Указания по выполнению заданий c (1012885), страница 3
Текст из файла (страница 3)
Результатом работы программы является количество вхождений слова в текст. Представим его в программе в виде целой переменной. Для хранения длины строки будем использовать именованную константу, а для хранения фактического количества символов в слове — переменную целого типа. Для работы с файлом потребуется служебная переменная соответствующего типа. П. Алгоритм решения задачи 1.
Построчно считывать текст из файла. 2 Просматривая каждую строку, искать в ией заданное слово. При каждом нахождении слова увеличивать счетчик. Деталиэируем второй пункт алгоритма. Очевидно, что слово может встречаться в строке многократно, поэтому для поиска следует организовать цикл просмотра строки, который будет работать, пока происходит обнаружение в строке последовательности символов, составляющих слово. При обнаружении совпадения с символами, составляющими слово, требуется определить, является ли оно отдельным словом, а не частью другого'.
Например, мы задали слово «кот». Эта последовательность символов содержится, например, в словах «котенок», «трикотаж», «трескотня» и «апперкот». Следовательно, требуется проверить символ, стоящий после слова, а в случае, когда слово не находится в начале строки — еще и символ перед словом. Эти символы проверяются на принадлежность множеству знаков пунктуации и разделителей. Ш.
Программа и тестовые примеры Разобьем написание программы на последовательность шагов. Шаг й Ввести «скелет» программы (директивы (гтлс1цбе, функцию ща)п(), описание переменных, открытие файла). Добавить контрольный вывод введенного слова.
Запустив программу, проверить ввод слова и успешность открытия файла. Для проверки вывода сообщения об ошибке следует выполнить программу еще раз, задав имя несуществующего файла. Фтпс1цсе <Свггеащ,ц> зпС ща)л()( сопзС зпС 1еп = 81; спаг ыогб[1еп), 1тпе[1еп1; соцС « " Введите слово для поиска: ": с1л » ыогб; 11зСгеаш 11л("СехС.СхС". 1оз;;1л ( зов::посгеаСе): 11 (111л) ( соцС « " Ошибка открытия файла." « елб1; геСцгп 1: ) геСцгп О; Шаг 2.
Добавить в программу цикл чтения из файла, внутри цикла поставить контрольный вывод считанной строки (добавляемые операторы помечены признаком комментария): Ф)пс1цбе <гзСгеаш.л> 1лС шазп()( сопзС 1пС 1еп = 81: спаг ыогб[1ел), 11пе[1еп]; соцС « " Введите слово для поиска; "; с1п » ыогб; 11эггеаш т)п("СехС.СхС", !оз::1п ! 1оз;:посгеаСе); тб ()т)п) ( соцс " Ошибка открытия файла." « епб1; геСцгп 1: ) Кроме этого, слова может быть написано в разных регистрах, но мы для простоты будем искать точно«совпадениее. ып11е (Гтп.дог)(пе(11пе.
1еп)) ( сонь « 1тпе « епб1. геьитп О: Шаг 3. Добавить в программу цикл поиска последовательности символов, составляющих слово, с контрольным выводом: тттпс!обе <Гзсгеаш.п> У)по!обе <з'ьг)пд.П> // тпь шатп()( сопят 1пт 1еп = 81: слаг ыогЯ1епЕ 11пе(1еп): сои( « "Введите слово для поиска: "; с)п » ыогб; 1пс 1 ыогб - зсг!еп(шогб). 1Гзтгеаш Г1п("Сехг.гхг". тоз::1п ) 1оз::посгеасе); 1Г (!Г1п) ( соис « "Ошибка открытия файла." « епб1; ге1агп 1; ) !пг соопг = О; ип11е (Гтп.дет)тпе(11пе, 1еп)) ( спаг *р = 1тпе: ыП11е( р = зггзсг(р. ыогб)) ( соос « " совпадение: " « р « епб1; р += 1 ыогсц соопг+ -; // // // // // сонь « сооп( « епб); гегогп О; Для многократного поиска вхождения подстроки в заголовке цикла используется функция зтгзтг. Очередной поиск должен выполняться с позиции, следующей за найденной на предыдущем проходе подстрокой.
Для хранения этой позиции определяется вспомогательный указатель р, который на каждой итерации цикла наращивается на длину подстроки. Также вводится счетчик количества совпадений. На данном этапе он считает не количество слов, а количество вхождений последовательности символов, составляютцих слово. Шаг 4. Добавить в программу анализ принадлеткности символов, находящихся перед словом и после него, множеству знаков пунктуации и разделителей: У!по!обе <Гзсгеаш.П> Г/1пс1ибе <вггтпд.л> Г/1пс1ибе <с(уре.П> // 1п( ша1п()( сопят тпв 1еп = 81; спаг ыогб(1епЕ 11пе(1еп); сонг « " Введите слово для присна: ": стп » ыогб; 1пс 1 ыогб = згг!еп(ыогб): ттзггеаш т)п(?бехг Схг", тоз::тп / тоз::посгеате); !Г (!Гтп) ( сон( < "Ошибка открытия файла." « епб1, гетигп 1, ) тпь соопт - О: ыП11е (Гтп.дет11пе(11пе.
1еп)) ( сдаг *р = 1!пе; шП11е( р = 5ггвгг(р, иогб)) сПаг *с = р: // р +- 1 ыогб; // слово не в начале строки? 1Г (с != 11пе) // сиивол перед словои не разделитель? 1Г ( 11зрнпсс(*(с - 1) ) Ы 1'1сврасе(*(с - 1) )) солт(пие: // // сиивол после слова разделитель? 1Г ( тзрипсс(*р) () твзрасе(*р) )) (*р =- 'тО') ) сонат«+, соис « "Количество вхошдений слова: " « соопг « епб); гесыгп О: Здесь вводится служебная переменная с для хранения адреса начала вхождения подстроки.
Символы, ограничивающие слово. проверяются с помощью функций 1вропст и 1ззрасе, прототипы которых хранятся в заголовочном файле <с(уре. П>, Символ, стоящий после слова, проверяется также на признак конца строки (для случая, когда искомое слово находится в конце строки). Для тестирования программы требуется создать файл с текстом, в котором задан- ное слово встречается: я в начале строки; Ся в конце строки; Ся в середине строки; С( несколько раз в одной строке; С) как часть других слов, находящаяся в начале, середине и конце этих слов; С) в скобках, кавычках и других разделителях.
Длина хотя бы одной из строк должна быть равна 80 символам. Для тестирования программы следует выполнить ее по крайней мере два раза: введя с клавиатуры слово, содержащееся в файле, и слово, которого в нем нет, Давайте теперь рассмотрим другой вариант решения этой задачи. В библиотеке есть функция зсгсод, которая разбивает переданную ей строку на лексемы в соот- ветствии с заданным набором разделителей. Если мы воспользуемся этой функ- цией, нам не придется «вручную» выделять и проверять начало и конец слова, потребуется лишь сравнить с искомым словом слово, выделенное с помощью всгсок, Правда, список разделителей придется задать вручную: О!пс1ибе <Свггеаш.П> ()1пс1исе <втгтпО.П> 1пС ша(п()( сопвС тпС 1еп = 81; слег ыбг<)[)епЕ 11пе[1епП слаг ое1тшв[1 = ",.!? /<>!)(*:;!""; соиС « "Оведите слово для поиска: ": с1п » иог<0 ттвфгеаш т(п("СехС.СхС", тов::1и ) 1ов::посгеаге): тт (!ттп) ( соиС « "Ошибка открытия файла." « епб1; геСигп 1; ) слаг *СоСеп; 1пС соипС = 0: ип11е (т!п.9еС11пе(11пе.
1еп)) ( СоСеп = вСгСоС( 1!не. Ое!(шв ). // 1 иП11е( Сокеп != Й0[С ) ( 1[ ( !вСгсшр (СоСеп, шогб) )соипС++; Н 2 Седел = вфгСоС( МОСС. Ое11шв ); // 3 соиС "Количество вхождений слова: " « соипС еп01: геСигп 0: ) Первый вызов функции всгсоС в операторе 1 формирует адрес первой лексемы (слова) строки 1! пе.
Он сохраняется в переменной Сеген. Функция вСгСоС заменяет на МОСС разделитель, находящийся после найденного слова, поэтому в операторе 2 можно сравнить на равенство искомое и выделенное слово. В операторе 3 выполняется поиск следующей лексемы в той же строке. Для этого следует задать в функции вСгСоС в качестве первого параметра 00[[. Как видите, программа стала короче и яснее. На этом примере можно видеть, что средства, предоставляемые языком, влияют на алгоритм решения задачи, и поэтому перед тем, как продумывать алгоритм, необходимо эти средства изучить. Представьте, во что бы вылилась программа без использования функций работы со строками и символами! поэтому ограничиться буфером на одну строку в данной задаче нельзя.
Примем решение выделить буфер, в который поместится весь файл. результаты являются частью исходных данных, поэтому дополнительного пространства под них выделять не требуется. Будем хранить длину файла в переменной длинного целого типа. Для организации вывода предложений понадобятся переменные того же типа, хранящие позиции начала и конца предложения. П. Алгоритм решения задачи 1. Открыть файл. 2.
Определить его длину в байтах. 3. Выделить в динамической памяти буфер соответствующего размера. 4. Считать файл с диска в буфер. 5. Лнализируя буфер посимвольно, выделять предложения. Если предложение оканчивается вопросительным знаком, вывести его на экран, Детализируем последний пункт алгоритма. Для вывода предложения необходимо хранить позиции его начала и конца. Предложение может оканчиваться точкой, восклицательным или вопросительным знаком. В первых двух случаях предложение пропускается.
Это выражается в том, что значение позиции начала предложения обновляется. Оно устанавливается равным символу, следующему за текущим, и просмотр продолжается. В случае обнаружения вопросительного знака предложение выводится па экран, после чего также устанавливается новое значение позиции начала предложения. 111. Программа и тестовые примеры Ниже приводится текст программы. Рекомендуем вам самостоятельно разбить его для отладки на последовательность шагов аналогично предыдущим примерам, вставляя н удаляя отладочную печать. Файл с тестовым примером должен содержать предложения различной длины (от нескольких символов до несколы<их строк), в том числе и вопросительные. У1пс)ибе <гвСгеаш.л> ()1пс)ибе <вС01о.л> тпС шатп()( тгвггеаш т!и("СехС.СхС".
1ов::1и / 1оз::посгеаге): тт (!т!и) ( соиС « "Ошибка .открытия файла." « еп01; геСигп 1; ) // б Н 7 Н 8 Задача 5.3. Вывод вопросительных предложений Написать программу, которая считывает текст из файла и выводит на экран тол в- ко вопросительные предложения из этого текста. 1.