Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Pascal и Delphi / Иллюстрированный самоучитель по Delphi 6 / Часть II . Язык Object Pascal / Типы данных /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Простые типы - Программирование от RIN.RU
Простые типы

К простым типам относятся порядковые, вещественные типы и тип дата-время.


Порядковые типы отличаются тем, что каждый из них имеет конечное количество возможных значений. Эти значения можно определенным образом упорядочить (отсюда - название типов) и, следовательно, с каждым из них можно сопоставить некоторое целое число - порядковый номер значения.


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


Тип дата-время предназначен для хранения даты и времени. Фактически для этих целей он использует вещественный формат.




Порядковые типы


К порядковым типам относятся (см. рис. 7.1) целые, логические, символьный, перечисляемый и тип-диапазон. К любому из них применима функция Ord(x), которая возвращает порядковый номер значения выражения X.



Рис. 7.1. Структура типов данных




Для целых типов функция ord(x) возвращает само значение х, т. е. Ord(X) = х для х, принадлежащего любому целому типу. Применение Ord(x) к логическому, символьному и перечисляемому типам дает положительное целое число в диапазоне от 0 до 1 (логический тип), от 0 до 255 (символьный), от 0 до 65535 (перечисляемый). Тип-диапазон сохраняет все свойства базового порядкового типа, поэтому результат применения к нему функции ord(X) зависит от свойств этого типа.


К порядковым типам можно также применять функции:


pred(x) - возвращает предыдущее значение порядкового типа (значение, которое соответствует порядковому номеру
ord (X) -1), т. е. Ord(Pred(X)) = Ord(X) - 1;
succ (X) - возвращает следующее значение порядкового типа, которое соответствует порядковому номеру ord (X) +1, т. е.
Ord(Succ(X)) = Ord(X) + 1.


Например, если в программе определена переменная


var
с : Char;
begin
с := '5';
end;




то функция PRED(C) вернет символ '4', а функция SUCC(C) - символ '6'.


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


Целые типы. Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два, четыре или восемь байтов. В табл. 7.1 приводятся названия целых типов, длина их внутреннего представления в байтах и диапазон возможных значений.


Таблица 7.1. Целые типы

Название

Длина,байтДиапазон значений
Cardinal40. .. 2 147 483 647
Byte10...255
Shortint1-128...+127
Smallint2-32 768...+32 767
Word20...65 535
Integer4-2 147 483 648...+2 147 483 647
Longint4-2 147 483 648...+2 147 483 647
Int648-9*1018. ..+9*1018
LongWord40. . .4 294 967 295




Примечание

Типы LongWord и Int64 впервые введены в версии 4, а типы Smallint и Cardinal отсутствуют в Delphi 1. Тип integer для этой версии занимает 2 байта и имеет диапазон значений от -32768 до +32767, т. е. совпадает с Smallint.




При использовании процедур и функций с целочисленными параметрами следует руководствоваться 'вложенностью' типов, т. е. везде, где может использоваться word, допускается использование Byte (но не наоборот), в Longint 'входит' Smallint, который, в свою очередь, включает в себя Shortint.


Перечень процедур и функций, применимых к целочисленным типам, приведен в табл. 7.2. Буквами b, s, w, i, l обозначены выражения соответственно типа Byte, Shortint, Word, Integer И Longint, х - выражение любого из этих типов; буквы vb, vs, vw, vi, vl, vx обозначают переменные соответствующих типов. В квадратных скобках указывается необязательный параметр.


Таблица 7.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)То жеВозвращает третий по счету байт
Lo(i)"Возвращает младший байт аргумента
Lo(w)"То же
odd(l)BooleanВозвращает True, если аргумент-нечетное число
Random(w)Как у параметраВозвращает псевдослучайное число, равномерно распределенное в диапазоне 0...(w-l)
sqr(x)XВозвращает квадрат аргумента
swap(i)IntegerМеняет местами байты в слове
swap (w)WordТоже



При действиях с целыми числами тип результата будет соответствовать типу операндов, а если операнды относятся к различным целым типам - общему типу, который включает в себя оба операнда. Например, при действиях с shortint и word общим будет тип integer. В стандартной настройке компилятор Delphi не вырабатывает код, осуществляющий контроль за возможной проверкой выхода значения из допустимого диапазона, что может привести к недоразумениям.


Например, при прогоне следующей программы на экране появится значение 0:


< div class=code>

procedure TfmExample.bbRunClick(Sender: TObject) ;
var
k: Word;
begin
k := 65535; // Максимальное значение типа Word
k := k+1; // По правилам математики
k=65536 IbOutput.Caption := IntToStr(k); // На самом деле k=0!
end;




Если активизировать переключатель project | options | Compiler I Range checking и повторить компиляцию с помощью Project | Build All, компилятор вставит в программу код проверки переполнения и при прогоне программы возникнет исключительная ситуация, которую при желании можно соответствующим образом обработать. Замечу, что, если изменить программу следующим образом:


k := 65535; // Максимальное значение типа Word
IbOutput.Caption := IntToStr(k + 1);// Будет выведено 65536


переполнения не произойдет, т. к. 32-разрядный компилятор версий Delphi 32 автоматически преобразует операнды выражения k+i к 4-байтным величинам.


Логические типы. К логическим относятся типы Boolean, ByteBool, Bool, wordBool и LongBool. В стандартном Паскале определен только тип Boolean, остальные логические типы введены в Object Pascal для совместимости с Windows: типы Boolean и ByteBool занимают по одному байту каждый, Bool и WordBool - по 2 байта, LongBool - 4 байта. Значениями логического типа может быть одна из предварительно объявленных констант False (ложь) или True (истина). Для них справедливы правила:


Ord(False) = 0;
Ord(True) <> 0;
Succ(False)= True;
Pred(True) = False.


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


var
l : Boolean;
begin
for l := False to True do ....




Однако необходимо помнить, что в Delphi 32 для Boolean значение


Ord (True) = +1, В ТО Время как для других типов (Bool, WordBool И Т.Д.)
Ord (True) = -1, поэтому такого рода операторы следует использовать с осторожностью!. Например, для версии Delphi 6 исполняемый оператор showMessage (' --- ') в следующем цикле for не будет выполнен ни разу:


var
L: Bool;
k: Integer;
begin
for L := False to True do ShowMessage ('--);
end; __




Если заменить тип параметра цикла l в предыдущем примере на Boolean, цикл будет работать и сообщение дважды появится на экране.[ Для Delphi версии 1 и 2 ord (True) =+1 для любого логического типа. ]


Символьный тип. Значениями символьного типа является множество всех символов ПК. Каждому символу приписывается целое число в диапазоне О...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.




Таблица 7.3. Кодировка символов в соответствии со стандартом ANSI
КодСимвол Код. Символ Код. Символ Код Символ
0NUL32BL64@96'
1ЗОН33!65А97а
2STX34"66В98b
3ЕТХ35#67С99с
4EOT36$68D100d
5ENQ37%69Е101е
6ACK38&70F102f
7BEL39'71G103д
8BS40(72Н104h
9HT41)73I105i
10LF42*74J106j
11VT43+75К107k
12FF44f 76L1081
13CR45- 77М109m
14SO46  78N110n
15SI47/ 790111о
16DEL48080Р112P
17DC149181Q113q
18DC250282R114r
19DC351383S115s
20DC 452484Т116t
21NAK53585U117u
22SYN54686V118v
23ETB55787W119W
24CAN56888х120x
25EM57989Y121У
26SUB58:90Z.122z
27ESC59;91t123{
28FS60<92\1241
29GS61=93]125}
30RS62>94Л126~
31US63f 95 

 
127r



Символы с кодами 0...31 относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами.


К типу char применимы операции отношения, а также встроенные функции:


Сhr (в) - функция типа char; преобразует выражение в типа Byte в символ и возвращает его своим значением;


UpCase(CH) - функция типа char; возвращает прописную букву, если сн - строчная латинская буква, в противном случае возвращает сам символ сн (для кириллицы возвращает исходный символ).


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


type
colors = (red, white, blue);




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


type
ТипМесяц=(янв,фев,мар,апр,май,июн,июл,авг,сен,окт,ноя,дек);
var
месяц : ТипМесяц;
begin
if месяц = авг then
IbOutput.Caption := 'Хорошо бы поехать к морю!';
end.




был бы, согласитесь, очень наглядным. Увы! В Object Pascal нельзя использовать кириллицу в идентификаторах, поэтому мы вынуждены писать так:


type
TypeMonth=(jan,feb,mar,may,jun,jul,aug,sep,oct,nov,dec);
var
month: TypeMonth;
begin
if month = aug then
IbOutput.Caption := 'Хорошо бы поехать к морю!';
end.




Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер О, второе - 1 и т. д. Максимальная мощность перечисляемого типа составляет 65536 значений, поэтому фактически перечисляемый тип задает некоторое подмножество целого типа word и может рассматриваться как компактное объявление сразу группы целочисленных констант со значениями 0, 1 и т. д.


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


type
colors = (black, red, white);
ordenal= (one, two, three) ;
days = (Monday, Tuesday, Wednesday);




С точки зрения мощности и внутреннего представления все три типа эквивалентны:


Ord(black)=0, ... , Ord(white)=2,
Ord(one)=0, ... , Ord(three)=2,
Ord(Monday)=0, ... , Ord(Wednesday)=2.


Однако если определены переменные


var
col : colors;
num : ordenal;
day : days ;


то допустимы операторы


col := black;
num := Succ(two);
day := Pred(Tuesday);


но недопустимы


col := one;
day := black;


Как уже упоминалось, между значениями перечисляемого типа и множеством целых чисел существует однозначное соответствие, задаваемое функцией Ord(X). В Object Pascal допускается и обратное преобразование: любое выражение типа Word можно преобразовать в значение перечисляемого типа, если только значение целочисленного выражения не превышает мощности этого типа. Такое преобразование достигается применением автоматически объявляемой функции с'именем перечисляемого типа. Например, для рассмотренного выше объявления типов эквивалентны следующие присваивания:


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;
Ichr : 'А'..'Z';




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


  • два символа ".." рассматриваются как один символ, поэтому жду ними недопустимы пробелы;

  • левая граница диапазона не должна превышать его правую границу.




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


type
days = (то,tu,we,th,fr,sa,su);
WeekEnd = sa .. su;
var
w : WeekEnd;
begin
w := sa;
end;




to ord(w) вернет значение 5, в то время как pred(W) приведет к ошибке.


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


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


Вперед  >>>
 1  2  3 


 8  Комментарии к статье  8 8  Обсудить в чате

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь