bound (Все лабы по инфе за 2ой сем на С++)

2013-10-10СтудИзба

Описание файла

Файл "bound" внутри архива находится в следующих папках: Все лабы по инфе за 2ой сем на С++, Инфа - бесценно. Документ из архива "Все лабы по инфе за 2ой сем на С++", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "информатика" в общих файлах.

Онлайн просмотр документа "bound"

Текст из документа "bound"

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

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

по курсу

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

Цель занятия

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Структура программы

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

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

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

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

Структуры данных

Обмен данными между прикладными функциями программы BOUND должен осуществляться через структуру буферов FORMBUF. Эта структура должна быть определена в блоке основной функции main и адресована во все прикладные функции программы BOUND, где доступна декларация ее полей.

Информационную основу структуры буферов FORMBUF должны составлять три буферных поля, которые представляют собой символьные массивы с именами, например, inbuf, outbuf и workbuf. В основном они предназначаются для буферизации входных, выходных и промежуточных данных при выполнении итераций алгоритма форматирования. Кроме того эти буферные поля могут быть использованы для получения аргументов командной строки вызова программы BOUND перед выполнением итераций алгоритма форматирования.

Буферные поля структуры FORMBUF должны иметь фиксированный размер, который может быть макроопределен величиной константы BUFSIZ из заголовочного файла <stdio.h> системы программирования C. Независимо от конкретной реализации системы программирования C значение константы BUFSIZ не может быть меньше, чем 512 байт, следовательно, достаточно для корректного форматирования текстов в большинстве практически интересных случаев.

Дополнительно к буферным полям в структуре FORMBUF нужно предусмотреть еще несколько полей. В частности, необходимо отдельное поле, например, word для хранения указателя слов входного буфера, два поля, например, fpin и fpout для указателей потоков ввода-вывода, а также поле, которое фиксирует целочисленный размер строк типографического текста. Его можно назвать, например, limit. Перечисленные дополнительные поля должны обеспечивать хранение данных типов char*, FILE* и int, соответственно.

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

Анализ командной строки

Для анализа аргументов командной строки вызова программы BOUND следует предусмотреть 3 прикладные функции: gramma, usage и convert. Обращение к ним должно быть специфицировано в начале исходного кода основной функции main программы BOUND.

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

Для сравнения аргументов вектора с ключами необходимо применить библиотечную функцию strcmp. Обнаруженные имена исходного и результирующего файлов нужно скопировать, соответственно, в поля inbuf и outbuf структуры FORMBUF. Копию аргумента, который определяет размер строк результирующего типографического текста, следует сохранить в поле workbuf структуры FORMBUF. Копирование указанных аргументов должен обеспечить вызов библиотечной функции strcpy. При этом буферные поля структуры FORMBUF должны быть предварительно инициализированы нулевым кодом.

Результат грамматического разбора аргументов командной строки вызова программы BOUND определяет величина логического произведения (&) кодов начальных символов трех буферных полей структуры FORMBUF. Прикладная функция gramma должна передавать значение этого произведения в основную функцию main через целочисленный код возврата. Нулевой код возврата означает отсутствие хотя бы одного из ключевых или информативных параметров в командной строке вызова программы BOUND.

При нулевом коде возврата прикладной функции gramma из основной функции main должна вызываться прикладная функция usage. Она должна отображать через поток протокола стандартной диагностики (stderr) информационное сообщение, содержащее описание корректного формата командной строки вызова программы BOUND. Для отображения указанной диагностики должна применяться библиотечная функция fprintf. Прикладная функция usage всегда должна завершаться возвратом отрицательного числа, которое через оператор return основной функции main передается в операционную среду вызова программы BOUND, обозначая аварийное завершение ее выполнения.

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5173
Авторов
на СтудИзбе
437
Средний доход
с одного платного файла
Обучение Подробнее