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

Напечатать в столбик первые слова всех предложений текста - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
varkl
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 19
24.09.2013, 10:05     Напечатать в столбик первые слова всех предложений текста #1
Напечатать в столбик первые слова всех предложений текста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2013, 10:05     Напечатать в столбик первые слова всех предложений текста
Посмотрите здесь:

Напечатать все слова из текста, отличные от слова hello. C++
C++ Напечатать повторяющиеся слова из текста
Напечатать симметричные слова из текста C++
C++ Вывести в алфавитном порядке последние слова всех предложений
Напечатать те слова, которые встречаются в каждом из двух заданных предложений C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
24.09.2013, 11:08     Напечатать в столбик первые слова всех предложений текста #2
наброски кода есть?
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
24.09.2013, 11:14     Напечатать в столбик первые слова всех предложений текста #3
На красоту кода не претендую, только учусь. Вот собственно что у меня получилось.
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<cstdio>
using namespace std;
 
int main()
{
    char str[80];
    int i,t;
    cout << "Enter string: ";
    gets(str);
    cout << endl << "The first words:" << endl << endl;
    for(t=0; str[t]; t++)
    {
        if(str[t]==' ' || str[t]=='.' || str[t]==',' || str[t]=='?' || str[t]=='!' || str[t]==':') break;
        else cout << str[t];
    }
    cout << endl;
    for(i=0; str[i]; i++)
    {
        if(str[i-2]=='.' || str[i-2]=='?' || str[i-2]=='!' && str[i-1]==' ') 
        {
            for(;str[i]!=' ' && str[i]!=0;i++)
            {
                if(str[i]!='.' && str[i]!=',' && str[i]!='?' && str[i]!='!' && str[i]!=':') cout << str[i];
            }
            cout << endl;
        }
        
    }   
    return 0;
}
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
24.09.2013, 11:16     Напечатать в столбик первые слова всех предложений текста #4
Цитата Сообщение от Drusha Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
for(i=0; str[i]; i++)
* * {
* * * * if(str[i-2]=='.' || str[i-2]=='?' || str[i-2]=='!' && str[i-1]==' ') 
* * * * {
* * * * * * for(;str[i]!=' ' && str[i]!=0;i++)
* * * * * * {
* * * * * * * * if(str[i]!='.' && str[i]!=',' && str[i]!='?' && str[i]!='!' && str[i]!=':') cout << str[i];
* * * * * * }
* * * * * * cout << endl;
* * * * }

А зачем второй цикл? Слово же вроде уже вывели...
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
24.09.2013, 11:20     Напечатать в столбик первые слова всех предложений текста #5
h_wolf , он выводит первые слова в предложении, но кроме самого первого слова в тексте, вот поэтому и пришлось добавить первый цикл, что бы вывести первое слово в тексте, вообщем как получилось.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
24.09.2013, 11:23     Напечатать в столбик первые слова всех предложений текста #6
Drusha, проверил в Code::Blocks без второго цикла все работает как надо - выводится только первое слово из строки.
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
24.09.2013, 11:31     Напечатать в столбик первые слова всех предложений текста #7
Цитата Сообщение от h_wolf Посмотреть сообщение
без второго цикла все работает как надо - выводится только первое слово из строки.
Дело в том что первый цикл выводит только самое первое слово в тексте и все, а в условии написано:
Цитата Сообщение от varkl Посмотреть сообщение
всех предложений текста
поэтому второй цикл выводит остальные первые слова в предложениях.
Единственное в коде можно было обойтись одной переменно t, можно i заменить на t, и начать второй цикл с индекса который остался после выполнения первого цикла.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
24.09.2013, 11:40     Напечатать в столбик первые слова всех предложений текста #8
А если предложений будет больше двух?
Тогда целесообразнее как-то через while-цикл сделать. Сейчас пытаюсь переписать Ваш код.
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
24.09.2013, 11:49     Напечатать в столбик первые слова всех предложений текста #9
h_wolf , эта программа работать будет хоть сколько угодно предложений, главное в 7 строчке цифру побольше выставить.
Просто я сделал вначале второй цикл, а он выводит первые слова которые идут после символов точка-пробел, вопросительный знак - пробел, восклицательный знак - пробел. Он выводил все первые слова всех предложений кроме первого соответственно. Поэтому я вначале добавил цикл, который мне выводит самое первое слово в массиве и все.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
24.09.2013, 11:51     Напечатать в столбик первые слова всех предложений текста #10
Drusha, да, действительно, не посмотрел на условия цикла for. Если доделаю свой вариант тоже здесь положу.
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
24.09.2013, 11:58     Напечатать в столбик первые слова всех предложений текста #11
h_wolf , ничего страшного, я тут свои варианты решения и выставляю для того что бы их критиковали. Т.к. учу с++ сам, то надо что бы кто-то критиковал, что бы я исправлялся.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
24.09.2013, 12:00     Напечатать в столбик первые слова всех предложений текста #12
У меня вот так вот получилось:

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
#include<iostream>
#include<cstdio>
using namespace std;
const int ArrSize=256;
 
int main()
{
    char str[ArrSize];
    int i,t=0;
    cout << "Enter string: ";
    gets(str);
    cout << endl << "The first words:" << endl << endl;
 
    while(str[t]!='\0')
    {
        if(str[t-1]!='.' || str[t-1]!='!' || str[t-1]!=';' || str[t-1]!='?' || str[t-1]!='!?') //дописать интеречсующие Вас разделители предложений
        {
            while(str[t]!=' '){
                cout<<str[t];
                t++;
            }
            cout<<' ';
 
            while(str[t-1]!='.' || str[t-1]!='!' || str[t-1]!=';' || str[t-1]!='?' || str[t-1]!='!?') //дописать интеречсующие Вас разделители предложений
                t++;
        }
        t++;
    }
 
    return 0;
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
24.09.2013, 12:10     Напечатать в столбик первые слова всех предложений текста #13
h_wolf, что-то не заработала, выводит только первое слово и все.
Цикл while(str[t]!='\0') можете попробовать заменить на while(str[t]), он так же остановиться когда там значения будет \0.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
24.09.2013, 12:16     Напечатать в столбик первые слова всех предложений текста #14

Не по теме:

почти получилось свести все к трем циклам while. и будет вообще красота)



Добавлено через 52 секунды
Drusha, У меня все отработало, странно.
Да, знаю, что можно заменить, но мне так нагляднее и симпотичнее. (=
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2013, 12:33     Напечатать в столбик первые слова всех предложений текста #15
Удалил.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
24.09.2013, 12:45     Напечатать в столбик первые слова всех предложений текста #16

Не по теме:

alsav22, почему?



Добавлено через 9 минут
Удалось свести вот к такому минимуму. Единственная проблема в строке 22 - если ставить только
C++
1
while(str[t]!='.')
то все ок. Но если добавить так как в коде ниже цикл не завершается...

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
#include<iostream>
#include<cstdio>
using namespace std;
const int ArrSize=256;
 
int main()
{
    char str[ArrSize];
    int t=0;
    cout << "Enter string: ";
    gets(str);
    cout << endl << "The first words:" << endl << endl;
 
    while(str[t]!='\0')
    {
        do{
           cout<<str[t];
           t++;
        }while(str[t]!=' ');
        cout<<'\n'; //что бы в столбик было (=
 
        while(str[t]!='.' || str[t]!='!') //проблема тут. Если убрать || то все работает...
            t++;
 
        t++;
    }
 
    return 0;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2013, 13:00     Напечатать в столбик первые слова всех предложений текста #17

Не по теме:

Цитата Сообщение от h_wolf Посмотреть сообщение
alsav22, почему?
Недостатки нашёл. Например, предложение заканчивается несколькими знаками (!? или ...), или первое слово одно и после него несколько знаков.



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
#include <iostream>
#include <string>
#include <sstream>
#include <cctype>
 
using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::stringstream;
 
int main()
{
    setlocale(0, "");
    
    string text = "Дело в том, что первый цикл выводит только самое первое слово в тексте и все,"
                  " а в условии написано: всех предложений текста. "
                  " Поэтому второй цикл выводит остальные первые слова в предложениях."
                  "\nЕдинственное в коде можно было обойтись одной переменно t, можно i заменить на t,"
                  "и начать второй цикл с индекса, который остался после выполнения первого цикла.";
 
    stringstream s(text);
    cout << text << endl << endl;
 
    string word;
    while (s >> word)
    {
        while (ispunct((unsigned char)word[word.size() - 1]))
            word.erase(word.size() - 1);
            
        cout << word << endl;
        
        char ch;
        while (s.get(ch))
        {
            if (ch == '.' || ch == '!' || ch == '?' )
            {
                while (s.get(ch))
                {
                    if (isspace((unsigned char)ch)) break;
                }
                break;
            }
        }
    } 
 
    cin.get();
    return 0;
}
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
24.09.2013, 13:13     Напечатать в столбик первые слова всех предложений текста #18
Что-то я сегодня туплю. Естественно в моейм варианте надо не || (ИЛИ) а && (И) использовать.

Вот рабочий код:

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
#include<iostream>
#include<cstdio>
using namespace std;
const int ArrSize=256;
int main()
{
    char str[ArrSize];
    int i,t=0;
    cout << "Enter string: ";
    gets(str);
    cout << endl << "The first words:" << endl << endl;
    while(str[t]!='\0')
    {
        do{
           cout<<str[t];
           t++;
        }while(str[t]!=' ');
        cout<<'\n'; //что бы в столбик было (=
        while(str[t]!='!' && str[t]!='.') //дописать интеречсующие Вас разделители предложений
            t++;
        t++;
    }
    return 0;
}
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
24.09.2013, 13:13     Напечатать в столбик первые слова всех предложений текста #19
alsav22, глядя на Ваш код, я вспомнил как мне в детстве отец говорил "Смотрю в книгу, вижу фигу" Видимо не дорос я еще до такого, буду учить дальше
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2013, 13:20     Напечатать в столбик первые слова всех предложений текста
Еще ссылки по теме:

Задан текст, напечатать слова этого текста отличные от последнего слова C++
Напечатать те слова, которые встречаются в каждом из двух заданных предложений C++
C++ Напечатать слова, которые отличны от последнего слова текста, предварительно удалив из слова последнюю букву

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

Или воспользуйтесь поиском по форуму:
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
24.09.2013, 13:20     Напечатать в столбик первые слова всех предложений текста #20
Drusha, ошибочка, думал Вы мне.

Добавлено через 1 минуту
Drusha, просто не все функции нам известны )
Yandex
Объявления
24.09.2013, 13:20     Напечатать в столбик первые слова всех предложений текста
Ответ Создать тему
Опции темы

Текущее время: 00:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru