Концепция данных в языке Паскаль

Описание простых и перечисляемых типов данных. Определение понятия константы. Диапазоны представления целых и вещественных типов. Примеры программ, иллюстрирующих просмотр с целью поиска компонента с заданным значением в структурах данных типа array.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 17.02.2012
Размер файла 78,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

end. {Prim3_3}

По сути структура array - это структура, заданная в одномерном пространстве индексов, в связи с чем ее часто называют одномерной структурой (вектором). Тем же свойством обладает и структура адресации оперативной памяти ЭВМ, поэтому они хорошо "совмещаются" при распределении памяти под переменную-вектор и никакого другого метода структурирования кроме метода построения одномерных структур в средствах языка нет. Однако компоненты вектора в свою очередь могут быть составными. Так вектор, компонентами которого являются векторы, соответствует матрице или двухмерной структуре. Например, ранее встречавшееся описание типа array [Index1] of Vector2 задает матрицу, состоящую из 80 строк типа vector2, а описание типа:

type

Index = 1 .. 10;

Vector= array [index] of Integer;

Matr = array [index] of Vector2;

определяет матрицу из 10 строк типа Vector или, что то же самое, квадратную матрицу (1010) с элементами типа Integer. Размещение такой структуры в оперативной памяти с помощью конструкторов для Matr и Vector иллюстрируется рисунком Рис.3.2.

Подобные рассуждения (подчиняющиеся индукции) можно продолжить, говоря о трехмерной структуре (кубе), как об array [Index] of Matr и т. д.

m11

m12

. . .

m1n

m21

m22

m2n

- - -

mn1

. . .

mn-,n

mnn

m0

1-я строка

2-я строка

n-я строка

Рис.3.2. Размещение матрицы в оперативной памяти ЭВМ

При обращении к компонентам таких структур селекторы должны соответствующим образом следовать один за другим. Если в разделе переменных определена матрица M: Matr, то M[I][J] обозначает J-ю компоненту строки M[I], которая является I-ой компонентой M. Обычно это записывается короче, как M[I,J]. Обе формы нотации будут одинаково восприниматься транслятором.

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

program Prim3_4;

type

Index = 1 .. 10;

Vector = array [index] of Integer;

Matr = array [index] of Vector;

var

I,J,N : Index;

Buf : Integer;

M : Matr;

begin

Write (`Введите размерность квадратной матрицы N= ');

ReadLn (N);

Write (`Введите ',N*N, `элементов матрицы построчно');

for I :=1 to N do

begin

for J :=1 to N do

Read (M[I,J]);

ReadLn

end;

Buf := M[1,1];

for I :=1 to N do

for J :=1 to N do

if M[I,J] < Buf then

Buf :=M[I,J];

writeln ('минимальный элемент матрицы равен ` , Buf)

end. {Prim3_4}

При этом не следует забывать, что матрица - это все же вектор, компонентами которого являются ее строки. Если конструктор в системе программирования не вырожден, то программа, позволяющая, например, поменять местами k-ую и i-ю строки матрицы (с учетом того, что в качестве буфера для обмена используется "лишняя" строка) может быть представлена так:

program Prim3_5;

type

Index= 1 .. 10;

Vector=array [index] of Integer;

Matr=array [index] of Vector;

var

I,J,K,L,N : Index;

Buf : Integer;

M : Matr;

begin

Write (`Введите размерность квадратной матрицы N= ');

ReadLn (N);

Write (`Введите ',N*N, `элементов матрицы построчно');

for I :=1 to N do

begin

for J :=1 to N do

Read (M[I,J]);

ReadLn

end;

Write (`Введите индексы строк для обмена')

ReadLn (K,L);

M[N+1] :=M[K];

M[K] :=M[L];

M[L] :=M[N+1];

WriteLn (`матрица после обмена строк имеет вид');

for I :=1 to N do

begin

for J :=1 to N do

Write (M[I,J]);

WriteLn

end

end. {Prim3_5}

Характерной особенностью машин того времени, когда разрабатывался Стандарт языка, была "длинная" физическая ячейка памяти (в основном, 32 или 64 бита). При длинной ячейке памяти представление массива, тип компонент которого характеризовался малым кардинальным числом, требовал дополнительной "упаковки" информации. В связи с этим, в Стандарте предусматривалась дополнительная спецификация packed array, предписывающая упаковку нескольких компонент массива в одну ячейку памяти. С помощью такой спецификации, в основном, описывались массивы, компоненты которых принадлежали типу Char (обработка текстов). Память современных ЭВМ структурируется на основе восьмиразрядной физической ячейки, в связи с чем спецификация packed array в какой-то степени потеряла смысл и современными версиями языка допускается, но игнорируется.

С обработкой текстовой или так называемой строковой информации связано введение в современные версии языка дополнительного стандартного типа - String.

Тип String Стандартом языка не предусматривается и здесь предварительно рассматривается по той же причине, что и расширенный синтаксис стандартных типов. В качестве подобной конструкции Стандартом предлагался тип Alpha, характеризуемый как Paced Array [1..8]of Char.

При этом не следует путать тип String и конструкцию <строка>, которая представляет собой последовательность символов, взятую в одиночные кавычки (см. раздел 1.2.), которая является строковой константой. Такой вид константы обычно используeтся в операторах ввода-вывода для выдачи текстовых сообщений или ответов на запросы меню программы. Однако представление строк и массивов типа array [Index] of Char, где Index - тип индексов, в машине с побайтной организацией памяти совпадают, поэтому допускается присваивание строковой константы массиву типа String. При таком присваивании код каждого из символов строковой константы становится значением соответствующей компоненты массива. Если количество символов в строковой константе больше, чем размерность массива, то "лишние" символы отбрасываются.

Переменные типа string обычно называют строковыми переменными или просто строками, что приводит к разночтению. Поэтому в дальнейшем под термином строка будет пониматься строковая переменная, а конструкция <строка>, если это не следует из контекста, будет называться строковой константой.

Тип String

Тип string oпределяется описанием string = array [Index] of Char, но являясь в системах Borland Pascal встроенным, явного описания в тексте программы не требует.

Этот тип относится к так называемым массивам с нулевой базой, для которых тип индексов определяется как Index =0 .. N, где N - количесво символов, размещаемое в массиве. Таким образом, в нем содержится одна "лишняя" компонента, значение которой равно реальному количеству заполненных компонент. Например, во фрагменте программы:

var

Str : string;

begin

Str :=`длина строки с учетом пробелов равна 39';

значение Str[0] будет равно 39, т. е. реальной длине присвоенной строковой константы. Здесь следует обратить внимание на еще одну особенность типа string : для присваивания значений компонентам массива Str не понадобился цикл, т. е. конструктор для типа string выполняет эту операцию самостоятельно, зафиксировав размерность массива в компоненте Str[0]. Максимально возможная длина строковой переменной, соответствующая описанию Str : string, равна 255 (ограничение, определяемое кардинальным числом нулевой компоненты).

Существует и другая форма определения типа string и описания соответствующих переменных, в которой явно указывается верхняя граница типа индексов. Напимер, во фрагменте:

type

String1 = string[60];

String2 = string[30];

var

Str1 : string1;

Str2 : string2;

или эквивалентном ему:

var

Str1 : string[60];

Str2 : string[10];

описаны переменные Str1 и Str2, содержащие соответственно 61 и 11 компонент (учитывая компоненты с нулевым индексом).

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

допускается обработка всей строки как единого целого;

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

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

Str1 :='Это - строка 1';

или выполнять объединение (конкатенацию,) нескольких строк при присваивании (операция обозначается символом +):

Str1 :='Это '+' - ' + ' строка '+ ' 1';

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

Аналогичный результат может быть получен с помощью такой группы операторов присваивания:

Str1 :='Это - ';

Str2 :=' строка 1';

Str1 :=Str1 + Str2 ;

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

Так, например, замена значений первых 10 компонент переменной Str2 на нулевые может быть выполнена с помощью цикла:

for I :=1 to 10 do Str2[I]:=`0';

Существенным недостатком типа string является короткая длина строки. Один из возможных способов, который можно использовать для увеличения размера строк, заключается в пометке конца массива некоторым специальным символом, например, #0. При этом явное описание длины массива можно опустить, т.е. не задавать тип индексов. Такие массивы называются массивами с завершающим нулем и используются для представления строк в последних версиях Borland Pascal. Вообще говоря, особенности обработки строковых переменных и соответствующий набор стандартных процедур и функций определяется версией системы программирования. В Borland Pascal 7.0 для этих целей, например, предусмотрен специальный модуль - String, который описан в разделе Х

С типом string связывается определенный набор стандартных процедур и функций. Примеры применения некоторых процедур и функций из этого набора рассматриваются ниже.

Функция Length. Стандартная функция Length (длина) возвращает фактическую длину текстовой строки, передаваемой ей в качестве фактического параметра (но не величину предельного размера строки, установленного при описании типа или соответствующей параметру переменной):

program Prim3_6;

var

Str : string;

begin

Write ('Введите слово')

ReadLn (Str):

WriteLn;

WriteLn ('это слово состоит из ',Length(Str),' букв);

end. {prim3_6}

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

Функция Upcase - функция, преобразующая одиночный символ из строчной формы в прописную (ее параметр -переменная строкового типа). Она предполагает обработку отдельных символов, в связи с чем для обработки строки символов, размещенной в переменной типа string, приходится использовать цикл.

program Prim3_7;

var

Str : string;

I : Byte;

begin

Str :='microsoft';

for I:=I to Length (Str) do

Str [I] :=Upcase(Str[l]);

WriteLn(Str) {резултат вывода - microsoft )

end. {Prim3_7}

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

program Prim3_8;

var

Str, Str1 : string;

begin

Str :='программирование';

Str1:=Copy(Str,4,5);

writel(Str1)

end. (результат вывода - грамм}.

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

Функция Pos. С помощью функции Pos можно найти в строковой переменной заданный фрагмент. Если заданный фрагмент в ней присутствует, то функция возвращает номер позиции, с которой этот фрагмент начинается (для первого из таких фрагментов). При отсутствии фрагмента функция возвращает ноль. При вызове функции в качестве параметров необходимо указать имя строковой переменной, в которой отыскивается фрагмент, и имя переменной-фрагмента или соответствующую строковую константу.

program Prim3_9;

var

Str, Str1 : string;

F : Byte;

begin

Str:='программирование';

Write (' Введите фрагмент поиска')

ReadLn (Str1):

F := Pos(Str,Str1);

if F<>0

then

WrIteLn ( 'фрагмент содержится в анализируемой строке,

начиная с позиции ', F ,' .')

else

WrlteLn('фрагмент в анализируемой строке отсутствует.')

end. (при вводе фрагмента "грамм" результат вывода - 4}

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

Процедуры Insert и Delete. С помощью этих процедур можно вставить одну строку в другую и удалить фрагмент из строки.

Оператор процедуры Insert(Str1,Str2,N) указывает, что в строку Str2 перед N-ой позицией необходимо, вставить строку Str1.

Оператор процедуры Delete(Str,M,N) позволяет удалить в строке Str фрагмент, начинающийся с позиции M и имеющий длину N.

Возможности этих двух процедур иллюстрируются ниже на примере слова "программирование".

program Prim3 _10;

var

Str1,Str2 : string;

begin

WriteLn;

Str1 := 'программирование';

WriteLn(Str1);

Delete(Str1,8,8);

WriteLn(Str1);

Str2 :=`a';

lnsert(Str2, Str1,9);

WriteLn(Str1);

Str1 :='к';

lnsert (Str2,Str1,1);

WriteLn (Str1)

end. {Результат вывода: программирование

программ

программа

программка}

Во избежание ошибочных ситуаций при применении процедур Insert и Delete необходимо быть уверенным, что указываемые в списке параметров позиции действительно существуют в обрабатываемых строках.

Тип record

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

В математике подобный составной тип называется декартовым произведением. Это связано с тем, что множество значений такого типа состоит из всех возможных комбинаций отдельных значений его компонент. Следовательно, число таких наборов из n чисел равно произведению количеств элементов всех составляющих множеств. Таким образом кардинальное число составного типа равно произведению кардинальных чисел всех типов компонент, т. е. card (T)=card(T1) * ... * card(Tn), где Ti - тип i-oй компоненты.

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

<тип record> ::= record <описание полей> end

<описание полей> ::= <фиксированная часть>

<вариантная часть>

<фиксированная часть> ;

<вариантная часть>

<фиксированная часть> ::= <список полей>

<список полей> ::= <секция записи>

<список полей> ; <секция записи>

<секция записи> ::= <список имен полей> : <тип>

<список имен полей> ::= <имя поля>

<список имен полей>,<имя поля>

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

Применение этих правил при описании комбинированных типов Date (дата рождения или др.) и Person (человек) приведены ниже.

type

Index=1 ..15:

Month=(jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec);

Year=1900 .. 2000;

Day=1 .. 31;

Sex=(male,female);

MarStatus=(single, married, widowed,divorced);

Date=record

Y : Year;

M : Month;

D : Day

end;

Person=record

Name,FirstName : string;

BirthDate : Date;

MySex : Sex;

MyStatus : MarStatus

end;

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

type

Date=record

Year : 1900 .. 2000;

Month : (jan, feb, mar. apr, may, jun, jul, aug, sep, oct, nov, dec);

Day : 1 .. 31;

end;

Person=record

Name,FirstName : string[15];

BirthDate : Date;

Sex : (male,female);

MarStatus : (single, married, widowed,divorced)

end;

Подобная форма уже обсуждалась в предыдущем разделе. Ее кажущаяся компактность в значительной мере теряется при описании переменных, необходимых для работы со структурой. Однако, выбор формы описания составного типа, как уже упоминалось, это "дело вкуса".

Записи отображаются в памяти (размещаются) так же, как и массивы, т. е. компонента за компонентой, но компоненты записи в общем случае не являются однотипными. Адрес ai i-ой компоненты относительно начального адреса a0 называется смещением. Смещение ai может быть вычислено как сумма размерностей rj всех предыдущих компонент (j=1, ..., i-1): ai=r1+r2+ ...+ri-1 . Поскольку у структуры типа array все компоненты имеют одинаковую размерность (r1=r2= ...=rn), смещение i-ой компоненты вектора wi может быть вычислено с помощью простой линейной функции wi=(i-1)*r. Эта функция используется селектором при вычислении адреса i-ой компоненты.

Для структуры record вычислять значение смещения при каждом обращении к компоненте не удобно. Смещения вычисляются конструктором один раз для всех компонент на основании описания конкретного типа и их результаты заносятся в таблицу, которая связывает имя поля с его смещением. Поэтому селектор записи требует указания имени поля, а не его индекса. Имя поля указывается после имени переменной-записи через точку. Так, например, если в разделе переменных задана переменная P типа Person, то обращение к полю Sex будет выглядеть как P.Sex, а к полю год рождения - P.BirhDate.Year. Обращение к полям записи иллюстрируется программой Prim3_11, которая осуществляет формирование (в данном случае ввод) переменной-записи P1 типа Person, присваивание ее другой переменной того же типа (P2) и вывод P2 на экран.

program Prim3_11;

type

Index=1 ..15:

Month=(jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec);

Year=1900 .. 2000;

Day=1 .. 31;

Sex=(male,female);

MarStatus=(single, married, widowed,divorced);

Date=record

Y : Year;

M : Month;

D : Day

end;

Person=record

Name,FirstName : string[15];

BirthDate : Date;

MySex : Sex;

MyStatus : MarStatus

end;

var

P1,P2 : Person;

begin

Write (`Введите фамилию -');

Read (P1.Name);

WriteLn;

Write (`Введите имя -');

Read (P1.FirstName);

WriteLn;

WriteLn (`Введите дату рождения' -);

Write (` год - ');

Read (P1. BirthDate.Y);

Write (` месяц - ');

Read (P1. Birthdate.M);

Write (` день - ');

ReadLn (P1. Birthdate.D);

Write (`Введите пол - ');

ReadLn (P1.MySex);

Write (`Введите семейное положение - ');

Read (P1.MyStatus);

p2:=p1;

WriteLn(p2.Name);

WriteLn(p2.FirstName);

Write (p2. BirthDate.Y);

Write (p2. BirthDate.M);

Write (p2. BirthDate.D);

Write (p2.MySex);

Write (p2.MyStatus)

end. {Prim3_11}

При этом важно напомнить, что операторы Write (p2. BirthDate.M), Write (p2.MySex) и Write (p2.MyStatus) не будут работать должным образом, так как перечислимый тип соответствующих полей не поддерживается стандартными процедурами вывода. Читателю предоставляется возможность в качестве упражнения самому скорректировать программу, доведя ее до "рабочего" состояния.

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

Каждый вариант характеризуется задаваемым в скобках списком описаний присущих ему компонент. Перед списком находятся одна или несколько меток, где указывается тип этих меток (т.е. тип, на основании которого различаются варианты). Пусть, например, таким типом будет maritalstatus=(married, widowed, divorced, singlе). Тогда объект "человек" может быть описан с помощью данных такого типа:

type Person=record

фиксированная часть, содержащая поля,

присущие всем людям};

case maritalstatus of

married: ( поля, присущие состоящим в браке );

widowed: ( поля, присущие вдовым );

divorced: ( поля, присущие разведеным );

single: ( поля, присущие одиноким )

end;

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

Синтаксис определения вариантной части имеет вид:

<вариантная часть> ::= case<поле признака>:<скалярный тип>

of <список вариантаов>

<список вариантаов> ::= < вариант>

<список вариантаов>;< вариант>

<вариант> ::= <список меток варианта>:

(<список полей>)<пусто>

<список меток варианта> ::= <метка варианта>

<список меток варианта>,

<метка варианта>

<метка варианта> ::= <значение скалярного типа>

<поле признака> ::=<имя> <пусто>

Конструкция вариантной части записи похожа на конструкцию оператора варианта; существенное отличие этих конструкций помимо их назначения состоит в том, что выбирающей меткой в операторе варианта является значение выражения, а в вариантной части записи - значение скалярного типа; в примере это mystatus, значениями которого являются метки single, married, widowed и divorced.

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

Тип Person с вариантами:

1. Общая часть:

фамилия (first name);

имя - (name);

номер страхового полиса (social security number) - целое (Integer);

пол (sex) - муж., жен. (male, female);

дата рождения (data of birth) - месяц, день, год (month, day, year);

число иждевенцев (number of dependents) - целое (Integer);

2. Вариантная часть:

семейное положение (marital status) - (married, widowed, divorced, singlе);

если в браке (married) или вдов (windowed), то

а. дата свадьбы (date of marriage) - месяц, день, год (month, day,

year);

если разведен (divoreed), то

а. дата развода (date of divorce) - месяц, день, год (month, day, year),

b. первый развод (first divorce) - (false, true);

если одинокий (single), то

а. независимость (independent) - (false, true).

На Pис.3.3 представлены "образы" двух объетов типа Person с различными атрибутами.

odart

Djek

180547

male

aug

12

1968

1

single

true

Robson

Jon

452430

male

jun

16

1956

3

divorced

dez

23

1976

false

Рис 3.3. Образы объетов типа person

Определить тип Person, используя вариантную часть, можно следующим образом:

type

Month=(jan, feb, mar. apr, may, jun, jul, aug, sep, oct, nov, dec);

Year=1900 .. 2000;

Day=1 .. 31;

Sex=(male,female);

MaritalStatus=(single, married, widowed, divorced);

Date=record

Y : Year;

M : Month;

D : Day

end;

Person=record

Name,FirstName : string[15];

BirthDate : Date;

Mysex : Sex;

case MyStatus : MaritalStatus of

married, widowed : (DateM : date);

divorced : (DateD : Date; FirstDivorced : Boolean);

Single : (Independent : Boolean)

end; {Person}

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

case MyStatus : MaritalStatus of

можно записать в виде

case MyStatus : (single, married, widowed, divorced) of

Используя запись с вариантами, нужно учитывать, что:

любая запись может иметь только одну вариантную часть и она должна следовать за фиксированной частью;

вариантная часть сама может содержать варианты, т.е. синтаксисом вложенные варианты не исключаются (пример - ниже);

в селекторе полей, относящихся к вариантной части метка варианта не используется; вариант выбирается с помощью присваивания ему имени типа, используемого в качестве метки, например P.MyStatus :=single, после чего возможно обращение к полю варианта P.Independent;

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

вариант, состоящий из пустых полей определяется только меткой (например, next :).

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

. . .

married, widowed : (DateM : Date);

case

Child : Boolean of

true : (QuantilyChild : Integer);

false : ( );

. . .

Кроме того. используя записи с вариантами, особое внимание следует обратить на тот факт, что в селекторе полей, относящихся к вариантной части метка варианта отсутствует. Это один из существенных недостатков, связанный с неоднозначностью синтаксической конструкции, который, к сожалению, присутствует в языке Паскаль. Так, например, в приведенной ниже программе нет синтаксических ошибок и результатом вывода будет символьное значение, соответствующее коду 140 в таблице ASCCI. Тем не менее, подменяя стандартную функцию chr (140), такая программа противоречит концепции типов языка и вообще здравому смыслу.

program BadStyle;

type

BadTyhe =record case Boolean of

true : (Int : Integer);

false : (Chr :Char)

end;

var

BType : BadTyhe;

begin

BType.Int :=140;

Write (BType.Chr)

end.

Отсутствие ошибок в программе обусловлено тем, что транслятор в случае записи с вариантами "не знает", какое значение имеет поле в контексте каждого оператора, и поэтому не будет включать в программу автоматическое преобразование типов. Просто содержимое соответствующей полю BType.Int ячейки памяти будет рассматриваться как поле BType.Chr в операторе Write.

Хуже обстоит дело в случае, когда варианты имеют разное количество полей. Тогда при описании переменной F типа Figure

type

Shape=(triangle,rectangle,circle); {треугольник, прямоугольник, круг}

Figure = record

case Tf : Shape of

triangle : (Side : Real, Angle1, Angle2 : Real);

rectangle : ( Side1, Side2 : Real);

Crcle : (Radius : Real)

end;

var

F : Figure

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

Здесь не помогает и явное описание поля дискриминанта, которое в соответствии с синтаксисом языка не входит в выражение селектора. Однако, оно может оказывается крайне полезным, если для работы с вариантами записи использовать оператор case, значения меток выбора которого будут соответствовать значениям поля, являющегося дискриминантом. Для приведенного выше описания записи типа Figure таким полем будет F.Tf и оператор выбора можно записать так:

case F.Tf of

triangle :

begin

{обработка треугольника}

end;

rectangle :

begin

{обработка прямоугольника}

end;

circle :

begin

{обработка круга}

end

end;{case}

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

Этот оператор позволяет сократить форму обращения к полям переменной-записи. Его конструкция определяется правилами:

<оператор присоединения> ::= with<список имен полей> do

<оператор>

<список имен полей> ::= <имя поля>

<список имен полей>,<имя поля>

Оператор, следующий за do, практически всегда составной, поскольку для одного оператора проще указать полное имя переменной-записи.

Заголовок этого оператора открывает область действия, в которой имена полей переменной-записи можно использовать без селектирующего префикса, т.е. как самостоятельные имена. Например, для переменной типа Person присваивания:

P.BirthDate.Mon := jan;

P.BirthDate.Day :=12;

P.BirthDate.Year :=1999;

можно представить в виде

with P.BirthDate do

begin

Mon := jan;

Day :=12;

Year :=1999

end;

Оператор вида with p1,p2,p3 do begin ... end; , эквивалентен последовательности операторов with p1 do with p2 do with p3 do begin ... end;.

В области действия оператора with недопустимы присваивания, изменяющие имена полей, которые включены в список. Например, в случае, когда тип записи является типом компонент вектора W, каждая из них имеет имя W[I]. Поэтому фрагмент with W[I] do begin . . .; I :=I+1 end некорректен (попытка изменения значения индексной переменной I).

Рекомендации к упражнениям

Основные "неприятности" при обработке регулярных структур, особенно многомерных, связаны с определением или вычислением индексов. Поэтому в качестве упражнения можно, например, сформулировать алгоритм и соответствующую программу "обхода" элементов матрицы по спирали, т. е. по пути "первая строка - последний столбец -последняя строка в обратном направлении - первый столбец в обратном направлении (без элемента m11) - вторая строка (без элемента m2n) и т. д., или самостоятельно "надумать" подобные алгоритмы. константа целый вещественный array

В качестве основного упражнения здесь можно рекомендовать разработку "игрушечной" программы - электронной таблицы, например, телефонного справочника, с использованием структур данных типа array [index] of record . Игрушкой эта программа будет потому, что после выключения машины вся введенная в таблицу информация будет потеряна (такая структура данных размещается в оперативной памяти). В дальнейшем этот вариант программы может быть модифицирован с целью устранения этого недостатка (см. рекомендации к упражнениям раздела 5).

Размещено на Allbest.ru


Подобные документы

  • Названия целых типов, длина их внутреннего представления в байтах и диапазон возможных значений. Кодировка символов в соответствии со стандартом ANSI. Описание типа массива в Object Pascal. Выделение и освобождение динамической памяти, псевдонимы типов.

    курсовая работа [184,5 K], добавлен 10.02.2016

  • Изучение символьных и строковых типов данных, алгоритма задачи на языке программирования Паскаль. Описания получения и установки отдельного символа строки, изменения регистра символов. Анализ создания и просмотра файла, поиска и сортировки информации.

    курсовая работа [440,7 K], добавлен 13.06.2011

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

    курсовая работа [48,8 K], добавлен 27.11.2010

  • Сущность понятия "тип данных". Объектно-ориентированный стиль программирования. Простые типы данных в языке Паскаль: порядковые, вещественные, дата-время. Булевский (логический) тип. Синтаксис определения ограниченного типа. Регулярные типы (массивы).

    реферат [24,1 K], добавлен 01.12.2009

  • Совместимость и преобразование типов данных. Создание информационно-поисковой системы на языке программирования Паскаль. Описание интерфейса, каждого блока программы "Картотека больных". Рассмотрение результатов работы программы, сортирования данных.

    курсовая работа [368,9 K], добавлен 18.05.2015

  • Сущность и характеристика типов моделей данных: иерархическая, сетевая и реляционная. Базовые понятия реляционной модели данных. Атрибуты, схема отношения базы данных. Условия целостности данных. Связи между таблицами. Общие представления о модели данных.

    курсовая работа [36,1 K], добавлен 29.01.2011

  • Структура простейшей базы данных и свойства полей. Характеристика типов данных. Описание процесса создания базы данных, таблиц и связей между ними, простых и составных форм, запросов в Microsoft Access. Пример составления подчинённых отчетов и макросов.

    курсовая работа [2,9 M], добавлен 14.11.2016

  • Программа поиска в базе данных в среде Borland Delphi 7.0 Enterprise. Условия и блок-схемы задач. Ввод массива. Текст программ в Delphi, в Паскаль. Текст программы поиска в базе данных. Кодирование материала. Изготовление реляционной базы данных.

    практическая работа [27,6 K], добавлен 11.10.2008

  • Определение понятия структур данных. Рассмотрение информации и ее представления в памяти. Особенности непозиционных и позиционных систем счисления. Классификация структур данных, операции над ними. Структурность данных и технология программирования.

    презентация [359,3 K], добавлен 20.05.2015

  • Создание базы данных и СУБД. Структура простейшей базы данных. Особенности языка программирования Турбо Паскаль. Описание типов, констант, переменных, процедур и функций. Описание алгоритма базы данных (для сотрудников ГИБДД), листинг программы.

    курсовая работа [26,3 K], добавлен 26.01.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.