Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 212
#1

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

20.08.2013, 17:38. Просмотров 1925. Ответов 34
Метки нет (Все метки)

Буду очень признателен за направление в нужно русло (готового ответа не надо, я хочу понять сам, только направление )

***
Условие:
Написать программу которая использует массив 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 посчитать слова в строке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2013, 17:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Прата С. Задача считать строку до слова done (C++):

Как считать строку и разбить ее на слова? - C++
Задача на С. (стандарт) Необходимо считать строку и разбить ее на слова (слова разделены пробелами (не меннее одного)). Количество слов и...

Прата задача 6.9 - C++
Всем доброго времени суток, подскажите как сделать что бы программа в строке 32 принимала имена с пробелами. Если открываю файл без...

С.Прата, задача 3.5 - C++
Гляньте, пожалуйста. Задача на преобразование целочисленных типов в с плавающей точкой. Вроде бы я решил: // запрос населения Земли и...

C++ - Прата задача 6.9 - C++
Подскажите пожалуйста в чем ошибка?не обрабатывается условие неправильного ввода имени файла. #include &lt;iostream&gt; #include &lt;fstream&gt; ...

Прата, задача 2, глава 6 - C++
Доброго времени суток. Учу программирования по книжке Прата. И вот такая задача: &quot;Напишите программу, которая считывает до десяти...

Странная задача из Прата 2011 - C++
Задача во вложении. Пользоваться циклами и ветвлениями нельзя, т.к. их еще не дают на этапе этого задания. Как понизить грейд? Что-то с...

34
h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 212
20.08.2013, 18:36  [ТС] #16
Хулиган, мне кажется все правильно, так и должно быть.
0
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 18:39 #17
Цитата Сообщение от Хулиган Посмотреть сообщение
при вводе done пост условие не выполняется и происходит выход из цикла, как получился такой скрин?
Так и должен быть выход из цикла. сin >> читает по словам в цикле ('\n' пропускает), доходит до done и выход из цикла.

Добавлено через 1 минуту
Цитата Сообщение от h_wolf Посмотреть сообщение
alsav22, почему так?
У вас в коде ошибка в том, что нужно использовать методы, которые чимают до пробела, а не всю строку, как cin.get().
0
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
20.08.2013, 18:41 #18
Цитата Сообщение от alsav22 Посмотреть сообщение
читает по словам в цикле, доходит до done и выход из цикла.
ну да, но у вас на скрине после done введено ещё 2 слова, после выхода из цикла, это как?
0
h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 212
20.08.2013, 18:41  [ТС] #19
alsav22, то есть cin доходя до пробела передает слово в массив, выполняется инкремент, проверяется условие, пробел отбрасывается и cin читает следующее слово?
0
h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 212
20.08.2013, 18:42  [ТС] #20
Хулиган, Эти слова вводятся целой строкой, а цикл читает до пробела и переходит к следующему слову пока не упрется в done. Строку же видно целиком потому как она вводится до вхождения в цикл
0
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 18:46 #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'. Т.е. первые отбрасывает (пока не встретит не пробельный), и читает до следующего пробельного символа.
0
h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 212
20.08.2013, 18:49  [ТС] #22
alsav22, Спасибо большое. Теперь все более менее понятно.
0
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 18:50 #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<<" слов";
Хотя так не будет, это я поспешил.
0
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
20.08.2013, 18:53 #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 ещё два слова, здесь считывание пословно, а не всей строки откуда они?
0
h_wolf
20.08.2013, 18:54  [ТС]
  #25

Не по теме:

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

0
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
20.08.2013, 18:58 #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 ещё два слова, здесь считывание пословно, а не всей строки откуда они?
0
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 19:12 #27
Цитата Сообщение от Хулиган Посмотреть сообщение
в учебнике четко написано: "цикл для чтения по одному слову за раз до тех пор пока не будет введено слово done."
не про какое чтение строки, содержащей все слова, и речи нету!
Цикл и читает по одному слову, а не по строке. Но в задании не говориться, что ввод должен быть по словам (и пример ввода показывает, что ввод должен быть построчный). Иначе как получить пример ввода из первого поста? Я просто из примера ввода перенёс текст в консоль, отсюда и скрин такой получился.

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

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

Двумерный массив и циклы. С. Прата, задача 5.6 - C++
С. Прата, Язык программирования С++, глава 5, задача 6. Напишите программу, которая позволит ввести ежемесячные объёмы продаж в единицах...

Как считать строку scanf'ом при этом не переходя на новую строку, т.е. без использования Enter'а - C++
Как считать строку scanf'ом при этом не переходя на новую строку, т.е. без использования Enter'а, необходимо для интерактивного ввода в...

Разбить строку на слова, добавить эти слова в массив строк - C++
Привет всем! Понадобилось решить одну простенькую задачку: Разбить строку на слова, добавить эти слова в массив строк, вывести...

Строка: Строку разбить на слова и слова запихнуть в массив char. - C++
Вобщем пока нужно: 1) строку разбить на слова и слова запихнуть в масив char. но у меня почему то вообще не то записывает в масив, хоча...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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