Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Irina20
0 / 0 / 0
Регистрация: 13.12.2010
Сообщений: 12
#1

Программа на С++ строки - C++

08.07.2011, 13:35. Просмотров 1775. Ответов 28
Метки нет (Все метки)

Нужна помощь в написании программы. Дано предложение, слова в котором разделены пробелами, а в конце стоит точка. Заменить порядок слов в предложении на обратный.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2011, 13:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа на С++ строки (C++):

программа на строки - C++
помогите плиз кто нить решить!! 1. В строке найти заданную последовательность символов и от конца этой последовательности удалить все...

программа на строки C++ - C++
Помогите написать программу, которая считывает текст с клавиатуры и выводит на экран количество слов, совпадающих со словом, введённым с...

Программа на строки - C++
Здравствуйте,помогите мне,пожалуйста,написать программу на С++. Даны две строчки,с помощью функции strcpy копировать из сточки sp,такое ...

программа на строки - C++
дан текст,состоящий из заглавных русских букв,сосчитать количество букв О,за которыми следует С.если нету то выдать сообщение

Простая программа на строки - C++
Помогите с задачей: написать функцию, которая обращяет строку, введённую с клавиатуры, другими словами зеркальное отображение.

программа на тему строки! - C++
помогите написать прогу! Во введённом тексте заменить цифры от 0 до 9 на слова «ноль, «один», …, «девять». заранее спасибо!

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
08.07.2011, 16:09 #16
Цитата Сообщение от Irina20 Посмотреть сообщение
точка после погоды осталась
Ну так её удалить надо было...
Продолжаем быдлокодить, с ужасом ждём, что будет, когда окажется, что и STL нельзя использовать...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <cstdio>
#include <cstring>
    
int main(){
    char buf[BUFSIZ];
    
    while ( printf("String: ") && scanf("%[^\n]%*c", buf) == 1 ){
        char * tail = strchr(buf, '.');
        if ( ! tail ){
            printf("Wrong input!\n");
            continue;
        }
        *tail = '\0';
        std::string str(buf);
        std::istringstream ist(str);
        std::stack<std::string> stk;
        while ( ist >> str )
            stk.push(str);
        while ( ! stk.empty() ){
            printf("%s ", stk.top().c_str());
            stk.pop();
        }
        printf("\b.\n");
    }
    
    return 0;
}
Код
$ ./str_stk
String: aaa bbb ccc. ddd
ccc bbb aaa.
Irina20
0 / 0 / 0
Регистрация: 13.12.2010
Сообщений: 12
08.07.2011, 16:17  [ТС] #17
easybudda, Огромное спасибо!!!!!!!!!!!!!!!
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,269
Записей в блоге: 2
Завершенные тесты: 1
08.07.2011, 17:18 #18
Цитата Сообщение от easybudda Посмотреть сообщение
с ужасом ждём, что будет, когда окажется, что и STL нельзя использовать...
Да не, если getline и cout нельзя, то STL по-любому можно ))

Но, если вдруг (мало ли)) все таки нельзя, то вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstdio>
#include <cstring>
 
int main(){
    char buf[BUFSIZ], *ptr;
    while ( printf("String: ") &&scanf("%[^\n]%*c", buf) == 1 ){
        char * tail = strchr(buf, '.');
        if ( ! tail ){
            printf("Wrong input!\n");
            continue;
        }
        *tail = '\0';
        while(ptr=strrchr(buf,' ')){
            printf("%s ",ptr+1);
            while(*--ptr==' ');
            *(ptr+1)='\0';
        }
        printf("%s.\n",buf);
    }
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
08.07.2011, 18:35 #19
Вот код и скриншот работы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
//Удаление множественных пробелов
char * move_num_spaces(char * str);
//Перенос текстового блока с позиции from_pos в позицию start_pos
char * move_text_block(char * str, int start_pos, int from_pos);
 
FILE * f;
char str[1024],*s;
int sLen = 0;
 
int main()
{
    if(!(f = fopen("text.txt","rb+")))
        printf("Oshibka otkritia fila s textom\r\n");
    else
    {
        //Читаем предложение из файла
        fseek(f,0,SEEK_END);
        sLen = ftell(f);
        fseek(f,0,SEEK_SET);
        fread(str,1,sLen,f);
        fclose(f);
        printf("\tINPUT TEXT\r\n");
        printf("%s\r\n",str);
        printf("\tYDALENIE MNOZHESTVENNIH PROBELOV\r\n");
        strcpy(str,move_num_spaces(str));
        printf("%s\r\n",str);
        printf("\rREVERSE WORDS\r\n");
        s = strrchr(str,' ');
        if(s != NULL)
        {
            s[strlen(s) - 1] = '\0';//Убираем точку
            while(s != NULL)
            {
                printf("%s ",s + 1);
                str[strlen(str) - strlen(s)] = '\0';
                s = strrchr(str,' ');
            }
            printf(" %s.\r\n",str);
        }
    }
    printf("Press any key to continue\r\n");
    scanf("%s",str);
    return 0;
}
 
//Удаление множественных пробелов
char * move_num_spaces(char * str)
{
    int nCount,start_pos,from_pos;
    char * chBuf = NULL;
    if(str != NULL)
    {
        chBuf = strchr(str,' ');
        while(chBuf != NULL)
        {
            nCount = 0;
            start_pos = strlen(str) - strlen(chBuf);
            while(chBuf + nCount)
            {
                if(chBuf[nCount] != ' ')
                    break;
                nCount++;
            }
            from_pos = start_pos + nCount;
            if(1 < nCount)
                str = move_text_block(str, start_pos + 1, from_pos);
            chBuf = strchr((chBuf + nCount),' ');
        }
    }
    return str;
}
 
//Перенос текстового блока с позиции from_pos в позицию start_pos
char * move_text_block(char * str, int start_pos, int from_pos)
{
    int i = from_pos;
    if(str != NULL)
    {
        while(str[i] != '\0')
        {
            str[start_pos + (i - from_pos)] = str[i];
            i++;
        }
        str[strlen(str) - (from_pos - start_pos)] = '\0';
    }
    return str;
}
PS:Во всех проектах отсутсвует предположение о случайном вводом двух и более пробелов подряд, моя программа позволяет пользователю ошибаться при записи текста в файл
Миниатюры
Программа на С++ строки  
Вложения
Тип файла: txt text.txt (99 байт, 10 просмотров)
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,269
Записей в блоге: 2
Завершенные тесты: 1
08.07.2011, 18:57 #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Во всех проектах отсутсвует предположение о случайном вводом двух и более пробелов подряд,
Цитата Сообщение от Kastaneda Посмотреть сообщение
C++
1
while(*--ptr==' ');
а в версии easybudda такая проверка просто не нужна.

Не по теме:

C++
1
2
3
printf("\tYDALENIE MNOZHESTVENNIH PROBELOV\r\n");
/////////////////////////////////////////////////////////////
printf("\rREVERSE WORDS\r\n");
русско-английский?

easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
08.07.2011, 19:07 #21
В продолжение конкурса быдлокодерских поделок
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <string.h>
    
void reverse_words(char * str){
    char * p;
    if ( str ){
        if ( p = strtok(str, " ") ){
            reverse_words(NULL);
            printf("%s.\n", p);
        }
    }
    else {
        if ( p = strtok(NULL, " ") ){
            reverse_words(NULL);
            printf("%s ", p);
        }
    }
}
 
int main(void){
    char buf[BUFSIZ], * p;
    
    while ( printf("String: ") && scanf("%[^\n]%*c", buf) == 1 ){
        if ( p = strchr(buf, '.') )
            *p = '\0';
        else {
            printf("Wrong input!\n");
            continue;
        }
        reverse_words(buf);
    }
    
    return 0;
}
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Во всех проектах отсутсвует предположение о случайном вводом двух и более пробелов подряд, моя программа позволяет пользователю ошибаться
А все другие протонным лучом, выпущенным из монитора убивают? Вы просто из любопытства попробуйте скомпилировать и на вход строку с несколькими пробелами между словами передать...
Код
$ ./revwords
String: aaa      bbb      ccc    .
ccc bbb aaa.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,269
Записей в блоге: 2
Завершенные тесты: 1
08.07.2011, 19:29 #22
Цитата Сообщение от easybudda Посмотреть сообщение
В продолжение конкурса быдлокодерских поделок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <cstdio>
#include <cstring>
 
class word{
    std::string w;
public:
    word(std::string ww):w(ww+' '){};
    ~word(){
        std::cout<<w;
    }
};
 
void output(std::istringstream& is){
    std::string s;
    if(is>>s)
        output(is);
    else return;
    word w(s);
}
 
int main(){
        char buf[BUFSIZ];
        
        while ( printf("String: ") && scanf("%[^\n]%*c", buf) == 1 ){
                char * tail = strchr(buf, '.');
                if ( ! tail ){
                        printf("Wrong input!\n");
                        continue;
                }
                *tail = '\0';
                output(std::istringstream(std::string(buf)));
                printf("\b.\n");
        }
        
        return 0;
}
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
08.07.2011, 19:34 #23
Цитата Сообщение от Kastaneda Посмотреть сообщение
std::cout<<w;
опаньки!
Цитата Сообщение от Irina20 Посмотреть сообщение
мы не используем getline и cout
морально-нравственные устои не позволяют...
Kastaneda
08.07.2011, 19:41
  #24

Не по теме:

easybudda, да, конечно же Забыл, что в нашем распоряжении все средства C++, кроме getline() и std::cout

easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
08.07.2011, 19:51 #25
Вариант чуть короче:
C
1
2
3
4
5
6
7
8
void reverse_words(char * str){
    char * p;
    
    if ( p = strtok(str, " ") ){
        reverse_words(NULL);
        printf("%s%s", p, ( str ) ? ".\n" : " ");
    }
}
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
08.07.2011, 21:48 #26
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
 
using namespace std;
 
int main()
{
        string s("wwww eeee rrrrr hhhhhhhh ooo."), s1;
        s.resize(s.size()- 1);
        vector<string> vec;
        istringstream str_potok (s);
 
        //Жалко, что в этом месте нельзя обойтись без дополнительной буферной переменной s1,
        //если кто знает, подскажите как. 
        while (str_potok>> s1) {
         vec.push_back (s1);
        }
 
        s1.resize(0);  
        
        while (vec.size()){
         s1+=vec.back()+=' ';
         vec.pop_back();
        }
 
        s1.resize(s1.size()- 1);
        
        printf ("%s\n", s1.c_str());  
        getchar();
         
        return 0;
}
Добавлено через 21 минуту
Ещё проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
 
using namespace std;
 
int main()
{
        string s("wwww eeee rrrrr hhhhhhhh ooo."), s1, s3;
        s.resize(s.size()- 1);
        istringstream str_potok (s);
 
        while (str_potok>> s1) {
         s3.insert(0, s1.insert(0, " ")); 
        }
 
        printf ("%s\n", s3.c_str()+1);  
        getchar();
         
        return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
08.07.2011, 22:09 #27
easybudda, да я забыл что токены выбираются внезависимости от длины промежутков, согласен проверка в твоём проекте не нужна
Миниатюры
Программа на С++ строки  
-=ЮрА=-
Заблокирован
Автор FAQ
08.07.2011, 22:34 #28
PS:За токены ты прав можно не мучаться с удалением лишних пробелов, однако твой код некорректно работает для предложений с точками внутри него, например для такого, думаю условием окончания текста лучше брать последний пробел в нём, т.к. по синтаксису последний знак пунктуации идёт после слова, перед которым всегда есть пробел.
Миниатюры
Программа на С++ строки  
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
08.07.2011, 22:42 #29
Цитата Сообщение от kravam Посмотреть сообщение
Жалко, что в этом месте нельзя обойтись без дополнительной буферной переменной s1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
#include <sstream>
#include <vector>
    
int main(){
    std::string s("aaa bbb ccc");
    std::istringstream ist(s);
    std::vector<std::string> vec;
    std::copy(std::istream_iterator<std::string>(ist), std::istream_iterator<std::string>(), std::back_inserter(vec));
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2011, 22:42
Привет! Вот еще темы с ответами:

Найдите ошибку, программа на строки - C++
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &quot;string.h&quot; #include &quot;iostream&quot; using namespace std; int main() { ...

Программа удаления из строки символов '0..9' - C++
Программа удаления из строки символов '0..9' #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main(int...

Программа не выводит строки в файл - C++
Вывод в файл не работает! void setKey() { system(&quot;cls&quot;); cout &lt;&lt; &quot;Введите количество вопросов в тесте: &quot;; cin &gt;&gt; key; ...

Программа для ввода строки от блондинки - C++
Привет всем! Вот решила начать изучать язык программирования С++, но не все пока получается... Вот дали задание...написать программу,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.07.2011, 22:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru