Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Статические структуры данных 2 страница




………………………………..

X:=Y; Y:=X; X:=Y+0.5; Y=3.14 – недопустимо.

 

После объявления массива, каждый его элемент можно обработать, указав имя массива и индекс элемента в квадратных скобках. Например, запись MAS[2], VEG[10] позволяет обратиться ко второму элементу массива MAS и к десятому элементу массива VEG.

При работе с двумерными массивами указывается два индекса, с N-мерными, N индексов. Например, запись MATR[2,3] делает доступным для обработки значение элемента находящегося во 2-й строке 3 столбца массива MATR.

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

B[10]: = B[3] + 1;

Sum: = Sum – C[K];

P1: = A[2*I + 1];

 

Рассмотрим типичные ситуации, возникающие при работе с данными типа ARRAY. Для этого опишем три массива и четыре вспомогательные переменные.

Пример:

VAR A,D: array[1..4] of real;

B: array[1..10,1..15] of integer;

I,J: integer; K: integer; S: real;

Инициализация массива заключается в присваивании каждому элементу массива одного и того же значения, соответствующего базовому типу. Это можно сделать, записав группу операторов присваивания. Например,

A[1]:=0; A[2]:=0; A[3]:=0; A[4]:=0;

Однако, при большом количестве элементов такой способ нерационален. Гораздо удобнее получить тот же результат, используя оператор FOR.

FOR I:=1 TO 4 DO A[I]:=0;

Для инициализации двумерного массива, обычно используют вложенный оператор FOR:

FOR I:= 1 TO 10 DO

FOR I:=1 TO 15 DO B[I,J]:=0;

Паскаль не имеет средств ввода – вывода элементов массива сразу, поэтому ввод – вывод производится поэлементно.

Значения элементам массива можно присвоить с помощью оператора присвивани, однако чаще всего они вводятся с экрана с помощью оператора READ (READLN).

FOR I:=1 TO 4 DO READLN(A[I]); для двумерного

FOR I:=1 TO 10 DO

FOR J:=1 TO 15 DO READLN(B[I,J]);

Можно ввести и значения отдельных элементов, а не всего массива. Например. Read(A[3]); Read(B[6,9]);

Вывод значения элементов массива выполняется аналогичным образом с помощью оператора WRITE или WRITELN

FOR I:=1 TO 4 DO WRITELN(A[I]); или

FOR I:=1 TO 10 DO

FOR J:=1 TO 15 DO WRITELN(B[I,J]);

Копированием массивов называется присваивание всех элементов одного массива всем соответствующим элементам другого массива. Копирование можно выполнить одним оператором присваивания. A:=D; или с помощью оператора FOR:

FOR I:=1 TO 4 DO A[I]:=D[I];

Оба массива должны быть идентичны по структуре.

Иногда требуется осуществить поиск элемента в массиве, или каких либо элементов, удовлетворяющих некоторым известным условиям. Например, необходимо выяснить сколько элементов массива А имеют нулевое значение. Введем дополнительную переменную К.

K:= 0; FOR I:=1 TO 4 DO

If A[I]=0 then K:= K + 1;

После выполнения цикла переменная К будет содержать количество элементов массива А равно 0.

Перестановка значений элементов массива осуществляется с помощью дополнительной переменной того же типа, что и базовый тип массива. Например, требуется поменять значение первого и пятого элементов массива А. S:=A[5]; A[5]:=A[1]; A[1]:=S;

Нахождение суммы элементов массива:

S:= 0; FOR I:=1 TO 4 DO begin

Read(A[I]); S:=S + A[I]; end.;

Упакованные массивы. Если перед названием типа стоит ключевое слово PACKED, то при трансляции генерируется программа, плотно упаковывающая данные в ячейки памяти. Дело в том, что единица хранения в компьютере – это слово. В то же время для изображения символа достаточно иметь один байт памяти. С целью экономии памяти машины и введено понятие упакованного массива. Цена за (упаковку) сэкономленную память – понижение скорости отражения в памяти во время выполнения (так как для работы с элементами массива требуется распаковка). Например:

VAR AP:packed array[1..3] of boolean;

ANP: array[1..3] of boolean;

идентичны в списке объема и характера хранимой информации, но различными способами представления в памяти.

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

VAR < имя массива>: packed array [тип индекса] of char;

Пусть, например, имеется строка «Савельева Лена». Эту строку символов можно считать массивом из 14 символов, включая пробел. Обозначим имя массива через FAM. Описание массива будет выглядеть следующим образом:

VAR FAM: packed array[1..14] of char;

Один элемент массива принимает значение одного символа, например,

FAM [1] = ‘C’, FAM[2] = ‘A’…

К упакованному массиву Z можно применить стандартные процедуры PACK and UNPACK

Pack (B,I,Z) означает “упаковку” элементов массива В, начиная с I элемента в массив Z. UNPACKED (Z,B,I) означает «распаковку» массива Z в массив В, начиная с I элемента массива В.

VAR prolix:array[1..1000] of char;

Pitn: packed array[1..1000] of char;

Pack (prolix,1,pitn); unpack(pitn,prolix,1);

Строковая константа состоит из букв, заключенных в апострофы. Если в строку нужно включить апостроф, то он должен быть записан в виде пары апострофов: WRITE(' под"езд');

К строкам и упакованным символьным векторам применимы операции отношения, но при этом аргументы обязательно содержат одинаковое количество символов. Строковые константы можно присвоить строковым переменным, но присваивание допустимо, если количество литер константы совпадает с размером упакованного массива. Во многих современных компиляторах не требуется совпадения длин.

VAR yon:packed array[]1..10 of char;

Begin yon:= ‘IT’’S cold’;

 

6.1.3. Составление программ с массивами

Большое число научно-технических задач, а также некоторые исследования в области вычислительной математики требуют вычислений с матрицами и их характеристиками.

Действия над матрицами.

1. Сумма (разность) матриц.

a11+b11 a12+b12... a1n+b1n

C[m..n]= A[m..n]+B[m..n]= a21+b21 a22+b22... a2n+b2n

............................

am1+bm1 am2+bm2... amn+bmn

2. Произведение матриц. Под произведением матрицы A[m..p] на матрицу B[p..n] 0понимают матрицу С[m..n], элементы которой вычисляются по формуле

p

c[i,j] = a[i,k] * b[k,j]

k=1

 

Иначе говоря, элемент C[i,j] равен сумме попарных произведений элементов i-й строки матрицы А на соответствующие элементы j-го столбца матрицы В.

 

3. Транспонирование матриц (m*n). Транспонированной по отношению к матрице А называется матрица А1, в которой строки матрицы А становятся соответствующими столбцами матрицы А1.

При программировании действий с матрицами, матрицы отображаются на паскалевский двумерный массив. Оформим программу в виде основной программы и трех процедур Summa, Proizv, Transp соответственно для вычисления суммы матриц А и В, произведения матриц А1 и В1 и транспонирования матрицы А.

Пример:

Program Ex8;

Const m=2; n=3;

m1=2; n1=2; p=3;

Type abc = array[1..m,1..n] of real;

a1t = array[1..m1,1..p] of real;

b1t = array[1..p,1..n1] of real;

at = array[1..n,1..n] of real;

Var a,b,c:abc; a1:a1t; b1:b1t; i,j:integer; aa,aa1:at;

Procedure Summa(a,b:abc; var c:abc);

begin

For i:=1 to m do For j:=1 to n do c[i,j]:=a[i,j]+b[i,j]

end;

Procedure Proizv(a:a1t; b:b1t; var c:abc);

Var k:integer; s:real;

Begin

For i:=1 to m do For j:=1 to n do

begin s:=0;

For k:=1 to p do s:=s+a[i,k]*b[k,j];

c[i,j]:=s end;

end;

Procedure Transp(aa:at; var aa1:at);

begin

For i:=1 to n do For j:=1 to n do

aa1[i,j]:=aa[j,i]

end;

Begin

Writeln('Задайте матpицу А');

For i:=1 to m do

For j:=1 to n do read(a[i,j]);

Writeln('Задайте матpицу B');

For i:=1 to m do

For j:=1 to n do read(b[i,j]);

Summa(a,b,c);

Writeln('Сумма матpиц');

For i:=1 to m do begin

For j:=1 to n do

write(c[i,j],' ');

writeln

end;

Writeln('Задайте матpицу А1');

For i:=1 to m1 do

For j:=1 to p do read(a1[i,j]);

Writeln('Задайте матpицу B1');

For i:=1 to p do

For j:=1 to n1 do

read(b1[i,j]);

proizv(a1,b1,c);

Writeln('Пpоизведение матpиц');

For i:=1 to m1 do begin

For j:=1 to n1 do

write(c[i,j],' ');

writeln

end;

Writeln('Задайте матpицу для тpанспониpования');

For i:=1 to n do

For j:=1 to n do

read(aa[i,j]);

Transp(aa,aa1);

Writeln('Тpанспониpованная матpица');

For i:=1 to n do begin

For j:=1 to n do

write(aa1[i,j],' ');

writeln

end;

end.

6.2. Строковый тип

Строка – это последовательность символов, количество которых колеблется от 0 до 255. Используется для обработки текстовой информации. Строка сравнима с одномерным массивом символов, но имеет существенное отличие. Массив символов имеет фиксированную длину (количество элементов), которое определяется при описании.

Строка имеет две разновидности длины:

· Общую длину строки, которая характеризует размер памяти, выделяемый строке при описании;

· Текущую длину строки (всегда меньшую или равную общей длине) которая показывает количество смысловых символов строки в каждый конкретный момент времени и указывается в нулевом элементе строки;

 

Формат:

Const <идентификатор> = ‘<Текст>’;

Var <список идентификаторов>: string[n];

Type <имя типа> = string[n];

 

где n – количество символов в строке (если не указываются, то 255 символов длина строки по умолчанию).

Пример:

Const C1=’Pascal’;

Var C2,C3,C4: string[20];

Type C=string[50];

Var a,b: C;

 

Задать значения строке можно двумя способами

1. Оператором ввода – причем для строк применяется только Readln()

2. Присвоением последовательности символов строковым переменным.

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

 

Пример:

Readln(C2);

C3:=’Borland’+C1;

 

Произвольные пары строк могут сравниваться с помощью операторов отношений.Операторы отношений это =, <>, <, >, <=, >=.

Приоритет каждого оператора отношения ниже приоритета операции конкотинации (объединение строк – результатом, которой является строка, представляющая собой строку состоящую из всех символов первой строки и следующих за ними всех символов второй строки).

Две строки равны только тогда, когда они одинаковой длины и состоят из идентичных символов. Если они не равны, то отношение строк заменяется отношением весов первых двух соответствующих друг другу, но неравных символов. Если такая пара не найдена, а строки совпадают до последнего символа более короткой строки, то короткая строка рассматривается как меньшая.

Расширение совокупности строковых операций являются процедуры и функции работы со строками.

Функции и процедуры для работы со строками:

Copy(s1, pos, kol):string – функция копирует из строки S1 количество kol символов, начиная с символа с номером pos.

Concat(s1,s2,..,sn):string – функция возвращает строку, представ-ляющую собой сцепление строк-параметров s1, s2,...,sn.

Insert(s1, s2, pos) – процедура вставляет подстроку s1 в строку s2 начиная с позиции pos.

Delete(s, pos, kol) – процедура удаляет количество символов kol из строки s, начиная с позиции pos.

Length(s):word - функция возвращает текущую длину строки s.

Val(s, arg, cod) – процедура преобразует строку символов s, в целое или вещественное значение arg, определяемое типом переменной, при этом позицию непреобразованного символа возвращает переменная cod.

Pos(s, text):word – функция отыскивает в строке text первое вхождение подстроки s и возвращает номер позиции, с которой она начинается.

Str(i,s) – процедура преобразует число i с заданным форматом в строку s.

6.3. Множественный тип

В математике множеством называют такую совокупность каких-либо объектов, называемых элементами, в которой никакие два элемента не совпадают (то есть среди них нет повторяющихся), и их порядок не имеет значения. Математическое множество может содержать любое число элементов, какой угодно природы. Для каждого множества должно существовать некое универсальное множество, в котором содержатся все элементы, представимые данным множеством. Например, про множество чисел от 1 до 10 можно было бы сказать, что оно выбрано из универсального множества "все числа от 1 до 100". Одним из способов математического обозначения множеств служит список элементов, заключенный в фигурные скобки {1,3,6}.

Множество в Паскале - это структура данных, сохраняющая некоторые (не все!) черты математических множеств. Как и в математике, повторяющиеся элементы во множествах Паскаля игнорируются.

Не имеет значения и порядок их следования. Универсальному множеству в Паскале соответствует понятие базового типа, для которого установлены определенные ограничения. Базовым может быть только простой порядковый тип, например, integer, char, (включая перечисление) или отрезок такого типа. Следует особо отметить, что элементами множеств Паскаля не могут быть ни вещественные числа (поскольку real не относится к классу порядковых типов), ни строки (потому что это не простой тип, а тем более не порядковый).

Размер множеств Паскаля всегда ограничен предельно допустимым количеством элементов, тогда как для математических множеств таких ограничений нет. Порядковое значение (даваемое функцией ord) каждого элемента базового типа должно лежать в диапазоне от 0 до 255. Список элементов, входящих в множество, записывают заключенным не в фигурные, а в квадратные скобки, например, [1,3,6]. Одно и то же множество можно записать не единственным способом, поскольку порядок элементов в множестве не имеет значения. Записав [4,2,6] или [6,2,4], мы фактически будем иметь дело с одним и тем же множеством. Более того, многократное повторение какого-либо элемента никак не влияет на "состав" множества, на основании чего мы могли бы даже записать [2,2,4,6], и речь шла все о том же множестве из трех чисел 2,4,6. Множество, не содержащее ни одного элемента, называется пустым или нульмножеством и обозначается просто парой скобок [] или [ ].

 

Объявление и построение множества.

По форме записи объявление множественной переменной похоже на объявление ряда (одномерного массива) с той лишь разницей, что вместо служебного слова array здесь применяется слово set (множество). Подобно тому, как мы поступали с другими типами данных, можно сначала определить тип множества, а затем использовать его для объявления одной или нескольких переменных.

 

Формат: Const <идентификатор> = [<эл-т1>, <эл-т2>,…,<эл-тN>];

Type <идентификатор> = SET OF <базовый тип>;

Var <список идентификаторов>: SET OF <базовый тип>;

 

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

 

Type

Weekdays = (Mon, Tue, Wed, Thu, Fri);

Digits = set of 0..9;

Letters = set of 'a'..'z';

Var

Days:set of Weekdays;

Symbols: digits;

Initial: letters;

Colors: set of (black, white, gray);

Number1:0..9;

Number2:0..9;

По отношению к множеству Days множество Weekdays выступает в роли универсального множества. Digits - множество целочисленных объектов со значениями из диапазона 0..9. Объявление множества Colors непосредственно сообщает, какие именно элементы могут быть в нем представлены.

Очень важно понимать, что сам факт перечисления в объявлении каких-то элементов указывает лишь на принципиально возможный набор значений. Иначе говоря, объявление множества описывает полную совокупность элементов (то есть универсальное множество), но при этом не создает никаких значений в самой set-переменной.

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

Например:

Colors:=[white,gray];

Initial:=['k'..'p'];

Symbols:=[9,4..6];

Days:=[Tue..Thu];

Days:=[Fri..Tue];

В последнем предложении назначения справа стоит множество, заданное отрезком дней недели, с пятницы по вторник. Как мы знаем, порядок следования элементов для множеств не играет роли, однако, при задании отрезков такой порядок важен. В базовом типе Weekdays было установлено, что Fri(пятница) идет после Tue(вторника), поэтому множество от пятницы до вторника пусто.

Что можно сказать по поводу таких предложений?

Days:=[9];

Colors:=[Mon];

Это ошибки, потому что в обоих случаях множества, состоящие слева и справа от символа:=, имеют совершенно разные базовые группы.

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

Number1:=5;

Number2:=9;

Symbols:=[Number1, 7, Number2];

В правой части последнего выражения получаем [5,7,9], что и определяет результирующее значение множества Symbols.

 

Операции над множествами.

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

Объединение. двух множеств А и В, записываемое как А+В, есть новое множество, состоящее из элементов, принадлежащих множеству А или В, или тому и другому одновременно.

Пример:

Type Ch = set of char;

Var Ch1, Ch2, Ch3:Ch;

...

Ch1:=['a','x','e'];

Ch2:=['o','x'];

Ch3:=Ch1+Ch2;

В результате объединения Ch3 будет содержать 4 элемента ['a','x','e','o'].

Пересечение. двух множеств А и В, записываемое как А*В, есть новое множество, состоящее из элементов, принадлежащих как А, так и В.

Ch3:=Ch1*Ch2;

Ch2:=Ch1*['n','o'];

В результате пересечения Ch3 будет содержать только один элемент [x]. В следующем предложении утверждается, что множество Ch2 должно быть образовано из элементов 'n' и 'o' при условии, что они есть во множестве Ch1. Если же ни того, ни другого там нет, множество Ch2 будет пустым.

Разность двух множеств А и В, записываемая как А-В, есть новое множество, состоящее только из тех элементов А, которые отсутствуют в В.

Пример:

Сh1:=['a','e','t'];

Ch2:=Ch1-['e']; {'a','t'}

Ch3:=['s','e','t']-Ch1; {'s'}

 

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

Необходимо отметить, что символы +, *, -, используемые для обозначения основных множественных операций, имеют совсем иные значения, будучи употреблены с числовыми величинами, а знак +, кроме того, выступает еще и как оператор конкатенации строк. Программист должен очень внимательно следить за тем, с какими смысловыми значениями появляются указанные знаки в том или ином контексте. В частности, заведомо ошибочной будет всякая попытка соединить одним из перечисленных операторов множество и число. Однако, ничто не мешает какой-то целочисленной переменной, скажем х, фигурировать в качестве элемента множества, например, так [x].

Манипулируя множественными операциями, очень легко добавлять элементы к множеству или, наоборот, удалять их из него.

Ch1:=Ch1+['k'];

Ch2:=Ch2-['m'];

Если 'k' уже был в Ch1 или 'm' не было в Ch2, то ничего не изменится.

Сравнение множеств в Паскале осуществляется при помощи различных операторов отношений.

Два множества А и В равны, если каждый элемент из А является также элементом В и наоборот. (А=В)

Множество А есть подмножество множества В, если каждый элемент А присутствует и в В. (А<=В)

Кроме того, имеется возможность выяснить, принадлежит ли данный элемент некоторому множеству. Для этой цели предусмотрен специальный оператор in. (x in A)

Результат выполнения операций сравнения, подмножества и принадлежности имеет булевский тип (True или False).

 

Таблица 6.1. Старшинство множественных операторов

Приоритетный уровень Операторы Операции
1(высший) * Пересечение
  + - Объединение, разность
3(низший) = <> >= <= in Равенство, неравенство, подмножество, принадлежность

 

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

 

6.4. Комбинированный тип (Запись)

Пусть необходимо разработать программу, которую нам предстоит разработать, должна ввести исходные данные, содержащие сведения о студентах класса (например, фамилию, имя, пол (М или Ж), возраст, образование. Уровень образования задается целочисленным кодом: 0 - средняя школа, 1 - ПТУ, 2 - техникум, 3 - ВУЗ, 4 – лицей, 5 - гимназия), а затем по запросам выдавать различные справки по поводу тех или иных студентов. Выражаясь профессионально, суть программы можно определить иначе: она должна создавать базу данных класса и обеспечивать пользователя сведениями относительно ее содержимого. База данных - это некоторая совокупность взаимосвязанных данных, определенным образом организованных для обеспечения легкого доступа к ним. Программируя подобные задачи на Паскале, обычно применяют такие организационные формы, как записи, ряды, состоящие из записей, и другие более сложные структуры и механизмы, в основе которых лежит идея записи.

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

 

6.4.1. Формат описания. Фиксированные записи

Описать в программе запись можно двумя способами: построив определение соответствующего типа или задав такой тип непосредственно в объявлении некоторой переменной. Допустим, мы хотим определить тип данных record с именем adres. Наша запись должна иметь два элемента - номер дома (типа integer) и название улицы (типа string); их описания, обрамленные синтаксическими ограничителями record и end, и составят определение типа записи.

Пример:

Type adres = record

number:integer;

name: string [20];

end;

Здесь имя adres выступает как обозначение построенного нами типа данных, включающего две компоненты: number и name. Отдельные элементы в типе record описываются как переменные.

Теперь, располагая определением типа adres, можно объявить одну и более переменных этого типа или даже массив из элементов типа adres.

Var home:adres;

family: array[1..4] of adres;

Запись home можно было объявить и напрямую, не заботясь о предварительном определении типа:

Var home: record

number:integer;

name: string [20];

end;

 

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

Структура вложенной записи

Teacher

 

Soname Birthday Adress first last

'Mary' 'Smith' '26.06.68' street city state tel

numb name 'Sevastopol' 'Ukr' '442211'

37 'Big Sea'

 

Построить такое описание можно различными способами.

Первый состоит в том, что структуру, показанную на рисунке, представляют состоящей из нескольких подструктур и соответственно этому определяют несколько отдельных типов. Затем, опираясь на эти определения, строят тип вложенной записи, который и станет типом переменной teacher, объявленной в секции Var.

Пример:

Type

{ Имя и фамилия }

NameRec = record

first: string [10];

last: string [10];

end;

{ Номер дома и улица }

StrRec = record

numb:integer;

name: string [20];

{ Полный адрес }

AdrRec = record

street: StrRec;

city: string [15];

state: string [3];

tel: string [6]

end;

{ Анкетные данные преподавателя }

TeacherRec = record

Soname: NameRec;

Birthday: string [8];

Adres: AdrRec;

end;

Var Teacher:TeacherRec;

 

Для описания сразу всех преподавателей кафедры (в предположении, что их будет не больше 20) воспользуемся объявлением массива записей:

Var Teacher: array [1..20] of TeacherRec;

Запись Teacher можно объявить и другим, более простым способом, описав сразу все детали типа этой переменной:

Var Teacher:

record

Soname: record

first: string [10];

last: string [10];

end;

Birthday: string [8];

Adres: record

Street: record

numb:integer;

name: string [20];

city: string [15];

state: string [3];

tel: string [6]

end;

end;

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

 

 

6.4.2. Поля записи. Предложение with

Еще одна особенность, присущая записям, состоит в том, что далеко не все составляющие структуры должны быть "носителями" конкретной информации. Так, в нашей записи Teacher на уровнях first и last содержатся вполне определенные данные, тогда как на уровне Name их нет. Имя Name играет здесь особую роль: оно указывает на те места записи, где находятся значения first (имя преподавателя) и last (его фамилия). Записи, предназначенные для непосредственного размещения информации, называются полями. Для каждого поля должно быть указано некоторое имя и тип представляемых этим полем данных (в нашем примере: first, last, birthday, numb, name city, state, tel). Те имена, которые предполагают дальнейшую детализацию, должны быть определены как записи (в нашем примере: soname, adres, street).

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

Как получать доступ к отдельным полям записи? Допустим, что текущее значение номера телефона некоторого преподавателя нужно заменить значением 123456. Чтобы обратиться к полю номера телефона (tel), мы должны иметь возможность сообщить, что речь идет о части полного адреса (adres), который в свою очередь является частью записи teacher. На Паскале это выражается в так называемой точечной нотации, позволяющей построить список имен структурных уровней записи, разделяя их одиночными точками. Каждая точка символизирует определенный уровень вложенности.




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 534; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.159 сек.