Міністерство освіти і науки України
НУ „Львівська політехніка”
Кафедра ЕОМ
ЗВІТ
Про виконання лабораторної роботи №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.