- •Предисловие
- •Общая схема выполнения лабораторной работы
- •Требования к программе
- •Содержание программы
- •Общие пояснения
- •Var r,d: real; {раздел описаний переменных может
- •Требования к программе
- •Общие пояснения
- •If Pr then {здесь Pr – логическая переменная,}
- •Разбор контрольного варианта Задание
- •Лабораторная работа № 3
- •Задачи лабораторной работы Вопросы, изучаемые в работе
- •Задание (общее ко всем вариантам).
- •Требования к программе.
- •Общие пояснения
- •Разбор контрольного варианта Задание
- •Алгоритм
- •Текст программы
- •Vvod: writeln('Сколько будет чисел?');
- •Варианты заданий
- •Требования к программе
- •Содержание программы
- •Общие пояснения
- •Var Massiv1,Nmbs:IntMasMax; {завели 2 целочисл. Массива}
- •Разбор контрольного варианта Задание.
- •Текст программы
- •Результаты работы
- •Варианты заданий
- •Требования к программе
- •Содержание программы.
- •Общие пояснения
- •Var {здесь выделяется место под все массивы }
- •Разбор контрольного варианта Задание
- •Формирование таблицы идентификаторов
- •Алгоритм
- •Текст программы.
- •Содержимое файла результатов umnik5.Res
- •Варианты заданий
- •Требования к программе
- •Содержание программы
- •Общие пояснения
- •Разбор контрольного варианта Задание
- •Рассмотрение метода решения
- •Алгоритм
- •Текст программы.
- •Vvod_eps:writeln('введите минимальный размер слагаемого);
- •Результаты расчета
- •Варианты заданий
- •Требования к программе и отчету по работе
- •Содержание программы.
- •Пояснения к лабораторной работе Общие пояснения к использованию процедур и функций.
- •Механизм параметров
- •Разбор контрольного варианта Задание
- •Б Рисунок 7. Алгоритм 31-го варианта лок-схема алгоритма Текст программы.
- •Общие пояснения Графический режим экрана
- •Алгоритмы построения графиков на экране
- •Стандартный модуль работы с графическим экраном Graph
- •Разбор контрольного варианта № 31 Задание
- •Алгоритм
- •Текст программы
- •X,y, { текущие значения переменных х и y }
- •Xmin,Xmax,{минимальное и максимальное значения х на графике}
- •Imin,Imax, {координаты экрана, соответствующие Ymin и Ymax}
- •Разбор контрольного варианта № 32 Задание
- •X,y:mas; { текущие значения переменных х и y }
- •Xmin,Xmax,t,tmin,tmax, { минимальное и максимальное значения х на графике }
- •Imin,Imax, { координаты экрана, соответствующие Ymin и Ymax }
- •Варианты заданий
- •Требования к программе
- •Содержание программы
- •Общие пояснения
- •Односвязные списки
- •Двусвязные списки
- •Нульсвязные списки
- •Описание файлов с данными
- •Inc(I); { стандартная процедура увеличения на 1 }
- •Разбор контрольного варианта Задание
- •Содержание программы
- •Алгоритм
- •Текст программы
- •If Beg then { если добавляем в начало }
- •If Beg then { если удаление из начала }
- •Варианты заданий
- •Литература
- •Приложение а. Система меню и команды Турбо-Паскаля Меню системы программирования Турбо-Паскаль
- •Главное меню
- •Опции главного меню
- •Локальные меню
- •Основные команды встроенного редактора текста
- •Приложение б. Сообщения об ошибках
- •Сообщения об ошибках на шаге выполнения
- •Приложение в. Описание числовых файлов для лабораторных работ
- •I,j : integer; {I- счетчик элементов массива, j - номер символа в файле }
- •Приложение г. Таблица ascii-кодов (с альтернативной кодировкой)
- •Содержание
Односвязные списки
Пример организации односвязного списка приведен ниже.
Type
Z=Record {комбинированный тип для данных}
a: String; {строковое поле}
b, c: Integer; {поле целых чисел}
d: Real {поле вещественных чисел}
end;
P=^S; {тип указатель записи базового типа S}
S=Record {базовый тип для указателей типа Р}
ls:P; {поле типа Р ссылки на следующую запись}
Dt:Z {поле типа Z записи данных}
end;
В этом примере типы Z и S введены для описания переменных записей, содержащих в своих полях a, b, c, d данные, соответствующие описанным типам полей. P тип указатель для динамических переменных базового типа S, т.е. значения переменных типа P будут адресами переменных типа S.
Наличие у комбинированной переменной типа S адресного поля ls типа P позволяет включать в состав записи ссылку на последующую запись и хранить таблицы в памяти машины в виде динамических списков связанных записей.
Var
Dt:Z; {запись данных}
Uz,U:P {указатели заглавного и текущего звеньев списка}
Двусвязные списки
В двусвязных списках базовый комбинированный тип S для указателей типа P будет иметь два адресных поля: поле ls ссылки на следующую запись списка и поле lp ссылки на предыдущую запись списка. Описание двусвязных списков аналогично приведенному выше (для односвязных списков) с отличием в структуре S:
P=^S; {тип указатель записи базового типа S}
S=Record {базовый тип для указателей типа Р}
ls: P; {поле типа Р ссылки на следующую запись}
lp: P ; {поле типа Р ссылки на предыдущую запись}
Dt: Z {поле типа Z записи данных}
end;
При работе с одно- и двусвязными списками нужно уметь добавлять элементы в любое место списка, удалять заказанный элемент из списка и перемещаться по списку с целью поиска или выбора информации из списка. Необходимо определять, пуст ли список в данный момент.
Обычно считается, что список пуст, если в нем имеется только звено заголовка и нет ни одного звена с данными. При работе с такими списками в начале необходимо создать заголовок (процедурой New), а в конце программы этот заголовок должен быть удален процедурой Dispose. Добавление звена в список и удаление из списка обычно оформляется в виде процедур. Перемещение по списку чаще всего выполняется с помощью итеративного цикла ("…Пока не достигнем звена с нужными данными или не просмотрим весь список…"). Ниже приведены некоторые примеры процедур для разных видов списков. Проверка "пуст ли список" обычно нужна для того, чтобы упростить процедуры работы со списками, так как с пустыми списками не все операции возможны.
Для линейных и кольцевых списков с заголовком вне кольца, проверяется ссылка из заголовка на следующее звено. Если Uz^.ls=nil, то список пуст. Для кольцевых с заголовком в кольце – если Uz^.ls=Uz , то список пуст.
Пример процедуры добавления элемента в линейный односвязный список (определяемый указателем Uz ) после звена, заданного текущим указателем (U).
procedure PutS1(Var U:P;E:Z);
var
q:P1; { Завели рабочий указатель }
begin
new(q); { Создаем новое звено, пока вне списка }
q^.Dt:=E; { заполняем его информацией }
q^.ls:=U^.ls; {подцепляем к новому звену конец списка за U }
U^.ls:=q {подцепляем к началу списка (до U) новое звено}
end;
Если добавлять элемент нужно в начало списка (на которое ссылается заголовок списка), при вызове процедуры в качестве первого параметра приводится указатель заголовка списка.
Пример процедуры удаления элемента, заданного текущим указателем (U) из линейного двусвязного списка.
procedure DelS2(Var U:P);
var
q:P; { Завели рабочий указатель }
begin
q:=U^.lp; {q указывает звено перед тем, на которое указывает U }
q^.ls:=U^.ls; {в звене q^ меняем ссылку на следующее звено – за U^}
if U^.ls<>nil then {если удаляемое звено – не последнее, то }
begin
q:=U^.ls; { в звене за удаляемым }
q^.lp:=U^.lp { меняем ссылку на предыдущее звено }
end;
dispose(U); { собственно удаление звена }
U:=nil { очистка указателя на удаленное звено }
end;
После срабатывания этой процедуры текущий указатель перестает указывать на что-либо (равен nil).
Пример процедуры удаления элемента, заданного текущим указателем (U) из кольцевого двусвязного списка.
procedure DelS2K(Var U:P);
var
q:P;
begin
q:=U^.lp;
q^.ls:=U^.ls;
q:=U^.ls;
q^.lp:=U^.lp;
dispose(U);
U:=nil;
end;
Выбор данных из списка производится без изменения списка, путем ссылки на информационную часть нужного звена: U^.Dt. Чтобы добраться до нужного звена списка, по нему приходится последовательно перемещаться (в цикле, начиная от начала или от текущего звена). Так же как при работе с массивом, для перехода от элемента A[i] к следующему элементу необходимо выполнить i:=i+1.
При работе со списком следует использовать оператор U:=U^ls.
Создав список (в цикле, используя процедуру добавления звена) и поработав с ним, необходимо в конце программы удалить его (также, в цикле, используя процедуру удаления элемента списка, пока он не станет пустым). После этого не забыть удалить заголовок списка.