Численные переменные и типы данных
Система программирования Delphi является современным и очень мощным средством для создания программ. В этом Вы могли убедиться, изучая элементарные возможности редактора этой системы. Работа в таком редакторе не сложна, и зачастую просто доставляет пользователю удовольствие разнообразием своих возможностей. Программы, созданные в Delphi достаточно эффективны, и позволяют использовать всю мощь вычислительной техники.
Одним из самых главных препятствий являются объем оперативной памяти и быстродействие компьютера. Программисту всегда приходиться думать о том, каким образом уменьшить потребность программы в памяти. Одним из способов решения этой проблемы является ограничение количества переменных, используемых в программе, или уменьшение размера ячеек памяти для их хранения.
Вы уже знаете, как объявляются переменные целого и вещественного типа. Кроме этих переменных в системе Delphi существует еще несколько типов данных. Они отличаются друг от друга только размером памяти, необходимым для их хранения, и, соответственно, диапазоном чисел, которые можно хранить в этих переменных. Таким образом программист может выбрать необходимый численный тип, и рационально использовать память. Так что же такое типы данных.
Типы данных
Любые данные, т.е. константы, переменные, свойства, значения функций или выражения в Delphi характеризуются своими типами. Тип определяет множество допустимых значений, которые может иметь тот или иной объект, а также множество допустимых операций, которые применимы к нему. Кроме того, тип определяет также и формат внутреннего представления данных в памяти ПК.
Delphi характеризуется разветвленной структурой типов данных:
Мы рассмотрим с вами пока только простые типы.
Порядковые типы
Порядковые типы отличаются тем, что каждый из них имеет конечное количество возможных значений. Эти значения можно определенным образом упорядочить (отсюда и название типов) и, следовательно, с каждым из них можно сопоставить некоторое целое число — порядковый номер значения.
К порядковым типам относятся целые, логические, символьный, перечисляемый и тип-диапазон. К любому из них применима функция Ord(х), которая возвращает порядковый номер значения выражения Х.
Целые типы
Название |
Длина,байт |
Диапазон значений |
Cardinal |
4 |
0. .. 2 147 483 647 |
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 |
Int64 |
8 |
-9*1018. ..+9*1018 |
LongWord |
4 |
0. . .4 294 967 295 |
Типы LongWord и Int64 впервые введены в версии 4, а типы Smallint и Cardinal отсутствуют в Delphi 1. Тип integer для этой версии занимает 2 байта и имеет диапазон значений от -32768 до +32767, т. е. совпадает с Smallint.
Стандартные процедуры и функции, применимые к целым типам
Обращение |
Тип результата |
Действие |
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) |
То же |
Возвращает третий по счету байт |
Lo(i) |
“ |
Возвращает младший байт аргумента |
Lo(w) |
“ |
То же |
odd(l) |
Boolean |
Возвращает True, если аргумент-нечетное число |
Random(w) |
Как у параметра |
Возвращает псевдослучайное число, равномерно распределенное в диапазоне 0...(w-l) |
sqr(x) |
X |
Возвращает квадрат аргумента |
swap(i) |
Integer |
Меняет местами байты в слове |
swap (w) |
Word |
Тоже |
Также помимо известных вам арифметических операций для целых чисел существуют еще две: div и mod.
div — деление целых чисел с отбросом дробной части. Например:
a div b если а=10 и b=3, то результат равен 3.
mod — остаток от деления целых чисел. Например:
a mod b если а=10 и b=3, то результат равен 1
Представление целых чисел
В изображении целых чисел присутствуют лишь знак и цифры (знак + можно не указывать). Предполагается десятичная система счисления, однако можно использовать и шестнадцатеричную. В этом случае перед числом следует поставить знак $.
Тип диапазон
Все целые типы относятся к так называемым перечисляемым или порядковым типам. В любом порядковом типе можно выделить подмножество значений, в которое входят все значения исходного типа. Тип-диапазон задается в разделе объявления типов указанием минимального и максимального значений, разделенный двумя точками. Раздел объявления типов всегда начинается служебным словом Type. Например:
Type pir = [1..2006];
Перечисляемый тип
Перечисляемый тип задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками, например:
Type colors = (red, white, blue);
Символьный тип
Значениями символьного типа является множество всех символов ПК. Каждому символу приписывается целое число в диапазоне О...255. Это число служит кодом внутреннего представления символа, его возвращает функция ord.
Для кодировки в Windows используется код ANSI (назван по имени American National Standard Institute - американского института стандартизации, предложившего этот код). Первая половина символов ПК с кодами 0... 127 соответствует таблице 7.3. Вторая половина символов с кодами 128...255 меняется для различных шрифтов. Стандартные Windows-шрифты Arial Cyr, Courier New Cyr и Times New Roman для представления символов кириллицы (без букв “ё” и “Ё”) используют последние 64 кода (от 192 до 256): “А”... “Я” кодируются значениями 192..223, “а”... “я” - 224...255. Символы “Ё” и “ё” имеют соответственно коды 168 и 184.
Кодировка символов в соответствии со стандартом ANSI
Код |
Символ |
Код. |
Символ |
Код. |
Символ |
Код |
Символ |
0 |
NUL |
32 |
BL |
64 |
@ |
96 |
' |
1 |
ЗОН |
33 |
! |
65 |
А |
97 |
а |
2 |
STX |
34 |
“ |
66 |
В |
98 |
b |
3 |
ЕТХ |
35 |
# |
67 |
С |
99 |
с |
4 |
EOT |
36 |
$ |
68 |
D |
100 |
d |
5 |
ENQ |
37 |
% |
69 |
Е |
101 |
е |
6 |
ACK |
38 |
& |
70 |
F |
102 |
f |
7 |
BEL |
39 |
' |
71 |
G |
103 |
д |
8' |
BS |
40 |
( |
72 |
Н |
104 |
h |
9 |
HT |
41 |
) |
73 |
I |
105 |
i |
10 |
LF |
42 |
* |
74 |
J |
106 |
j |
11 |
VT |
43 |
+ |
75 |
К |
107 |
k |
12 |
FF |
44 |
f |
76 |
L |
108 |
1 |
13 |
CR |
45 |
- |
77 |
М |
109 |
m |
14 |
SO |
46 |
|
78 |
N |
110 |
n |
15 |
SI |
47 |
/ |
79 |
0 |
111 |
о |
16 |
DEL |
48 |
0 |
80 |
Р |
112 |
P |
17 |
DC1 |
49 |
1 |
81 |
Q |
113 |
q |
18 |
DC2 |
50 |
2 |
82 |
R |
114 |
r |
19 |
DC3 |
51 |
3 |
83 |
S |
115 |
s |
20 |
DC 4 |
52 |
4 |
84 |
Т |
116 |
t |
21 |
NAK |
53 |
5 |
85 |
U |
117 |
u |
22 |
SYN |
54 |
6 |
86 |
V |
118 |
v |
23 |
ETB |
55 |
7 |
87 |
W |
119 |
W |
24 |
CAN |
56 |
8 |
88 |
х |
120 |
x |
25 |
EM |
57 |
9 |
89 |
Y |
121 |
У |
26 |
SUB |
58 |
: |
90 |
Z |
.122 |
z |
27 |
ESC |
59 |
; |
91 |
t |
123 |
{ |
28 |
FS |
60 |
< |
92 |
\ |
124 |
1 |
29 |
GS |
61 |
= |
93 |
] |
125 |
} |
30 |
RS |
62 |
> |
94 |
Л |
126 |
~ |
31 |
US |
63 |
f |
95 |
|
127 |
r |
Символы с кодами 0...31 относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами.
К типу char применимы операции отношения, а также встроенные функции:
Сhr (в) - функция типа char; преобразует выражение в типа Byte в символ и возвращает его своим значением;
UpCase(CH) - функция типа char; возвращает прописную букву, если сн - строчная латинская буква, в противном случае возвращает сам символ сн (для кириллицы возвращает исходный символ).
Вещественные типы
В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и, следовательно, представляются в ПК абсолютно точно, значения вещественных типов определяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа.
Вещественные типы
Длина, байт |
Название |
Количество значащих цифр |
Диапазон значений |
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*10e324…1.7*10e308 3.4*10-4951…1.1*10e4932 -2e63…+2e63-1 +/-922 337 203 685477,5807 |
В предыдущих версиях Delphi 1...3 тип Real занимал 6 байт и имел диапазон значений от2, 9*10-39 до 1,7*1038. В версиях 4 и 5 этот тип эквивалентен типу Double. Если требуется (в целях совместимости) использовать 6-байтньш Real, нужно указать директиву компилятора {SREALCOMPATIBILITY ON}.
Как видно из предыдущей табл. вещественное число Delphi занимает от 4 до 10 смежных байт и имеет следующую структуру в памяти ПК:
S |
е |
M |
Здесь s - знаковый разряд числа; е - экспоненциальная часть; содержит двоичный порядок; m - мантисса числа.
Мантисса m имеет длину от 23 (для single) до 63 (для Extended) двоичных разрядов, что и обеспечивает точность 7...8 для single и 19...20 для Extended десятичных цифр. Десятичная точка (запятая) подразумевается перед левым (старшим) разрядом мантиссы, но при действиях с числом ее положение сдвигается влево или вправо в соответствии с двоичным порядком числа, хранящимся в экспоненциальной части, поэтому действия над вещественными числами называют арифметикой с плавающей точкой (запятой).
Отметим, что арифметический сопроцессор всегда обрабатывает числа в формате Extended, а три других вещественных типа в этом случае получаются простым усечением результатов до нужных размеров и применяются в основном для экономии памяти.
Для работы с вещественными данными могут использоваться встроенные математические функции, представленные в следующей табл. в этой таблице Real означает любой вещественный тип, integer - любой целый тип.
Стандартные математические функции Delphi
Обращение |
Тип параметра |
Тип результата |
Примечание |
abs (x) |
Real, Integer |
Тип аргумента Real |
Модуль аргумента |
Pi |
- |
<< |
П =3.141592653... |
ArcTan(x) |
|
|
Арктангенс (значение в радианах) |
cos (x) |
To же << |
To же << |
Косинус, угол в радианах |
exp(x) |
<< |
<< |
Экспонента |
frac(x) |
<< |
<< |
Дробная часть числа |
int(x) |
<< |
<< |
Целая часть числа |
ln(x) |
<< |
<< |
Логарифм натуральный |
Random |
- |
<< |
Псевдослучайное число, равномерно распределенное в диапазоне 0...[1] |
Random.fx)
|
Integer
|
Integer
|
Псевдослучайное целое число, равномерно распределенное в диапазоне 0...(х-1) |
Randomize
|
-
|
- |
Инициация генератора псевдослучайных чисел |
sin (x) |
Real |
Real |
Синус, угол в радианах |
sqr(x) |
To же |
To же |
Квадрат аргумента |
sqrt(x) |
<< |
<< |
Корень квадратный |
На заметку Генератор псевдо случайных чисел представляет собой функцию которая берет некоторое целое число, называемое базовым, изменяет, его разряды По определенному алгоритму и выдает новое число результат. Одновременно с этим новое число становится базовым при следующем обращении к функций; и т. д. (Так как алгоритм процедуры не меняется: в ходе ее работы, числа называются псевдослучайными.) В системном модуле System, который автоматически доступен любой программе, базовое число хранится в переменной с именем RandSeek и всегда имеет начальное значение 0. Это означает, при последовательном обращении к Random в разных, программах (или при нескольких прогонах одной программы) будет всегда выпадать одна и та же последовательность псевдослучайных чисел.
Представление вещественных чисел
Вещественные числа содержат в своем изображении точку и/или показатель степени (символ Е или е), например:
X = -0.5;
Y = 1.34;
Z = -1E-5;
W = 7.5e+15;
Функции преобразования типов данных
Round(x) — округление вещественного числа до ближайшего целого. Аргумент функции — величина вещественного типа, а результат — округленная до ближайшего целого числа величина типа Longint. Если результат выходит за диапазон значений Longint, то при выполнении программы произойдет ошибка.
Trunc(x) — получение целой части вещественного числа. Тип результата — Longint. Если результат выходит за диапазон значений Longint, то при выполнении программы произойдет ошибка.
Тип дата-время
Тип дата-время определяется стандартным идентификатором TDateTime и предназначен для одновременного хранения и даты, и времени. Во внутреннем представлении он занимает 8 байт и подобно currency представляет собой вещественное число с фиксированной дробной частью: в целой части числа хранится дата, в дробной - время. Дата определяется как количество суток, прошедших с 30 декабря 1899 года, а время - как часть суток, прошедших с 0 часов, так что значение 36444,837 соответствует дате 11.10.1999 и времени 20:05. Количество суток может быть и отрицательным, однако значения меньшие -693594 (соответствует дате 00.00.0000 от Рождества Христова) игнорируются функциями преобразования даты к строковому типу.
Над данными типа TDateTime определены те же операции, что и над вещественными числами, а в выражениях этого типа могут участвовать константы и переменные целого и вещественного типов.
Для работы с датой и временем используются подпрограммы, перечисленные в следующей табл.
Подпрограммы для работы с датой и временем
Function Date: TDateTime;
Function DateToStr(D: TDateTime): String; Function DateTimeToStr(D: TDateTime): String;
Function FormatDateTime (Format: String;
Value(TDateTime): String;
Function Now: TDateTime;
Function Time: TDateTime;
Function TimeToStrfT(TDateTime): String; |
Возвращает текущую дату
Преобразует дату в строку символов Преобразует дату и время в строку символов
Преобразует дату и время из параметра value в строку символов в соответствии со спецификаторами параметра Format (см. пояснения в п. 7.3.)
Возвращает текущую дату и время
Возвращает текущее время
Преобразует время в строку |