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

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

03.01.2015, 17:36. Показов 2243. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.01.2015, 17:36
Ответы с готовыми решениями:

Подсчитать количество символов и слов в строке
Помогите пожалуйста, нужно подсчитать количество символов и слов в строке (учитывать только буквы). #include &lt;string.h&gt; ...

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

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

18
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
03.01.2015, 17:46
Считаешь количество разделителей слов (если надо, то скукоживаешь их повторения), а количество символов стандартными функциями. Если вариант со скукоживанием не катит, то ищешь символ разделения (как вариант - строку разделения) и проверяешь удалённость предыдущего найденного символа/строки разделения - если рядом, то количество слов не увеличиваешь и ищешь дальше.
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
03.01.2015, 18:01  [ТС]
Проблема в этом, что мне надо именно этот код сделать рабочим. Так как я изучаю C++ по книге Лафоре хотелось бы понять почему код не работает.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
03.01.2015, 18:12
Я не в курсе кто такой Лафоре и с какого перепугу ты так ухватился за этот код.
И ещё:
if (ch = ' ') // если символ является пробелом
wdcount++;// то инкрементируем число слов
А если два пробела подряд?
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
03.01.2015, 18:24  [ТС]
А если два пробела подряд?
Тогда алгоритм выдаст ошибочное значение. Он примитивен, но он не работает. В этом проблема. Просто по книге идет тема о функции getche(). Но программа отказывается выходить из цикла после нажатия Enter.
0
10 / 10 / 1
Регистрация: 17.02.2013
Сообщений: 344
03.01.2015, 18:37
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  [ТС]
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
QDAS,
Цитата Сообщение от QDAS Посмотреть сообщение
C++
1
while (ch != '/n')// цикл, пока не будет нажат клавиша Enter
А что такое '/n' ? Может быть '\n' ?
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
03.01.2015, 19:57  [ТС]
А что такое '/n' ? Может быть '\n' ?
За исправление спасибо, но по сути ничего не меняет, все равно на Enter не реагирует.
0
Неэпический
 Аватар для Croessmah
18125 / 10709 / 2063
Регистрация: 27.09.2012
Сообщений: 27,000
Записей в блоге: 1
03.01.2015, 20:13
C++
1
if (ch = ' ')
= - это присваивание.
== - сравнение
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
03.01.2015, 20:21  [ТС]
= - это присваивание.
== - сравнение
Спасибо, глупая ошибка получилась, но с цикла все равно не выходит.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
04.01.2015, 01:21
Лучший ответ Сообщение было отмечено QDAS как решение

Решение

Цитата Сообщение от QDAS Посмотреть сообщение
но с цикла все равно не выходит.
C++
1
2
while (ch != '\r')// цикл, пока не будет нажат клавиша Enter
{
Добавлено через 1 минуту
И не нужно нестандартные функции использовать.
1
1 / 1 / 0
Регистрация: 21.12.2014
Сообщений: 67
04.01.2015, 01:26
Попробуйте while(ch != '\0')
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
04.01.2015, 01:30
Цитата Сообщение от Unsigned Посмотреть сообщение
Попробуйте while(ch != '\0')
Не нужно такое пробовать. Откуда, при вводе, '\0' возьмётся?
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
04.01.2015, 01:39  [ТС]
C++
1
2
while (ch != '\r')// цикл, пока не будет нажат клавиша Enter
{
Спасибо Вам большое.
И не нужно нестандартные функции использовать.
Это пример с книги Лафоре по C++, учусь по ней, там была использована такая функция.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
04.01.2015, 01:49
Цитата Сообщение от QDAS Посмотреть сообщение
Это пример с книги Лафоре по C++, учусь по ней, там была использована такая функция.
Понятно, но всё равно не нужно, стандартных достаточно.
0
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 57
09.01.2015, 19:46  [ТС]
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
Лучший ответ Сообщение было отмечено 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  [ТС]
Результатом этого выражения:
C++
1
getche() != '\r'
будет true или false, в числовом выражении: не ноль (например, 1), или ноль. Это значение будет присваиваться ch. Пока будет возвращаться true, цикл while будет работать, но работать будет только else, т.к. 1 это не код пробела, когда вернётся false, ch станет равна 0 и произойдёт выход из while.
Спасибо Вам еще раз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2015, 00:33
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
MVC фреймворк в PHP
Jason-Webb 19.04.2025
Архитектурный паттерн Model-View-Controller (MVC) – это не просто модный термин из мира веб-разработки. Для PHP-программистов это фундаментальный подход к организации кода, который радикально меняет. . .
Dictionary Comprehensions в Python
py-thonny 19.04.2025
Python славится своей выразительностью и лаконичностью, что позволяет писать чистый и понятный код. Среди множества синтаксических конструкций языка особое место занимают словарные включения. . .
Шаблоны и протоколы для создания устойчивых микросервисов
ArchitectMsa 19.04.2025
Микросервисы — архитектурный подход, разбивающий сложные приложения на небольшие, независимые компоненты. Вместо монолитного гиганта, система превращается в созвездие небольших взаимодействующих. . .
Изменяемые и неизменяемые типы в Python
py-thonny 19.04.2025
Python славится своей гибкостью и интуитивной понятностью, а одна из главных его особенностей — это система типов данных. В этом языке все, включая числа, строки, функции и даже классы, является. . .
Интеграция Hangfire с RabbitMQ в проектах C#.NET
stackOverflow 18.04.2025
Разработка современных . NET-приложений часто требует выполнения задач "за кулисами". Это может быть отправка email-уведомлений, генерация отчётов, обработка загруженных файлов или синхронизация. . .
Построение эффективных запросов в микросервисной архитектуре: Стратегии и практики
ArchitectMsa 18.04.2025
Микросервисная архитектура принесла с собой много преимуществ — возможность независимого масштабирования сервисов, технологическую гибкость и четкое разграничение ответственности. Но как часто бывает. . .
Префабы в Unity: Использование, хранение, управление
GameUnited 18.04.2025
Префабы — один из краеугольных элементов разработки игр в Unity, представляющий собой шаблоны объектов, которые можно многократно использовать в различных сценах. Они позволяют создавать составные. . .
RabbitMQ как шина данных в интеграционных решениях на C# (с MassTransit)
stackOverflow 18.04.2025
Современный бизнес опирается на множество специализированных программных систем, каждая из которых заточена под решение конкретных задач. CRM управляет отношениями с клиентами, ERP контролирует. . .
Типы в TypeScript
run.dev 18.04.2025
TypeScript представляет собой мощное расширение JavaScript, которое добавляет статическую типизацию в этот динамический язык. В JavaScript, где переменная может свободно менять тип в процессе. . .
Погружение в Kafka: Концепции и примеры на C# с ASP.NET Core
stackOverflow 18.04.2025
Apache Kafka изменила подход к обработке данных в распределенных системах. Эта платформа потоковой передачи данных выходит далеко за рамки обычной шины сообщений, предлагая мощные возможности,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru