bound (956658), страница 2

Файл №956658 bound (Все лабы по инфе за 2ой сем на С++) 2 страницаbound (956658) страница 22013-10-10СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

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

Прикладная функция convert вызывается для преобразования символического представления требуемого размера строк результирующего типографического текста, которое было сохранено в поле workbuf структуры FORMBUF функцией gramma, в целочисленный формат поля limit. Для выполнения указанного преобразования можно применить библиотечные функции atoi или sscanf. Его результат нужно сохранить в поле limit структуры FORMBUF и вернуть в основную функцию main. Если полученное значение отрицательно, равно 0 или меньше некоторой разумной величины, например, 32, то дальнейшее выполнение программы BOUND должно быть аварийно завершено с вызовом диагностической функции usage в основной функции main.

Перегрузка операций ввода-вывода

Для перегрузки стандартных операций ввода-вывода в программе BOUND целесообразно предусмотреть 4 прикладные функции: textopen, getbuf, putbuf и closetext. Единственным параметром каждой из них является указатель на структуру FORMBUF. Исходный код этих функций должен предусматривать вызов библиотечных функций буферизованного ввода-вывода, прототипы которых декларирует заголовочный файл <stdio.h> системы программирования C.

Прикладная функция textopen должна вызываться в основной функции main после разбора аргументов командной строки вызова программы BOUND с целью открыть потоки ввода строк из файла исходного текста и вывода строк в результирующий файл типографического текста. Чтобы открыть указанные потоки ввода-вывода, в ее исходном коде должно быть специфицировано обращений к библиотечной функции fopen. Имена файлов, для обработки которых открываются потоки ввода-вывода, должны быть доступны через поля inbuf и outbuf структуры буферов FORMBUF, где они сохраняются при разборе аргументов командной строки.

При этом файл, содержащий исходный текст должен быть открыт в режиме чтения, а результирующий файл для сохранения форматированного текста должен быть открыт в режиме записи. Если любой из указанных файлов не может быть открыт в требуемом режиме доступа, то функция textopen должна возвращать значение системной переменной errno, содержащей код ошибки, в основную функцию main, которая через оператор return передает его в операционную среду вызова программы BOUND, блокируя ее дальнейшее выполнение. Для визуальной диагностики ошибок в функции textopen должен быть предусмотрен вызов библиотечной функции perror, которой передается имя соответствующего файла. Если оба файла успешно открыты, то указатели их потоков сохраняются в соответствующих полях структуры FORMBUF и могут быть использованы для реализации буферизованного ввода-вывода в других функциях этой группы, а функция textopen завершается с нулевым кодом возврата.

Прикладная функция getbuf должна выполнять операцию буферизованного ввода строк из файла исходного текста через поток ввода путем обращения к библиотечной функции fgets. Предельную длину получаемых строк в ней должно ограничивать значение макроопределения BUFSIZ из заголовочного файла <stdio.h> системы программирования C. Для получения очередной строки исходного текста должно быть адресовано поле inbuf структуры буферов FORMBUF, представляющее входной буфер алгоритма форматирования. Для идентификации потока ввода используется поле указателя потока fpin также из структуры FORMBUF. Прикладная функция getbuf должна вызываться во внешнем цикле алгоритма форматирования и возвращать адрес входного буфера или значение нулевого указателя NULL для идентификации конца файла исходного текста.

Прикладная функция putbuf должна обеспечивать буферизованный вывод в поток записи результирующего типографического текста строки, полученной в выходном буфере алгоритма форматирования. Для реализации вывода должна применяться библиотечная функция fputs. Ее аргументы должны адресовать буферное поле outbuf, представляющее выходной буфер алгоритма форматирования, и поле указателя потока вывода fpout структуры FORMBUF. Функция putbuf должна вызываться в циклах алгоритма форматирования, когда заполнен выходной буфер. Ее код возврата должен быть равен нулю. Нулевой код возврата этой функции можно использовать для инициализации длины и содержимого промежуточного буфера алгоритма форматирования.

Прикладная функция closetext должна закрывать потоки обработки файлов, содержащих исходный и результирующий типографический текст, освобождая указатели потоков fpin и fpout в структуре FORMBUF. Для выполнения этих действий следует использовать библиотечную функцию fclose. Прикладная функция closetext должна быть вызвана в основной функции main перед завершением работы программы BOUND. Ее код возврата должен быть равен нулю и передаваться оператору return, который завершает спецификацию основной функции main программы BOUND.

Функции форматирования

Для выполнения операций алгоритма форматирования текста в программе BOUND необходимо предусмотреть 6 прикладных функций: getword, chklimit, putword, expander, trailer и gap. Управление ими должна обеспечивать прикладная функция format, которая должна вызываться в основной функции main после инициализации потоков ввода-вывода. Единственным параметром всех функций форматирования должен быть указатель на структуру FORMBUF. Исходный код перечисленных прикладных функций должен предусматривать обращение к библиотечным функциям обработки символьных строк, форматы вызова которых декларируются в заголовочном файле <string.h> системы программирования C.

Прикладная функция getword должна обеспечивать разбиение содержимого входного буфера inbuf структуры FORMBUF на отдельные слова. Считается, что слова во входном буфере разделяют символы пробелов и табуляций, а последнее слово завершает символ перевода строки. Для выделения слов следует использовать библиотечную функцию strtok, которой передается адрес входного буфера inbuf при поиске первого слова или NULL при поиске остальных слов. Адрес очередного слова должен сохраняться в поле word структуры FORMBUF и передаваться через код возврата прикладной функции getword. Когда содержимое входного буфера inbuf исчерпано, прикладная функция getword должна возвращать значение константы NULL.

Прикладная функция chklimit должна осуществлять проверку возможности дополнить рабочий буфер wordbuf очередным словом входного буфера inbuf, которое адресует поле word структуры FORMBUF. Эта проверка основана на том, что суммарная длина слов в рабочем буфере слов не должна превышать требуемый размер строк результирующего типографического текста, который устанавливает значение поля limit структуры FORMBUF. Для вычисления длины рабочего буфера слов workbuf и текущего слова word необходимо использовать библиотечную функцию strlen. Результат проверки определяет знак разности между суммой вычисленных длин и лимитирующим значением поля limit структуры FORMBUF. Любое положительное значение разности означает невозможность дополнить рабочий буфер слов очередным словом. Полученная величина разности должны быть передана через целочисленный код возврата прикладной функции chklimit.

Прикладная функция putword должна применяться для добавления текущего слова, адресованного полем word, в рабочий буфер слов workbuf структуры FORMBUF. После слова необходимо добавить один символ пробела, чтобы обеспечить разделение слов в буфере workbuf. Для добавления слов и пробелов нужно использовать библиотечную функцию strcat. Целочисленный код возврата прикладной функции putword должен идентифицировать текущий размер рабочего буфера слов, для вычисления которого следует применить библиотечную функцию strlen.

Прикладная функция expander предназначена для выравнивания слов, которые накоплены в рабочем буфере слов wordbuf, по ширине, заданной полем limit структуры FORMBUF. Для выполнения этой процедуры нужно предварительно установить текущий размер рабочего буфера слов и количество промежутков между его словами. Текущий размер рабочего буфера слов определяется эффективной длиной поля wordbuf структуры FORMBUF, которая измеряется с помощью библиотечной функции strlen. Количество промежутков однозначно определяет число пробелов в рабочем буфере слов, потому что каждую пару слов в нем по построению разделяет один символ пробела. Число пробелов можно найти, используя циклический вызов библиотечной функции strrchr. При этом целесообразно заменить каждый пробел на символ с нулевым кодом '\0' для удобства последующей обработки завершаемых им слов.

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

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

Распознавание пустых строк, которые не содержат других символов, кроме необязательных символов пробелов и/или табуляции, и разделяют абзацы исходного текста, должно осуществляться прикладной функцией gap. Она должна обнаруживать во входном буфере inbuf структуры FORMBUF первый символ, отличный от символов пробела и табуляции, и возвращать его код. Таким образом прикладная функция gap должна возвращать код '\n' для пустой строки входного текста или любое другое значение в противном случае. Пропуск начальных пробелов и табуляций во входном буфере должен быть реализован с помощью библиотечной функции strspn.

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

Внешний цикл должен обеспечивать получение очередной строки исходного текста во входной буфер inbuf структуры FORMBUF путем вызова прикладной функции getbuf и распознавание пустой строки в конце абзаца текста по коду возврата прикладной функции gap. При обнаружении пустой входной строки должны быть вызваны прикладная функция trailer с целью обработки конца текущего абзаца текста и прикладная функция putbuf для записи его последней строки, полученной во выходном буфере outbuf структуры FORMBUF в результирующий типографический текст. Итерации внешнего цикла должны продолжаться пока при очередном вызове прикладной функции getbuf не будет обнаружен конец входного потока. После завершения внешнего цикла должен быть предусмотрен вызов прикладных функций trailer и putbuf, соответственно, для формирования и записи последней строки текста.

Внутренний цикл должен выполняться для обработки содержимого входного буфера inbuf структуры FORMBUF с целью формирования и записи строк абзаца результирующего типографического текста. В блоке внутреннего цикла управляющей функции format должен быть реализован вызов прикладных функций getword, chklimit, expander, putword и putbuf в соответствии с алгоритмом форматирования абзацев текста. Итерации внутреннего цикла должны продолжаться пока не будут обработаны все слова входного буфера.

Характеристики

Тип файла
Документ
Размер
96,5 Kb
Тип материала
Высшее учебное заведение

Список файлов лабораторной работы

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