![]() Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Программа подсчета слов ⇐ ПредыдущаяСтр 4 из 4
Теперь вы располагаете всеми инструментами для написания программы подсчета слов (т.е. программы, которая читает входной текст и сообщает количество найденных в нем слов). Параллельно можно также подсчитывать символы и строки. Давайте посмотрим, что такая программа должна включать. Во-первых, программа должна выполнять посимвольный ввод, а также иметь возможность узнавать, когда останавливаться. Во-вторых, она должна быть способна распознавать и подсчитывать такие элементы, как символы, строки и слова. Вот представление этой программы в виде псевдокода: читать символ пока еще имеются входные данные инкрементировать счетчик символов если строка прочитана, инкрементировать счетчик строк если слово прочитано, инкрементировать счетчик слов читать следующий символ Вы уже имели дело с моделью цикла ввода: while ((ch = getchar ())! = STOP) { … } Здесь STOP представляет некоторое значение для ch, сигнализирующее о конце ввода. В примерах, рассмотренных до сих пор, для этой цели использовались символы новой строки и точки, однако ни один из них не подходит для универсальной программы подсчета слов. На данный момент выберем символ (такой как, например, |), который редко встречается в тексте. Теперь приступим к рассмотрению тела цикла. Так как для ввода в программе используется функция getchar (), подсчет символов можно вести, инкрементируя счетчик при каждой итерации цикла. Для подсчета количества строк программа может проверять наличие символов новой строки. Если программа сталкивается с символом новой строки, она должна инкрементировать счетчик строк. Потребуется еще решить, что делать, если символ STOP встречается в середине строки. Должен ли он учитываться как строка? Один из ответов предполагает трактовку строки как неполной, т.е. строки, в которой содержатся различные символы, но нет символа конца строки. Этот случай можно идентифицировать, отслеживая предыдущий прочитанный символ. Если прочитанный символ, предшествующий STOP, не является символом новой строки, то вы имеете неполную строку. Забиваем Сайты В ТОП КУВАЛДОЙ - Уникальные возможности от SeoHammer
Каждая ссылка анализируется по трем пакетам оценки: SEO, Трафик и SMM.
SeoHammer делает продвижение сайта прозрачным и простым занятием.
Ссылки, вечные ссылки, статьи, упоминания, пресс-релизы - используйте по максимуму потенциал SeoHammer для продвижения вашего сайта.
Что умеет делать SeoHammer
— Продвижение в один клик, интеллектуальный подбор запросов, покупка самых лучших ссылок с высокой степенью качества у лучших бирж ссылок. — Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта. — Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы). — SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание. SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение Наиболее запутанная часть программы касается идентификации слов. Прежде всего, необходимо дать определение, что понимается под словом. Давайте выберем относительно простой подход и определим слово как последовательность символов, которая не содержит пробельных символов (символов пробела, табуляции и новой строки). В этом смысле “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. Сервис онлайн-записи на собственном Telegram-боте
Попробуйте сервис онлайн-записи VisitTime на основе вашего собственного Telegram-бота:— Разгрузит мастера, специалиста или компанию; — Позволит гибко управлять расписанием и загрузкой; — Разошлет оповещения о новых услугах или акциях; — Позволит принять оплату на карту/кошелек/счет; — Позволит записываться на групповые и персональные посещения; — Поможет получить от клиента отзывы о визите к вам; — Включает в себя сервис чаевых. Для новых пользователей первый месяц бесплатно. Зарегистрироваться в сервисе При работе с булевской переменной в качестве условия проверки обычно используют значение этой переменной. То есть применяйте 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
|