Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕтодичка по практическим работам.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
156.28 Кб
Скачать

Контрольные вопросы

  1. Отличие процедур reset для тестового и типизированного файлов.

  2. Типичный фрагмент последовательного чтения всего файла.

  3. Вывод числовых переменных.

  4. Отличие файлов последовательного и прямого доступа.

  5. Операции прямого доступа к записям файла.

  6. В какой ситуации функция eof возвращает TRUE ?

  7. Могут ли компоненты записи быть различных типов ?

  8. Как осуществляется доступ к полям записей ?

  9. Могут ли записи входить компонентами в другие переменные ?

  10. * Что такое вариантная запись ?

  11. * Что является селектором в операторе case при задании вариантной части записи ?

Лабораторная работа 10. Использование данных ссылочного типа Основные сведения

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

VAR имя_ссылочной_переменной : ^имя_базового_типа;

Для того чтобы получить доступ к данным, адрес которых содержится в ссылочной переменной, используется операция разыменования:

имя_ссылочной_переменной^

Ссылочной переменной может быть присвоен пустой адрес NIL или адрес какой-либо переменной, определенной в программе:

имя_ссылочной_переменной := @ имя_переменной

или

имя_ссылочной_переменной := ADR(имя_переменной)

Значения ссылочных переменных можно присваивать друг другу и сравнивать на равенство и неравенство. Такое сравнение в Borland Pascal ненадежно из-за того, что один и тот же адрес может быть представлен различными способами. Надежным является лишь сравнение с пустым адресом NIL.

Процедуры и функции динамического распределения памяти кучи:

maxavail: longint – возвращает длину в байтах самого длинного непрерывного свободного участка памяти в куче.

memavail: longint – возвращает суммарную длину всех свободных участков памяти в куче.

sizeof( x ): word – возвращает длину в байтах переменной или типа X программы.

new( var P ) – захватывает участок памяти в куче для переменной P^ и присваивает ссылочной переменной P адрес этого участка.

dispose( var P ) – освобождает участок памяти в куче, ранее выделенный для переменной P^ функцией new.

getmem( var P; Size: word ) – захватывает в куче участок памяти длиной Size байт и присваивает ссылочной переменной P его адрес.

freemem( var P; Size: word ) – освобождает в куче участок, начинающийся с адреса хранящегося в ссылочной переменной P, длиной Size байт.

Длина захватываемых функциями new и getmem участков не должна превышать 65520 байт.

Пример выполнения

Ввести неопределенное количество строк символов и упорядочить их по алфавиту. Вывести упорядоченную последовательность строк на экран.

Следует организовать односвязный список строк.

program PRIMER;

type

ELPTR=^EL; { тип ELPTR – указатель на элемент списка }

EL= record { тип EL - элемент списка }

S: string; {поле данных элемента списка}

NEXT: ELPTR {поле связи элементов списка}

end;

var

pHEAD : ELPTR; {указатель на заголовок списка}

pV1,pV2: ELPTR;

C : char;

SVST : string;

BF : boolean;

begin

{*** Формирование списка ***}

pHEAD:=NIL; {инициализация списка}

pV2 :=NIL; {в каждый момент - последний добавленный элемент}

repeat

new(pV1); {добавляемый элемент}

writeln('Введите строку');

readln(pV1^.S);

if pHEAD=NIL then pHEAD :=pV1 {в пустой список}

else pV2^.NEXT:=pV1; {теперь pV1 стоит за pV2}

pV1^.NEXT:=NIL; {pV1 - последний добавленный элемент}

pV2 :=pV1; {pV2 - последний добавленный элемент}

writeln('Еще есть строка?(N-нет)');

readln(C)

until (C='N') or (C='n');

{*** Сортировка списка строк (пузырьком) ***}

repeat

bF:=FALSE; {перестановок не было}

pV1:=HEAD;

while pV1^.NEXT<>NIL do begin

if pV1^.S > (pV1^.NEXT)^.S then begin

sVST :=pV1^.S;

pV1^.S :=(pV1^.NEXT)^.S;

(pV1^.NEXT)^.S:=sVST;

bF:=TRUE {была перестановка}

end;

pV1:=pV1^.NEXT

end { while pV1^.NEXT<>NIL }

until NOT bF;

{*** Печать отсортированного списка ***}

writeln('Отсортированная по алфавиту последовательность строк');

pV1:=pHEAD;

while pV1<>NIL do begin

writeln(pV1^.S);

pV1:=pV1^.NEXT

end;

{*** Освобождение памяти ***}

pV1:=pHEAD; {pV1 - текущий}

while pV1<>NIL do begin

pV2:=pV1^.NEXT; {pV2 - следующий}

dispose(pV1);

pV1:=pV2

end

end.