Читать интересную книгу Описание языка PascalABC.NET - W Cat

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 55 56 57 58 59 60 61 62 63 ... 101

После запуска этого варианта мы получим сообщение Верное решение. Тест номер 1 (из 5)", а после пяти подобных запусков -- сообщение "Задание выполнено!":

Замечание. Приведем другой, более быстрый, способ решения задания String9, в котором результирующая строка заполняется посимвольно, как обычный массив:

uses PT4;

var

n, i: integer;

c1, c2: char;

s: string;

begin

Task('String9');

read(n, c1, c2);

SetLength(s, n);

for i := 1 to n div 2 do

begin

s[2 * i - 1] := c1;

s[2 * i] := c2;

end;

write(s);

end.

Обратите внимание на процедуру SetLength(s, n), которая обеспечивает правильную настройку длины результирующей строки s. Без вызова этой процедуры программа работала бы неверно, так как любая глобальная строковая переменная инициализируется пустой строкой, а при работе с отдельными символами строки корректировка ее длины не производится.

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

Щелкнув мышью на метке Результаты (F2)", расположенной в правом верхнем углу окна задачника, или нажав клавишу F2, мы можем вывести на экран окно результатов, в котором будет перечислены все наши попытки решения задачи:

String9 a08/09 11:17 Ознакомительный запуск.

String9 a08/09 11:18 Неверно указан тип при вводе исходных данных.

String9 a08/09 11:21 Выведены не все результирующие данные.

String9 a08/09 11:26 Ошибочное решение.

String9 a08/09 11:29 Задание выполнено!

Для закрытия окна результатов достаточно нажать клавишу Esc. Окно результатов можно отобразить на экране и после закрытия окна задачника и возврата в среду PascalABC.NET. Для этого надо использовать команду меню Модули | Просмотреть результаты", кнопку или клавиатурную комбинацию Shift+Ctrl+R.

Задание на обработку файлов

Создание программы-заготовки и знакомство с заданием

В качестве примера задания на обработку файлов рассмотрим задание File48.

Напомним, что программу-заготовку для решения этого задания можно создать с помощью команды меню Модули | Создать шаблон программы", кнопки или клавиатурной комбинации Shift+Ctrl+L. Эта заготовка будет иметь следующий вид:

uses PT4;

begin

Task('File48');

end.

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

В первой строке раздела исходных данных указаны имена трех исходных файлов (SA, SB и SC) и одного результирующего (SD). В последующих строках раздела исходных данных показано содержимое исходных файлов. Элементы файлов отображаются бирюзовым цветом, чтобы подчеркнуть их отличие от обычных исходных данных (желтого цвета) и комментариев (светло-серого цвета).

Поскольку размер файлов, как правило, превышает количество элементов, которое может уместиться на одной экранной строке, для отображения содержимого файла может отводиться более одной экранной строки. Слева от каждой строки с содержимым файла указывается порядковый номер файлового элемента, значение которого указано первым в этой строке (элементы нумеруются от 1).

Запуск нашей программы признан ознакомительным (и поэтому правильность решения не анализировалась), так как в ходе ее выполнения не было введено ни одного элемента исходных данных. При ознакомительном запуске раздел результатов не отображается, однако приводится пример верного решения, т. е. те числа, которые должны содержаться в результирующем файле при правильной обработке исходных файлов.

Ввод части исходных данных

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

uses PT4;

var

i: integer;

s: string;

f: array [1..4] of file of integer;

begin

Task('File48');

for i := 1 to 3 do

begin

read(s);

Assign(f[i], s);

end;

end.

Мы намеренно ограничились тремя итерациями цикла, оставив непрочитанным имя результирующего файла. Считывание имен файлов производится в одну и ту же переменную s, поскольку после связывания файла, имеющего имя s, с соответствующей файловой переменной (процедурой Assign) все остальные действия с данным файлом в нашей программе будут осуществляться с использованием файловой переменной, без обращения к имени файла.

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

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

Ввод всех исходных данных без создания требуемого файла

Изменим программу, заменив в заголовке цикла число 3 на 4, и вновь запустим программу. Теперь все данные, необходимые для выполнения задания, введены в программу (это видно по индикатору ввода). Однако задание не выполнено, поскольку результирующий файл не создан. Поэтому решение опять признано ошибочным с диагностикой Результирующий файл не найден":

Пример программы, приводящей к ошибке времени выполнения

Добавим в тело цикла после процедуры Assign вызов процедуры Reset, обеспечивающий открытие существующего файла:

uses PT4;

var

i: integer;

s: string;

f: array [1..4] of file of integer;

begin

Task('File48');

for i := 1 to 4 do

begin

read(s);

Assign(f[i], s);

Reset(f[i]);

end;

end.

Теперь запуск программы приведет к сообщению об ошибке Error System.IO.FileNotFoundException":

Сообщение, начинающееся со слова Error, означает, что при работе программы произошла ошибка времени выполнения (Runtime Error). После слова Error указывается имя этой ошибки (в данном случае System.IO.FileNotFoundException, то есть ошибка ввода-вывода, связанная с тем, что файл не найден) и краткое ее описание на английском языке.

Сообщение об ошибке времени выполнения появится и в разделе Список ошибок" окна PascalABC.NET:

Создание пустого результирующего файла

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

uses PT4;

var

i: integer;

s: string;

f: array [1..4] of file of integer;

begin

Task('File48');

for i := 1 to 4 do

begin

read(s);

Assign(f[i], s);

if i < 4 then Reset(f[i])

else Rewrite(f[i]);

end;

{ * }

for i := 1 to 4 do

Close(f[i]);

end.

1 ... 55 56 57 58 59 60 61 62 63 ... 101
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Описание языка PascalABC.NET - W Cat.
Книги, аналогичгные Описание языка PascalABC.NET - W Cat

Оставить комментарий