Автор работы: Пользователь скрыл имя, 26 Апреля 2013 в 18:52, курсовая работа
Delphi — результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Паскаль был полностью процедурным языком, Турбо Паскаль, начиная с версии 5.5, добавил в Паскаль объектно-ориентированные свойства, а Delphi — объектно-ориентированный язык программирования с возможностью доступа к метаданным классов. Delphi оказал огромное влияние на создание концепции языка C# для платформы .NET. Многие его элементы и концептуальные решения вошли в состав С#. Мы будем рассматривать концепцию данных на основе среды версии Delphi 5. Delphi 5 имеет высокую производительность для развития Интернет. Представлено множество новых функций и усовершенствований. Некоторые из них, среди многих других, являются: различные макеты рабочего стола, концепция кадров, параллельное развитие, перевод возможности, более интегрированный отладчик, новые возможности Интернет (XML), базы данных ADO.
col :=black;
col :=colors(0);
Разумеется, показанное далее присваивание недопустимо, так как перечисленному типу нельзя присвоить целое значение:
col := 0;
Переменные любого перечисленного
типа можно объявлять без
var
col : (black, white, green);
Тип-диапазон есть подмножество
своего базового типа, в качестве которого
может выступать любой
Тип - диапазон задается границами своих значений внутри базового типа:
<мин. знач.>..<макс. знач.>
Здесь <мин. знач. > - минимальное значение типа-диапазона; <макс. знач. > - максимальное его значение.
Например:
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 (х) - возвращает минимальное значение типа-диапазона.
В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и, следовательно, представляются в ПК абсолютно точно, значения вещественных типов определяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа (табл. 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 полностью совместимы с любыми другими вещественными типами: над ними определены все вещественные операции, они могут использоваться как аргументы математических функций и т. д. Наиболее подходящей областью применения этих типов являются бухгалтерские расчеты.
Для работы с вещественными данными могут использоваться стандартные математические функции.
К выражениям вещественных
типов применимы следующие
В 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.
Тип дата-время определяется
стандартным идентификатором TD
Над данными типа 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)
Любой из структурированных типов (а в Object Pascal их четыре: массивы, записи, множества и файлы) характеризуется множественностью образующих этот тип элементов. Каждый элемент, в свою очередь, может принадлежать структурированному типу, что позволяет говорить о возможной вложенности типов. В Object Pascal допускается произвольная глубина вложенности типов, однако суммарная длина любого из них во внутреннем представлении не должна превышать 2 Гбайт [16-разрядные версии операционной системы Windows З.х используют так называемую “сегментную” модель памяти, поэтому в Delphi 1 любой структурированный тип не может занимать более одного сегмента (65536 байт)].
В целях совместимости со стандартным Паскалем в Object Pascal разрешается перед описанием структурированного типа ставить зарезервированное слово packed, предписывающее компилятору по возможности экономить память, отводимую под объекты структурированного типа; но компилятор фактически игнорирует это указание: “упаковка” данных в Object Pascal осуществляется автоматически везде, где это возможно.
Массивы в 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;
Глубина вложенности
структурированных типов
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)
Запись - это структура данных, состоящая из фиксированного количества компонентов, называемых полями записи. В отличие от массива, компоненты (поля) записи могут быть различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются.
Информация о работе Концепция данных в языке Pascal. Реализация Delphi