Міністерство освіти і науки України
НУ „Львівська політехніка”
Кафедра ЕОМ
ЗВІТ
Про виконання лабораторної роботи №2
Робота із записами, списками на масивах та списками на вказівниках
на мові Turbo Paskal
Студента групи КІ-17 Кохалика Р.В.
Львів 2003
Мета роботи: вивчення способів оголошення та алгоритмів опрацювання даних структурних типів .
Теоретичний вступ:
Робота із записами на мові Turbo Pascal
1. Оголошення та доступ до полів
Запис - це структура даних, що складається із кінцевої кількості логічно зв'язаних компонентів, які називаються полями запису. Від масивів записи відрізняються тим, що їх поля можуть бути різного типу. Поля запису мають імена для посилання на них.
Структура оголошення типу запису:
type
ім'я_типу = record
ім'я_поля1: тип_поля1;
ім'я_поля2,...,ім'я_поляj: тип_полів2_j;
{........................}
ім'я_поляn: тип_поляn
end;
Імена полів запису ї правильними ідентифікаторами Турбо-Паскаля. В межах одного типу запису вони повинні бути унікальними, але можуть співпадати з іншими ідентифікаторами поточного блоку програми, або з полями інших записів. Ім'я поля від типу поля відділяється двокрапкою. Якщо декілька полів мають однаковий тип, то вони можуть задаватися через кому. В якості типу поля може використовуватися довільний допустимий тип. Список полів охоплюється ключовими словами record-end. Після останнього опису поля перед end можна не ставити крапку з комою.
Якщо поле запису в свою чергує записом, то такі записи називаються вкладеними. Слід звернути увагу на те, що тип запису описується в блоці type, а сам запис оголошується в блоці var.
Приклад оголошення запису:
type rozm=record
x,y,z:real
end;
var size1:rozm;
var product:record
name:string[20];
count:word;
size:rozm;
price:real
end;
Доступ до полів запису здійснюється шляхом вказування імені запису та імені поля, розділених крапкою, наприклад:
product.name:='Вирiб 001';
product.count:=1;
Для вкладених записів необхідне уточнення:
product.size.x;
product.size.y;
Імена полів запису можуть повторюватися на різних рівнях їх вкладеності.
2. Масиви записів
Записи можуть бути елементами масивів, наприклад: var x:array[1..5] of product;
Тоді доступ до окремих полів здійснюється вказанням індексів елемента масиву, наприклад:
x[1].name:='Вирiб 001';
x[1].count:=1;
with x[1] do price:=890;
Ввід або вивід елементів масиву записів здійснюється у циклі:
for i:=1 to 5 do
with x[i], size do
begin
readln(name,count,x,y,z,price);
writeln(name,count,x,y,z,price)
end;
Списки.
Реалізація структури даних список за допомогою масиву являє собою не що інше як масив записів, які містять у собі переважно два поля: інформаційне поле і поле Next (або і Prev), тобто „вказівники” на наступний і попередній елементи. В цих полях містяться індекси наступного і попереднього елементів у масиві (там вони можуть бути не по порядку). Номер елемента у списку часто не співпадає з номером його у масиві. У цьому і полягає ідея зв’язаного списку.
Список на масиві:
const N = 100;
type
IndexType = 0 .. N;
InfoType = integer;
ElemType = record
Info : InfoType;
Next: IndexType;
end;
ListType = IndexType;
SpaceType = array[0..N] of ElemType;
var
Space : SpaceType;
Free : ListType;
Список на вказівниках:
type
InfoType = integer;
ListType = ^Elem;
Elem = record
info : InfoType;
next : ListType;
end;
Завдання для роботи:
Ввести інформацію про групу держав. Для кожної держави задані :
Назва
кількість населення
площа
кількість лікарень
Знайти назву держави з мінімальною кількістю лікарень.
Вивести список держав з густиною населення кожної.
Тексти програм:
Program Masuv;
Uses crt;
Type
TCountry = record
Name : string[3];
Population: longint;
square : longint;
Hospital : longint;
end;
const n=10;
Var
book : array [1..n] of TCountry;
f : text;
code,i : integer;
filename : string;
_name : string[10];
min : longint; Ro : real;
p : string[6]; s : string[3];
h : string[5];
Begin
clrscr;
filename:='C:\country.txt';
assign(f,filename); reset(f);
i:=0;
while (not eof(f)) do
begin
inc(i);
readln(f,book[i].name,p,s,h);
val(p,book[i].population,code);
val(s,book[i].square,code);
val(h,book[i].hospital,code);
end;
Min:=book[1].hospital;
For i:=2 to n do
if book[i].hospital < min then
begin
min:=book[i].hospital;
_name:=book[i].name;
end;
Writeln ('--------------------------------------------------');
writeln ('Країна з найменшою кількістю лікарень : ',_name,'.');
writeln ('Кількість лікарень : ',min);
Writeln ('--------------------------------------------------');
For i:=1 to n do
With book[i] do
begin
ro:=Population/square; write ('назва : ',name,'; ');
Writeln ('Густина населення : ',ro:8:2);
end;
close(f); readln
end.
Program M_List;
Uses crt, misc;
Type
TCountry = TInfo;
Var
Space : TLinkedList; temp : TInfo; f : text; code,i : integer; filename : string;
_name : string[10]; min : longint; Ro : real; p : string[6]; s : string[3]; h : string[5];
Begin
clrscr; filename:='C:\country.txt'; assign(f,filename); reset(f); i:=0;
EmptyList(space);
while (not eof(f)) do
begin
readln(f,temp.name,p,s,h); val(p,temp.population,code); val(s,temp.square,code);
val(h,temp.hospital,code); add(space,temp);
end;
Min:=space[at(space,0)].info.hospital;
For i:=1 to getLength(space)-1 do
if space[at(space,i)].info.hospital < min then
begin
min:=space[at(space,i)].info.hospital; _name:=space[at(space,i)].info.name;
end;
For i:=0 to GetLength(space)-1 do
With space[at(space,i)].info do
ro:=Population/square;
close(f);
readln
end.
--------------------------------------------------------------------------------------------------------------------Program P_List;
Uses crt, p_List;
Var
………………..
Begin
……... t:=list;
Min:=T^.info.hospital;
While T^.next<>nil do
begin
t:=FindAfter(t);
if t^.info.hospital < min then
begin
min:=T^.info.hospital;
_name:=T^.info.name;
end;
end; t1:=list;
While t1<>nil do
begin
ro:=T1^.info.Population/T1^.info.square;
t1:=findAfter(t1);
end ;
close(f); readln end.
На екрані в усіх трьох випадках отримаємо:
Країна з найменшою кількістю лікарень: Pol
Кількість лікарень: 500
Назва Ukr Густина населення 1083.33
Назва Rus Густина населення 166.77
Назва Ger Густина населення 1200.00
Назва Pol Густина населення 1066.77
Назва Usa Густина населення 2333.33
Назва Bel Густина населення 1935.48
НазваTur Густина населення 940.00
Назва Ita Густина населення 984.62
Назва Spa Густина населення 1010.09
Назва Bra Густина населення 1498.00
Висновок: На цій лабораторній роботі я навчився використовувати такі структури даних, як списки, записи.