Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Программа подсчета слов






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

Во-первых, программа должна выполнять посимвольный ввод, а также иметь возможность узнавать, когда останавливаться. Во-вторых, она должна быть способна распознавать и подсчитывать такие элементы, как символы, строки и слова. Вот представление этой программы в виде псевдокода:

читать символ

пока еще имеются входные данные

инкрементировать счетчик символов

если строка прочитана, инкрементировать счетчик строк

если слово прочитано, инкрементировать счетчик слов

читать следующий символ

Вы уже имели дело с моделью цикла ввода:

while ((ch = getchar ())! = STOP)

{

}

Здесь STOP представляет некоторое значение для ch, сигнализирующее о конце ввода. В примерах, рассмотренных до сих пор, для этой цели использовались символы новой строки и точки, однако ни один из них не подходит для универсальной программы подсчета слов. На данный момент выберем символ (такой как, например, |), который редко встречается в тексте.

Теперь приступим к рассмотрению тела цикла. Так как для ввода в программе используется функция getchar (), подсчет символов можно вести, инкрементируя счетчик при каждой итерации цикла. Для подсчета количества строк программа может проверять наличие символов новой строки. Если программа сталкивается с символом новой строки, она должна инкрементировать счетчик строк. Потребуется еще решить, что делать, если символ STOP встречается в середине строки. Должен ли он учитываться как строка? Один из ответов предполагает трактовку строки как неполной, т.е. строки, в которой содержатся различные символы, но нет символа конца строки. Этот случай можно идентифицировать, отслеживая предыдущий прочитанный символ. Если прочитанный символ, предшествующий STOP, не является символом новой строки, то вы имеете неполную строку.

Наиболее запутанная часть программы касается идентификации слов. Прежде все­го, необходимо дать определение, что понимается под словом. Давайте выберем отно­сительно простой подход и определим слово как последовательность символов, которая не содержит пробельных символов (символов пробела, табуляции и новой строки). В этом смысле “glymxck” и “r2d2” являются словами. Слово начинается, когда программа впервые встречает символ, отличный от пробельного, и заканчивается, когда появляется следующий пробельный символ. Ниже показано простейшее проверочное выражение, которое обеспечивает обнаружение символов, отличных от пробельных:

с! = ' ' & & с! = ' \n' & & с! = '\t' /* истинно, если с - не пробельный символ */

Наиболее прямолинейное проверочное выражение, обеспечивающее выявление пробельных символов, имеет следующий вид:

с! = ' ' || с == ' \n' || с == ' \ t' /* истинно, если с - пробельный символ */

Однако проще применить функцию isspace () из ctype.h, которая возвращает значение true, если переданный ей аргумент представляет собой пробельный символ. Таким образом, функция isspace (с) возвращает истинное значение, если с — пробельный символ, и! isspace (с) будет истинным, если с таковым не является.

Чтобы отслеживать, входит ли символ в слово, при считывании первого символа слова можно устанавливать в 1 некоторый флаг (назовем его inword). В этой точке можно также инкрементировать счетчик слов. Затем до тех пор, пока значение inword остается равным 1 (или истинным), последующие непробельные символы не помечают начало слова. При появлении следующего пробельного символа флаг понадобится сбросить в 0 (или ложь), после чего программа будет готова к поиску следующего слова. Представим все сказанное в виде псевдокода:

если с не является пробельным символом и inword ложно

установить inword в истину и посчитать слово

if с является пробельным символом и inword истинно

установить флаг inword в ложь

При таком подходе inword устанавливается в 1 (истина) в начале каждого слова и в 0 (ложь) в конце каждого слова. Слова подсчитываются только в момент, когда значение inword меняется с 0 на 1.

Нам доступен тип _Вооl, можно включить заголовочный файл stdbool. h и использовать ключевое слово bool для типа флага inword, а также true и false для его значений. В противном случае применяйте тип int и значения 1 и 0.

При работе с булевской переменной в качестве условия проверки обычно исполь­зуют значение этой переменной. То есть применяйте

if (inword)

вместо

if (inword == true)

и

if (! inword) вместо

if (inword == false)

Причина в том, что выражение inword == true получает значение true, если inword равно true, и false, если inword равно false, поэтому в качестве условия проверки можно применять просто inword. Аналогично,! inword имеет то же значение, что и выражение inword == false (не истинно — false, а не ложно — true).

 

В листинге 7.7 описанные идеи (идентификация строк, неполных строк и слов) реализованы на языке С.

Листинг 7.7. Программа wordcnt.c

// wordcnt.c -- производит подсчет символов, слов, строк

#include < stdio.h>

#include < ctype.h> // для isspace()

#include < stdbool.h> // для bool, true, false

#define STOP '|'

int main(void)

{

char c; // прочитанный символ

char prev; // предыдущий прочитанный символ

long n_chars = 0L; // количество символов

int n_lines = 0; // количество строк

int n_words = 0; // количество слов

int p_lines = 0; // количество неполных строк

bool inword = false; // == true если символ с находится внутри слова

 

printf(" Введите текст для анализа (| для завершения): \n");

prev = '\n'; // используется для идентификации полных строк

while ((c = getchar())! = STOP)

{

n_chars++; // посчитать символы

if (c == '\n')

n_lines++; // посчитать строки

if (! isspace(c) & &! inword)

{

inword = true; // начало нового слова

n_words++; // посчитать слова

}

if (isspace(c) & & inword)

inword = false; // достигнут конец слова

prev = c; // сохранить значение символа

}

 

if (prev! = '\n')

p_lines = 1;

printf(" символов = %ld, слов = %d, строк = %d, ",

n_chars, n_words, n_lines);

printf(" неполных строк = %d\n", p_lines);

return 0;

}

 

Ниже показан результат выполнения этой программы:

Введите текст для анализа (| для завершения):

Reason is а

powerful servant but

an inadequate master.

|

символов = 55, слов = 9, строк = 3, неполных строк = 0

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.