Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Описание записей и действия с ними
Для работы с группой данных различного типа введено понятие записи. В языке программирования Паскаль запись представляет собой совокупность ограниченного числа данных различного типа.
Примерызаписей: 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; просмотров: 210. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |