Шрифт:
Интервал:
Закладка:
Приведем пример дерева общего вида, которое реализовано с помощью связанных записей типа TNode (аналогичным образом деревья общего вида изображаются в окне задачника):
Корень этого дерева (со значением 13) имеет три дочерние вершины (71, 73 и 29), причем вершина 71 не имеет потомков, вершина 73 имеет три непосредственных потомка (18, 93 и 92), а вершина 29 -- два (24 и 84). На последнем уровне располагается вершина 46, являющаяся единственной дочерней вершиной вершины 93.
При ознакомительном запуске задания Tree86 на экране появится окно, подобное следующему.
Обратите внимание на то, как выглядит одно и то же дерево в двух различных представлениях: вариант, соответствующий обычному бинарному дереву, приводится в разделе исходных данных, а вариант, соответствующий дереву общего вида, -- в разделе результатов. При переходе от бинарного дерева к дереву общего вида часть информации о структуре бинарного дерева теряется, поскольку в случае, если некоторая вершина дерева общего вида имеет только одного непосредственного потомка, нельзя определить, каким был этот потомок в исходном бинарном дереве -- левым или правым.
Напомним, что точки, обрамляющие значения вершин в разделе результатов, означают, что все эти вершины должны быть созданы программой учащегося (в отличие от вершин исходного дерева, созданных самим задачником при инициализации задания).
При формировании нового дерева будем использовать рекурсивную функцию CreateNode(P). Параметр P содержит указатель на вершину исходного дерева, копия которой создается при вызове функции. Возвращаемым значением функции является указатель на созданную вершину (как обычно, если P = nil, то функция не выполняет никаких действий и возвращает nil). Для создания дочерних вершин выполняется рекурсивный вызов этой функции. Заметим, что цепочка дочерних вершин может быть пустой (если вершина P является листом), содержать один элемент (если вершина P имеет только одного непосредственного потомка) или два элемента. Перед формированием цепочки дочерних вершин удобно занести адреса дочерних вершин вершины P во вспомогательные переменные P1 и P2. При этом в случае, если вершина P имеет только одного потомка (неважно, левого или правого), адрес этого потомка заносится в переменную P1, а переменная P2 остается равной nil. Благодаря использованию переменных P1 и P2, фрагмент кода, отвечающий за формирование списка дочерних вершин, удается сделать более кратким. Приведем текст программы, решающей задачу Tree86.
uses PT4;
function CreateNode(P: PNode): PNode;
var P1, P2: PNode;
begin
if P = nil then
begin
result := nil;
exit;
end;
New(result);
result^.Data := P^.Data;
result^.Right := nil;
P1 := P^.Left;
P2 := P^.Right;
if P1 = nil then
begin
P1 := P2;
P2 := nil;
end;
{ формирование списка дочерних вершин }
result^.Left := CreateNode(P1);
if P1 <> nil then
result^.Left^.Right := CreateNode(P2);
end;
var P1: PNode;
begin
Task('Tree86');
read(P1);
write(CreateNode(P1));
end.
Примечание. Фрагмент дерева общего вида, содержащий все дочерние вершины некоторой вершины, можно рассматривать как односвязный список, элементы которого связаны между собой с помощью поля Right (у последнего элемента списка поле Right равно nil). Каждый элемент подобного списка может содержать подсписок" своих дочерних элементов; адрес начала этого подсписка хранится в поле Left данного элемента. Поэтому в алгоритмах, связанных с обработкой вершин деревьев общего вида, для перебора непосредственных потомков некоторой вершины удобно использовать цикл (как при переборе элементов списка), в то время как для обработки каждой дочерней вершины следует, как обычно, использовать рекурсию.
Задания, связанные с ЕГЭ по информатике
Пример 1. Простая задача на реализацию базовых алгоритмовГруппа заданий ExamBegin посвящена базовым алгоритмическим задачам, включенным в кодификатор ЕГЭ по информатике. Процесс выполнения подобных заданий мы рассмотрим на примере одной из простых задач, связанных с нахождением максимумов и минимумов из двух, трех или четырех чисел без использования массивов и циклов.
ExamBegin2°. На вход подаются три вещественных числа; числа расположены в одной строке. Вывести вначале минимальное, а затем максимальное из них. Каждое число должно выводиться на новой строке и снабжаться комментарием: «MIN=" для минимального, «MAX=" для максимального.
Создание программы-заготовки и знакомство с заданиемНапомним, что программу-заготовку для решения этого задания можно создать с помощью команды меню Модули | Создать шаблон программы", кнопки или клавиатурной комбинации Shift+Ctrl+L. Приведем текст созданной заготовки:
uses PT4Exam;
begin
Task('ExamBegin2');
end.
После запуска программы на экране появится окно задачника:
Обсудим особенности программы-заготовки и окна задачника.
В программе-заготовке вместо модуля PT4 подключается модуль PT4Exam, специально предназначенный для использования при выполнении заданий групп Exam. Данный модуль содержит реализацию единственной процедуры Task, инициализирующей задание. Никакие дополнительные процедуры, связанные с вводом-выводом, в него не включены. Это обусловлено тем, что ввод-вывод при выполнении заданий групп Exam надо выполнять, используя стандартные процедуры языка Pascal.
Основной особенностью окна задачника является то, что в разделе исходных данных отсутствуют данные, выделенные желтым цветом (напомним, что желтый цвет используется для выделения данных, которые необходимо вводить с помощью специальных процедур ввода задачника). Вместо этого в окне отображается строка бирюзового цвета, содержащая числовые данные. Вид строки подчеркивает то обстоятельство, что вводить данные требуется не с помощью специальных процедур ввода, имеющихся в задачнике, а с помощью стандартных процедур языка Pascal. Отметим, что бирюзовый цвет используется в окне задачника для отображения внешних" данных (содержащихся в файлах или динамических структурах), доступ к которым должен осуществляться с помощью стандартных средств используемого языка программирования.
Пример верного решения выделяется серым цветом (в отличие от настоящих" результатов, выведенных программой учащегося, которые, как и входные данные, выделяются бирюзовым цветом), однако представление выходных данных совпадает с представлением входных: это набор строк, содержащих числовые данные (дополненные комментариями). Вид данных в разделе результатов показывает, что для их вывода, как и для ввода исходных данных, необходимо использовать стандартные процедуры языка Pascal.
Примечание. Если вы уже выполняли задания, связанные с обработкой файлов, то можете заметить, что отображение данных в заданиях групп Exam в точности соответствует способу отображения содержимого текстовых файлов. Это совпадение не случайно. На самом деле во всех заданиях групп Exam все исходные данные хранятся в специальном входном текстовом файле, а все результаты должны записываться в специальный выходной текстовый файл. Однако при этом не требуется выполнять особых действий, связанных с определением имен этих файлов, связыванием файлов с файловыми переменными, открытием и закрытием файлов (все эти действия выполняются задачником автоматически). Для программы, выполняющей задание, эти файлы играют роль стандартных потоков ввода-вывода, поэтому для доступа к ним достаточно использовать обычные процедуры ввода-вывода языка Pascal.
Ввод исходных данных и их обработкаПриступим к выполнению задания. В данном случае следует использовать алгоритм, не требующий применения массивов, поэтому опишем три простые переменные вещественного типа и введем в них исходные данные:
uses PT4Exam;
var
a, b, c: real;
begin
Task('ExamBegin2');
read(a, b, c);
end.
Мы воспользовались стандартной процедурой ввода read, введя все три исходных числа за один ее вызов. Этого же результата мы могли бы добиться и с помощью процедуры readln:
readln(a, b, c);
Заметим, что использование отдельных процедур readln для ввода каждого числа приведет к ошибочному результату:
- Математические диктанты. Числовые примеры. Все типы задач. Устный счет. 1-2 классы - Елена Нефедова - Детская образовательная литература
- ФСБ. Машина смерти. Чекист остается чекистом. (СИ) - Сокольников Борис - Детская образовательная литература
- Новейшие сочинения. Все темы 2011: 5-9 классы - Людмила Бойко - Детская образовательная литература