Скачиваний:
64
Добавлен:
22.06.2014
Размер:
119.3 Кб
Скачать

3. Описание алгоритма программы.

3.1. Переменные и константы.

В начале программы следует описание всех переменных и констант используемых при решении задачи.

Константы:

  • max - размер максимально возможной длины строки для расчёта (присвоено значение 70). Согласно условию задания, строки в текстовом файле, в которых свыше 70 символов, обрабатываться не будут;

  • bak – константа для указания расширения файла резервной копии;

  • about – информация об авторе;

  • bigстрока содержащая текст предупреждения о том что в файле присутствуют строки превышающие максимальный размер (max).

Переменные:

  • n - Размер максимальной строки, т.е. строки по которой будет происходить выравнивание всего текста;

  • d - Количество пробелов в строке;

  • z - Количество пустых символов в конце строки недостающих до максимальной строки;

  • all - Общее количество пробелов и пустых символов в строке;

  • m – Длина строки;

  • c – Количество разрывов в строке между словами;

  • need – Необходимое, среднее, количество пробелов в каждом разрыве, для форматирования;

  • y – Разница в длине отформатированной строки от максимальной перед выравниванием;

  • i, j – Служебные переменные для циклов;

  • fin, fou – Переменные инициализации входного и выходного файла;

  • k – Количество букв в имени текстового файла;

  • bФлаг наличия пробела в предыдущем символе, false – нет пробела, true – есть пробел;

  • g – Флаг наличия в файле строки больше максимально допустимой;

  • f – Переменная для хранения текущей строки;

  • name, name_bak – Имена файлов оригинала и резервной копии;

  • a – Массив для хранения номера позиций начал разрывов в строке;

  • eМассив для хранения количества пробелов в каждом разрыве строки;

  • r – Массив для хранения длин каждого слова в строке.

3.2. Алгоритм работы программы.

Программа состоит из основного (управляющего) модуля и пяти процедур:

  • open - Процедура открытия файла, и создание резервной копии;

  • calc_end – Процедура удаления пробелов в конце строки;

  • calc_string Процедура расчёта количества и расположения пробелов;

  • calc_itog Процедура расчёта нового расположения пробелов;

  • string_edit Процедура формирования новой строки.

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

После ввода имени файла происходит вызов процедуры open для его инициализации.

Процедура open.

Входные данные:

  • nameимя файла.

Внутренние переменные:

  • name_bak - имя резервного файла;

  • fin, fouПеременные инициализации входного и выходного файла;

  • kКоличество букв в имени текстового файла.

Выходные данные:

  • Инициализированный файл fin.

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

После создания имени резервной копии производится процедура инициализации и открытия файла. Если файла с данным именем не существует, то программа выдаст сообщение «Файл не найден!» и завершит свою работу.

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

По завершению процедуры open, управляющий модуль начинает производить начальные установки необходимые для расчёта «состояния» строк в файле, т.е. вычисление строки по которой будет производится выравнивание всего текста, а также наличия в файле строк длина которых превышает максимально допустимую (>70).

Расчёт происходит последовательной проверкой размера каждой строки. Если хоть одна строка превышает максимально допустимую длину, то флагу g присваивается значениеtrue. Длина строки с максимальным, но не превышающим норму, размером записывается в переменнуюn, по этой длине будет производится выравнивание всего текста.

Форматирование строк к заданной длине производится поочерёдным считыванием (от начала файла) длин строк и последовательным выполнением над ними процедур calc_end, calc_string, calc_itog, string_edit.

Процедура calc_end.

Входные данные:

  • m– Длина строки;

  • f– Переменная для хранения текущей строки.

Выходные данные:

  • m– Длина строки;

  • f – Переменная для хранения текущей строки.

Данная процедура необходима для того, чтобы удалить в конце строки возможные пробелы, т.к. алгоритм данной программы будет некорректно рассчитывать количество разрывов в строке, если в конце строки будут находиться пробелы, а не пустые символы. Более подробно это об этом в описании процедуры расчёта строк calc_string.

Удалении происходит путём просмотра последнего символа строки и если он равен пробелу, то он удаляется. Данная операция производится до тех пор, пока последний символ не станет «неравным» пробелу. В конце процедуры производится считывание новой длины строки.

Процедура calc_string.

Входные данные:

  • m– Длина строки;

  • f – Переменная для хранения текущей строки.

Внутренние переменные:

  • bФлаг наличия пробела в предыдущем символе.

Выходные данные:

  • a – Массив для хранения номера позиций начал разрывов в строке;

  • eМассив для хранения количества пробелов в каждом разрыве строки;

  • r – Массив для хранения длин каждого слова в строке;

  • d– Количество пробелов в строке;

  • c– Количество разрывов в строке между словами.

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

Анализ строки производится последовательно от начала строки по одному символу и до конца строки. Если символ равен пробелу, то соответственно общее кол-во пробелов (d) увеличивается на 1.

  • Расчёт кол-ва, размера и начальных позиций разрывов производится путём использования флага наличия пробела в предыдущем символе – b (false – нет пробела, true – есть пробел). Происходит это следующим образом:

Начальное значение b=false,. т. к. нулевой символ не может быть пробелом. При нахождении пробела проверяется значение флага b, и т.к. в нём говорится, что предыдущий символ не пробел то, значит, начался разрыв. Общее кол-во разрывов (c=c+1) увеличивается на 1, а в матрицу a, в ячейку с номером разрыва, записывается текущая позиция пробела, как позиция начала разрыва. Также в матрице e, значение ячейки под номером разрыва, увеличивается на 1, т.е. размер разрыва увеличиваем на 1. Значение флага b меняется на true, т.к. для следующего символа предыдущий является пробелом.

Производится переход к следующему символу. Если там снова пробел, то не происходит никаких изменений, кроме увеличения размера разрыва на 1 (e[c]=e[c]+1). Так повторяется до тех пор пока символ не станет «неравным» пробелу (если позиция окажется «пустой», т.е. конец строки, то получится что там закончился разрыв, хотя разрыва там нет. Чтобы этого не происходило, использовалась функция calc_end), при этом значению флага b возвращается значение false (т.е. пробелы кончились, разрыв соответственно тоже).

При нахождении следующих разрывов, операция повторяется.

После расчёта всей строки производится вычисление длины всех слов в строке по формуле r[i]:=a[i+1]-(a[i]+e[i]), где i от 1 до с-1.

Процедура calc_itog.

Входные данные:

  • c– Количество разрывов в строке между словами;

  • m – Длина строки;

  • n - Размер максимальной строки.

Внутренние переменные:

  • z - Количество пустых символов в конце строки недостающих до максимальной строки;

  • all - Общее количество пробелов и пустых символов в строке.

Выходные данные:

  • need – Необходимое, среднее, количество пробелов в каждом разрыве, для форматирования.

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

Сначала производится вычисление кол-ва пустых символов с правого конца строки: z:=n-m, т.е. разница между текущей длиной строки и необходимой. Далее к этому числу прибавляется общее кол-во пробелов в строке d, тем самым вычисляется общее кол-во пустых позиций в строке (all:=z+d).

Количество пробелов на каждый разрыв строки находим как need:=round(all/c).

Где: all – общее кол-во пустых позиций в строке;

c – кол-во разрывов в строке.

Результат округляется до целого числа.

Процедура string_edit.

Входные данные:

  • f – Переменная для хранения текущей строки;

  • need – Необходимое, среднее, количество пробелов в каждом разрыве, для форматирования;

  • a – Массив для хранения номера позиций начал разрывов в строке;

  • r – Массив для хранения длин каждого слова в строке;

  • eМассив для хранения количества пробелов в каждом разрыве строки.

Внутренние переменные:

  • m – Длина строки;

  • y – Разница в длине отформатированной строки от максимальной, перед выравниванием.

Выходные данные:

  • f – Переменная для хранения текущей строки.

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

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

Активизируется цикл от 1 до с (с – количество разрывов). Начиная с позиции записанной в ячейке под номером разрыва матрицы а, удаляется символов ровно столько, сколько записано в матрице e для данного разрыва. Затем с позиции первого пробела последовательно вставляются пробелы в количестве указанном в переменной need.

Для того чтобы перейти к следующему разрыву, необходимо рассчитать новую позицию начальной координаты следующего разрыва, т.к. количество пробелов в текущем разрыве изменилось, то соответственно координата начала следующего разрыва сместилась. Данное вычисление производится по формуле: a[i+1]:=a[i]+need+r[i].

После того как все разрывы будут изменены, программа считывает новое значение длины строки и сравнивает с необходимым значением (n). Так как расчет кол-ва пробелов в каждом разрыве вёлся с округлением (need:=round(all/c)), то длина может не совпадать с номиналом. В условии задания сказано, что кол-во пробелов в разрывах может отличаться на 1. Поэтому для выравнивания строк последовательно добавляется или удаляется (в зависимости от того больше строка или меньше номинала) в разрывы, начиная от первого, по одному пробелу, пока длина строк не станет равной.

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

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