Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Емельянов.doc
Скачиваний:
12
Добавлен:
03.11.2018
Размер:
3.25 Mб
Скачать

Символьные типы

Смысл символьного типа очевиден при выводе символов на экран или принтер. Обычно символьные типы задают некоторые стандартные схемы кодирования и декодирования информации для обмена символьными дан­ными. Символьная схема должна воспроизводиться так же, как ее определя­ет операционная система. Существуют две схемы: набор 8-битовых симво­лов, известный как расширенный (extended) ANSI-стандарт (American Na­tional Standards Institute - Американский национальный институт стандар­тов), и схема, соответствующая международному стандарту UNICODE и представлящая набор 16-битовых символов, в котором первые 256 симво­лов совпадают с символами, определенными ANSI-стандартом.

В Delphi определены два физических символьных типа и один общий. Два физических типа ANSIChar и WideChar реализуют соответственно ANSI-стандарт и UNICODE-схему. Общий тип, именуемый Char, обычно соответствует типу AnsiChar. Каждый символ имеет свой собственный по­рядковый номер. Номер символа можно извлечь с помощью функции Ord(C), где С - какой-либо символ.

36

Значения переменным символьного типа присваивают, записывая тот или иной символ в апострофах (например, с := 'А' ;) или используя по­рядковый номер того или иного символа (например, с := #65;, где 65 -порядковый номер символа А в наборе символов; : = - знак присваивания).

Логические типы

Минимальной единицей измерения информации является бит, два зна­чения которого: 0,1 - можно использовать для записи информации о чем-либо, представляющем одно из двух: да (истина, true, 1) или нет (ложь, false, 0). Информация о чем-либо, что можно представить как истина или ложь, хранится в переменных логического или булевого типа. Для совместимости с языком C++ или другими языками программирования и различными опе­рационными системами имеются три физических булевых типа. Предпочти­тельней использовать общий Boolean (1 байт) тип. Другие типы именуются следующим образом: ByteBool (1 байт), WordBool (2 байта) и LongBool (4 байта).

Переменным булевого типа можно присваивать только значения true или false. Если память, соответствующая логической переменной типа Boo­lean, содержит 0, то ее значение равно false, если в памяти содержится I, то значение логической переменной равно true. В данном случае тип Boolean задает приведенную выше схему интерпретации содержимого памяти. Пе­ременные физических булевых типов интерпретируют содержимое памяти по-другому: если в памяти содержится 0, значение переменной равно false, при любом другом значении значение переменной равно true. Однако функ­ция Ord всегда возвращает значение 1, если переменная равна true, и 0, если значение переменной равно false. Таким образом, порядковый номер false равен 0, a true - 1.

С помощью булевых типов выполняются сравнения. Это их основное на­значение.

Тип перечень

Запишем пример объявления типа перечень (иногда этот тип непра­вильно называют перечисляемым или перечислимым): Type EnumType = (Valuel, Value2, Value3);.

Обычно данные типа перечень содержат дискретные значения, пред­ставляя их не числами, а именами (идентификаторами). Простейшим встро­енным типом перечень является тип Boolean, который можно определить следующим образом: Type Boolean = (false, true);.

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

37

вированных программистом для каких-то конкретных целей. Например, можно создать список цветов: туре MyColor = (Red, Green, Blue);.

В этом типе объявлены четыре идентификатора: MyColor обозначает со­ответствующий тип, Red, Green, Blue - значения этого типа. Учитывая, что тип перечень относится к порядковому типу, можно извлечь порядковый номер с помощью функции Ord для каждого значения (Ord(Red) = О, Ord(Green) = 1, Ord(Blue) = 2).

ИНТЕРВАЛЬНЫЙ ТИП

Интервальный тип (диапазон) позволяет объявить переменные, содер­жащие информацию из некоторого заданного поддиапазона для какого-то исходного базового типа. Базовый тип должен быть порядковым, кроме типа диапазон.

Синтаксис объявления интервального типа имеет следующий вид: Туре D = MinValue. .MaxValue;, где константы: MinValue и MaxValue опреде­ляют соответственно минимальное и максимальное значения среди всех возможных значений для данного типа. Например: Type Day = 1. .31;.

ВЕЩЕСТВЕННЫЙ ТИП

С помощью вещественных типов (табл. 5) вводятся переменные, со­держащие числа, которые состоят из целой и дробной частей.

Таблица 5

Тип

Пороговое значе­ние

Максимальное по модулю значение

Число значащих цифр

Размер в байтах

Single

Double Extended Comp

Currency

1,5*10-45

5.4*10-324

3.6*10-4951

1

0,0001

3,4*1038

1,7*10308

1,1*104932

263 -1

9,2*1014

7-8

15-16

19-20

19-20

19-20

4

8

10

8

8

Real

5.4*10-324

1,7*10308

15-16

8

Все вещественные типы различаются пороговым (минимальным поло­жительным или отрицательным) и максимальным по модулю значениями. Все типы могут представлять число 0. Если при выполнении вычислений образуется число, меньшее порогового, то в память запишется 0 - произош­ло исчезновение порядка.

Особенность вещественных типов заключается в том, что они представ­ляют некоторое подмножество математических вещественных чисел, кото­рое можно представить в формате с плавающей запятой и фиксированным числом цифр, т. е. точное представление чисел не всегда возможно. Удиви­тельно, но такое простое число, как 0.1, записывается с некоторой погреш­ностью, пусть очень небольшой. Из-за этого представление чисел с плаваю-

щей запятой оказывается неудобным, когда сохраняется и печатается фикси­рованное число десятичных разрядов, например при вычислениях с денеж­ными величинами. Дня частичного решения этой проблемы введен тип Comp, фактически представляющий собой целые числа, т.е. вещественные числа, дробная часть которых равна 0.

Некоторые операции с этим типом приведены в табл. 6.

Таблица 6

Операция

Результат

Abs(X)

Абсолютная величина X

АгсТаn(Х)

Арктангенс X

Cos(X)

Косинус X

Ехр(Х)

Экспоненциальная функция от X

Frac(X)

Дробная часть X

Int(X)

Целая часть от X (результат - вещественный)

Ln(X)

Натуральный логарифм от X

Pi

Число Пи (3,1416...)

Round(X)

Ближайшее к X целое (результат - целый)

Sin(X)

Синус X

Sqr(X)

Квадрат X, т. е. Х*Х

Sqrt(X)

Квадратный корень от X

Trunc(X)

Отсекает дробную часть X (результат-целый)

Тип Currency (денежный) введен для удобства работы с денежными суммами. Физически значения в соответствии с этим типом записываются как целые числа в память того же объема, что и в случае типа Сотр. Однако в этот тип встроено автоматическое представление чисел в виде рублей и копеек. Компилятор не забывает умножать их на 10000 перед записью в па­мять и делить их на 10000 при выполнении вычислений - таким образом, обеспечивается точность расчетов с четырьмя знаками после запятой.

ТИП ДАТА-ВРЕМЯ

Стандартный тип дата-время (TDateTime), определенный в модуле Sys­tem, совпадает с типом Double. Например, если определена константа типа дата-время 35065.75, то это число означает 1 января 1996 г., 18.00. Способ преобразования этого числа в дату-время встроен в тип. Целая часть числа типа TDateTime задает число дней, прошедшее с 30 декабря 1899 года, а Дробная часть - прошедшую долю текущих суток. Символьное представле­ние типа дата-время определяется установками Windows. Различные функ­ции преобразования находятся в модуле SysUtils.

ВЫРАЖЕНИЯ

Многие операторы содержат в своем составе конструкции, называемые выражениями. Выражение - это синтаксическая единица языка, опреде-

38

39

Var

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

КОНСТАНТЫ

Константами называют параметры, значения которых не могут изме­няться в процессе выполнения программы. В выражениях возможно двоякое использование констант:

  • непосредственное использование значения константы;

  • использование имени константы.

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

Для задания имени константы используется следующее объявление: const <имя> = <значекие>; - например, const a = 5; s = ' Pascal' ;. В описании const можно использовать константные выражения (например, const Ъ = Pi/4;). Все вычисления константных выражений выполняются на стадии компиляции. Код программы не увеличивается при использовании поименованных констант.

ТИПИЗИРОВАННЫЕ КОНСТАНТЫ

Данное название не совсем удачное, так как типизированная констан­та представляет собой фактически переменную. Название это появилось потому, что типизированная константа определяется ключевым словом Const, например Const Maximum: integer = 100;. Не будет ошибки, если вместо данной строки записать: Var Maximum: integer = 100;. Та­ким образом, типизированные константы используются для задания началь­ного значения переменных.

Использование типизированных констант зависит от директивы компи­лятора {$J}. Если она выключена {$J-}, типизированные константы стано­вятся просто константами, если она включена {SJ+} (установлено по умол­чанию) - типизированная константа представляет собой инициализирован­ную переменную.

ПЕРЕМЕННЫЕ

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

40

Var а: integer;

х,у: single;

operat:(plus, minus, mult, divide);.

В данном случае объявлены четыре переменных: а - целого типа, х, у -вещественного типа, operat - типа перечень.

ОПЕРАЦИИ

Можно выделить следующие операции:

  • арифметические;

  • логические;

  • операции над битами;

  • операции отношения;

  • операции со строками;

  • операции с множествами;

  • операции над объектами;

  • адресная операция @.

Арифметические операции для вещественных чисел определяются с помощью символов: +, -, *, /. Для целых чисел определены пять операций: +, -, *, div (деление нацело), mod (остаток от деления), например, a div в; {если А=7, ав = 3, то результат равен 2}, с mod 3; {если с = 10, то результат равен 1}.

Логические операции применяются к операндам логического типа, как, например, приведено в табл. 7 для унарной операции отрицания not.

Таблица 7

Значение операнда X

Результат операции not X

True

False

False

True

Результат вычисления логической операции получается также логиче­ского типа. Определяются эти операции специальными таблицами. Рассмот­рим три бинарные логические операции: and - логическое И (конъюнкция); or - логическое ИЛИ (дизъюнкция); хог - ИСКЛЮЧАЮЩЕЕ ИЛИ (табл. 8).

Таблица 8

Значения операндов Результаты операций

X

Y

XandY

XorY

XiorY

True

True

True

True

False

False

True

False

True

True

True

False

False

True

True

False

False

False

False

False

Существуют 2 варианта вычисления логических выражений, задаваемые Директивой {$В}: полное {$В+} и укороченное {$В-}. Полное вычисление означает, что выполняются все запрограммированные действия, даже если

41

на промежуточном этапе становится известным значение всего выражения. При укороченном вычислении все расчеты прекращаются, как только стано­вится известным значение заданного выражения. Например, если в выраже­нии (A and в) or (х xor Y) значение (A and в) равно true (когда опе­рация or дает true, см. табл. 8), то при укороченной форме вычисления пре­кращаются без расчета второй части (х xor Y) исходного выражения, так как полученное значение true уже не изменится.

Операции над битами выполняются над целыми числами. Существуют следующие битовые операции:

  • not X - инверсия всех битов числа X;

  • X and Y - побитовое логическое умножение чисел X и V;

  • X or Y - побитовое логическое ИЛИ над X и Y;

  • X xor Y - побитовое исключающее ИЛИ над X и Y;

  • X shr J - сдвиг содержимого числа X на J бит вправо;

  • X shlJ - сдвиг числа X на J бит влево.

Операции сдвига часто используются для умножения и деления целых чисел на 2, 22, 23 и т. д. Например, пусть X = 3 (в двоичной формг 0011). Вы­полним X shl 1 -ООП сдвигаем влево на 1 разряд, получим 0110. Двоичное число 0110 равно 6 в десятичной системе, т. е. выполнено умножение на 2.

Операции отношения предназначены для сравнения двух величин. Ве­личины должны быть сравнимых типов. Результат сравнения имеет логиче­ский тип. Существуют шесть операций:

= - равно, < - меньше, <= - меньше или равно,

<> - не равно, > - больше, >= - больше или равно.

Адресная операция @ позволяет определить адрес расположения пере­менной, типизированной константы, подпрограммы и некоторых других программных элементов в памяти. Остальные операции будут рассмотрены далее.

ФУНКЦИИ

Функция представляет собой специальную подпрограмму, предназна­ченную для вычисления какого-либо параметра, исходя из значений ее аргу­ментов. Имеется большое количество встроенных стандартных функций. Возможно создание собственных функций, которые используются наряду со стандартными. Любая функция задается своим именем с указанием после него в круглых скобках перечня аргументов, например sin(X).

ПОРЯДОК ВЫЧИСЛЕНИЯ ВЫРАЖЕНИЙ

Выражения вычисляются в определенном порядке в соответствии с при­оритетами (табл. 9) выполняемых операций.

42

Таблица 9

Приоритет

Операции

1

( ) - круглые скобки

2

Вычисление функций

3

@, not, унарные +, -

4

•, /, div, mod, and, shl, shr, as

5

+, -, or, xor

6

=, <>, >, < <=, >= is, in

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

ВИДЫ ОПЕРАТОРОВ

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

Простыми называют операторы, которые не содержат внутри себя дру­гих операторов.

Структурированными являются такие операторы, которые состоят из других операторов. К ним относятся:

  • составной оператор;

  • операторы условного перехода;

  • операторы цикла;

  • оператор над записями;

  • операторы обработки исключительных ситуаций.

Иногда объявления программных элементов называют операторами объявления, которые, в отличие от "настоящих" операторов, являются неис­полнимыми.

ПРОСТЫЕ ОПЕРАТОРЫ

Таких операторов четыре: оператор присваивания, обращение к проце­дуре, оператор безусловного перехода и пустой оператор.

Оператор присваивания является средством изменения содержимого памяти. Синтаксически с помощью этого оператора переменной присваива­ется значение какого-либо выражения. Записывается этот оператор следую­щим образом: Y := <выражение>;, где Y - переменная, := - знак присваи­вания. Например, Х:= 5; Y:= sin (X) ; С : = 'А';.

43

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

Обращение к процедуре позволяет выполнить вычисления, задаваемые подпрограммой вида "процедура". Как и функция, процедура имеет имя и может иметь список аргументов. При вызове вычислений из процедуры за­писывается имя нужной процедуры, а затем справа от имени в круглых скобках записывается список параметров-аргументов. Например, ProcName{x, У) ;. Существует большое количество встроенных стандарт­ных процедур, например Dec(X) и Inc(Х) (см. табл. 1). Программист может составлять собственные процедуры.

Оператор безусловного перехода записывается в следуюшем виде: goto <метка>;. Этот оператор позволяет изменить последовательный порядок выполнения операторов и перейти к выполнению программы, начиная с за­данного оператора. Оператор, на который происходит переход, должен быть помечен меткой. Метки бывают двух видов: или какое-либо число 1...9999 или обычный идентификатор: А, В25, Point. Все метки должны быть описа­ны в объявлении Label: 56, А, В25, Point;. Одной меткой можно по­метить только один оператор: Point: y := 2*х,-. Использование операто­ра GOTO считается плохим стилем программирования.

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