Концепция данных в языке Pascal. Реализация Delphi

Автор работы: Пользователь скрыл имя, 26 Апреля 2013 в 18:52, курсовая работа

Описание работы

Delphi — результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Паскаль был полностью процедурным языком, Турбо Паскаль, начиная с версии 5.5, добавил в Паскаль объектно-ориентированные свойства, а Delphi — объектно-ориентированный язык программирования с возможностью доступа к метаданным классов. Delphi оказал огромное влияние на создание концепции языка C# для платформы .NET. Многие его элементы и концептуальные решения вошли в состав С#. Мы будем рассматривать концепцию данных на основе среды версии Delphi 5. Delphi 5 имеет высокую производительность для развития Интернет. Представлено множество новых функций и усовершенствований. Некоторые из них, среди многих других, являются: различные макеты рабочего стола, концепция кадров, параллельное развитие, перевод возможности, более интегрированный отладчик, новые возможности Интернет (XML), базы данных ADO.

Файлы: 1 файл

курсовая.doc

— 903.50 Кб (Скачать файл)

col :=black;

col :=colors(0);

Разумеется, показанное далее присваивание недопустимо, так  как перечисленному типу нельзя присвоить  целое значение:

col := 0;

Переменные любого перечисленного типа можно объявлять без предварительного описания этого типа, например:

var

col : (black, white, green);

    1. Тип-диапазон

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

Тип - диапазон задается границами своих значений внутри базового типа:

<мин. знач.>..<макс. знач.>

Здесь <мин. знач. > - минимальное  значение типа-диапазона; <макс. знач. > - максимальное его значение.

Например:

type

digit = '0'.. '9';

dig2 = 48..57;

Тип - диапазон необязательно описывать в разделе type, а можно указывать непосредственно при объявлении переменной, например:

var

date : 1..31;

month : 1..12;

lchr : ‘A’..’Z’;

Приведём пример использования  типа - диапазона:

uses

SysUtils;

type

digit_1 = 1..10;//вводим 3 типа - диапазона

digit_2 = 11..20;

digit_3 = 21..30;

var

i:integer;//определяем переменную i

r:digit_1;//вводим три переменные типа - диапазона

j:digit_2;

k:digit_3;

begin

writeln('I= ');

ReadLn(i);//

if (i>0) and (i<11)//в зависимости чему равна переменная i она может принадлежать различным диапазонам

then

begin

r:=i;

WriteLn('1..10');

end;

if (i>10) and (i<21 )

then

begin

j:=i;

WriteLn('11..20');

end;

if (i>20) and (i<31)

then

begin

k:=i;

WriteLn('21..30');

end;

ReadLn(i);

end.

(приложение 5)

При определении типа-диапазона нужно руководствоваться следующими правилами:

  • два символа (..) рассматриваются как один символ, поэтому между ними недопустимы пробелы;
  • левая граница диапазона не должна превышать его правую границу.

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

В стандартную библиотеку Object Pascal включены две функции, поддерживающие работу с типами-диапазонами:

High(х) - возвращает максимальное значение типа-диапазона, к которому принадлежит переменная х;

Low (х) - возвращает минимальное значение типа-диапазона.

    1. Вещественные типы

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

Таблица 2.4

Вещественные типы

Длина, байт

Название

Количество значащих цифр

Диапазон значений

8

4

8

10

8

8

Real

Single

Double

Extended

Comp

Currency

15…16

7…8

15…16

19…20

19…20

19…20

5.0*10e-324…1.7*10e308

1.5*10e-45…3.4*10e38

5.0*10e-324…1.7*10e308

3.4*10е-4951…1.1*10e4932

-2e63…+2e63-1

+/-922337203 685477,5807


Данная таблица отображает вещественные типы для Delphi 5.

В предыдущих версиях Delphi 1...3 тип Real занимал 6 байт и имел диапазон значений от 2,9*10е-39 до 1,7*10е38. В версиях 4 и 5 этот тип эквивалентен типу Double. Если требуется (в целях совместимости) использовать 6-байтных Real, нужно указать директиву компилятора {SREALCOMPATIBILITY ON}.

Как видно из табл. 2.4, вещественное число в Object Pascal занимает от 4 до 10 смежных байт и имеет следующую структуру в памяти ПК.

s

e

m


Здесь s - знаковый разряд числа; е - экспоненциальная часть( содержит двоичный порядок); m - мантисса числа.

Мантисса m имеет длину от 23 (для Single) до 63 (для Extended) двоичных разрядов, что и обеспечивает точность 3...8 для Single и 19...20 для Extended десятичных цифр. Десятичная точка (запятая) подразумевается перед левым (старшим) разрядом мантиссы, но при действиях с числом ее положение сдвигается влево или вправо в соответствии с двоичным порядком числа, хранящимся в экспоненциальной части, поэтому действия над вещественными числами называют арифметикой с плавающей точкой (запятой).

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

Особое положение в Object Pascal занимают типы Comp и Currency, которые трактуются как вещественные числа с дробными частями фиксированной длины: в Comp дробная часть имеет длину 0 разрядов, т. е. просто отсутствует, в Currency длина дробной части составляет 4 десятичных разряда. Фактически оба типа определяют большое целое число со знаком, сохраняющее 19...20 значащих десятичных цифр (во внутреннем представлении они занимают 8 смежных байт). В то же время в выражениях Сomp и Сurrency полностью совместимы с любыми другими вещественными типами: над ними определены все вещественные операции, они могут использоваться как аргументы математических функций и т. д. Наиболее подходящей областью применения этих типов являются бухгалтерские расчеты.

Для работы с вещественными  данными могут использоваться стандартные  математические функции.

К выражениям вещественных типов применимы следующие функции:

  • Round(x) – округленное значение выражения х;
  • Trunc(x) – целая часть значения выражения х.

В Delphi включён также модуль Match, который существенно расширяет представленный  в вышележащей таблице набор встроенных математических функций.

Например:

uses

SysUtils;

var

Epsilon:Real;//  определяем переменную вещественного типа

begin

Epsilon:=1;

while 1+Epsilon/2>1 do

Epsilon:= Epsilon/2;

writeln('mashinnoe ipsilon= ',Epsilon);

ReadLn

end.

(приложение 6)

Эта программа отыскивает «машинное эпсилон» - такое минимальное  не равное нулю вещественное число, которое  после прибавления его 1.0 ещё даёт результат, отличный от 1.0.

    1. Тип дата-время

Тип дата-время определяется стандартным идентификатором TDateTime и предназначен для одновременного хранения и даты, и времени. Во внутреннем представлении он занимает 8 байт и, и подобно Сurrency, представляет собой вещественное число с фиксированной дробной частью: в целой части числа хранится дата, в дробной - время. Дата определяется как количество суток, прошедших с 30 декабря 1899 года, а время - как часть суток, прошедших с 0 часов, так что значение 36 444,837 соответствует дате 31.05.2004 и времени 19:43. Количество суток может быть и отрицательным, однако значения, меньшие -693 594 (соответствует дате 00.00.0000 от Рождества Христова), игнорируются функциями преобразования даты к строковому типу.

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

Таблица 2.5

Подпрограммы для работы с датой и временем

Программа

Описание

function Date: TDateTime

Возвращает текущую  дату

function DateToStr (D: TDateTime): String;

Преобразует дату в строку символов

function DateTimeToStr (D: TDateTime): String;

Преобразует дату и время  в строку символов

function FormatDateTime (Format: String; Value: TDateTime): String;

Преобразует дату и время  из параметра Value  в строку символов в соответствии со спецификаторами параметра Format

function Now: TDateTime;

Возвращает текущую  дату и время

function Time: TDateTime;

Возвращает текущее  время

function TimeToStr (T: TDateTime): String;

Преобразует время в  строку


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

lbOutput.Caption :=DatetoStr (Date+21);

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

Time + StrToTime (‘1:30’);

Time + 1.5/24.

Например:

uses

SysUtils,

Windows;

var

x:TDateTime;//определяем переменную типа дата – время, она будет возвращать текущую дату

Str:string;

begin

x:=Date;

Str:=DateToStr(x);

WriteLn(Str);//выводим текущую дату на экран

ReadLn

end.

(приложение 7)

 

    1. СТРУКТУРИРОВАННЫЕ ТИПЫ

Любой из структурированных  типов (а в Object Pascal их четыре: массивы, записи, множества и файлы) характеризуется  множественностью образующих этот тип  элементов. Каждый элемент, в свою очередь, может принадлежать структурированному типу, что позволяет говорить о возможной вложенности типов. В Object Pascal допускается произвольная глубина вложенности типов, однако суммарная длина любого из них во внутреннем представлении не должна превышать 2 Гбайт [16-разрядные версии операционной системы Windows З.х используют так называемую “сегментную” модель памяти, поэтому в Delphi 1 любой структурированный тип не может занимать более одного сегмента (65536 байт)].

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

    1. Массивы

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

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

<имя типа> = array [ <сп. инд. типов> ] of <тип>;

Здесь <имя типа> - правильный идентификатор; array, of - зарезервированные слова (массив, из); <сп. инд. типов> -список из одного или нескольких индексных типов, разделенных запятыми; квадратные скобки, обрамляющие список, - требование синтаксиса; <тип> - любой тип Object Pascal.

В качестве индексных  типов в Object Pascal можно использовать любые порядковые типы, имеющие мощность не более 2 Гбайт (т. е. кроме LongWord и Int64).

Определить переменную как массив можно и непосредственно при описании этой переменной, без предварительного описания типа массива, например:

var

a, b: array [1..10] of Real;

Обычно в качестве индексного типа используется тип –  диапазон, в котором задаются границы  изменения индексов. Так как тип <тип>, идущий в описании массива за словом of, - любой тип Delphi, то он может , в частности, и другим массивом, например:

type

mat = array [0..5] of array [-2.. 2] of array  [Char] of Byte;

Такую запись можно заменить более компактной:

type

mat = array [0..5, -2..2, char] of Byte;

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

var

type

mat = array [0..5, -2..2, char] of Byte;

 

begin

a[1, 1] :=1;

a[2, 1] :=2;

a[1, 2] :=3;

a[2, 2] :=4;

Write(a[1, 1]);//выводим массив из 4 чисел

WriteLn(a[2, 1]);

Write(a[1, 2]);

WriteLn(a[2, 2]);

end.

Тогда в памяти последовательно друг за другом будут расположены байты со значениями 1, 3, 2, 4.

В Object Pascal можно одним  оператором присваивания передать все  элементы одного массива другому массиву того же типа, например:

var

a, b: array [1..5] of Single;

begin

a : = b ;

end.

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

var

a: array [1..5] of Single;

b: array [1..5] of Single;

Поэтому представленный  далее оператор вызовет сообщение  об ошибке:

a:= b;

Над мантиссами не определены операции отношения. Нельзя , например, записать

if a = b then …

Сравнить два массива  можно поэлементно, например:

var

a : array [1..2] of Integer;

b : array [1..2] of Byte;

eq : Boolean;

i : Byte;

begin

a[1]:=2;

a[2]:=2;

b[1]:=7;

b[2]:=2;

Write('Vivedite massiv a=');

writeln(a[1],a[2]);

Write('Vivedite massiv b=');

writeln(b[1],b[2]);

eq := True;

for i :=1 to 2 do

if a[ i ] <> b[ i ] then

eq := False;

if eq = False then

writeln('Massivi ne ravni')

else

writeln('Ravni');

readln;

end.

(приложение 8)

    1. Записи

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

Информация о работе Концепция данных в языке Pascal. Реализация Delphi