Скачиваний:
56
Добавлен:
04.03.2014
Размер:
98.82 Кб
Скачать

ФОРМАТИРОВАНИЕ ТЕКСТОВЫХ ФАЙЛОВ

Методические указания для практических занятий

по курсу

Языки программирования высокого уровня

Цель занятия

Целью занятия является практическое изучение методов применения стандартных библиотечных функций буферизованного ввода-вывода системы программирования C для форматирования текстовых файлов.

Формулировка задания

Требуется разработать программу BOUND для форматирования границ строк текстовых документов по заданной ширине. Исходный текстовый документ, подлежащий форматированию, может состоять из произвольного числа строк различной длины, где слова разделены символами пробелов или табуляции. Строки исходного текста группируются в текстовые абзацы, разделенные пустыми строками, в которых нет других символов, кроме пробелов и/или табуляций. Исходный текстовый документ может содержать однострочные заголовки, которые отделены от абзацев пустыми строками, и концептуально эквивалентны однострочным абзацам.

После форматирования должен быть получен типографический текст, где все строки, кроме последних строк абзацев, имеют одинаковую заданную ширину, а последние строки абзацев выровнены по левой границе. Выравнивание границ строк должно достигаться путем переноса лишних слов на следующую строку и регулировки размера промежутков из пробелов между словами текста. При этом размеры промежутков в пределах каждой строки не должны отличаться больше, чем на один пробел.

Исходными данными для программы BOUND являются имена текстовых файлов, где находится подлежащий выравниванию текст и должен быть сосредоточен результат его форматирования, а также требуемая ширина типографического текста. Указанные параметры должны передаваться программе BOUND через аргументы командной строки ее вызова, где каждому из них предшествует идентифицирующий ключ -i, -o или -l, которые обозначают, что следующий аргумент следует интерпретировать как имя входного файла, имя выходного файла и требуемый размер строки типографического текста, соответственно. Использование ключей позволяет перечислять параметры программы BOUND в произвольном порядке. Отсутствие любого ключа или параметра командной строки должно блокировать выполнение программы BOUND.

В результате выполнения программы BOUND должен быть создан текстовый файл с заданным именем, содержащий полученный типографический текст с требуемой шириной строк. В операционную среду вызова программы BOUND в этом случае должен возвращаться нулевой код. Если результирующий файл не может быть создан, программа BOUND должна возвращать ненулевой код и отображать соответствующее диагностическое сообщение через стандартный поток диагностики ошибок.

Программа BOUND должна быть разработана в системе программирования C, с учетом требований современных стандартов ANSI/ISO C, на основе концепций структурного и функционально-ориентированного программирования. Исходный код программы BOUND должен допускать трансляцию в любой реализации компилирующей системы программирования C. Выполняемый код программы BOUND должен быть сформирован для эксплуатации в среде OS UNIX.

Алгоритм форматирования текста

В программе BOUND должен быть реализован алгоритм форматирования, ориентированный на построчную обработку содержимого исходного текста. Его основу составляют циклы обработки строк исходного текста и слов в каждой полученной строке для формирования выходных строк, которые образуют результирующий типографический текст. Информационную поддержку итераций указанных циклов обеспечивают три символьных буфера: входной, выходной и промежуточный. Каждый из буферов имеет фиксированный размер, который гарантированно превышает длину любой строки исходного текста.

Итерации внешнего цикла алгоритма форматирования должны продолжаться, пока не достигнут конец исходного текста. На каждой итерации очередная строка исходного текста размещается во входном буфере для обработки ее слов во внутреннем цикле алгоритма форматирования. Его итерации должны продолжаться, пока не рассмотрены все слова текущего входного буфера.

Итерации внутреннего цикла алгоритма форматирования должны обеспечивать разбиение входного буфера на отдельные слова, которые последовательно накапливаются в промежуточном буфере через один пробел. Добавление слов в промежуточный буфер может продолжаться, пока его текущий размер не превышает предел, установленный шириной результирующего типографического текста. Когда превышен указанный предел, все слова, накопленные в промежуточном буфере, должны быть последовательно переписаны в выходной буфер, содержимое которого предварительно инициализируется пробелами. Взаимное расположение слов в выходном буфере должно обеспечивать выравнивание его содержимого по требуемой ширине слов результирующего типографического текста.

Для выравнивания выходного буфера по заданной ширине строк необходимо вычислить величины промежутков из пробелов между словами в нем. Базовую величину промежутка определяет результат целочисленного деления разности между заданной шириной типографического текста и суммарной длиной слов на количество промежутков между словами. Остаток от деления указанных величин должен быть равномерно распределен между всеми промежутками, путем добавления не больше, чем одного пробела между каждой парой слов. Таким образом, расположение каждого слова в выходном буфере рекурсивно определяется длиной предыдущего слова плюс величина промежутка между словами.

Сформированный выходной буфер должен быть дополнен символом перевода строки и переписан в результирующий типографический текст. После этого промежуточный буфер должен быть очищен и продолжены итерации внутреннего цикла для обработки оставшихся слов входного буфера. Когда все слова из входного буфера будут перенесены в промежуточный буфер, во входном буфере должна быть размещена следующая строка исходного текста, которая предоставляет свои слова для заполнения промежуточного буфера на следующей итерации внутреннего цикла алгоритма форматирования.

Следует отметить, что иначе должны обрабатываться пустые строки исходного текста, которые идентифицируют границы абзацев. При получении пустой строки во входной буфер, итерации внутреннего цикла алгоритма форматирования не должны выполняться, поэтому содержимое промежуточного буфера, сохраняется неизменным. С другой стороны расположение слов в промежуточном буфере, где слова выровнены по левой границе и разделены одним пробелом, соответствует требуемому формату последней строки абзаца типографического текста. Поэтому при получении пустой строки достаточно скопировать промежуточный буфер в выходной буфер, дополнив его парой символов перевода строки и записать содержимое полученного выходного буфера в результирующий типографический текст. После этого необходимо очистить промежуточный буфер для выполнения последующих итераций алгоритма форматирования. Необходимо также помнить, что рассмотренную процедуру обработки конца абзаца следует выполнить после выхода из внешнего цикла алгоритма форматирования, если последняя строка исходного текста не является пустой.

Очевидно, что рассмотренная процедура обработки конца абзаца должна выполняться только при непустом промежуточном буфере, когда в нем есть хотя бы одно слово. Промежуточный буфер автоматически оказывается пустым, если исходный текст содержит фрагменты из двух и более расположенных подряд пустых строк или когда исходный текст начинается с пустой строки. В этих ситуациях достаточно записать в выходной буфер и, соответственно, в результирующий типографический текст только символ перевода строки при получении каждой пустой строки исходного текста во входной буфер.

Соседние файлы в папке Инфа - бесценно