0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
1

Пример из книги Лафоре. Подсчитать количество слов и символов в строке

03.01.2015, 17:36. Показов 2134. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include <iostream>
#include <conio.h> // для getche()
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus");
    int chcount = 0; // число непробельных символов
    int wdcount = 1; // число пробелов
    char ch = 'a';   // ch должна иметь определенное значение
    cout << "Введите строку:";
    while (ch != '/n')// цикл, пока не будет нажат клавиша Enter
    {
        ch = getche();// считывание символа
        if (ch = ' ') // если символ является пробелом
            wdcount++;// то инкрементируем число слов
        else          // в противном случае  
            chcount++;// инкрементируем число символов
    }                 // вывод результатов на экран
    cout << "Слов:" << wdcount << endl;
    cout << "Букв:" << chcount - 1 << endl;
    getch();
    return 0;
}
Программа должна бы была подсчитывать количество слов и символов в строке, вводимой пользователем с клавиатуры. Но после того как я ввожу слова и нажимаю Enter, то ничего не происходит.
Пример взят из книжки Лафоре.
Подскажите пожалуйста в чем проблема.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.01.2015, 17:36
Ответы с готовыми решениями:

Подсчитать количество символов и слов в строке
Помогите пожалуйста, нужно подсчитать количество символов и слов в строке (учитывать только буквы)....

Массив символов (Подсчитать количество слов в строке, при условии, что в качестве разделителя слов используется один или несколько пробелов)
Написать программу, в которой с клавиатуры вводится строка символов. Подсчитать количество слов в...

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

Подсчитать количество слов в строке, которые повторяются 3 и более раза с количеством символов больше 6
Console.WriteLine(&quot;Пов. слово&quot;); string pov = Console.ReadLine(); ...

18
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
03.01.2015, 17:46 2
Считаешь количество разделителей слов (если надо, то скукоживаешь их повторения), а количество символов стандартными функциями. Если вариант со скукоживанием не катит, то ищешь символ разделения (как вариант - строку разделения) и проверяешь удалённость предыдущего найденного символа/строки разделения - если рядом, то количество слов не увеличиваешь и ищешь дальше.
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
03.01.2015, 18:01  [ТС] 3
Проблема в этом, что мне надо именно этот код сделать рабочим. Так как я изучаю C++ по книге Лафоре хотелось бы понять почему код не работает.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
03.01.2015, 18:12 4
Я не в курсе кто такой Лафоре и с какого перепугу ты так ухватился за этот код.
И ещё:
if (ch = ' ') // если символ является пробелом
wdcount++;// то инкрементируем число слов
А если два пробела подряд?
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
03.01.2015, 18:24  [ТС] 5
А если два пробела подряд?
Тогда алгоритм выдаст ошибочное значение. Он примитивен, но он не работает. В этом проблема. Просто по книге идет тема о функции getche(). Но программа отказывается выходить из цикла после нажатия Enter.
0
10 / 10 / 1
Регистрация: 17.02.2013
Сообщений: 344
03.01.2015, 18:37 6
QDAS,
попробуйте так чтоли:
C++
1
2
cout << '\n' <<"Слов:" << wdcount << endl;
cout << '\n' <<"Букв:" << chcount - 1 << endl;
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
03.01.2015, 18:53  [ТС] 7
C++
1
2
cout << '\n' <<"Слов:" << wdcount << endl;
cout << '\n' <<"Букв:" << chcount - 1 << endl;
Это ничего не меняет.
0
10 / 10 / 1
Регистрация: 17.02.2013
Сообщений: 344
03.01.2015, 19:24 8
QDAS,
Цитата Сообщение от QDAS Посмотреть сообщение
C++
1
while (ch != '/n')// цикл, пока не будет нажат клавиша Enter
А что такое '/n' ? Может быть '\n' ?
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
03.01.2015, 19:57  [ТС] 9
А что такое '/n' ? Может быть '\n' ?
За исправление спасибо, но по сути ничего не меняет, все равно на Enter не реагирует.
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
03.01.2015, 20:13 10
C++
1
if (ch = ' ')
= - это присваивание.
== - сравнение
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
03.01.2015, 20:21  [ТС] 11
= - это присваивание.
== - сравнение
Спасибо, глупая ошибка получилась, но с цикла все равно не выходит.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
04.01.2015, 01:21 12
Лучший ответ Сообщение было отмечено QDAS как решение

Решение

Цитата Сообщение от QDAS Посмотреть сообщение
но с цикла все равно не выходит.
C++
1
2
while (ch != '\r')// цикл, пока не будет нажат клавиша Enter
{
Добавлено через 1 минуту
И не нужно нестандартные функции использовать.
1
1 / 1 / 0
Регистрация: 21.12.2014
Сообщений: 67
04.01.2015, 01:26 13
Попробуйте while(ch != '\0')
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
04.01.2015, 01:30 14
Цитата Сообщение от Unsigned Посмотреть сообщение
Попробуйте while(ch != '\0')
Не нужно такое пробовать. Откуда, при вводе, '\0' возьмётся?
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
04.01.2015, 01:39  [ТС] 15
C++
1
2
while (ch != '\r')// цикл, пока не будет нажат клавиша Enter
{
Спасибо Вам большое.
И не нужно нестандартные функции использовать.
Это пример с книги Лафоре по C++, учусь по ней, там была использована такая функция.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
04.01.2015, 01:49 16
Цитата Сообщение от QDAS Посмотреть сообщение
Это пример с книги Лафоре по C++, учусь по ней, там была использована такая функция.
Понятно, но всё равно не нужно, стандартных достаточно.
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
09.01.2015, 19:46  [ТС] 17
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
#include <iostream>
#include <conio.h> // для getche()
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Ukr");
    system("color 4");
    int chcount = 0; // число непробельных символов
    int wdcount = 1; // число пробелов
    char ch;  // ch должна иметь определенное значение
    cout << "Введите строку:";
    while ((ch = getche()) != '\r')// цикл, пока не будет нажат клавиша Enter
    {
        if (ch == ' ') // если символ является пробелом
            wdcount++;// то инкрементируем число слов
        else          // в противном случае  
            chcount++;// инкрементируем число символов
    }                 // вывод результатов на экран
    cout << '\n' << "Слов:" << wdcount << endl;
    cout << '\n' << "Букв:" << chcount << endl;
    getch();
    return 0;
}
Немножко изменил сам цикл, но не понимаю некоторых вещей.

При такой записе цикла, программа работает корректно
C++
1
while ((ch = getche()) != '\r')
А при такой
C++
1
while (ch = (getche() != '\r'))
Если ввожу пробел, то программа считает пробел символов и инкрементирует chcount только. Приоритет больше у операции отношения это я знаю, но оно же проверяет или введенный символ не Enter и если Enter, то выходит из цикла и если не Enter, то это значение присваивается переменной ch и цикл выполняется.
Так в чем разница то ? Не могу понять. Объясните пожалуйста.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
09.01.2015, 23:54 18
Лучший ответ Сообщение было отмечено QDAS как решение

Решение

Результатом этого выражения:
C++
1
getche() != '\r'
будет true или false, в числовом выражении: не ноль (например, 1), или ноль. Это значение будет присваиваться ch. Пока будет возвращаться true, цикл while будет работать, но работать будет только else, т.к. 1 это не код пробела, когда вернётся false, ch станет равна 0 и произойдёт выход из while.
1
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
10.01.2015, 00:33  [ТС] 19
Результатом этого выражения:
C++
1
getche() != '\r'
будет true или false, в числовом выражении: не ноль (например, 1), или ноль. Это значение будет присваиваться ch. Пока будет возвращаться true, цикл while будет работать, но работать будет только else, т.к. 1 это не код пробела, когда вернётся false, ch станет равна 0 и произойдёт выход из while.
Спасибо Вам еще раз.
0
10.01.2015, 00:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2015, 00:33
Помогаю со студенческими работами здесь

Пример из книги Лафоре
Здравствуйте! Не могли бы подсказать, по какой причине в листинге ниже переменные должны быть...

Пример из книги Лафоре
В третьей главе книги Лафоре по с++ есть пример использующий функцию getche(): #include &lt;iostream&gt;...

Не работает пример из книги Лафоре
Доброго времени суток! Взялся решать задачу из книги Лафоре, глава 9, упр. 2. Опробовал уже...

Дан текст, в котором слова разделены одним пробелом. а) Подсчитать количество слов в данной строке. б) Подсчитать количество букв а в последнем слове
Дан текст, в котором слова разделены одним пробелом. а) Подсчитать количество слов в данной строке....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru