
35. Переменная – именованный элемент программы, который может менять свое значение. Перед употреблением переменная должна быть объявлена в разделе переменных var. При объявлении должен быть указан тип переменной, задающий размер памяти для нее. Переменные могут быть:
Глобальные. Объявляются в главной программе. Место под них выделяется компилятором в статической памяти на все время выполнения программы. Они доступны и во вложенных подпрограммах, если там нет локальных переменных с таким же именем.
Локальные. Действуют в пределах подпрограммы, где они объявлены. Место под них выделяется в стеке на время выполнения подпрограммы. Стек – память для отложенных значений. При завершении подпрограммы переменная освобождается, а при повторном обращении к подпрограмме создается заново.
Динамические. Создаются при исполнении программы в динамической памяти. Компилятор в статической памяти создает под них указатель для занесения адреса начала данных. Размер указателя 4 байта.
Переменные получают значения с помощью операторов присвоения.
var
VarName:Real;
begin
VarName:=<значение выражения>;
end.
Данные в компьютере можно рассматривать как ячейки памяти, имеющие свои имена (идентификаторы). Все данные в программе на языке Delphi должны быть описаны до их первого использования. И компилятор следит, чтобы в программе они использовались в соответствии с этим описанием, что позволяет избежать ошибок. Любая величина в Delphi может быть постоянной или переменной. Её имя (идентификатор) может состоять из комбинации латинских букв, цифр и знака подчёркивания, и начинаться не с цифры. При этом регистр символов значения не имеет. Место описания данных в программе - вне логических блоков begin / end. В модуле перед ключевым словомimplementation есть блок описания: var Form1: TForm1; Именно здесь, начиная со следующей строки, удобно объявлять глобальные переменные и константы. Как видим, одна (Form1) уже есть! Команда объявления переменных в языке Delphi: var имя_переменной : тип_переменной ; Слово var - ключевое. Именем может быть любой идентификатор, если он не был описан ранее и не является одним из ключевых или зарезервированных слов языка Delphi. Если нужно описать несколько переменных одного типа, то их перечисляют, отделяя запятой: var A, B, C : Integer; Если несколько описаний следуют друг за другом, то ключевое слово var повторно можно не указывать: var A, B : Integer; C, D : String;
34. Константа — в программировании элемент данных, который занимает место в памяти, имеет имя и определенный тип, причем его значение никогда не меняется.
Данные в компьютере можно рассматривать как ячейки памяти, имеющие свои имена (идентификаторы). Все данные в программе на языке Delphi должны быть описаны до их первого использования. И компилятор следит, чтобы в программе они использовались в соответствии с этим описанием, что позволяет избежать ошибок. Любая величина в Delphi может быть постоянной или переменной. Её имя (идентификатор) может состоять из комбинации латинских букв, цифр и знака подчёркивания, и начинаться не с цифры. При этом регистр символов значения не имеет. Место описания данных в программе - вне логических блоков begin / end. В модуле перед ключевым словом implementation есть блок описания: var Form1: TForm1; Именно здесь, начиная со следующей строки, удобно объявлять глобальныепеременные и константы. Как видим, одна (Form1) уже есть!
Постоянную величину иначе называют константой. Конечно, в программе можно использовать числа и строки непосредственно: 3.1415 или 'Это значение числа пи', но иногда удобнее присвоить их идентификатору. Описание констант аналогично описанию переменных, но используется ключевое слово const, за именем идентификатора следует тип, затем знак равенства и его значение. Причём тип константы допускается не указывать: const pi=3.1415 ; ZnakPi : String = 'Это значение числа пи'; К слову, константа Pi встроенная в Delphi, то есть для того чтобы использовать в Delphi число 3,1415... в расчётах, нужно просто присвоить встроенную константу Piпеременной типа Real или просто использовать непосредственно в выражениях. 33. СОВМЕСТИМОСТЬ И ПРЕОБРАЗОВАНИЕ ТИПОВ ДАННЫХ
Когда в тех или иных операциях или операторах присутствуют данные, относящиеся к различным
типам, возникает вопрос о соответствии типов. В связи с этим говорят об идентичности типов,
совместимости типов и совместимости типов для присваивания. Когда возникают проблемы с
соответствием типов данных, можно осуществить преобразование тех или иных типов. Эти
вопросы и будут рассмотрены в данном разделе.
9.1. Идентичность типов
Идентичность типов требуется от формальных параметров процедур и функций и соответствующих
им фактических параметров во время вызова.
Два типа Т1 и Т2 идентичны в следующих случаях:
- Т1 и Т2 - один и тот же идентификатор типа (например, Integer, Real и т.д.);
- один тип объявляется эквивалентным другому.
Пример.
type
Tl = Boolean;
Т2 = Т1;
ТЗ = Boolean;
Все типы: Tl, T2, ТЗ и Boolean - идентичные типы.
type
Ml = array[1..5] of Integer;
M2 = array[1..5] of Integer;
Типы Ml и М2 - не идентичные типы. Однако VI и V2 - переменные идентичных типов:
var
VI, V2: array[1..5] of Integer;
9.2. Совместимость типов
Совместимость типов требуется в выражениях (в том числе и в операциях отношения).
Два типа Т1 и Т2 совместимы в следующих случаях:
- Т1 и Т2 - один и тот же тип или они идентичны;
- Т1 и Т2 - вещественные типы;
- Т1 и Т2 - целые типы;
- один тип - вещественный, а другой - целый;
- один тип представляет собой тип-диапазон другого;
- оба типа являются типами-диапазонами какого-то одного типа;
- оба типа являются типами-множествами с совместимыми базовыми типами;
- один тип является строкой, а другой - строкой или символом;
- один тип - Pointer, а другой - любой тип-указатель;
- один тип PChar, а другой - массив символов, заканчивающийся символом
с кодом 0 (только при наличии ключа компилятора ($Х+) - см. п. 17.7.1);
- оба типа являются указателями, полученными с помощью адресной операции @,
примененной к величинам идентичных типов (только при наличии ключа компилятора
{$Т+} - см. п. 17.7.1);
- оба типа - процедурные типы с идентичными типами результатов (для типа-функции),
идентичным числом параметров и попарной идентичностью типов этих параметров.
9.3. Совместимость для присваивания
Эта совместимость необходима, когда значение какого-то выражения
присваивается переменной, типизированной константе, функции. Если значение объекта
типа Т2 присваивается объекту типа Т1, то это возможно в следующих случаях:
- Т1 и Т2 - идентичные типы и не являются файловыми типами или структурированными
типами, содержащими компоненты файлового типа на любом уровне структурирования;
- Т1 и Т2 - совместимые порядковые типы и значение типа Т2 находится в
границах возможных значений объекта типа Т1;
- Т1 и Т2 - вещественные типы и значение типа Т2 находится в границах
возможных значений объекта типа Т1;
- Т1 - вещественный тип, а Т2 - целый тип;
- Т1 и Т2 - строки;
- Т1 - строка, а Т2 - символ;
- Т1 и Т2 - совместимые типы-множества и все компоненты значения типа
Т2 находятся в множестве Т1;
- Т1 и Т2 - совместимые указатели;
- Т1 - типа PChar, a T2 - строковая константа (только при наличии ключа
компилятора {$Х+} - см. п. 17.7.1);
- Т1 - типа PChar, a T2 - массив символов, заканчивающийся символом с
кодом 0 (только при наличии ключа компилятора {$Х+} - см. п. 17.7.1);
- Т1 и Т2 - совместимые процедурные типы;
- Т1 - процедурный тип, а Т2 - процедура или функция с идентичным
типом результата, числом параметров и попарной идентичностью типов
этих параметров;
- Т1 и Т2 - объектные типы (см. п. 14) и Т2 - потомок Т1;
- Т1 и Т2 - указатели на объектные типы (см. п. 14) и Т2 - указатель на
потомок типа, на который указывает Т1.
9.4. Преобразование типов
В ряде случаев требуется преобразовать переменную одного типа в переменную другого типа.
В Turbo Pascal такое преобразование осуществляется сравнительно просто, если переменные
обоих типов имеют один и тот же размер. Для этого следует указать идентификатор типа, а
за ним в круглых скобках переменную исходного типа. Если новый тип - структурированный,
можно в случае необходимости выбрать компоненту в соответствии с общими правилами.
Пример.
type
ByteRec = record
Lo, Hi: Byte
end;
WordRec = record
Low, High: Word
end;
PtrRec = record
Ofs, Seg: Word
end;
BytePtr = ^Byte;
var
B: Byte;
W: Word;
L: Longint;
P: Pointer;
begin
W := $1234; (присвоение переменной W значения)
В := ByteRec(W).Lo;
{преобразование переменной типа Word в запись из двух байтов и выделение младшего байта}
ByteRec(W).Hi := 0;
{преобразование переменной типа Word в запись из двух байтов и запись в старший байт
значения 0}
L := $01234567; {присвоение переменной L значения}
W := WordRec(L).Low;
{преобразование переменной типа Longint в запись из двух
слов и выделение младшего слова}
В := ByteRec(WordRec(L).Low).Hi;
{преобразование переменной типа Longint в запись из двух слов, выделение младшего слова,
преобразование его в запись из двух байтов и выделение старшего байта}
В := BytePtr(L)^;
{преобразование переменной типа Longint в указатель и получение значения параметра, на
который он указывает}
Р :=Ptr ($40,$49);
{Присвоение указателю Р значения с помощью стандартной функции Ptr}
W := PtrRec(P).Seg;
{преобразование указателя в запись из двух слов и выделение второго слова (фактически
адреса сегмента)}
Inc(PtrRec(P).Ofs, 4);
{преобразование указателя в запись из двух слов, выделение первого слова (фактически
смещения адреса) и увеличение его величины на 4 с помощью стандартной процедуры Inc}
end.
Такое преобразование возможно не только, когда исходный и окончательный типы имеют
одинаковый размер. Оно возможно также в случае преобразования друг в друга двух порядковых
типов (см. п. 3.2), независимо от их размера, а также преобразования параметра без типа
32. Вещественные типы Внутреннее представление
Вещественные типы данных хранятся в памяти компьютера иначе, чем целые. Внутреннее представление вещественного числа состоит из двух частей - мантиссы и порядка, и каждая часть имеет знак. Например, число 0,087 представляется в виде 0,87*10-1, и в памяти хранится мантисса 87 и порядок -1 (для наглядности мы пренебрегли тем, что данные на самом деле представляются в двоичной системе счисления и несколько сложнее).
Существует несколько вещественных типов, различающихся точностью и диапазоном представления данных. Точность числа определяется длиной мантиссы, а диапазон - длиной порядка.
Тип |
Название |
Размер |
Значащих цифр |
Диапазон значений |
real |
вещественный |
6 байт |
11-12 |
2.9e-39..1.7e+38 |
single |
одинарной точности |
4 байта |
7-8 |
1.5e-45..3.4e+38 |
double |
двойной точности |
8 байт |
15-16 |
5.0e-324..1.7e+308 |
extended |
расширенный |
10 байт |
19-20 |
3.4e-4932..1.1e+4923 |
comp |
большое целое |
8 байт |
19-20 |
-9.22e18..9.22e18(-263..263-1) |
Операции
С вещественными величинами можно выполнять арифметические операции, перечисленные в таблице. Результат их выполнения - вещественный.
Операция |
Знак операции |
сложение |
+ |
вычитание |
- |
умножение |
* |
деление |
/ |
В общем случае при выполнении любой операции операнды должны быть одного и того же типа, но целые и вещественные величины смешивать разрешается.
К вещественным величинам можно также применять операции отношения, перечисленные в разделе "Логические типы" (подробнее>>). Результат этих операций имеет логический тип.
Стандартные функции
К вещественным величинам можно применять стандартные функции, перечисленные ниже:
Имя |
Описание |
Результат |
Пояснения |
abs |
модуль |
вещественный |
|x| записывается abs(x) |
arctan |
арктангенс угла |
вещественный |
arctg x записывается arctan(x) |
cos |
косинус угла |
вещественный |
cos x записывается cos(x) |
exp |
экспонента |
вещественный |
ex записывается exp(x) |
frac |
дробная часть аргумента |
вещественный |
frac(3.1) даст в результате 0.1 |
int |
целая часть аргумента |
вещественный |
frac(3.1) даст в результате 3.0 |
ln |
натуральный логарифм |
вещественный |
logex записывается ln(x) |
pi |
значение числа п |
вещественный |
3.1415926536 |
round |
округление до целого |
целый |
round(3.1) даст в результате 3 round(3.8) даст в результате 4 |
sin |
синус угла |
вещественный |
sin x записывается sin(x) |
sqr |
квадрат |
целый |
x2 записывается sqr(x) |
sqrt |
квадратный корень |
вещественный |
записывается sqrt(x) |
trunc |
целая часть аргумента |
целый |
trunc(3.1) даст в результате 3 |