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

Прата С. Задача считать строку до слова done - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
20.08.2013, 17:38     Прата С. Задача считать строку до слова done #1
Буду очень признателен за направление в нужно русло (готового ответа не надо, я хочу понять сам, только направление )

***
Условие:
Написать программу которая использует массив char и цикл для чтения по одному слову за раз до тех пор пока не будет введено слово done. Затем программа должна сообщить количество введенных слов(исключая done).

пример вывода:

вводите слова(для завершения введите done):
anteater birthday call centr god sex
categoty for inside outside done for sure
Вы ввели 10 слов(а).

***
Насколько видно из примерного текста вывода программы слова необязательно отделены друг от друга знаком новой строки, то есть надо читать всю строку, а потом в ней считать слова до слова done.
Не могу придумать алгоритма решения никак. опять таки необходимо использовать только изученные средства - циклы, массивы, string, strcmp и пр. if..else нам не известны.
Для решения необходимо использовать только массивы (одномерные, двумерные), циклы, структуры, функции-члены cin, объект класса string, операции сравнения (<,>,!= и пр.)

Добавлено через 1 минуту
только не понятно как без if посчитать слова в строке.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 18:46     Прата С. Задача считать строку до слова done #21
Или вот так сделать (чтобы до пробела читалось):
C++
1
2
3
4
5
6
7
8
9
10
11
char Str[255]={0};
    int count=0;
 
    cout<<"Введите слова, для заверщения введите done:";
    do
    {
        cin.get(Str, 255, ' ').get();
        count++;
    }while(strcmp(Str, "done"));
 
    cout<<"Введено "<<count-1<<" слов";
Добавлено через 3 минуты
Цитата Сообщение от h_wolf Посмотреть сообщение
alsav22, то есть cin доходя до пробела передает слово в массив, выполняется инкремент, проверяется условие, пробел отбрасывается и cin читает следующее слово?
Да, но только cin с оператором вставки: >>, и отбрасываются не только пробелы, но и любые первые пробельные символы, в том числе и '\n'. Т.е. первые отбрасывает (пока не встретит не пробельный), и читает до следующего пробельного символа.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
20.08.2013, 18:49  [ТС]     Прата С. Задача считать строку до слова done #22
alsav22, Спасибо большое. Теперь все более менее понятно.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 18:50     Прата С. Задача считать строку до слова done #23
Цитата Сообщение от alsav22 Посмотреть сообщение
Или вот так сделать (чтобы до пробела читалось):
C++
1
2
3
4
5
6
7
8
9
char Str[255]={0};
 int count=0;
cout<<"Введите слова, для заверщения введите done:";
 do
 {
 cin.get(Str, 255, ' ').get();
 count++;
 }while(strcmp(Str, "done"));
cout<<"Введено "<<count-1<<" слов";
Хотя так не будет, это я поспешил.
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
20.08.2013, 18:53     Прата С. Задача считать строку до слова done #24
Цитата Сообщение от h_wolf Посмотреть сообщение
потому как она вводится до вхождения в цикл
string вводится с помощью сin только до первого пробела! т.е. читается 1 слово все остальные отбрасываются! чтобы считать строку полностью нужно использовать: getline(cin, str);

и не придумывайте себе гемороя в задании написано что ввод осущ. по одному слову до тех пор пока не будет введено done, но раз вы так зацепились за те слове после done то можно сделать ввод по одному слову до тех пор пока полз не прекратит ввод, а подсчет только до done

Добавлено через 2 минуты
alsav22, и объясните мне пожалуйста как с кодом
C++
1
2
3
4
5
6
7
8
9
cout << "Input string: ";
string str = "";
int i = 0;
do 
{
     cin >> str;
     ++i; 
} while (str != "done");
cout << i - 1 << endl;
получился тот скрин в котором после done ещё два слова, здесь считывание пословно, а не всей строки откуда они?
h_wolf
20.08.2013, 18:54  [ТС]
  #25

Не по теме:

Хулиган, я не придумываю гомерроя, я учусь. Стараюсь выполнять то что требуется по учебнику, а так как в учебнике нет ответов стараюсь придерживаться приведенных результатов.

Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
20.08.2013, 18:58     Прата С. Задача считать строку до слова done #26
Цитата Сообщение от h_wolf Посмотреть сообщение
я не придумываю гомерроя, я учусь
Цитата Сообщение от h_wolf Посмотреть сообщение
Стараюсь выполнять то что требуется по учебнику
в учебнике четко написано: "цикл для чтения по одному слову за раз до тех пор пока не будет введено слово done."
не про какое чтение строки, содержащей все слова, и речи нету!

Добавлено через 1 минуту
alsav22, и объясните мне пожалуйста как с кодом
C++
1
2
3
4
5
6
7
8
9
cout << "Input string: ";
string str = "";
int i = 0;
do 
{
     cin >> str;
     ++i; 
} while (str != "done");
cout << i - 1 << endl;
получился тот скрин в котором после done ещё два слова, здесь считывание пословно, а не всей строки откуда они?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 19:12     Прата С. Задача считать строку до слова done #27
Цитата Сообщение от Хулиган Посмотреть сообщение
в учебнике четко написано: "цикл для чтения по одному слову за раз до тех пор пока не будет введено слово done."
не про какое чтение строки, содержащей все слова, и речи нету!
Цикл и читает по одному слову, а не по строке. Но в задании не говориться, что ввод должен быть по словам (и пример ввода показывает, что ввод должен быть построчный). Иначе как получить пример ввода из первого поста? Я просто из примера ввода перенёс текст в консоль, отсюда и скрин такой получился.

Добавлено через 4 минуты
Хулиган, но, вообще-то, я согласен с вами в том, что текст задания и пример ввода как-то не очень стыкуются.

Добавлено через 2 минуты
Цитата Сообщение от h_wolf Посмотреть сообщение
вводите слова(для завершения введите done):
Если так вводить (по словам), то при введении done должен быть выход из цикла (как вы справедливо и пишите), но как тогда получится такой текст при вводе?
anteater birthday call centr god sex
categoty for inside outside done for sure
Так получится, если только построчно вводить.
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
20.08.2013, 19:12     Прата С. Задача считать строку до слова done #28
Цитата Сообщение от alsav22 Посмотреть сообщение
Но в задании не говориться, что ввод должен быть по словам (и пример ввода показывает, что ввод должен быть построчный).
но ведь всю строку нельзя ввести за раз с помощью cin, считывание из cin выполнится до первого пробела, а все остальное будет утеряно
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
20.08.2013, 19:19  [ТС]     Прата С. Задача считать строку до слова done #29
Цитата Сообщение от Хулиган Посмотреть сообщение
но ведь всю строку нельзя ввести за раз с помощью cin, считывание из cin выполнится до первого пробела, а все остальное будет утеряно
именно поэтому я и решил изначально использовать cin.get(Str, 255).get()
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 19:23     Прата С. Задача считать строку до слова done #30
Цитата Сообщение от Хулиган Посмотреть сообщение
но ведь всю строку нельзя ввести за раз с помощью cin, считывание из cin выполнится до первого пробела, а все остальное будет утеряно
Приблизительно опишу, как всё работает. Набрали в консоле строку, нажали Enter. Всё набранное попало в буфер чтения. cin >> будет читать, в цикле, по слову из буфера, пока не прочтёт всё (буфер пуст), или не произойдёт выход из цикла по уловию. После этого будет ожидать нового ввода и т.д., пока не будет выход из цикла.
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
20.08.2013, 19:29     Прата С. Задача считать строку до слова done #31
Цитата Сообщение от h_wolf Посмотреть сообщение
именно поэтому я и решил изначально использовать cin.get(Str, 255).get()
да причем здесь вы, я интересуюсь как с помощью того кода можно было получить такой скрин:

1ввод слова
2проверка != done
3ввод слова(и так до слова done)
...
4 ввод слова done
5 не выполняется условие
6 выход из цикла
7 вывод count-1

последние 2 слова не были введены, а ввод done for sure думаю не правильный поскольку с тем же успехом можно было ввести anteater birthday call centr god sex
categoty for inside outside и ни к чему хорошему это не привело!

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
пока не прочтёт всё (буфер пуст)
ну как бы перед каждым cin>>srt буфер очищается

Добавлено через 1 минуту
cin is tied to the standard output stream cout (see ios::tie), which indicates that cout's buffer is flushed (see ostream::flush) before each i/o operation performed on cin.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 19:31     Прата С. Задача считать строку до слова done #32
Используя отладчик можно увидеть как cin >> читает в цикле. Ожидание ввода, пишется строка, Enter. Начинается чтение в цикле по словам, потом ожидание следующей строки.
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
20.08.2013, 19:32     Прата С. Задача считать строку до слова done #33
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 <iostream>
#include <cstring>
using namespace std;
const int STR_LIM = 50;
int main()
{
    system("chcp 1251");
    system("title Ch.5 Ex.8");
 
    char word[STR_LIM];
    int count = 0;
    
    cout << "Enter words (to stop, type the word done):\n";
    
    while (cin >> word && strcmp("done", word))
        ++count;
 
    cout << "You entered a total of " << count << " words.\n";
 
 
    system("PAUSE");
    return 0;
}
Мое решение.

Не по теме:

Отличная книга,мне нравится. Выполняю все задачи с энтузиазмом. С нетерпением изучаю новую главу, что бы в конце главы порешать задачки =) Сейчас дочитал 12-ю главу:"Классы и динамическое выделение памяти."
Если модераторы разрешат изменять первый пост, то буду выкладывать все решения, иначе дорешаю все задачки и создам пост,если никто не опередит =)

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 19:35     Прата С. Задача считать строку до слова done #34
Цитата Сообщение от Хулиган Посмотреть сообщение
ну как бы перед каждым cin>>srt буфер очищается
Есть буфер ввода и буфер вывода. Я пишу о буфере ввода. В приведённой вами цитате, речь идёт об очистке буфера вывода, перед операцией ввода.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2013, 23:27     Прата С. Задача считать строку до слова done
Еще ссылки по теме:

Прата задача 6.9 C++
Разбить строку на слова, добавить эти слова в массив строк C++
C++ C++ - Прата задача 6.9

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

Или воспользуйтесь поиском по форуму:
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
20.08.2013, 23:27     Прата С. Задача считать строку до слова done #35
Цитата Сообщение от alsav22 Посмотреть сообщение
Есть буфер ввода и буфер вывода
ааа, все понял, спасибо)) приношу свои извинения за вынос мозга..перепутал потоки
просто надо было разобраться откуда те два слова)
Yandex
Объявления
20.08.2013, 23:27     Прата С. Задача считать строку до слова done
Ответ Создать тему
Опции темы

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