Автор работы: Пользователь скрыл имя, 26 Апреля 2013 в 18:52, курсовая работа
Delphi — результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Паскаль был полностью процедурным языком, Турбо Паскаль, начиная с версии 5.5, добавил в Паскаль объектно-ориентированные свойства, а Delphi — объектно-ориентированный язык программирования с возможностью доступа к метаданным классов. Delphi оказал огромное влияние на создание концепции языка C# для платформы .NET. Многие его элементы и концептуальные решения вошли в состав С#. Мы будем рассматривать концепцию данных на основе среды версии Delphi 5. Delphi 5 имеет высокую производительность для развития Интернет. Представлено множество новых функций и усовершенствований. Некоторые из них, среди многих других, являются: различные макеты рабочего стола, концепция кадров, параллельное развитие, перевод возможности, более интегрированный отладчик, новые возможности Интернет (XML), базы данных ADO.
К порядковым типам относятся (см. рис. 1.) целые, логические, символьный, перечисляемый и тип-диапазон. К любому из них применима функция Ord(x), которая возвращает порядковый номер значения выражения X.
Для целых типов функция ord(x) возвращает само значение х, т. е. Ord(X) = х для х, принадлежащего любому целому типу. Применение Ord(x) к логическому, символьному и перечисляемому типам дает положительное целое число в диапазоне от 0 до 1 (логический тип), от 0 до 255 (символьный), от 0 до 65535 (перечисляемый). Тип-диапазон сохраняет все свойства базового порядкового типа, поэтому результат применения к нему функции ord(х) зависит от свойств этого типа.
К порядковым типам можно также применять функции:
pred(x) - возвращает предыдущее значение порядкового типа (значение, которое соответствует порядковому номеру ord (х) -1, т. е. оrd(рred(х)) = оrd(х) - 1;
succ (х) - возвращает следующее значение порядкового типа, которое соответствует порядковому номеру ord (х) +1, т. е. оrd(Succ(х)) = оrd(х) + 1.
Например, если в программе определена переменная
var
с : Char;
begin
с := '5';
end;
то функция pred(с) вернет символ '4', а функция succ(с) - символ '6'.
Если представить себе любой порядковый тип как упорядоченное множество значений, возрастающих слева направо и занимающих на числовой оси некоторый отрезок, то функция pred(x) не определена для левого, a succ (х) - для правого конца этого отрезка.
Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два, четыре или восемь байтов. Далее приводятся названия целых типов, длина их внутреннего представления в байтах и диапазон возможных значений (табл. 2.1).
Таблица 2.1
Целые типы
Название |
Длина, байт |
Диапазон значений |
Byte |
1 |
0…255 |
ShortInt |
1 |
-128…+127 |
SmallInt |
2 |
-32 768…+32 767 |
Word |
2 |
0…65 535 |
Integer |
4 |
-2 147 483 648…+2 147 483 647 |
LongInt |
4 |
-2 147 483 648…+2 147 483 647 |
LongWord |
4 |
0…4 294 967 295 |
Int64 |
8 |
-9*1018…+9*1018 |
Cardinal |
4 |
0…2 147 483 647 |
Данная таблица соответствует целым типам в Delphi 5.Типы LongWord и Int64 впервые введены в версии 4, а типы Smallint и Cardinal отсутствуют в Delphi 1. Тип Integer для этой версии(Delphi 2005) занимает 2 байта и имеет диапазон значений от -32768 до +32767, т. е. совпадает с Smallint.
При использовании процедур и функций с целочисленными параметрами следует руководствоваться “вложенностью” типов, т.е. везде, где может использоваться Word, допускается использование Byte (но не наоборот), в Longint “входит” Smallint, который, в свою очередь, включает в себя Shortint.
Перечень процедур и функций, применимых к целочисленным типам (реализация Delphi 5), приведен в табл. 2.2. Буквами b, s, w, i, l обозначены выражения соответственно типа Byte, Shortint, Word, Integer и Longint соответственно, буквой х - выражение любого из этих типов; буквы vb, vs, vw, vi, vl, vx обозначают переменные соответствующих типов. В квадратных скобках указывается необязательный параметр.
Таблица 2.2
Стандартные процедуры и функции, применимые к целым типам
Обращение |
Тип результата |
Действие |
abs(x) |
x |
Возвращает модуль x |
chr(b) |
Char |
Возвращает символ по его коду |
dec (vx[ ,I]) |
_ |
Уменьшает значение vx на i, а при отсутствии i- на 1 |
inc (vx[ ,I]) |
_ |
Увеличивает значение vx на i, а при отсутствии i- на 1 |
Hi(w) |
Byte |
Возвращает старший байт аргумента |
Hi(I) |
Byte |
Возвращает третий по счёту байт |
Lo(i) |
Byte |
Возвращает младший байт аргумента |
Lo(w) |
Byte |
Возвращает младший байт аргумента |
odd(l) |
Boolean |
Возвращает True, если аргумент - нечётное число |
Random(w) |
Как у параметра |
Возвращает псевдослучайное число, равномерно распределённое в диапазоне 0…(w-1) |
sqr(x) |
X |
Возвращает квадрат аргумента |
swap(i) |
Integer |
Меняет местами байты в слове |
swap(w) |
Word |
Меняет местами байты в слове |
При действиях с целыми числами тип результата будет соответствовать типу операндов, а если операнды относятся к различным целым типам - общему типу, который включает в себя оба операнда. Например, при действиях с Shortint и Word общим будет тип Integer. В стандартной настройке компилятор Delphi не вырабатывает код, осуществляющий контроль за возможной проверкой выхода значения из допустимого диапазона, что может привести к недоразумениям. Например, при прогоне следующей программы на экране появится значение 0:
procedure TfmExample. bbrunClick(Sender: TObject);
var
k:Word;
begin
k:= 65535; // Максимальное значение типаWord
k:= k+1; // По правилам математики k=65536
Writeln(k); // На самом деле k=0!
Readln
end;
(приложение 1)
Если на вкладке Compiler диалогового окна Options (открывается командой Project ► Options) установить флажок Range checking и повторить компиляцию командой Project ► Build All, компилятор вставит в программу код проверки переполнения и при прогоне программы возникнет исключительная ситуация, которую при желании можно соответствующим образом обработать. Замечу, что можно изменить программу следующим образом:
k := 65535; // Максимальное значение типа Word
Writeln(k + 1); // Будет выведено 65536
Тогда переполнения не произойдет, так как 32-разрядный компилятор Delphi автоматически преобразует операнды выражения k + 1 к 4-байтным величинам.
К логическим относятся типы Boolean, ByteBool, Bool, WordBool и LongBool. В стандартном Паскале определен только тип Boolean, остальные логические типы введены в Object Pascal для совместимости с Windows: типы Boolean и ByteBool занимают по одному байту каждый, Bool и WordBool - по 2 байта, LongBool - 4 байта. Значениями логического типа может быть одна из предварительно объявленных констант False (ложь) или True (истина).
Поскольку логический тип относится к порядковым типам, его можно использовать в операторе цикла счетного типа. В Delphi 5 для Boolean значение
Ord (True) = +1, в то время как для других типов (Bool, WordBool и т.д.)
Ord (True) = -1, поэтому такого
рода операторы следует
var
L: Bool;
k: Integer;
begin
for L:= False to True do
ShowMessage ('---');
end;
(приложение 2)
Если заменить тип параметра цикла L в предыдущем примере на Boolean, цикл будет работать и сообщение дважды появится на экране.
В отличии от некоторых других языков, Object Pascal не позволяет трактовать целое значение как булеву величину. Поэтому, например, если X- целая переменная, то оператор
if X then…
будет воспринят компилятором как синтаксическая ошибка.
Для булевых типов определены операции and (И), or (ИЛИ), not (НЕ, отрицание) и xor (исключающее ИЛИ) (табл. 2.3). Использование этих операций расширяет возможности по формированию сложных условий в ряде операторов.
Булевы операции принимают операнды булевых типов и возвращают результат тоже булевого типа.
Таблица 2.3
Булевы операции
Обозначение |
Операция |
Типы операндов |
Тип результата |
Пример |
not |
Отрицание |
Boolean |
Boolean |
not (C in MySet) |
and |
Логическое И |
Boolean |
Boolean |
Done and (Total > 0) |
or |
Логическое ИЛИ |
Boolean |
Boolean |
A or B |
xor |
Логическое исключающее ИЛИ |
Boolean |
Boolean |
A xor B |
Для символов имеются физические и общий типы. Физические типы представлены типами AnsiChar и WideChar. Символ типа AnsiChar занимает 1 байт, а для кодирования символов используется код ANSI (назван по имени American National Standard Institute - американского института стандартизации, предложившего этот код). Символ типа WideChar занимает 2 байта.
Каждому символу приписывается целое число в диапазоне 0...255. Это число служит кодом внутреннего представления символа, его возвращает функция ord.
Кроме физических типов, в языке Delphi определён общий тип Char, который эквивалентен типу AnsiChar.
Существуют символы, которые относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами.
К символьному типу применимы операции отношения, а также имеются следующие функции:
Сhr (W): Char – возвращает символ с кодом, равным значению целочисленного выражения x;
UpCase(C): Char – преобразует символ с к верхнему регистру;
А также предопределены такие функции и процедуры, как Ord, Pred, Succ, Inc, Dec и др. Функция, возвращающая номер символа, противоположна по смыслу функции Chr, т.е. Ord(Chr(65)) вернёт 65, а Chr(Ord(‘A’)) вернёт символ «А».
Например:
uses
SysUtils;
var d:char;
begin
ReadLn(d);
WriteLn(Ord(d)); //используем функцию, которая возвращает код символа
ReadLn(d); //выводим код символа
end.
В результате получается код, значение которого зависит от введённого символа.
(приложение 3)
Перечисленный тип задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками.
Формат описания перечислимого типа:
Type <Имя типа > = (<Имя 1>, …, <Имя N>);
Например:
type
colors = (red, white, blue);
Применение перечисляемых типов делает программы нагляднее. Если, например, в программе используются данные, связанные с месяцами года. То такой фрагмент программы был бы весьма наглядным:
type
ТипМесяц=(янв, фев, мар, апр, май, июн, июл, авг, сен, окт, ноя, дек);
var
месяц : ТипМесяц;
begin
…
if месяц = авг then
lbOutput.Caption:= 'Хорошо бы поехать к морю!';
…
end.
Приведём пример использования перечисленного типа, который содержит 3 имени и с помощью конструкций if и case of отображает сообщения в зависимости от того чему равна переменная xMonth:
uses
SysUtils;
type
Month = (Jan,Feb,Mar); //создаём перечисленный тип с тремя именами
var
xMonth : Month; //создаём переменную перечисленного типа
ch:char;
i:integer;
begin
ReadLn(i);
Case i of
1: xMonth:=Jan;
2: xMonth:=Feb;
3: xMonth:=Mar;
end;
if xMonth=Jan
then WriteLn('Nachalo zimi');
if xMonth=Feb
then Writeln('Konec zimi');
if xMonth=Mar
then Writeln('Nachalo vesni');
ReadLn(ch);
end.
(приложение 4)
Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер 0, второе - 1 и т. д. Максимальная мощность перечисляемого типа составляет 65536 значений, поэтому фактически перечисляемый тип задает некоторое подмножество целого типа Word и может рассматриваться как компактное объявление сразу группы целочисленных констант со значениями 0, 1 и т. д.
Использование перечисляемых типов повышает надежность программ благодаря возможности контроля тех значений, которые получают соответствующие переменные. Пусть, например, заданы такие перечисленные типы:
type
colors = (black, red, white);
ordenal = (one, two, three);
days = (Mon, Tue, Wed);
С точки зрения мощности и внутреннего представления все три типа эквивалентны. Однако пусть определены такие переменные:
var
col : colors;
num : ordenal;
day : days;
Тогда допустимы следующие операторы:
col :=black;
num :=two;
day :=Tue;
В то же время следующие операторы недопустимы:
col :=one;
day :=black;
Между значениями перечисленного типа и множеством целых чисел существует однозначное соответствие.
В Object Pascal допускается обратное преобразование: любое выражение типа Word можно преобразовать в значение перечисляемого типа, если только значение целочисленного выражения не превышает мощности этого типа. Такое преобразование достигается применением автоматически объявляемой функции с именем перечисленноого типа. Например, для рассмотренного ранее объявления типов эквивалентны следующие присваивания:
Информация о работе Концепция данных в языке Pascal. Реализация Delphi