Описание языка PascalABC.NET - W Cat
Шрифт:
Интервал:
Закладка:
Если закрыть окно задачника, находясь в режиме отображения всех данных, то при последующих запусках программы окно будет сразу отображаться в этом режиме.
Приведем вариант правильного решения данной задачи (в этом варианте учитывается, что результирующий двумерный массив имеет не более 10 строк и столбцов; соответствующее условие приведено в преамбуле к описанию группы ExamBegin):
uses PT4Exam;
var
m, n, i, j: integer;
d: real;
a: array[1..10, 1..10] of real;
begin
Task('ExamBegin28');
readln(m, n, d);
for i := 1 to m do
read(a[i, 1]);
for j := 2 to n do
for i := 1 to m do
a[i, j] := a[i, j - 1] + d;
for i := 1 to m do
begin
for j := 1 to n do
write(a[i, j]:7:2);
writeln;
end;
end.
В приведенном решении следует обратить особое внимание на организацию ввода-вывода. Укажем две особенности, связанные с вводом. Во-первых, несмотря на то что по условию число d находится во второй строке, мы смогли включить его в один список с предшествующими числами m и n (поскольку при чтении числовых данных переход на новую строку выполняется автоматически). Во-вторых, при чтении элементов исходного набора необходимо использовать вариант процедуры read без суффикса ln", чтобы не пропустить оставшиеся в этой строке числа.
При выводе полученного двумерного массива необходимо обеспечить его правильное форматирование: каждый элемент должен выводиться на семи экранных позициях с двумя дробными знаками и, кроме того, каждая строка массива должна выводиться на новой экранной строке. Это достигается за счет использования соответствующих атрибутов форматирования и явного перехода на новую строку с помощью процедуры writeln без параметров.
Примечание. Заметим, что в заданиях группы Matrix, также посвященной обработке двумерных массивов, специальные действия по форматированию полученных массивов выполнять не требуется, так как задачник автоматически форматирует все полученные результаты. Таким образом, задания группы ExamBegin более приближены" к реальной экзаменационной ситуации, в которой программа учащегося должна не только обрабатывать исходные данные, но и обеспечивать наглядное отображение результатов.
Пример 3. Обработка сложных наборов данныхГруппа ExamTaskC содержит 100 типовых заданий, аналогичных заданиям, которые предлагаются на ЕГЭ по информатике в качестве задач повышенной сложности (задача C4). Основную часть данной группы составляют задания на обработку сложных наборов данных (записей) с элементами-полями различных типов. В подобных заданиях требуется правильно выбрать способ хранения данных и организовать их эффективную обработку; при этом обычно требуется применить несколько базовых алгоритмов, например, алгоритм суммирования или нахождения минимума/максимума и алгоритм поиска нужного элемента или сортировки набора данных по требуемому ключу. В группу ExamTaskC включены также задания повышенной сложности на обработку текстовых данных (подобные задания содержатся в завершающем разделе данной группы).
Следует заметить, что возможность автоматической генерации больших наборов исходных данных, предоставляемая задачником Programming Taskbook, позволяет существенно ускорить тестирование учебных программ и сделать его более надежным, что, в свою очередь, повышает эффективность изучения типовых приемов решения задач группы C.
В заданиях группы ExamTaskC ввод и вывод имеет те же особенности, что и в заданиях группы ExamBegin.
Рассмотрим следующее задание.
ExamTaskC25°. На вход подаются сведения об абитуриентах. В первой строке указывается количество абитуриентов N, каждая из последующих N строк имеет формат
<Номер школы> <Год поступления> <Фамилия>
Номер школы содержит не более двух цифр, годы лежат в диапазоне от 1990 до 2010. Для каждого года, присутствующего в исходных данных, вывести общее число абитуриентов, поступивших в этом году (вначале выводить год, затем число абитуриентов). Сведения о каждом годе выводить на новой строке и упорядочивать по возрастанию номера года.
Программа-заготовка, созданная для этого задания, подобно заготовкам для заданий группы ExamBegin, будет использовать специальный модуль PT4Exam:
uses PT4Exam;
begin
Task('ExamTaskC25');
end.
При запуске этой программы на экране появится окно задачника, содержащее следующие данные:
Окно будет иметь такой вид, если при его предшествующем закрытии оно находилось в режиме отображения всех данных. Для отображения всех данных на экране может потребоваться увеличить высоту окна; для этого достаточно зацепить мышью заголовок окна и переместить его вверх (для перемещения заголовка окна задачника вверх и вниз можно также воспользоваться клавиатурными комбинациями Ctrl+Up и Ctrl+Down).
При первом тестовом испытании программы ей будет предложен для обработки набор данных не слишком большого размера (порядка 10-20 элементов).
Вначале следует определиться со структурами данных, которые будут использоваться в программе. Поскольку требуется найти одну характеристику для каждого года, а число лет невелико, можно использовать числовой массив year, каждый элемент которого соответствует определенному году. Так как в языке Pascal можно использовать произвольные границы индексов, удобно в качестве диапазона индексов указать диапазон лет, который требуется проанализировать: 1990..2010. В начале программы выполним инициализацию элементов массива, положив их значения равными 0 (заметим, что если после обработки исходных данных некоторые элементы массива year останутся нулевыми, то это будет означать, что соответствующие годы не были представлены в наборе исходных данных, и выводить информацию о них не следует).
После инициализации массива следует прочесть информацию о количестве абитуриентов и организовать цикл, в котором будут обрабатываться данные о каждом абитуриенте и соответствующим образом корректироваться элементы массива year. В дальнейшем сведения об уже обработанном абитуриенте нам не будут нужны, поэтому сохранять их в специальном наборе данных (например, массиве) не требуется. Заметим также, что фамилия абитуриента для решения задачи не требуется, поэтому после чтения двух числовых данных можно сразу переходить к новой строке, пропуская строковый элемент данных (фамилию). В задаче не нужно использовать и номера школ, однако их придется считывать, так как только после номера школы указывается интересующий нас год поступления абитуриента.
Когда данные обо всех абитуриентах будут обработаны, в массиве year будет содержаться вся необходимая информация, которую останется вывести в формате, указанном в условии задачи.
Приведем первый вариант решения (этот вариант содержит одну ошибку):
uses PT4Exam;
var
n, i, k, m: integer;
year: array[1990..2010] of integer;
begin
Task('ExamTaskC25');
for i := 1990 to 2010 do
year[i] := 0;
readln(n);
for i := 1 to n do
begin
readln(k, m); { k - номер школы, m - год поступления }
Inc(year[m]);
end;
for i := 1990 to 2010 do
writeln(i, ' ', year[i]);
end.
Ошибка связана с тем, что на экран выводится информация о годах, отсутствующих в наборе исходных данных. Поэтому она сразу будет выявлена при обработке наборов данных небольшого размера, предлагаемых программе при первом тестовом запуске (для большей наглядности приведем окно задачника в режиме сокращенного отображения данных, при котором выводятся только пять первых элементов из каждого набора данных):
Для исправления ошибки достаточно добавить в последний цикл условный оператор:
for i := 1990 to 2010 do
if year[i] 0 then
writeln(i, ' ', year[i]);
Теперь все 9 тестовых испытаний программы, требуемых для того, чтобы решение было зачтено как выполненное, будут пройдены успешно.
Завершая рассмотрение этого задания, опишем некоторые дополнительные возможности, связанные с просмотром больших наборов данных.
Начиная со второго испытания, программе может быть предложен для обработки набор исходных данных большего размера (порядка 50-100 элементов). При этом уже не удастся отобразить на экране все данные, связанные с заданием. В подобной ситуации у правой границы окна задачника появится полоса прокрутки, позволяющая перемещаться к той части данных, которая первоначально не отображается на экране. Прокрутку данных можно выполнять не только с помощью полосы прокрутки, но и используя клавиши со стрелками, PgUp, PgDn, Home, End, а также колесико мыши.