Королевство Дельфи"Knowledge itself is power"
F.Bacon
 Лицей
  
Главная
О лицее

Список семинаров

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  13:12[Войти] | [Зарегистрироваться]

Переменные, типы данных и константы

Andrew Fionik
дата публикации 29-03-2004 16:09

урок из цикла: Азы Delphi.


предыдущий урок содержание семинара следующий урок

Переменные, типы данных и константы

Любая программа оперирует какими-нибудь данными. Эти данные нужно где-то хранить, а также обрабатывать по определенным правилам. В данной лекции мы рассмотрим такие понятия как переменные, типы данных и константы. Переменные представляют собой хранилища в которых размещаются обрабатываемые данные. Каждой переменной назначается какой-либо тип данных, определяя таким образом что с этой переменной можно делать и как. Типы данных определяют правила работы с этими переменными а также множество допустимых значений которые могут размещаться в переменных. Константы - специальные языковые конструкции имеющие заранее определенное значение.

Типы данных

Существует несколько способов по которым можно сгруппировать или разделить типы данных.


По способу объявления

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

Пример: Тип данных Integer (32-ух разрядное знаковое целое) - встроенный. Тип данных DWord (32-ух разрядное беззнаковое целое) - пользовательский, производный от LongWord. Он объявлен программистами Borland в тексте библиотеки VCL.


По платформе

Типы данных разделяются на фундаментальные (fundamental) и общие (generic). Фундаментальные типы (их формат и множество значений) не зависят от реализации языка Delphi, его версии, операционной системы и процессора. Формат и множество значений общих типов данных специфичны для конкретной платформы и могут варьироваться в зависимости от версии Delphi, ОС и процессора. Следует стараться использовать общие типы данных где это возможно, т.к. они предоставляют оптимальную производительность и переносимость программ. Однако зависимость формата от платформы может создать проблемы с совместимостью когда речь идет о хранении (файлы) и обработке данных вне программы (передача данных другим программам или ОС).

Пример: Тип данных Integer в версии Delphi 1 и в Turbo Pascal представлял собой 16-ти разрядное знаковое целое число. Теперь в 32-ух разрядных версиях Delphi этот тип данных является 32-ух разрядным. Вполне возможно что при переходе на следующее поколение процессоров которые будут оперировать 64-ех битными машинными словами этот тип данных тоже станет 64-ех битным. В противоположность ему Byte всегда является 8-ми битным беззнаковым целым.


По характеру данных

Простые типы данных

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

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

Порядковые (ordinal) - типы данных представляют собой типы данных которые могут хранить одно из значений упорядоченного набора. Порядковым типом данных называется тип описывающий множество значений каждое из которых имеет однозначно определенное предыдущее значение и последующее значение. Исключение - последнее и первое значение в типе, они не имеют соответственно последующего и предыдущего значений. Каждое значение в типе имеет порядковый номер. Для конкретного значения с порядковым номером N предыдущее значение имеет порядковый номер N-1 а последующее значение имеет порядковый номер N+1.

К порядковым типам данных относятся следующие предопределенные типы данных:

  • все целочисленные типы (ShortInt, SmallInt, Integer, Cardinal, Int64, Word, LongInt, Byte, LongWord)

  • логический тип данных (Boolean)

  • символьный тип данных (Char)

  • перечислимые типы данных в которых явно не определены порядковые номера значений, тогда они автоматически определяются порядком заданным при описании возможных значений (типы данных создаваемые пользователем)

  • поддиапазон (тип производный от любого из предыдущих типов и включающий в себя подмножество значений базового типа)

Вещественные типы данных

Вещественный (real) тип данных определяет множество чисел которые могут быть записаны в форме с плавающей десятичной точкой. Количество значений определяемых вещественным типом очень большое, хотя и конечное. К вещественным типам данных относятся Real48, Real, Single, Double, Extended, Comp, Currency.

Строковые типы данных

Строка представляет собой последовательност символов. В Delphi существует три встроенных типа для строковых данных.

  • ShortString - короткие строки, длиной до 255 символов.
  • AnsiString, String - длинные строки, длиной до ~2^31 символов.
  • WideString - ~2^30 символов Unicode


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

Структурированные типы данных

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

  • set - множества.
  • array - массивы.
  • record - записи.
  • class - классы.
  • class reference - ссылки на класс.
  • interface - интерфейсы.

Указатели

Указатели не содержат каких-либо значений, они содержат в себе адреса в оперативной памяти где эти значения находятся. Этот тип данных также будет описан подробно в нескольких последующих лекциях. Указатели бывают типизированные (typed) и нетипизированные (untyped). Типизированные указатели представляют собой типы данных которые описаны таким образом что компилятор знает как корректно работать со значениями на которые они указывают. Нетипизированные указатели представляют собой единственный тип данных pointer. Компилятор не знает как работать со значениями на которые он указывает, это за него должен сделать программист. Указатели также являются одним из мощнейших средств языка Delphi, однако они-же являются источником большинства трудноуловимых и фатальных ошибок.

Процедурные типы данных

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

Варианты

Варианты, а точнее вариант (variant) - единственный тип данных который может содержать значения разных типов. Тип значений хранимых вариантом не определен на этапе компиляции и управляется программистом.

Объявление типов

Типы данных определяемые пользователем (т.е. программистом) объявляются в секции определения типов которая начинается с зарезервированного слова type и имеет вид:

type
	TypeDeffinitionList
... где TypeDeffinitionList - список объявляемых типов. Количество типов в списке должно быть больше 0. Нельзя просто употребить в тексте программы зарезервированное слово type если за ним не следует список объявляемых типов данных.
	TypeDeffinition1;
	TypeDeffinition2;
	...
... где TypeDeffinitionN - объявление одного типа данных.
	TypeName=TypeDeclaration;
TypeName - идентификатор нового типа данных, определенного здесь.
TypeDeclaration - описание типа данных.

Пример:

type
	Float=Real; // тип Float эквивалентен уже существующему типу Real
	TIntegerArray=array[0..9] of Integer; // массив для 10-ти значений типа Integer
	TSemaphoreColor=(scRed, scYellow, scGreen); {перечислимый тип который может содержать
	одно из трех значений scRed, scYellow, scGreen}

Объявление пользовательских типов данных будет подробно рассмотрено в дальнейших главах. Здесь оно приведено только для общего представления о том что такое типы данных.

Переменные

Данные, которыми манипулирует программа, хранятся в переменных. Каждая переменная принадлежит к одному из типов данных. По другому говорят что "такая-то переменная является переменной такого-то типа" или "такая-то переменная имеет тип такой-то". Указание типа данных для переменной является важным свойством языка. Указание типа данных определяет правила по которым переменная может быть использована, способы ее использования и допустимый набор действий которые могут быть произведены над данными хранящимися в этой переменной. Самое главное, то что задание типа данных для переменной информирует компилятор о том какие "правила игры" нужно принять во время работы с этой переменной. Таким образом компилятор имеет возможность проанализировать корректность операций производимых над переменными и сообщить программисту о ошибках, буде тот в своем программном коде нарушает правила игры.

Переменные имеют также имена или по другому идентификаторы. По имени переменной компилятор (да и программист тоже :-) отличают одну переменную от другой.

Над переменными возможно производить две фундаментальных операции - присвоить переменной какое-нибудь значение и использовать значение присвоенное переменной для каких-нибудь целей.

Попробуем объяснить концепцию переменных на пальцах

Допустим у нас имеется числовое значение 25 которое представляет собой количество денег которые должен нам наш знакомый. Нам надо сохранить его (не знакомого, а сколько денег он нам должен) а потом воспользоваться им. Мы берем коробку на которой написано "Долг", пишем на бумажке число 25 и бросаем его в коробку. А в голове запоминаем что размер долга знакомого хранится в коробке с надписью "Долг". Впоследствии встретившись с нашим знакомым в темном переулке мы быстренько ищем у себя в кармане коробку с надписью "Долг", открываем ее, выуживаем бумажку и радостно сообщаем ему: "Слышь-ты, гони бабло... цельных... м-м-м-м... 25 рублей". Видя нашу зверскую рожу знакомый в ужасе сообщает нам что в наличности у него с собой только 15 рублей и он готов отдать нам их, а остаток будет попозже. "Без проблем", - говорим мы ибо 15 рублей нам и не хватало на бутылочку "Сибирская корона - Рубиновое". Забираем у него деньги, старую бумажку выбрасываем, на новой пишем 10 (результат от 25-15) и кладем в коробку "Долг".

Хорошо. У нас есть бутылка пива и мы хотели бы ее сохранить некоторое время (например, пока не дойдем до ближайшей шашлычной). Попытка затолкать бутылку пива в такую-же коробку в которой у нас хранилась заметка о долге ни к чему не приведет. Бутылка не влезет. Тогда мы пихаем бутылку в полиэтиленовый пакет с надписью "Christian_Dior" и счастливо прем в шашлычную к месту распития и разъетия.

В чем мораль сей басни, спросите вы? А вот в чем. Бумажки с надписями и бутылка пива - это значения переменных. Емкости для хранения (коробка и пакет) - это сами переменные, места где хранятся значения (данные). Надписи на коробке и пакете - идентификаторы переменных по которым мы отличали их от других коробок распиханых по карманам и пакетов болтающихся за спиной. Разница размеров между пакетам и коробкой - типы переменных, в коробку мы можем класть только маленькие бумажки, а в пакет только бутылки с пивом.

Когда мы положили бумажку с надписью в коробку мы выполнили операцию присваивания. Присвоили переменной "Долг" значение 25. Когда мы смотрели бумажку для сообщения размера долга, мы использовали значение находящееся в переменной "Долг". Когда мы положили другую бумажку в коробку, мы присвоили перменной "Долг" новое значение - 10, как результат выражения 25-15. С пивом и пакетом то-же самое.

Переменные объявляются в секции объявления переменных, которая начинается с ключевого слова var. Формат объявления переменных:

var
	VariableDeffinitionList
... где VariableDeffinitionList - список объявленных переменных. В списке переменных обязательно должна быть объявлена хотя-бы одна переменная.
	VariableList1:VariableDatatype1;
	VariableList2:VariableDatatype2;
	...
	VariableListN:VariableDatatypeN;
... где VariableList - список объявляемых переменных типа VariableDataType и разделенных запятыми.
	VariableIdent1,VariableIdent2,...,VariableIdentN:VariableDataType;
VariableIdent - идентификатор объявляемой переменной.
VariableDataType - идентификатор типа переменной.
Как видите можно объявлять сразу-же несколько переменных одного типа в одной строке. Можно объявлять и по одной. Никакой разницы не будет.

Пример:

var
	A,A1:Integer;
	B:String;
	C,D:Real;
... может быть записано и так:
var
	C:Real;
	A:Integer;
	B:String;
	A1:Integer;
	D:Real;

Константы

Иногда нам требуется использовать в тексте программы фиксированные значения, т.е. значения которые не должны изменяться в процессе выполнения программы. Например в программе расчета давления машины на грунт это может быть количество колес автомобиля - 4. Предположим везде в расчетах мы будем использовать это число - 4. Но что будет если нам предложат переделать программу чтобы она считала давление на грунт БТР-а, у которого этих колес 8 штук? Идея просматривать код и заменять везде 4 на 8 - не самая лучшая. Гораздо удобнее и правильнее определить константу и назначить ей нужное значение, а потом использовать вместо значения эту константу. Компилятор сам подставит значение константы в тех местах где она была использована. Таким образом нам достаточно лишь будет исправить значение константы с 4 на 8 а потом перекомпилировать программу.

Константы подразделяются на два вида - истинные (true constants) и типизированные (typed). Истинные константы - собственно и есть константы в чистом виде. Типизированные константы - константы которые могут содержать типизированные значения. Например можно объявить массив-константу или запись-константу.

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

Константы, так-же как переменные и типы данных, объявляются в своей секции объявления констант которая начинается с зарезервированного слова const. Объявление констант имеет следующий формат:

const
	ConstantDeffinitionList
... где ConstantDeffinitionList - список объявлений констант. Если вы указали секцию объявления констант, то в списке констант должна быть объявлена хотя-бы одна константа.
	ConstantDeffinition1
	ConstantDeffinition2
	...
	ConstantDeffinitionN
ConstantDeffinition - объявление истинной или типизированной константы. Объявление истинной константы имеет формат:
	ConstantIdent=ConstantExpression;
Объявление типизированной константы больше похоже на объявление переменной и отличается от него только тем что переменной не присвоено изначально никакое значение, а константе изначально присвоено конкретное значение определенное в коде программы. Формат объявления типизированной константы:
	ConstantIdent:DataType=ConstantExpression;
ConstantIdent - идентификатор константы.
DataType - тип данных к которому принадлежит значение константы. DataType может быть как идентификатором ранее объявленного типа данных, так и объявлением типа данных на месте.
ConstantExpression - константное выражение. Константное выражение - такое выражение которое может быть вычислено компилятором во время компиляции. В константном выражении могут присутствовать идентификаторы других, уже определенных, констант.

Пример объявления констант:

const
	A=10;
	B='Linux must die';
	E:Real=2.71;
	C=A+5;
	D:array[0..4] of Integer=(5, A, 1, C, 123);

Пример использования вышеупомянутых сущностей языка в программе

Итак, вернемся к нашим баранам и посчитаем распределение давления колес на поверхность для какого-нибудь транспортного средства. Хотя мы знаем что вес обычно распределяется неравномерно, но будем для простоты считать что это не так и давление каждого колеса на поверхность одинаковое.

{$APPTYPE CONSOLE}
program WheelPressure;  // название программы
        // секция объявлений
type    // секция объявления типов
    // объявили тип данных Float который совпадает с встроенным типом Real
	Float=Real;
const        // секция объявления констант
	WheelCount=4;   // WheelCount - количество колес
	VehicleMass:Float=1.8;   // VehicleMass - масса транспортного средства
var     // секция объявления переменных
	WheelPressure:Float;   // WheelPressure - давление одного колеса
begin  // начало тела программы
    // присваиваем переменной WheelPressure частное от деления VehicleMass на WheelCount
	WheelPressure:=VehicleMass/WheelCount;
	// печатаем пояснение и значение переменной WheelPressure
	WriteLn('Pressure caused by one wheel is ', WheelPressure);
end.  // конец тела программы

NB! Обратите внимание на комментарий вначале текста программы {$APPTYPE CONSOLE}. Это специальный комментарий для компилятора Delphi инструктирующий его что он должен создавать консольную программу.

Для чего все это сделано, скажете вы, когда можно было просто написать:

{$APPTYPE CONSOLE}
program WheelPressure;
var
	WheelPressure:Float;
begin
	WheelPressure:=1.8/4;
	WriteLn('Pressure caused by one wheel is ', WheelPressure);
end.

... или вообще так:
{$APPTYPE CONSOLE}
program WheelPressure;
begin
	WriteLn('Pressure caused by one wheel is ', 1.8/4);
end.

... ведь результат будет одинаковым?

А вот зачем. Представьте себе что наша программа состоит не из пары десятков строк а из пары десятков тысяч строк (обычное дело для реального мира) и, скажем, "количество колес", используется в двадцати местах, рассеянных по этой программе. Предположим условия задачи изменятся и нам придется делать расчет не для 4-ех колесного транспортного устройства, а для 8-ми колесного. Куда проще завести константу и использовать ее во всех расчетах, а при необходимости сменить вместо того чтобы искать все места в программе где используется "количество колес" и менять его с 4 на 8.

То-же самое относится к типу данных Float. Если вдруг нам понадобится увеличить точность расчетов то мы просто переменим объявление типа данных Float и объявим его равным типу данных Double вместо Real. Тип данных Double позволяет сохранить больше значащих цифр при вычислениях. Таким образом исправив программу только в одном месте мы повысим точность вычислений по всей программе.


предыдущий урок содержание семинара следующий урок




Смотрите также материалы по темам:


 Обсуждение материала [ 26-12-2004 20:33 ] 5 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования