Конспект лекций по информатике для специальностей 2102, 2103 Автор доц., к т. н. Каширская Е. Н

Вид материалаКонспект

Содержание


8.3. Записи с вариантами
9. Типизированная константа
Подобный материал:
1   ...   15   16   17   18   19   20   21   22   ...   25

8.3. Записи с вариантами


При определении комбинированного типа в него можно включать вариантную часть. Это означает, что разные переменные, хотя они и относятся к одному типу, могут иметь различные структуры. Например, пусть необходимо задать информацию о некотором человеке, указав фамилию и год рождения, а также, если это мужчина, то сообщить, военнообязанный ли он и какую имеет специальность; если это женщина, то указать, замужем ли она и сколько имеет детей:

Type Pol = (Mug, Gen);

Chel = Record

Fam: Array [1..10] of Char;

God: 1900..2000;

MG: Pol; { заголовок вариантной части }

Case Pol of

Mug: (Voen: Boolean; Spec: Array [1..15] of Char);

Gen: (Zamugem: Boolean; Dety: Integer);

End; (* of record *)

Var Ch1, Ch2: Chel;

Вариантная часть записи начинается оператором Case и следует за общей частью; после её окончания в записи не появляться никакие другие поля, поэтому оператор Case не закрывается служебным словом End.

Обычно некоторое поле общей части указывает вариант. В примере это поле MG, называемое полем признака или дискриминации.

Все варианты описываются внутри оператора Case. Каждый вариант характеризуется задаваемым в скобках списком описаний присущих ему компонентов.

Перед списком стоит одна или несколько меток. Тип этих меток указывается в заголовке вариантной части (в отличие от оператора варианта, где селектором варианта является выражение, а не тип). Тип должен быть скалярным (не массивы и не записи), При этом он задаётся именем.

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

Часто для сокращения записи поле признака (дискриминант) включается в заголовок вариантной части:

Case MG: Pol of

Для переменной Ch1 типа Chel можно написать следующие операторы присваивания:

Ch1.Fam := ‘Solomatin’;

Ch1.God := 1977;

Ch1.MG := Mug;

Ch1.Voen := True;

Ch1.Spec := ‘Programmist’;

Задав значение поля признака MG (некоторую константу типа Pol), можно присваивать новые значения только полям вариантной части, помеченных такой же константой.

Хотя никакого контроля поля селектора при обращении к компоненту из вариантной части не производится, для надёжности работы программы следует придерживаться этого правила.

В любой записи может быть только одна вариантная часть, и, если она есть, она должна располагаться за всеми фиксированными полями.

Пример.

Type Alfa = Array [1..10] of Char;

Variety = (Book, Journal, Newspaper);

Name = Record

First, Last: Alfa;

End; (* of Name *)

Edition = Record

Name1: Name;

Title, Publishers: Alfa;

Case V: Variety of

Book: (Years: Integer);

Journal: (Number: 1..12;

Volume: Integer;

YearJ: 1900..2000);

Newspaper: (Day: 1..31;

Month:1..12;

YearN: Integer);

End; (* of Edition *)

………………………

Var E: Edition;

…………………….…

E.Name1.First := ‘Niklau’;

E.Name1.Last := ‘Wirth’;

E.Title := ‘Pascal’;

E.Publichers := ‘Springer’;

E.V := Journal;

E.Number := 5;

E.Volume := 12;

E.YearJ := 1972;

В описании записи разрешается использовать только одну вариантную часть, причём она должна быть записана после фиксированной части. Однако в вариантной части, в свою очередь, может появиться вариантная часть, следовательно, могут быть вложенные друг в друга вариантные части.

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

Пример. Определить площадь геометрической фигуры.

X и Y – координаты одного из углов прямоугольника или треугольника или центра окружности.

Area – площадь.

Skew – угол наклона одной из сторон прямоугольника.

Side1 и Side2 – длины двух смежных сторон прямоугольника.

Inclin – угол наклона одной из сторон треугольника.

Side – её длина.

Angle1 и Angle1 – углы, образованные с нею двумя другими сторонами.

Diameter – диаметр окружности.

Program Opr;

Const Pi = 3.141592;

Type Figure = (Triangle, Rectangle, Circle);

GeometricFigure = Record

X, Y: Real;

Area: Real;

Case Shape: Figure of

Triangle: (Inclin, Side, Angle1,Angle2: Real);

Rectangle: (Skew, Side1, Side2: Real);

Circle: (Diameter: Real);

End; (* of record *)

Var GFig: GeometricFigure;

Begin

……………

Case GFig.Shape of Triangle: GFig.Area := 0.5*SQR(GFig.Side)/(cos(GFig.Angle1)/

sin(GFig.Angle2)+cos(GFig.Angle2)/sin(GFig.Angle1));

Rectangle: GFig.Area := GFig.Side1 * GFig.Side2;

Circle: GFig.Area := Pi * SQR(GFig.Diameter) / 4;

End; (* of Case *)

…………………….

End.

9. ТИПИЗИРОВАННАЯ КОНСТАНТА


Типизированную константу можно использовать как переменную. Её следует рассматривать как инициализированную переменную, значение которой задано с самого начала. Применение типизированных констант экономит машинное время, т.к. начальное присвоение значений уже выполняется компилятором.

Типизированные константы задаются, как обычные, но дополнительно они получают и свой тип. Необходимо принять во внимание, что заданные значения имеются в распоряжении программы только при новом ее пуске, а затем могут изменять свое значение. Повторный пуск программы не с самого начала может дать уже другие значения.

Преимущество применения типизированных констант заключается в простоте присвоения начальных значений для переменных.

Синтаксис (вид описания):

Const имя: тип = значение;