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

3.3. Выбор набора тестов

Для проверки работоспособности программы в тесте необходимо учесть следующие моменты:

  • Как программа отформатирует строку содержащую больше 70 символов;

  • Как программа отформатирует строку содержащую пробелы в конце строки;

  • Как программа отформатирует строку содержащую пробелы в начале строки;

  • Как программа отформатирует строку не содержащую текста;

  • Как программа отформатирует строку не содержащую разрывов;

  • Будет ли произведено создание файла резервной копии.

Для теста создадим файл test.txt с учётом всех перечисленных вариации состояния строк. Результат теста отображен в Приложении 2.

Примечание: Т.к. в MS Word ширина всех символов различна, то в данном документе выравнивание, при визуальном просмотре, выглядит некорректным. Для оценки результатов теста лучше просматривать сами тестовые файлы (к программе прилагаются) текстовым редактором NC или подобным.

4. Заключение.

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

Список литературы.

        1. Фаронов В.В. TurboRascal 7.0. Начальные курс. Учебное пособие. Москва: «Нолиджс». 1999г.

        2. Фаронов В.В. TurboRascal 7.0. Практика программирования. Учебное пособие. Москва: «Нолиджс». 1999г.

        3. Немнюгин С. А. Турбо-Паскаль. Учебник. Санкт-Петербург: «Питер», 2001 г.

Приложение 1

Листинг программы

program KP;

uses CRT;

var

n:integer; {Размер максимальной строки}

d:integer; {Кол-во пробелов в строке}

z:integer; {Кол-во пустых символов в конце строки недостающих до max строки}

all:integer; {Общее кол-во пробелов z+d}

m:integer; {Кол-во символов в строке}

c:integer; {кол-во разрывов в строке}

need:integer; {Необходимое, среднее, кол-во пробелов в каждом разрыве}

y:integer; {Разница в длине отформатированной строки от максимальной перед выравниванием}

i,j:integer; {служебные переменные для циклов}

fin,fou: text;{переменные инициализации входного и выходного файла}

k:word; {Кол-во букв в имени файла}

b:boolean; {Флаг наличия пробела в предыдущем символе, 0-нет пробела, 1-есть пробел}

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

f:string; {Переменная для хранения текущей строки}

name,name_bak:string; {имена файлов оригинала и резервной копии}

a:array [0..70] of integer; {массив для хранения позиций начал разрывов в строке}

e:array [0..70] of integer; {массив для хранения кол-ва пробелов в каждом разрыве строки}

r:array [0..70] of integer; {массив для хранения длин каждого слова в строке}

const

max = 70; {максимально возможная длина строки для расчёта}

bak = '.bak'; {расширение для файла резервной копии}

about = 'Данная программа выполнена студентом ТМЦДО --------., ---------.';

big = 'В файле существуют строки размер которых превышает 70 знаков! После обработки они остануться без изменений!';

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

begin

k:=pos('.',name); {считывание кол-ва букв в имени файла}

if k=0 then

k:=length(name)+1;

name_bak:=copy (name,1,k-1)+bak; {генерируется имя резервного файла}

assign (fin,name);

{$I-}

reset(fin);

{$I+}

if IOResult<>0 then {Проверка ошибок ввода-вывода при открытии файла}

begin

writeln ('Файл не найден!');

halt; {Если файл не найден то закрыть программу}

end;

close (fin);

assign(fou,name_bak); {Проверка наличия файла с именем как у резервного}

{$I-}

reset(fou);

{$I+}

if IOResult=0 then

begin

close(fou);

erase(fou); {Если такой файл есть, то уничтожить}

end;

rename(fin,name_bak); {Переименование файла-оригинала в файл с расширением .bak}

writeln ('Создана резервная копия файла: ',name_bak);

reset (fin);

assign (fou,name);

rewrite (fou); {Создание файла со исходным именем, открытие на запись}

end; {конец процедуры открытия файла}

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

begin

m:=length (f); {длина текущей строки}

while f[m]=' ' do {продолжать удалять пока последний символ не перестанет быть пробелом}

begin

delete (f,m,1); {удалить последний символ в строке}

m:=length (f); {новая длина строки}

end;

end; {конец процедуры удаления пробелов в конце строки}

procedure calc_string; {Процедура анализа текущей строки (расчёта количества и расположения пробелов и т.п.)}

begin {начальные установки}

b:=false; {Флаг = 0, символ предыдущий текущему не является пробелом}

d:=0; {Общее кол-во пробелов в строке}

c:=0; {Общее кол-во разрывов между словами}

if n>=m then {Если кол-во символов в текущей строке не превышает максимального кол-ва, то...}

begin

for i:=1 to m do {Поочерёдная проверка всех символов в строке}

begin

if f[i]=' ' then {Если символ равен "пробел", то...}

begin

d:=d+1; {... увеличить на 1 значение общего кол-ва пробелов в текущей строке}

if b=true then {если перед этим пробелом стоит пробел, то...}

e[c]:=e[c]+1 {... увеличить на 1 значение общего кол-ва пробелов в текущей строке}

else {если перед текущим пробелом стоит символ, то...}

begin

c:=c+1; {увеличить на 1 значение общего кол-ва разрывов в строке}

a[c]:=i; {Записать позицию на которой стоит данный пробел, как координату начала данного разрыва}

e[c]:=1; {Установить общее кол-во пробелов в текущем разрыве 1}

b:=true; {Флагу присвоить значение, говорящее для последующего символа что предыдущий равен " "}

end;

end

else {Если текущий символ не равен пробелу, то...}

b:=false; {...установить флаг в значение говорящее последующему символу, что предыдущий символ не равен ""}

end;

for i:=1 to c-1 do {цикл расчёта длины всех слов в текущей строке}

r[i]:=a[i+1]-(a[i]+e[i]);

end;

end; {Конец процедуры анализа текущей строки}

procedure calc_itog; {Процедура расчёта нового кол-ва пробелов в строке}

begin

if n>=m then {Если кол-во символов в текущей строке не превышает максимального кол-ва, то...}

begin

if c>0 then {Если в текущей строке есть хоть один разрыв, то...}

begin

z:=n-m; {Определение кол-во неиспользованных позиций справа от конца строки }

all:=z+d; {Общее кол-во пустых позиций в текущей строке}

need:=round(all/c);{расчёт необходимого кол-ва пробелов во всех разрывах (с округлением до целого числа)}

end;

end;

end;{конец процедуры расчёта нового кол-ва пробелов в строке}

procedure string_edit; {Процедура формирования новой текущей строки с учётом необходимого кол-во пробелов}

begin

if c>0 then {Если в текущей строке есть хоть один разрыв, то...}

begin

for i:=1 to c do {цикл замены пробелов, в разрывах, на необходимый}

begin

delete (f,a[i],e[i]); {удаление текущего разрыва путём удаления " " начиная с позиции первого " " разрыве}

a[i+1]:=a[i]+need+r[i]; {расчёт смещения начальной координаты следующего разрыва}

for j:=1 to need do

begin

insert (' ',f,a[i]); {вставка пробелов}

end;

end;

m:=length(f); {выяснение новой длины текущей строки}

if m<n then {если длина меньше чем необходимо (а необходимо макс.), то..}

begin {разница выходит за счёт того, что при выяснении необходимого кол-ва пробелов происходило округление}

y:=n-m; {расчёт разницы между необходимой длинной}

for i:=1 to y do {по условию задания, кол-во пробелов в каждом разрыве может отличаться на 1}

insert (' ',f,a[i]); {вставка по одному пробелу в разрывы начиная с первого }

end; {кол-во разрывов определяется разницей в длине строки от номинала}

if m>n then {если длина больше чем необходимо (а необходимо макс.), то..}

begin

y:=m-n; {расчёт разницы в длине}

for i:=1 to y do

delete (f,a[i],1); {удаление по одному пробелу из разрывов начиная с первого, кол-во удаление = разнице}

end;

end;

end; {Конец процедуры формирования строки}

begin {Главная программа}

clrscr;

writeln (about); {Вывод на экран информации об авторе работы}

writeln;

write ('Введите имя текстового файла: '); {Ввод имени редактируемого файла}

readln (name);

open; {Вызов процедура открытия файла и создания резервной копии}

{начальные установки}

n:=0; {Начальное значение максимальной длины строки}

g:=false; {присвоение флагу значения что нет строк >70}

while not eof(fin) do {цикл расчёта максимальной строки по которой будет происходить выравнивание}

begin

readln (fin,f); {считывание текущей строки}

m:=length(f); {считывание длины текущей строки}

if m>n then {если длина превышает уже установленную макс длину, то...}

begin

if m<=max then {и если длина не больше максимально допустимой т.е. 70}

n:=m; {записывание значения текущей длины строки как максимального}

end;

end;

reset(fin); {сброс файла на начало}

while not eof(fin) do {цикл поочерёдной обработки строк на выравнивание к макс. строке}

begin

readln (fin,f); {считывание очередной строки}

m:=length(f); {считывание длины строки}

if m<=max then {если длина не превышает максимально возможную длину, то...}

begin

calc_end; {процедура удаления пробелов в конце строки}

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

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

string_edit; {Процедура формирования новой строки}

writeln (fou,f); {запись полученной строки в файл}

end

else {если длина строки превышает максимально возможную, то...}

begin

writeln (fou,f); {запись строки файл без изменений}

g:=true; {флаг устанавливается в значение что есть строка >70}

end;

end;

if g=true then {если в файле есть строка >70, то...}

writeln (big); {выдача предупреждающего сообщения}

close (fin); {закрытие файлов оригинала и резервной копии}

close (fou);

end. {конец программы}