Главная->Інформатика та програмування->Содержание->Перечисления и программа подсчета числа слов

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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. В зависимо- сти от контекста задачи такой способ может оказаться проще, чем использова- ние перечислений.

 

15