Смекни!
smekni.com

Тест программных программ (стр. 3 из 5)

a:=a+'.ts'; {прибавление расширения}

Assign(c,a); {связь переменной с файлом вопросов}

f1:=a;

a:=a+'o'; {изменение расширения}

Assign(u,a); {связь переменниой с файлом ответов}

delete(a,length(a),1);

Assign(b1,'c:\pascal\registr.dat'); {связь переменной с файлом отчета}

Append(b1); {открытие файла отчета для дозаписи}

Reset(c); {открытие файла вопросов для чтения}

Window(20,10,66,15); {закрытие начального окна}

TextBackGround(black);

clrscr;

Reset(u);

Read(c,b); {считывание пароля}

Readln(c,b);

z:=ord(b)-ord('0'); {установка времени}

z1:=z;

Window(10,10,40,12); {окно пароля}

TextBackGround(magenta);

clrscr;

Readln(u,a);

If length(a)>2 Then Begin{проверка наличия в файле пароля}

Write('введите пароль ');

Readln(f); {ввод пароля}

If a<>f Then Begin

Write('пароль неверный');

GoTo l1; {выход из процедуры}

End;

End

else Begin

close(u);

Reset(u);

End;

Readln(c,f);

Writeln('тест по теме "',f,'"'); {вывод темы теста}

z2:=60;

repeat

Window(60,20,70,21); {закрытие окна пароля}

TextBackGround(black);

clrscr;

TextColor(yellow);

z2:=z2-1; {включение таймера}

If z2<0 Then Begin

z1:=z1-1;

z2:=60;

End;

If (z1=0)and(z2=0) Then GoTo l1;

Writeln(z1,':',z2);

GetTime(g1,g2,g3,g4); {вывод текущего времени}

Write(g1,':',g2,' ',g3);

Delay(1000);

TextColor(black);

Window(10,10,53,15); {вывод вопроса, ожидание ввода ответа}

TextBackGround(cyan);

clrscr;

while not Eoln(c)or(b<>'&') do Begin

Read(c,b);

If b<>'&' Then Write(b);

End;

Writeln;

Window(55,10,80,15); {вывод сообщения о вводе ответа}

TextBackGround(blue);

clrscr;

Write('ваш ответ ');

TextColor(yellow);

repeat{таймер}

Window(60,20,70,21);

TextBackGround(black);

clrscr;

z2:=z2-1;

If z2<0 Then Begin

z1:=z1-1;

z2:=60;

End;

If (z1=0)and(z2=0) Then GoTo l1;

GetTime(g1,g2,g3,g4);

Writeln(z1,':',z2);

Write(g1,':',g2,' ',g3);

Delay(1000);

until keypressed;

Window(55,10,80,15);

TextBackGround(blue);

clrscr;

TextColor(yellow);

b:=readkey; {считывание цифры ответа}

Write(b); {считывание правильного ответа из файла}

Readln(u,k);

Readln(c);

If k=b Then p:=p+1; {сравнение ответов, начисление баллов}

Window(60,20,70,21);

TextBackGround(black); {закрытие окна отверов}

clrscr;

TextColor(black);

z2:=z2-1; {таймер}

If z2<0 Then Begin

z1:=z1-1;

z2:=60;

End;

If (z1=0)and(z2=0) Then GoTo l1;

GoToXY(70,15);

GetTime(g1,g2,g3,g4); {вывод текущего времени}

Writeln(z1,':',z2);

Write(g1,':',g2,' ',g3);

Delay(1000);

until Eof(c);

l1:f1:=f1+'o';

close(c); {закрытие всех файлов}

close(u);

Window(55,10,80,15); {закрытие окон}

TextBackGround(black);

clrscr;

Window(10,10,53,15);

TextBackGround(black);

clrscr;

Window(15,10,50,19);

TextBackGround(blue);

clrscr;

<подсчет результата>

End;

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

!!! Не забывайте закрывать файлы после использования и перезагружать их после прочтения до конца по необходимости, иначе возникнет ошибка Disk Read Error!!!

Эта ошибка может стоить вам всего файла. Очень часто после сбоя при чтении файла этот файл заново прочитать вам не удастся.

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

Procedure RedactF;

Begin

Window(10,10,53,15);

TextBackGround(black);

TextColor(black);

clrscr;

Window(20,10,66,15); {открытие начального окна}

TextBackGround(blue);

clrscr;

Writeln('Какой файл редактировать ');

Readln(a); {ввод пути к редактируемому файлу }

a2:=a;

Window(20,10,66,15); {закрытие начального окна}

TextBackGround(black);

clrscr;

Assign(c,a); {связь переменной с файлом вопросов}

a:=a+'o'; {изменение расширения}

Assign(u,a); {связь переменной с файлом ответов}

delete(a,length(a),1);

a:=a+'1'; {изменение расширения}

Assign(y,a); {создание нового файла вопросов}

delete(a,length(a),1);

a:=a+'2'; {изменение расширения}

Assign(a1,a); {создание нового файла ответов}

Reset(c); {установка и загрузка файлов}

Reset(u);

Rewrite(y);

Rewrite(a1);

Window(5,5,50,20); {окно просмотра файла}

TextBackGround(lightgray);

clrscr;

Writeln('Вывод вопросов через Enter:');

repeat

while not Eoln(c)or(b<>'&') do Begin {просмотр вопросов через Enter}

Read(c,b);

If b<>'&' Then Write(b);

End;

Readln(c);

Readln;

until EOF(c);

close(c); {перезапуск файла вопросов}

Reset(c);

Window(5,5,50,20); {закрытие окна просмотра файла}

TextBackGround(black);

clrscr;

Window(30,5,58,10); {окно номера редактируемого вопроса}

TextBackGround(yellow);

clrscr;

Read(c,b); {считывание количества вопросов}

Readln(c,b);

d:=ord(b)-ord('0');

Write('№ редактируемого вопроса: ');

repeat

Readln(z); {ввод № вопроса}

If z>d Then Writeln('номер превышает число вопросов'); {проверка существования номера}

until z<=d;

Window(30,5,58,10); {закрытие окна номера редактируемого вопроса}

TextBackGround(black);

clrscr;

Window(10,10,53,20); {окно вопросов}

TextBackGround(lightgray);

clrscr;

close(c); {перезапуск файла вопросов}

Reset(c);

p:=0;

repeat

while not EOLN(c) do Begin {копирование значений в другой файл}

Read(c,b);

Write(y,b);

End;

Readln(c);

Writeln(y);

p:=p+1;

until p=z*3; {установка количества копируемых строк}

p:=0;

while not (p=z-1) do Begin {стирание ненужного вопроса}

p:=p+1;

Readln(u,b);

Writeln(a1,b);

End;

while not EOLN(c) do Begin {можно было применить и цикл с параметром от 0 до 2}

Read(c,b);

Write(b);

End;

Readln(c);

Writeln;

while not EOLN(c) do Begin {вывод редактируемого вопроса на экран}

Read(c,b);

Write(b);

End;

Readln(c);

Writeln;

while not EOLN(c) do Begin

Read(c,b);

Write(b);

End;

Readln(c);

Writeln;

Writeln('Заменить на:');

Writeln(z,')'); {ввод нового вопроса}

Writeln(y,z,')');

Readln(f);

Writeln(y,f);

Window(55,10,80,15); {окно ответов}

TextBackGround(cyan);

clrscr;

Write('количество ответов на ',z,'-й вопрос ');

Readln(e); {ввод количества ответов}

Window(10,10,53,20); {окно вопросов}

TextBackGround(lightgray);

clrscr;

For j:=1 to e do Begin {ввод ответов на вопрос}

Write(' ',j,')');

Readln(a);

Str(j,f);

a:=' '+f+')'+a;

Write(y,a);

End;

Writeln(y,'&');

Window(55,10,80,15); {окно ответов}

TextBackGround(cyan);

clrscr;

Write('Правильный ответ: ');

Readln(b); {ввод правильного ответа}

Window(55,10,80,15); {закрытие окна ответов}

TextBackGround(black);

clrscr;

Writeln(a1,b);

repeat

while not EOLN(c) do Begin {дозапись значений}

Read(c,b);

Write(y,b);

End;

Readln(c);

Writeln(y);

until EOF(c);

Readln(u);

while not EOF(u) do Begin {дозапись значений в копируемый файл}

Readln(u,b);

Writeln(a1,b);

End;

Window(10,10,53,20); {закрытие окна вопросов}

TextBackGround(black);

clrscr;

close(c); {закрытие файлов}

Erase(c); {стирание старого файла вопросов}

close(u);

Erase(u); {стирание старого файла ответов}

close(y);

Rename(y,a2); {переименование файла вопросов}

a2:=a2+'o';

close(a1);

Rename(a1,a2); {переименование файла ответов}

End;

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

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

Procedure SearchF;

Begin

Assign(b1,'c:&bsol;pascal&bsol;registr.dat'); {связь переменной с файлом отчета}

Reset(b1); {открытие файла для чтения}

Window(10,10,53,15); {закрытие всех окон}

TextBackGround(black);

TextColor(black);

clrscr;

Window(5,10,70,13); {окно поиска}

TextBackGround(green);

clrscr;

Write('Ваша Фамилия');

Readln(a); {ввод фамилии}

while not EOF(b1) do Begin {поиск фамилии}

Readln(b1,f); {считывание строки}

For i:=1 to length(a) do f1:=f1+f[i]; {выделение фамилии}

If a=f1 Then Begin {проверка совпадения}

Writeln(f); {вывод на экран}

c1:=true; {подтверждение запроса}

End;

f1:=''; {обнуление строки}

End;

If c1=false Then Write('Запрос не найден. Пройдите тест.');

{в случае отсутствия фамилии в списке}

Readln;

close(b1); {закрытие файла}

Window(5,10,70,13); {закрытие окна}

TextBackGround(Black);

clrscr;

End;

Задачи: выделение фамилии из строки путем поиска пробела, поиск соответствия фамилий и вывод результатов поиска на экран.

Проблемы: никаких

Функция печати данных. В Turbo Pascal имеются средства для работы с принтером. Это ключевое слово Lst, указывающиеся в операторе вывода Writeln. Следуя этой инструкции, компилятор посылает сообщения не на экран, а на принтер. Этот способ имеет существенный недостаток: данные передаются очень медленно. Также в языке нет определенной команды для окочания работы принтера, поэтому бумага остается внутри и приходится использовать внешние управляющие кнопки принтера. Программа просит указать путь к файлу, а затем распечатывает его.

Я нашел другой алгоритм работы с принтером, более быстрый, но он требует знаний языка Assembler, встроенного в Turbo Pascal:

Procedure PrintF;

Begin

TextColor(black);

Window(10,10,53,15); {начальное окно}

TextBackGround(cyan);

clrscr;

Writeln('Какой файл распечатать?'); {вывод запроса}

Window(60,24,70,24);

TextBackGround(black);

clrscr;

repeat {вывод времени}

h:=g3;

GoToXY(50,22);

GetTime(g1,g2,g3,g4);

TextColor(yellow);

Write(g1,':',g2,' ',g3);

Delay(1000);

clrscr;

until keypressed;