>f1name := 'pt1' + s + '.tst';
>f2name := 'pt2' + s + '.tst';
>Assign(f1, f1name);
>Rewrite(f1);
>Assign(f2, f2name);
>Rewrite(f2);
>end;
>procedure EndExam;
>begin
>Close(f1);
>Close(f2);
>DataS(f1name, 3, 1);
>DataS(f2name, 45, 1);
>DataFileT(f1name, 1, 5);
>ResultFileT(f2name, 1, 5);
>end;
Обсудим особенности этих процедур. Имена файлов, создаваемых в процедуре StartExam, имеют вид pt1#####.tst (для файла с исходными данными) и pt2#####.tst (для файла с контрольными данными), причем в позициях, помеченных символом #", располагаются цифры, выбираемые случайным образом. Тем самым обеспечиваются все требования к именам файлов: они генерируются случайным образом, имеют расширение .tst, и имя файла с исходными данными всегда отличается от имени контрольного файла. Напомним, что все файлы с расширением .tst автоматически удаляются из рабочего каталога после проверки учебного задания.
При анализе процедуры EndExam следует обратить внимание на то, что информация о содержимом исходного файла занимает всю область исходных данных (строки с первой по пятую -- см. вызов процедуры DataFileT) и, таким образом, она скрывает информацию об именах файлов, ранее выведенную в первой строке области исходных данных (см. вызовы процедур DataS). В обычном задании такая реализация была бы ошибочной, поскольку учащийся не увидел бы на экране имена файлов и не понял бы, что эти имена необходимо ввести и обработать в его программе. Однако в задании групп Exam именно такая реализация является правильной, поскольку ввод имен файлов и связывание этих файлов со стандартными потоками ввода-вывода выполняется автоматически (незаметно" для программы учащегося), и поэтому информацию об именах файлов на экране отображать не следует.
Итак, наличие процедур StartExam и EndExam позволяет нам упростить реализацию заданий: после определения формулировки любого задания нам достаточно вызвать процедуру StartExam, заполнить файлы f1 и f2 исходными и, соответственно, контрольными данными и вызвать процедуру EndExam.
Приступим к непосредственной реализации заданий. Поскольку эти задания являются однотипными, реализуем их в одной процедуре Exam1, снабдив ее параметром m: при m = 1 будет инициализироваться первое задание, а при m = 2 -- второе:
>procedure Exam1(m: integer);
>var
>n, i: integer;
>a: array[1..10] of real;
>begin
>CreateTask('Преобразование массивов');
>case m of
>1:
>begin
>TaskText('На вход в первой строке подается целое положительное четное число {N},', 0, 1);
>TaskText('а во второй строке \= массив из {N} вещественных чисел. Поменять местами', 0, 2);
>TaskText('его первый элемент со вторым, третий с четвертым, и т.\,д. Вывести', 0, 3);
>TaskText('преобразованный массив в одной строке, для каждого элемента', 0, 4);
>TaskText('отводить 7 экранных позиций.', 0, 5);
>end;
>2:
>begin
>TaskText('На вход в первой строке подается целое положительное четное число {N},', 0, 2);
>TaskText('а во второй строке \= массив из {N} вещественных чисел. Поменять местами', 0, 3);
>TaskText('первую и вторую половину элементов массива. Вывести преобразованный массив', 0, 4);