Студопедия

КАТЕГОРИИ:

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


Запись, описание типа, пример действий




Тип-запись представляет собой логически связанную совокупность компонент разного типа. Каждая компонента называется полем записи. Количество полей определяется информационным объектом и может быть любым в пределах общего ограничения на размер структуры. Тип-запись описывается с помощью служебного слова record следующим образом:

type <имя типа> = record

<имя поля1> : <тип1>;

. . .

<имя поляj> : <типj> end;

Ниже приведены примеры описаний. Однотипные поля можно описывать через запятую.

complex = record re, im : real end; {тип ‘комплексное число’}

book = record {тип-книга}

avtor : string[30]; {поле ‘автор книги’}

titul : string; {поле ‘название книги’}

god_izd : 1990..2003 {поле ‘год издания’} end;

Теперь можно описать и соответствующие переменные:

var z1, z2, z3 : complex; b : book;

Поле записи задается составным именем, например так: z1.re - вещественная часть комплексного числа z1; b.avtor - автор книги b. Из приведенных примеров видно, что составные имена полей могут быть достаточно громоздкими и затруднять описание действий с ними. Для упрощения обращения к полям записи служит оператор присоединения with, имеющий следующую конструкцию: with <имя записи> do <оператор>;

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

X
Для примера рассмотрим вложенную конструкцию оператора присоединения для следующей структуры данных.

 

       
 
 
   

 

 


A
program Vlogen_Zapisi;

B
var x : record

c : string;

y : record a, b : byte end {y}

end;

begin with x, y do begin

writeln(‘Введите через пробел поля a и b записи y - целое от 0 до 255’);

readln(a, b); {Вместо x.y.a и x.y.b}

writeln(‘Введите поле c записи x - строку символов’);

readln(с); end; {Вывод сделаем без оператора присоединения}

writeln(‘Поля записи x: ’, x.c, ‘ и поля записи y: ’, x.y.a:4, x.y.b:4) end.

 

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

type <имя типа> = record

<поле1> : <тип1>; … Фиксированная

<полеj> : <типj>; часть записи

case <переменная> : <тип> of Вариантная

ci, ck : (<поле> : <тип>; … часть

<поле> : <тип>); … записи

cp, cq : (<поле> : <тип>; …

<поле> : <тип>) end;

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

type figura = (cvadrat, treug, krug);

param = record {параметры фигуры}

x, y : real; {Фиксированная часть - точка привязки фигуры}

case figura of

cvadrat : (storona : real);

treug : (storona1, storona2, ugol : real);

krug : (radius : real) end;

Из описания видно, что запись о параметрах любой фигуры содержит фиксированную часть - координаты точки привязки фигуры на плоскости и вариантную часть, зависящую от вида фигуры и определяющую параметры ее прорисовки при заранее оговоренной ориентации фигуры

 

 

Билет №24

Операторы break и continue

Бывает, что цель выполнения цикла достигается раньше, чем он будет прекращен по условию выхода. Так, например, в программе для определения простоты числа цикл будет выполняться n div 2-1 раз, хотя то, что число не является простым, может быть обнаружено на первых шагах цикла. Чтобы уменьшить количество шагов цикла, можно воспользоваться оператором goto, либо сформировать сложное условие выполнения (прекращения) цикла.

Однако существуют специальные операторы, использующиеся для прерывания хода выполнения цикла. Оператор break выполняет полный выход из цикла, т.е. все возможные итерации цикла прерываются. Оператор continue прерывает только текущую итерацию. Break иcontinue являются процедурами, хотя обычно их называют операторами.

Операторы break и continue выполняются в любом из видов циклов (repeat, while, for) и действительны только для внутреннего цикла. Например, если нужно обеспечить принудительный выход из двойного цикла, оператор break должен быть расположен как во внутреннем, так и во внешнем цикле. Операторы break и continue по сути являются видоизмененными операторами goto с известной точкой, в которую осуществляется переход.

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

var num: real; i: integer;begin for i := 1 to 5 do begin write ('Введите число: '); readln (num); if num = 0 then break; writeln (num) end; readlnend.

В примере запрашиваются пять чисел и суммируются только положительные из них.

var num, sum: real; i: integer;begin sum := 0; for i := 1 to 5 do begin write ('Введите число: '); readln (num); if num < 0 then continue; sum := sum + num end; write (sum:10:2);readlnend.

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

type v = record

a: type1

b: type2

……

case n: typen of

c1:(t11: type11;

t12: type12; …);

c2:(t21: type21;

t22: type22; …)end;

var z: v;

Здесь z – переменная типа v; n – переменная, называемая переключателем; typen – тип переменной n.

Этому же типу должны принадлежать метки c1 и c2. Каждой метке соответствует набор полей t11, …. Эти поля являются компонентами варианта.

Если какой-либо метке c вообще не соответствуют поля, то пишут c…: ( );

Замечания:

1. Любая запись (record) может иметь только одну вариантную часть (case).

2. Вариантная часть должна помещаться после постоянной части.

3. Среди идентификаторов полей не должно быть одинаковых.

Обращение к компоненте z.tij записи z происходит так:

1. Присваивается соответствующее значение c… переключателю n. В зависимости от значения n переменная z, помимо полей a, b, …, содержит те поля, которые соответствуют той метке c…, с какой совпадает значение n.

2. Выполняется операция с компонентой z.tij.

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

Эта информация может быть описана, например, записью person.

Пусть переменная типа kind может иметь одно из значений («женат», «холост»).

kind = (married, single);

person = record

name: string;

datebirth: date;

case yesno: kind of

married: (name1: string; date1: date);

single: ()

end;

Здесь name – строка символов; datebirth – запись, содержащая дату рождения; yesno – переключатель типа kind, который может принимать одно из двух значений: married либо single; name1 – строка символов, содержащая фамилию супруга(и); date1 – запись, содержащая дату рождения; single – пустое поле.

Если персона в браке, то будет присутствовать поле married, если нет – поле single. Паскаль допускает вложение вариантов в типе record.

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

Пример.


Type

kind = (married, single);

date = record

day: 1..31;

month: 1..12;

year: integer;

end;

person = record

name: string;

datebirth: date;

case yesno: kind of

married: (name1: string; date1: date);

single: ()

end;

Var

p: person;

Begin

with p do begin

yesno := married;

name := 'panin';

with datebirth do begin

day := 14;

month := 5;

year := 1962

end;

case yesno of

married: begin

name1 := 'panina';

with date1 do begin

day := 30;

month := 12;

year := 1968

end; end; end;end;

with p do

write(' ', name);

with p.datebirth do

writeln(' ', day, '/', month, '/', year);

with p do

write(' ', name1);

with p.date1 do

write(' ', day, '/', month, '/', year);

readln end.


 

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

· при описании типизированных констант явно указывается их тип;

· типизированные константы могут менять свое значение по ходу выполнения программы также как обычные переменные;

· типизированные константы описываются в разделе CONST и также, как простые константы, получают при описании (начальное) значение;

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

Синтаксис описания типизированных констант:

CONST
ИмяКонстанты1 : ИмяТипа1 = Значение1;
ИмяКонстанты2 : ИмяТипа2 = Значение2;

Примеры описания типизированных констант:

CONST
R : Real = 19.875;
I : Integer = -10;
Title : String = 'Заголовок';
SpecChar : Char = '\';
{ стартовое значение можно задать масиву }
Vector : array[1..5] of Byte = (1,3,5,7,9);
{ а можно и множеству }
Indexes : set of Byte = [1..10,20,100..200];

Важно: Поскольку типизированные константы это, на самом деле, обычные переменные, их нельзя использовать в описаниях других констант и типов. Следующий фрагмент показывает пример НЕПРАВИЛЬНОГО использования типизированных констант:

CONST
Min : Byte = 0;
Max : Byte = 1;
e : Real = 2.7;
Interval = Max - Min + 1; {Ошибка }
e2 = e*e; { Ошибка }
VAR
V : array[Min..Max] of Integer; { Ошибка }

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

x := 0; y := 0; ch := 'n';
flag := FALSE;
a[1] := 1; a[2] := 0; a[3] := -1; a[4] := 0;

Более элегантное решение этой проблемы - переменная со стартовым значением: вводим идентификатор переменной, указываем ее тип и тут же (!) определяем ее начальное значение.

 

 


Поделиться:

Дата добавления: 2015-04-21; просмотров: 86; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты