Міністерство освіти і науки України
НУ „Львівська політехніка”
Кафедра ЕОМ
ЗВІТ
Про виконання лабораторної роботи №6
Робота із записами на мові 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. Оператор дії над записами
Для спрощення доступу до полів запису використовуїться оператор with-do:
with ім'я_запису do оператор;
Ім'я запису ї правильним ідентифікатором і повинно бути попередньо оголошене в блоці var. Ім'я запису може визначати елемент масиву записів.
В якості оперетора може використовуватися довільний оператор Турбо-Паскаля, в тому числі складений.
Приклад використання оператора with:
var
date: record
month:byte;
year :word
end;
{........}
with date do
if month=12 then begin
month:=1;
year:=year+1
end
else
month:=month+1;
Приведений приклад еквівалентний наступному:
if date.month=12 then begin
date.month:=1;
date.year:=date.year+1
end
else
date.month:=date.month+1;
Оператор with може бути вкладеним:
with V1 do
with V2 do
{........}
with Vn do
оператор;
де V1,...,Vn - імена записів. Цей оператор еквівалентний наступному: with V1,V2,...,Vn do оператор;
На i-му рівні вкладеності операторів with дії наступне правило: ідентифікатор x вважаїться іменем поля запису Vi, потім - (i-1)-го запису і т.д.; Імена записів перевіряються на вкладеність. Тому ідентифікатор x буде в першу чергу полем вкладених записів. Якщо це не так, то x перевіряїться на належність до окремих записів знизу вгору. Якщо ідентифікатор x не входить ні в один із записів, то він повинен бути описаний як елемент іншого типу даних.
3. Ініціалізація записів
Початкова ініціалізація записів може бути виконана одним із наступних способів:
1) оголошенням типованих констант;
2) шляхом присвоїння значень полям в операторній частині програми;
3) при вводі значень полів з клавіатури.
При оголошенні типованих констант типу запис у круглих дужках вказуються назви полів та їх значення. Назва поля від його значення відокремлюїться символом "двокрапка", а одне поле від іншого - символом "крапка з комою". Приклад оголошення типованої константи:
Const m:product=(name:'Вирiб 001';
count:1;
size:(x:20;y:50;z:40);
price:890);
Полям змінної типу запис можна присвоїти значення в операторній частині програми, наприклад:
Var m:product;
begin
with m,size do
begin
name:='Вирiб 001';
count:=1;
x:=20; y:=50; z:=40;
price:=890
end
{...}
end.
Ввід записів з клавіатури та вивід на екран або на принтер здійснюїться по окремих полях. При вводі різнотипних полів необхідно пам'ятати, що:
1) числові поля одне від одного та від полів іншого типу відділяються пропусками, символом табуляції або переходу на новий рядок;
2) в символьне поле (char або string) будуть прочитані один або декілька символів розділення, розміщених зразу після останнього прочитаного поля;
3) рядки символів читаються до вичерпання оголошеної довжини або до символу EOLN, який формуїться при натисканні клавіші Enter. Символ EOLN у рядок не потрапляї і може бути прочитаний наступним вводом символьних даних. Приклад вводу та виводу полів запису:
Var m:product;
begin
writeln('Введіть поля запису: string[20] word real real real real');
with m,size do readln(name,count,x,y,z,price);
with m,size do writeln(name,count,x,y,z,price);
{...}
end.
4. Операції над записами
Для тотожніх записів дозволяїться виконання операції присвоїння, наприклад:
Type rec=record
move:(Right,Left,Ahead,Back,Stop);
x,y:real
end;
Const a:rec=(move:Ahead;x:2.0;y:5.0);
Var b:rec;
Begin
b:=a;
with b do
begin
case move of
Right: write('Right':-10);
Left: write('Left':-10);
Ahead: write('Ahead':-10);
Back: write('Back'):-10;
Stop: write('Stop':-10)
end;
writeln(x:5:2,y:5:2); end
End.
Порівняння двох записів здійснюїться окремо по кожному полю, наприклад: if (a.move=b.move) and (a.x=b.x) and (a.y=b.y) then writeln('Записи співпадають');
5. Масиви записів
Записи можуть бути елементами масивів, наприклад: 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;
Текст програми:
Program tovar;
Uses crt;
type Tnomencl = record name: string; code: longint; price: longint; end;
type Torder = record code, quantity: longint; end;
type Tcheque = record name:string; cost:longint; end;
const Goods: array [1..5] of Tnomencl = ((name: 'Parasol'; code: 1; price: 50),
(name: 'cricket'; code: 2; price:1),
(name: 'Sound card'; code: 3; price: 20),
(name: 'jeans'; code: 4; price: 60),
(name: 'disk'; code: 5; price: 15));
Var
Cheque: Array [1..5] of Tcheque;
Order:Array [1..5] of Torder;
i:integer;
e:string;
Begin
Repeat
Writeln ('Enter quantity');
For i:=1 to 5 do With order[i] do
Begin
Write ('Code:',i,' Quantity:');
code:=i;
Read (quantity);
End;
Writeln ('---------------');
For i:=1 to 5 do With cheque [i] do
Begin
name:=Goods[i].name;
cost :=Goods[i].price*order[i].quantity;
Writeln ('Name:',name);
Writeln ('Cost:',cost);
Writeln ('---------------');
End;
Writeln ('For exit press "Q"');
e:= readkey;
Until e ='q';
readln;
readln;
end.