Автор: Пользователь скрыл имя, 27 Декабря 2011 в 11:37, курсовая работа
Мова Паскаль відноситься до парадигми структурного програмування. Це значить, що поняття «структура» входить у програму не тільки на рівні загальної її побудови, але і передбачає структурування самої логіки й даних якими оперує мова програмування. Перш за все, даний принцип знайшов своє застосування в типізації мови, тобто наділенні її жорсткою системою визначених типів, комбінуючи які кваліфікований програміст може створювати свої власні типи, причому вже не тільки прості (атомарні), але і складні конструкції, які представляють собою – структури даних.
R.F,
де R - змінна комбінованого типу;
F - ідентифікатор поля.
Незалежно
від кількості оголошених змінних типу
"запис", поля кожної змінної називаються
однаково, відповідно до шаблона. Оскільки
імена полів "сховані" усередині
типу, вони можуть збігатися з іменами
"зовнішніх" змінних і поля в інших
описах записів, наприклад:
type PointRecType = RECORD
X,Y : Integer
END;
ColorPointRecType = RЕСОRD
X,Y:Integer;
Color:Word
END;
var X,Y :Integer; Point :PointRecType;
ColorPoint
:ColorPointRecType;
У програмі X,Point.X, ColorPoint.X - зовсім різні значення.
Записи
в Паскалі можуть мати так звану
варіантну частину. Це означає, що в межах
одного типу можна задати декілька різних
структур. Безпосередній вибір однієї
зі структур буде визначатися контекстом
або сигнальним значенням [2, c. 64]. Варіантні
поля при завданні шаблону запису вказуються
після того, як перераховані всі поля фіксованого
типу й оформляються особливим чином:
TYPE
VRecType = RECORD {Тип запису з варіантами}
Number :Byte;
case Measure : Char of {Ознака одиниць виміру довжини}
'д','Д':(INChes : Word); {В дюймах}
'с','С':(cantimeters :LongInt); {В сантиметрах}
'?':(Comment1,Comment2 : String[16]) {Тексти - коментарі}
END;
В прикладі запису є звичайне фіксоване поле Number, і поле-селектор Measure, обрамлене словами CASE і OF, після чого йде перерахування варіантів 3-го поля в круглих дужках. Вміст поля-селектора визначає, який саме варіант буде обраний при роботі з записом. В один й той же момент доступні поля тільки одного з можливих варіантів, в залежності від значення, привласненого полю - селектору. Усі варіанти розташовуються в одному й тому ж самому місці пам'яті, а розмір цього місця визначається самим об'ємним варіантом – в даному випадку 2*(16+1) байтів для поля String[16].
Поле-селектор можна ігнорувати, звертаючись до кожного з полів варіантів - те саме значення буде трактуватися відповідно до типу поля. В такому випадку завжди існує можливість помилок, які ніяк не діагностуються, але якщо не помилятися, то можна зі зручністю використовувати варіантні записи для збереження різних варіантів наприклад, як у наведеному прикладі, одиниць виміру довжини [3, c. 88].
Якщо
явний покажчик варіанта не потрібний,
його можна замінити ім'ям будь-якого перелічуваного
типу, що має достатню кількість варіантів:
TYPE
VRecType = RECORD
Number :Byte;
case Byte of
1:(INChes : Word); {В дюймах}
2:(cantimeters :LongInt); {В сантиметрах}
3:Comment1,Comment2 : String[16]) {Тексти - коментарі}
END;
Значення
констант в процесі опису в
цьому випадку - чиста формальність
і можуть бути будь-якими неповторюваними
в межах типу Byte [7, c. 105]. При відмовленні
від поля-селектора під час роботи програми
вже не можна визначити, який варіант повинний
використовуватися в даний момент і так
звичайно працюють при необхідності різнотипного
представлення тих самих даних:
TYPE
CharArrayType = Array[1..4] of char;
VAR
V4:RECORD
case Boolean of
True : (C:CharArrayType);
False: (B1,B2,B3,B4 :Byte)
END;
Поля B1..B4 дозволяють працювати з ASCII - кодами символів, а поля З[1]..C[4] - із символами, не прибігаючи до явного перетворення типів.
Змінні типу "запис" можуть брати участь тільки в операціях присвоювання, а їх поля - у будь-яких дозволених для їхнього типу операціях [1, c. 103].
Для полегшення роботи з полями записів у Паскалі введений оператор приєднання WITH з наступним синтаксисом використання:
WITH Ім.’яЗмінноїЗапису DO Оператор;
Усередині
оператора звертання до полів
уже виробляється без вказівки імені
змінної:
VAR
DemoRec : RECORD X,Y :Integer END;
WITH DemoRec DO
begin
X:=0;Y:=129;
End;
При
використанні всередині WITH "незаписних"
змінних необхідно стежити, щоб їх імена
не збігалися із "записними". При
необхідності "розв'язки" всередині
WITH до співпадаючих зовнішніх імен необхідно
дописати перед ними через крапку, ім'я
програми чи модуля в якому вони описані:
PROGRAM MAIN;
VAR X,Y :Integer;
RecXY :RECORD X,Y :Integer END;
begin
WITH RecXY DO begin
X:=3.14*Main.X;
Y:=3.14*Main.Y end;
end;
Якщо
одне з полів запису - теж запис,
можна поширити оператор приєднання на
декілька полів всередину, перелічивши
їх через кому, але всередині тіла оператора
можна буде звертатися тільки до останніх
полів:
WITH Имязаписи, Поле_Запис DO
begin
Звертання до імен полів Поля_Запис
end;
Дано два комплексних числа. Знайти комплексне число, що є сумою даних чисел. Використовувана структура даних - запис [14, c. 116].
PROGRAM Summa (Input,Output);
type
Complex = Record
RE: Real;
IM: Real
end;
var X,Y: Complex; { Вхідні параметри }
S: Complex; { Результат }
BEGIN
WriteLn ('Уведіть дійсну і мниму частину комплексного числа X :');
Read (X.RE,X.IM); WriteLn;
WriteLn ('Уведіть дійсну і мниму частину комплексного числа Y :');
Read (Y.RE,Y.IM); WriteLn;
S.RE:=X.RE+Y.RE; S.IM:=X.IM+Y.IM;
Write ('Перед Вами - результат... ', S.RE:5:2,' + i',S.IM:5:2)
END.
Програма,
що демонструє роботу оператора приєднання
With [12, c. 94].
PROGRAM Wit (Input,Output);
type
R = Record { R - ім'я комбінованого типу }
X: Real;
Y: Char
end;
Q = Record { Q - ім'я комбінованого типу }
A: Integer; { A - ім'я поля }
B: R
end;
var U: Q;
X: Integer;
A: Char;
BEGIN
U.A:=2; U.B.X:=7.3; U.B.Y:='І'; { Ініціалізація змінних комбінованого типу }
WriteLn ('Уміст поля A ... ',U.A); { Інший спосіб ініціалізації }
WriteLn; WriteLn 1 0(' Використання оператора With...');
With 1 0U 1 0do
begin
A:=1; B.X:=6.7; B.Y:='A'; WriteLn ('Уміст поля A 1.. ',A,', ')
end;
A:='C'; WriteLn ('а значення змінної A ... ',A)
END.
Копіювання
одного запису в іншу [11, c. 315].
PROGRAM Copyrovanie (input,output);
type
P = Record
n : integer;
FIO : string[12];
Otsenka: array[1..3] of integer
end;
var V,VCopy: P;
BEGIN
V.n:= 5; V.FIO:= 'Зеніт'; { Ініціалізація змінної V комбінованого типу }
V.Otsenka[1]:= 4; V.Otsenka[2]:= 5; V.Otsenka [3]:= 3;
VCopy := V; { Запис V скопійований у запис VCopy! }
WriteLn('Гляньте, чи правильно ми скопіювали... ');
Write (VCopy.n,' ',VCopy.FIO,' ',VCopy.Otsenka[1],' ',
VCopy.Otsenka[2],' ',VCopy.Otsenka[3]); WriteLn
END.
Нижче наведена демонстраційна програма, яка показує основні моменти роботи з комбінованими типами даних, а саме:
a) опис масиву записів;
b) ініціалізацію масиву записів;
c)
передача значень
Постановка
задачі: дано масив записів, який складає
з двох елементів. Запис має три поля: речовинного,
цілого і символьного типів. Необхідно
знайти для кожного елемента масиву суму
вмісту "цілого" і "речового"
полів [9, c. 130].
PROGRAM Demostr;
type
R = 1..2;
Q = Record { Q - ім'я комбінованого типу }
Logic: Boolean; { Ім'я поля : Logic }
Tchislo: Integer; { Ім'я поля : Tchislo}
Coffi: Real; { Ім'я поля : Coffi }
end; { Після імені поля - тип поля }