Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Описание записей и действия с ними




 

Для работы с группой данных различного типа введено понятие записи.

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

 

Примерызаписей:

1) Данные о студенте:

Фамилия – массив символов,

Имя – массив символов,

Год рождения – целое число,

Название института – массив символов.

2) Формуляр книги в библиотеке:

Автор – массив символов,

Название – массив символов,

Год издания – целое число,

Издательство – массив символов,

Количество страниц – целое число,

Цена – действительное число.

Все данные можно объединить в одну группу и считать записью. Запись в целом и отдельные её элементы обозначаются именами.

К каждому элементу записи можно обратиться с помощью уточнённого имени. Оно содержит имя записи, а через точку – имя элемента.

Запись, как и другие данные, объявляется в разделе описаний и используется в разделе операторов.

Описание записи имеет следующий вид:

Type имя_типа = Record

Имя_элемента 1: тип;

Имя_элемента 2: тип;

…………

Имя_элемента n-1: тип;

Имя_элемента n: тип;

End;

Var имя_записи: имя_типа;

Здесь служебное слово Record (запись) выполняет роль открывающей операторной скобки, End – закрывающей операторной скобки. Внутри операторных скобок описываются элементы записи. Допускается вместо имени записи указывать список имён, то есть имена записей, разделённые запятыми.

Элементы записи вместе с их описанием называются полями записи.

Пример.

Список 1                                        Список 2

No Фамилия Оценки                   1 ------------

1 ------------ (4 штучки              2 ------------

2 ------------ у каждого)            3 ------------

3 ------------ …………                4 ------------

Type T = Record

N: Integer:

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

Ball: Array [1..4] of Integer;

End;

Var C1, C2: T;

Здесь сначала введён тип записи Т, а затем в разделе переменных указано, что переменные С1 и С2 имеют тип Т.

Каждый элемент записи имеет своё описание:

N – переменная целого типа,

Name – массив из 10 символов (если фамилия содержит меньше 10 букв, то оставшиеся позиции заполняются пробелами),

Ball – массив из 4-х целых чисел (4 оценки за экзамен).

Допускается описание записи непосредственно в разделе переменных:

Var имя_записи: Record

Имя_элемента 1: тип;

Имя_элемента 2: тип;

…………

Имя_элемента n-1: тип;

Имя_элемента n: тип;

End;

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

а) ввести значения порядковых номеров

Read(C1.N);

Read(C2.N);

б) вычислить сумму первых двух оценок

Summa1 := C1.Ball[1] + C1.Ball[2];

Summa2 := C2.Ball[1] + C2.Ball[2];

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

Оператор присоединения.

 

Мы отметили, что обращение к элементам записи происходит с помощью уточнённого имени. Оператор присоединения позволяет упростить обращение к элементу записи. Имя записи выносится в заголовок оператора присоединения, а в блоке Begin – end используются только имена элементов записи.

Оператор присоединения имеет вид:

With имя_записи do

Begin

       Операторы

End;

Пример. Для 1-ой экзаменационной ведомости (списка 1) оператор присоединения можно записать так:

With C1 do

Begin

     Read(N);

     Summa := Ball[1] + Ball[3];

End;

Пример. Имеется ведомость учащихся с оценками:

Иванов Иван    2

Петров Пётр    2

Сидоров Сидор  3

Составить программу для вычисления среднего балла.

Поскольку в каждой строке ведомости представлены данные различного типа, введём запись с именем СПИСОК, состоящую из двух полей:

Name – фамилия и имя – упакованный массив из 15 символов;

Ball – оценка – целое число.

Для вычисление среднего балла Midball находится сумма всех оценок Summa, которая делится на число студентов N.

Program W123;

Const N = 3; (* число учащихся в списке *)

     M = 15; (* максимальная длина Name *)

Type T = Record

Name: Packed Array [1..M] of Char;

Ball: Integer;

End;

Var Spisok: T;

I, K: Integer; (* параметры цикла *)

Midball: Real; (* средний балл *)

Summa: Integer; (* сумма оценок *)

Begin

Summa := 0;

Writeln(‘ введите таблицу ‘);

For I := 1 to N do

Begin

        For K := 1 to M do

Read(Spisok.Name[K]);

Read(Spisok.Ball);

Summa := Summa + Spisok.Ball;

End;

Midball := Summa / N;

Writeln(‘----------------------------‘);

Writeln(‘ средний балл = ‘, Midball: 5: 2);

End.

 

 

Запись - это комбинированный тип, сложная переменная с несколькими компонентами. В отличие от массивов компоненты записи (поля) могут иметь разные типы, и доступ к ним осуществляется не по индексу, а по имени поля.

Записи могут входить в качестве компонентов в другие переменные, например, можно сформировать массив записей.

К каждому компоненту записи можно обратиться, используя имя переменной типа записи и имя поля, разделённых точкой.

В области действия оператора присоединения With имена переменных-записей и полей, указанные в его заголовке, можно опускать. Транслятор автоматически формирует полные имена. В области действия оператора присоединения нельзя изменять элементы списка переменных-записей и полей, указанные в заголовке.

 

Пример. Определить число студентов 1990 г. рождения.

Type Student = Record

    Name: Array [1..15] of Char;

    Date: Integer;

    End; { of record }

Var Grope: Array [1..30] of Student;

  K, I: Integer;

Begin

K := 0;

For I := 1 to 30 do

With Grope[I].Date do

If Date = 1974 then K := K + 1;

Writeln(K);

End.

В данном примере в заголовке оператора With стоит Grope[I] – элемент массива, зависящий от параметра I, поэтому оператор присоединения вставлен внутрь цикла по I.

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

 

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

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), можно присваивать новые значения только полям вариантной части, помеченных такой же константой.

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

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

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

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.

 

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

 

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

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

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

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

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










Последнее изменение этой страницы: 2018-05-27; просмотров: 174.

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