ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 4) онлайн
Перечисления и программа подсчета числа слов
Наша следующая программа подсчитывает количество слов в предложении,- вво- димом с клавиатуры пользователем. Структура работы программы показана на рис. 4.10.
Флаг isWord

Рис. 4.10. Работа программы WDCOUNT
В отличие от примера CHCOUNT, здесь мы уже не будем сводить подсчет слов к подсчету введенных пробелов (хотя наша программа все еще не будет обраба-
тывать табуляции и прочие разделяющие символы). Мы используем перечис- ляемый тип данных с двумя значениями. Вот листинг программы WDCOUNT:
// wdcount.cpp
// подсчет числа слов в предложении с использованием перечислений
#include <iostream>
using namespace std;
#include <conio.h> // для getche()
enum itsaWord { NO, YES }; // NO=0, YES=1
int main()
{
itsaWord isWord = NO; // isWord равно YES, когда
// вводится слово, и NO, когда вводятся пробелы
char ch='a'; // считывание символа с клавиатуры
int wordcount = 0; // число слов
cout << "Введите предложение: \n";
do {
ch = getche(); // ввод символа
if( ch==' ' || ch=='\r' ) // если введен пробел,
{
if( isWord == YES ) // а до этого вводилось слово,
{ // значит, слово закончилось
wordcount++; // учет слова
isWord = NO; // сброс флага
}
} // в противном случае
else // ввод слова продолжается
if ( isWord == NO ) // если начался ввод слова,
isWord = YES; // то устанавливаем флаг
} while( ch !='\r' ); // выход по нажатию Enter
cout << "\n---Число слов: " << wordcount << "---\n";
return 0;
}
Программа считывает символы с клавиатуры в цикле do. Она не выполняет никаких дополнительных действий над непробельными символами. Когда с кла- виатуры вводится пробел, счетчик количества слов увеличивается на единицу, после чего программа игнорирует все пробелы, вводимые до появления первого непробельного символа. Далее программа снова «пропускает» непробельные сим- волы до появления пробела, увеличивает счетчик количества слов на единицу и т. д. Для того чтобы реализовать подобный алгоритм, программе необходимо различать, вводится ли в данный момент слово или последовательность пробе- лов. Для этого используется переменная isWord перечисляемого типа itsaWord, определенного следующим образом:
enum itsaWord { NO, YES };
Переменные типа itsaWord могут иметь только два различных значения: NO и YES. Обратите внимание на то, что перечисление начинается со значения NO; это означает, что этому значению будет соответствовать внутреннее представле- ние в виде целого числа 0, которое, как мы знаем, может интерпретироваться еще и как ложное значение (мы могли бы использовать вместо перечисляемого типа стандартный тип bool).
В начале работы программы переменной isWord присваивается значение NO. Как только с клавиатуры буден получен первый непробельный символ, значе-
ние переменной изменится на YES и будет сигнализировать о том, что в данный момент вводится слово. Значение YES будет сохраняться за переменной isWord до тех пор, пока с клавиатуры не будет введен пробел. Ввод пробела означает конец слова, поэтому переменная isWord получит значение NO, которое будет сохранять- ся до тех пор, пока не появится непробельный символ. Мы знаем, что значения NO и YES на самом деле представлены как 0 и 1, однако не используем этот факт. Мы могли бы использовать запись if(isWord) вместо if( isword == YES) и if( !isWord) вместо if( isword == NO ), но это не является хорошим стилем программирования.
Обратите внимание на то, что нам необходимы дополнительные фигурные скобки вокруг второго из операторов if, чтобы последующий else сочетался не со вторым if, а с первым.
Для того чтобы организовать флаг в ситуациях, подобных рассмотренной в программе WDCOUNT, можно воспользоваться переменной типа bool. В зависимо- сти от контекста задачи такой способ может оказаться проще, чем использова- ние перечислений.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
