
- •Лабораторная работа 8.Структурированные типы данных. Файлы. Работа с типизированными файлами
- •8.1 Структурированный тип данных - файловый
- •8.2 Этапы работы с типизированными файлами
- •8.2.1.Описание файловой переменной
- •8.2.2.Связь переменной с физическим файлом
- •8.2.3.Открытие файла
- •8.2.4.Ввод/вывод в типизированный файл
- •8.2.5.Закрытие файла
- •8.3 Процедуры и функции для работы с файлами и каталогами
- •8.4 Задания
- •Лабораторная работа 9.Структурированные типы данных. Файлы. Работа с текстовыми файлами
- •9.1 Этапы работы с текстовыми файлами
- •9.1.1.Описание файловой переменной
- •9.1.2.Связь переменной с физическим файлом
- •9.1.3.Открытие файла
- •9.1.4.Ввод/вывод в текстовый файл
- •9.1.5.Закрытие файла
- •9.2 Задания
- •Лабораторная работа 10.Структурированные типы данных. Файлы. Создание и обработка файла матриц
- •10.1Задания
- •Лабораторная работа 11.Данных. Записи. Создание баз данных средствами турбо-паскаля
- •11.1Тип данных - запись
- •11.2Операции, используемые при работе с записями
- •11.3Вариантные записи
- •11.4Задания
- •13.1.2.Действия с указателями
- •13.1.3.С труктура оперативной памяти и компоненты динамической памяти
- •13.2Односвязный список
- •13.3Задание
- •Лабораторная работа 14.Указатели. Динамические структуры данных. Обработка двухсвязных списков
- •14.1Двухсвязные списки и кольца
- •14.2Задание
- •Библиографический список
- •Оглавление
13.1.2.Действия с указателями
ОПЕРАЦИЯ ПРИСВАИВАНИЯ ДОПУСТИМА
для двух однотипных указателей
пары: типизированный и нетипизированный указатели.
другие присваивания не допустимы!
ОПЕРАЦИИ С УКАЗАТЕЛЯМИ
операция взятия адреса @
- возвращает адрес памяти, в которой размещен объект-операнд;
операция разадресации ^
- возвращает объект, адрес которого содержится в указателе;
операция =
- возвращает результат сравнения двух указателей на равенство (два указателя равны, если они хранят адрес одной и той же ячейки памяти или оба равны NIL);
операция <>
- возвращает результат сравнения двух указателей на неравенство.
Других операций сравнения указателей нет.
NIL
- обозначает пустой или нулевой указатель (но это не ноль в прямом смысле).
- единственная константа-указатель!
- можно присваивать любому (типизированному или нетипизированному) указателю.
ФУНКЦИИ РАБОТЫ С УКАЗАТЕЛЯМИ
ADDR(X) /@X/
- возвращает адрес памяти, в которой размещен X (тип POINTER)
PTR(S,C)
- возвращает указатель (тип POINTER), построенный по сегменту S и смещению C
OFS(X)
- возвращает смещение адреса указанного объекта X (тип WORD)
SEG(X)
- возвращает сегмент адреса указанного объекта X (тип WORD)
MAXAVAIL
- возвращает размер в байтах наибольшего непрерывного участка кучи
MEMAVAIL
- возвращает размер в байтах общего свободного пространства кучи
SIZEOF(X)
- возвращает длину в байтах внутреннего представления объекта X
DSEG
- возвращает значение, хранящееся в регистре DS, т.е. адрес сегмента данных программы
CSEG
- возвращает значение, хранящееся в регистре CS, т.е. адрес начала кода программы
13.1.3.С труктура оперативной памяти и компоненты динамической памяти
ВЫДЕЛЕНИЕ И ОСВОБОЖДЕНИЕ ДИНАМИЧЕСКОЙ ПАМЯТИ
NEW()
- выделяет память из кучи под динамически размещаемую переменную, адрес которой будет помещен в P.
DISPOSE(P)
- возвращает память, выделенную под P в кучу. при этом содержимое p не изменится. Во избежание ошибок желательно добавлять P:=NIL.
MARK(P)
- запоминает в p текущее значение HeapPtr.
REALSE(P)
- возвращает в кучу фрагмент памяти, начиная от P до конца кучи.
GETMEM(P,SIZE)
- резервирует память из кучи объемом SIZE, адрес начала блока помещается в P.
FREEMEM(P,SIZE)
- освобождает (возвращает в кучу) блок памяти объемом SIZE, начиная с P.
13.2Односвязный список
- модель представления знаний, представляющая собой набор записей (RECORD), каждая из которых содержит ссылку (указатель) на последующий элемент той же структуры. Такая организация структуры обеспечивает возможность просмотра и корректировки списка.
Ключевое понятие списка – голова – указатель на первый элемент списка
(обычно обозначается HEAD). В некоторых задачах используется также
указатель на последний элемент списка – LAST.
ОПИСАНИЕ ЭЛЕМЕНТОВ СПИСКА НА ЯЗЫКЕ ПАСКАЛЬ
-
TYPE
LIST=^NODE; {тип указателя на элементы списка}
NODE= RECORD
DATA: INTEGER;
NEXT: LIST
END;{тип элементов списка: данное – integer и next - указатель на следующий элемент}
VAR
HEAD: LIST; {голова - указатель на первый элемент списка}
LAST : LIST; {хвост - указатель на последний элемент списка}
Таким образом, определен список из целых чисел.
ПРОЦЕДУРА СОЗДАНИЯ СПИСКА
-
PROCEDURE NEWLIST (VAR HEAD: LIST);
{создает новый пустой список}
BEGIN
HEAD := NIL;
END;
ПРОЦЕДУРА ВЫВОДА ЭЛЕМЕНТОВ СПИСКА НА ЭКРАН
-
PROCEDURE PRINTLIST(HEAD: LIST);
VAR P: LIST; {указатель-счетчик}
BEGIN
P:=HEAD; {начальное значение счетчика - голова}
WHILE P<>NIL DO {пока не конец списка}
BEGIN
WRITE(P^.DATA:6); {вывод содержимого элемента списка}
P:=P^.NEXT {переход к следующему элементу списка}
END;
WRITELN;
END;
ПРОЦЕДУРА ДОБАВЛЕНИЯ ЭЛЕМЕНТА В ГОЛОВУ СПИСКА
-
PROCEDURE ADDHEADLIST(VAR HEAD: LIST; X: INTEGER);
VAR P: LIST; {указатель на новый элемент}
BEGIN
NEW(P); {резервируем в куче память для нового элемента}
P^.DATA:=X; {заносим значение поля data – число x}
P^.NEXT:=HEAD; {следующим в списке будет тот элемент, который сейчас находится в голове; заносим его адрес в next}
HEAD:=P {теперь головой становится новый элемент}
END;
ФУНКЦИЯ ВЫЧИСЛЕНИЯ СУММЫ ЭЛЕМЕНТОВ СПИСКА
-
FUNCTION SUM(HEAD: LIST):INTEGER;
VAR P: LIST; {указатель-счетчик}
S:INTEGER; {накопитель суммы}
BEGIN
S:=0; {начальное значение суммы - 0}
P:=HEAD; {начальное значение счетчика - голова}
WHILE P<>NIL DO {пока не конец списка}
BEGIN
S:=S+P^.DATA; {добавляем содержимое элемента списка к сумме}
P:=P^.NEXT {переход к следующему элементу списка}
END;
SUM:=S;
END;
ПРИМЕР ПРОГРАММЫ, РАБОТАЮЩЕЙ СО СПИСКОМ
-
VAR X:INTEGER;
BEGIN
NEWLIST(HEAD); {создаем новый пустой список}
WRITE('NEW='); READLN(X); {вводим элемент для добавления в список}
WHILE (X<>0) DO {пока не введен ноль}
BEGIN
ADDHEADLIST(HEAD,X); {добавляем введенное значение в список}
WRITE('NEW='); READLN(X) {вводим элемент для добавления в список}
END;
PRINTLIST(HEAD); {распечатаем построенный список}
WRITELN(SUM(HEAD)); {выведем сумму элементов построенного списка}
END.