Шупрута В.В. - Delphi 2005 - Учимся программировать (1080891), страница 20
Текст из файла (страница 20)
Структура формы представления вещественного числа показана нарис. 3.1.знакэкспонентаматиссаРис. 3 . 1 т Представление вещественного числа в памяти компьютераПоле «знак» представляет собой знаковый разряд числа, «экспонента» экспоненциальную часть. «Мантисса» может быть представлена 23-63 разрядами двоичных чисел, что обеспечивает точность представления от 6..8 до19..20 знаков. Десятичная точка подразумевается перед левым разрядоммантиссы. Однако при действиях с числами ее положение сдвигается влево иливправо (в зависимости от порядка числа, хранящегося в экспоненциальнойчасти). Именно поэтому часто действия над вещественными числами называютарифметикой с плавающей точкой.ГЛАВА 3 • Язык программирования DelphiОтметьте для себя, что компьютер всегда обрабатывает числа в формате Extended, а все остальные типы в этом случае получаются усечением результатовдо нужных размеров и применяются в основном для экономии памяти.ДиапазонДапазон (Subbrange) - это специальная конструкция языка Delphi, позволяющая присваивать переменным значения, лежащие в заданном диапазоне.Данный тип задается границами своих значений внутри базового типа, накотором он основан.Диапазон может задаваться двумя способами - в специальном разделе type(см.
ниже в разделе «Структура типового модуля программы на языке Delphi»)или непосредственно при объявлении переменной. В качестве примера можнопривести следующий фрагмент кода:typebasic_digits = 0..9;l_char = 'а'.. 'z';Можно также объявлять диапазон и в разделе var:varbasic_digits : 0..9;l_char : 'a'.. ' z ' ;При объявлении диапазона помните, что две точки (. .) рассматриваютсякак один символ, поэтому их нельзя разделять пробелами. Кроме того, леваяграница диапазона не должна превышать правую.Тип «дата-время»Этот тип данных определяется в разделе описаний стандартным идентификатором TDateTime и предназначен для одновременного хранения даты ивремени.
Во внутреннем представлении он занимает 8 байт и фактическипредставляет собой вещественное число, где в целой части хранится дата, а вдробной - время. Дата определяется как количество суток, прошедших с 30декабря 1899 года, время - как часть суток, прошедших с 0 часов.Над данным типом определены те же операции, что и с вещественнымтипом.Логический типЛогический тип (Boolean) представляет собой специальную конструкцию,которая может принимать два значения: True (Истина) или F a l s e (Ложь).Какие бывают типы данныхВ разделе описания переменных для объявления данного типа используетсяглово b o o l e a n .
Как правило, переменные данного типа используются ввыражениях, а также в управляющих конструкциях (операторах) языка Delphi, где проверяется некоторое условие. Пример объявления переменнойлогического типа приведен ниже.varanswer_l,answer_2,answer_3 : boolean;beginanswer_l:=true;answer_2:=false;answer_3:=answer_l or answer_2; // answer_3 содержит falseend;Для логического типа допустимо использование логических операций(перечень логических операций см. в разделе «Выражения и операции»).Перечислимые типыПеречислимый тип (Enum) представляет собой упорядоченный набор значений,описанный как список идентификаторов:typeTSound = (tsClick, tsClack, tsClock);Такой тип данных полезен, если вам надо описать переменную, котораяпринимает ограниченное количество значений.НаборНабор (Set) — это коллекция значений некоторого диапазона или перечислимого типа.
Тип данных, на основе которого создается набор, не может иметь более 256 значений. Объявление набора выглядит следующимобразом:typeTSound = (tsClick, tsClack, tsClock);TSounds = set of TSound;TSomelnts = 1..250;TIntSet = set of TSomelnts;В программе присваивание значения переменной типа «набор» будетвыглядеть следующим образом:ГЛАВА 3 • Язык программирования Delphivars : TintSet;begins := [ ] ; / / Пустой наборs := [ 1 , 2 , 3 ] ; / / Набор, содержащий 3end ;значенияМожно добавлять и удалять значения из переменной типа набор:s := s + [ 4 ] ;s := s - [ 1 ] ;Проверить, присутствует какой-либо элемент в наборе, можно с помощьюконструкции in:if 2 in s then ShowMessage('2 присутствует в наборе! 1 );МассивыРассмотренные выше простые типы данных позволяют использовать впрограмме одиночные объекты - различные числа, строки, символы.
ЯзыкDelphi также позволяет использовать объекты, которые содержат множествооднотипных объектов (чисел, символов, строк). Такие объекты называютсямассивами (Array).При описании массивов необходимо указать общее количество входящих вмассив элементов и тип элементов. Например, следующий фрагмент кодаvarmassiv_a:array [0..100] of string;massiv_b:array [1..5] of char;massiv_c:array [-10..10] of integer;создает три массива соответствующих типов.
Как видно из исходного кода, дляописания массива используются зарезервированные слова array и of. Засловом array следует диапазон чисел, с помощью которого компиляторопределит общее количество элементов массива. За словом of следует типсодержащихся в массиве элементов.Чтобы получить доступ к массиву (элементам массива), необходимо впрограмме указать идентификатор массива и затем в квадратных скобкахномер элемента, к которому производится обращение. Следующий фрагменткода поясняет все вышесказанное.varmassiv_a:array [0..100] of string;massiv_b:array [1..5] of char;Какие бывают типы данных^Г|Гmassiv_c:array [-10..10] of integer;beginmassiv_a[15]:='Пример использования массивов';massiv_b[1]:='S';massive_c[0]:=24;end;При использовании массивов помните, что использование элементовмассива, индекс которых выходит за пределы объявленного диапазона,недопустимо.Есть еще один тип массива - динамический массив (Dynamic array).
Егоописание очень похоже на описание обычного, статического массива, однаков нем отсутствует указание границ массива:vardyn_massiv:array of integer;Правила работы с ним точно такие же, как и с обычным массивом, то естьобращение к его элементам производится по индексу, а выход за границумассива приводит к возникновению ошибки. Но как же тогда указать впрограмме нужную длину массива и узнать ее, если границы массива неуказываются при его описании, спросите вы? Для этого существуютспециальные процедуры и функции, перечисленные в табл. 3.5.Таблица 3.5 т Функции работы с динамическими массивамиИмяОписаниеf u n c t i o n Length (S) : I n t e g e r ;Возвращает количество элементов в массиве или символовв строкеprocedure SetLength( v a r s,- NewLength: i n t e g e r ) ;__Устанавливает новую длину массива или строки, при этомсохраняет те элементы, которые были в массиве или строкедо ее измененияf u n c t i o n Low(X);Возвращает индекс нижней границы массиваf u n c t i o n High(x),-Возвращает индекс верхней границы массиваНадо только помнить, что при описании динамический массив всегда имеетнулевую длину.
Кстати, хотя функция Low для любого массива вернет индекспервого элемента, но все динамические массивы имеют индекс первого элемента, равный нулю. А теперь рассмотрим пример использования динамического массива и функций работы с ним:procedure TForml.FormActivate(Sender: TObject);ГЛАВА 3 • Язык программирования Delphii : integer;a : array of integer;sum : integer;avg : double;msg : string;begint// Выделяем 10 элементов.setlength(a,10);// Заполняем массив случайными числами от 1 до 100.for i := Low(a) to High(a) doa[i] := Random(100)+1;// Считаем сумму элементов массива.sum :- 0;for i := Low(a) to High(a) dosum := sum + • a[i];// Считаем среднее значение среди элементов массива.avg := sum / Length(a);// Формируем и выводим сообщение с результатами.msg := 'Массив: ';for i := Low(a) to High(a)-1 domsg := msg + IntToStr(a[i]) + ',';msg := msg + IntToStr(a[High(a)]) + #13#10;msg := msg + 'Сумма элементов =+ IntToStr(sum) + #13#10;msg := msg + 'среднее значение =+ FloatToStr(avg);ShowMessage(msg);end ;Результат работы этой небольшой программы вы можете видеть на рис.
3.2.Массив: 1,4,87,21,28,68,32,17,38,43•Сумма элементов •• 339среднее значение - 33,9Рис. 3.2 т Пример работы с динамическим массивомЗаписиЗапись (Record) - сложная структура данных, состоящая из фиксированногоколичества объектов, называемых полями записи. В отличие от массивовполя записи могут быть разного типа. Чтобы можно было ссылаться на тотКакие бывают типы данных•или иной элемент, поля записи именуются. Структура объявления записитакова:<имя_типа_записи>=гесогс1 <список_полей> end;Имя типа записи - идентификатор, который будет использоваться длядоступа к данному типу.
Record и end - зарезервированные слова,означающие начало описания записи и его конец. Список полей представляетсобой последовательность описания идентификаторов, очень похожий наописание обычных типов в разделе var. Пример описания типа приведенниже:typePersonal = recordName:string ;Age:Byte;Payment:integer;end;В этом примере создается запись P e r s o n a l - запись, содержащаяинформацию о сотруднике. Такой информацией в данном случае является егоимя, возраст и оклад. Соответственно, определяются три поля записи - полеName типа s t r i n g для хранения имени, поле Age типа Byte - для возраста иполе Payment типа I n t e g e r для оклада.
После того как создано описаниеподобного типа, необходимо создать объект такого типа - только тогдаподобную структуру можно использовать. Для этого в разделе var достаточносоздать идентификатор созданного нами типа P e r s o n a l :varboss:Personal; .// Возможно использование// одиночного объекта типа// записьemployment: array [1..100] of Personal; // или использование множества// объектов.Доступ в тексте программы к объявленным идентификаторам можно получитьследующим образом:beginBoss.Name:='Иван Петров 1 ;Boss.Age:=3 0;Boss.Payment:=40000;employment[10].Name:='Федор Сумкин';•ГЛАВА 3 т Язык программирования Delphiemployment[10].Age:= Boss.Age;// Возраст Сумкина 30.employment [10] . Payment := Boss.