Студопедия — Проект — форматирование текста
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Проект — форматирование текста






 

Написать программу форматирования текста, читаемого из файла unformt.txt и состоящего из строк ограниченной длины. Слова в строке разделены произвольным количеством пробелов. Программа должна читать входной файл по строкам, форматировать каждую строку и выводить результат в выходной файл formatd.txt. Форматирование заключается в выравнивании границ текста слева и справа пу­тем равномерного распределения пробелов между соседними словами, а также в отступе с левой стороны страницы на margin позиций, то есть результирующий текст должен находиться в позициях margin + 1.. margin + maxl_line. Кроме этого, программа должна подсчитать общее количество слов в тексте.

 

На примере этой задачи мы показываем технологию разработки многофайловых проектов.

 

Алгоритм решения задачи не представляет особой сложности:

  1. Открыть входной файл.
  2. Читать файл построчно в текстовый буфер line, попутно удаляя возможные пробелы в начале строки (до первого слова).
  3. Для каждой строки line выполнить следующие действия:

- Вычислить величину интервала (количество пробелов), которую необходимо обеспечить между соседними словами для равномерного распределения слов в пределах строки.

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

  1. После обработки последней строки входного файла вывести на экран значение счетчика слов и закрыть выходной файл.

Разбиение на подзадачи.

 

В результате детализации описанного алгоритма определяем спецификации нужных нам функций:

 

- void DefInter (const char* pline, int & base_int, int & add_int, int & inter) определяет для строки, на которую указывает pline, количество межсловных промежутков inter, требуемую величину основного интервала base_int для каждого промежутка (количество пробелов) и величину дополнительного интервала add_int, определяемую как остаток от деления общего количества пробелов в строке на количество межсловных промежутков; последняя величина должна быть равномерно распределена путем добавления одного пробела в каждый из первых add_int промежутков;

- void GetLine (FILE* finp, char* pline) читает очередную строку из входного файла в массив символов с адресом pline, ликвидируя при этом пробелы в начале строки;

- void PutInterval (FILE* fout, const int k) выводит очередной интервал, состоящий из пробелов;

- int PutWord (FILE* fout, const char* pline, const int startpos) выводит очередное слово в выходной файл, начиная с позиции startpos текущей строки pline; возвращает номер позиции в строке pline, следующей за последним переданным символом, или 0 — если достигнут конец строки;

- int SearchNextWord (const char* pline, const int curpos) возвращает номер позиции, с которой начинается следующее слово в строке pline, или 0, если достигнут конец строки (поиск начинается с позиции curpos).

 

Разбиение на модули.

 

Наша программа будет располагаться в двух исходных файлах: task7_7.cpp -с функцией main, edit. ерр — с реализацией перечисленных выше функций, а также заголовочный файл edit.h с интерфейсом этих функций.

 

Ниже приводится содержимое этих файлов.

 

//////////////////////////////////////////////////////////////// // Файл Task7_7.cpp #include < stdio.h> #include < string.h> #include < stdlib.h> #include " edit.h" // Глобальные переменные const int maxl_line = 63; const int margin = 5; int main() { FILE* finp; FILE* fout; char line[maxl_line + 1]; int b_i, a_i, start, next, inter; int nword = 0; printf(" Работает программа Task7_7.\n"); if(! (finp = fopen(" unformt.txt", " r"))) { printf(" Файл unformt.txt не найден.\n"); exit(0); } printf(" Читается файл unformt.txt.\n"); if(! (fout = fopen(" formatd.txt". " w"))) { printf(" Файл formatd.txt не создан.\n") exit(0); } printf(" Выполняется запись в файл formated.txt.\n"); whi1e(GetLine(finp. line)) { DefInter(line, b_i, a_i, inter); PutInterval(fout, margin); next = PutWord(fout, line, 0, nword); for (int i = 0; i < inter; i++) { start = SearchNextWord(line, next); PutInterval(fout, b_i); if (a_i) { a_i--; PutInterval(fout, 1); } next = PutWord(fout, line, start, nword); if (! next) break; } fprintf(fout, " \n"); } printf(" \nКоличество слов - %d\n", nword); fclose(fout); printf(" Работа завершена.\n"); return 0; } ///////////////////////////////////////////////////// // Файл Edit.h // Прототипы функций void DefInter(const char* pline, int& base_int, int& add_int, int& inter); int GerLine (FILE*, char*); void PutInterval(FILE*, const int); int PutWord(FILE*, const char*, const int, int&); int SearchNextWord(const char*, const int); // Глобальные переменные extern const int maxl_line; //////////////////////////////////////////////////// // Файл Edit.cpp #include < stdio.h> #include < string.h> #inclede " edit.h" int GetLine(FILE* finp, char* pline) { int i = 0; char c; while ((c = fgetc(finp)) == ' ') i++; if(c == EOF) return 0; fseek(finp, -1, SEEK_CUR); fgets(pline, maxl_line – i + 1, finp); plane[strlen(pline) – 1] =0; return 1; } int SearchNextWord(const char* pline, const int curpos) { int i = curpos; while(pline[i]! = ' ') { if (pline[i] == '\n') return 0; i++; } while (pline[i] == ' ' & & pline[i + 1] == ' ') i++; return i + 1; } void DefInter(const char* pline, int& base_int, int& add_int, int& inter) { int к = 0, end; end = strlen(pline) – 1; while ((pline[end] == ' ') || (pline[end] == '\n') || (paline[end] == '\r')) end; inter = 0; for (unsigned int i = 0; i < end; i++) { if (pline[i] == ' ') { k++; if (pline[i + 1]! = ' ') inter++; } } int blank_amount = k + maxl_llne – end; if (! k) { base int = 0; add_int = 0; } else { base_int = blank_amount / inter; add_int = blank_amount % inter; } return; } int PutWord (FILE* fout, const char* pline, const int startpos, int& n) { int i = startpos; char c; n++; while ((c = pline[i++])! = ' ') { fprintf(fout, " %c", c); if ((c == '\n') || (c == '\0')) {i = 0; break; } } return i - 1; } void PutInterval(FILE* fout, const int k) { for (int i = 0; i < k; i++) fprintf(fout, " "); return; } ///////////////////////////////////////////////////////////

 

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

 

Приведем результаты тестирования этой программы.

Содержимое входного файла unformt.txt1;

23. Не терпеть и малого своего недостатка - вот признак совершенства. От изъянов духовных и телесных редко кто свободен, но часто их лелеют, когда от них легко бы исцелиться. Вчуже досадно видеть разумному, как ничтожный изъян порой портит великолепное сочетание достоинств, - довольно и облачка, чтобы затемнить солнце. Родимые пятна на доброй славе злоба людская сразу подметит - и упорно в них метит. Особенно ценно искусство скрывать свой недостаток, обращая его в преимущество. Так. Цезарь скрывал свою плешь лавровым венком.

Содержимое выходного файла formatd.txt:

 

23. Не терпеть и малого своего недостатка – вот признак совершенства. От изъянов духовных и телесных редко кто свободен, но часто их лелеют, когда от них легко бы исцелиться. Вчуже досадно видеть разумному, как ничтожный изъян порой портит великолепное сочетание достоинств, - довольно и облачка, чтобы затемнить солнце. Родимые пятна на доброй славе злоба людская сразу подметит - и упорно в них метит. Особенно ценно искусство скрывать свой недостаток, обращая его в преимущество. Так. Цезарь скрывал свою плешь лавровым венком.

 

Протестируйте эту программу на других текстах.

 

Давайте повторим наиболее важные моменты этого семинара.

  1. Функция — это именованная последовательность операторов, выполняющая-законченное действие. Функции нужны для упрощения структуры программы.
  2. Интерфейс грамотно написанной функции определяется ее заголовком.
  3. Для вызова функции надо указать ее имя и набор аргументов.
  4. В определении, в объявлении и при вызове функции типы и порядок следования аргументов и параметров должны совпадать.
  5. Передача параметров в функцию может выполняться по значению или по адресу.
  6. Входные данные функции надо передавать по значению или по константной ссылке, результаты ее работы — через возвращаемое значение, а при необходимости передать более одной величины — через параметры по ссылке или указателю.
  7. При написании функции нужно предусмотреть все возможные ошибки и обеспечить пользователя функции средствами их диагностики.
  8. Печать диагностических сообщений внутри функции нежелательна.
  9. Функция может иметь несколько параметров со значениями по умолчанию. Они
    должны находиться в конце списка параметров.
  10. Массивы всегда передаются в функцию по адресу. Количество элементов в массиве должно передаваться отдельным параметром.
  11. Рекурсивная функция должна содержать хотя бы одну нерекурсивную ветвь. При использовании рекурсии следует учитывать возникающие при этом проблемы и накладные расходы.
  12. В многофайловых проектах важно грамотно разбить задачу на подзадачи и распределить функции по файлам.
  13. Для предотвращения ошибок компиляции, связанных с повторным включением заголовочных файлов, следует использовать так называемые стражи включения.






Дата добавления: 2014-11-10; просмотров: 753. Нарушение авторских прав; Мы поможем в написании вашей работы!



Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

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

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

Ганглиоблокаторы. Классификация. Механизм действия. Фармакодинамика. Применение.Побочные эфффекты Никотинчувствительные холинорецепторы (н-холинорецепторы) в основном локализованы на постсинаптических мембранах в синапсах скелетной мускулатуры...

Шов первичный, первично отсроченный, вторичный (показания) В зависимости от времени и условий наложения выделяют швы: 1) первичные...

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

Вопрос 1. Коллективные средства защиты: вентиляция, освещение, защита от шума и вибрации Коллективные средства защиты: вентиляция, освещение, защита от шума и вибрации К коллективным средствам защиты относятся: вентиляция, отопление, освещение, защита от шума и вибрации...

Задержки и неисправности пистолета Макарова 1.Что может произойти при стрельбе из пистолета, если загрязнятся пазы на рамке...

Studopedia.info - Студопедия - 2014-2024 год . (0.009 сек.) русская версия | украинская версия