Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

DiVM / OOP / 12_116608_1_51491

.pdf
Скачиваний:
26
Добавлен:
11.05.2015
Размер:
6.45 Mб
Скачать

системам кодировки символов. Данные типа AnsiChar занимают один байт памяти и кодируют один из 256 возможных символов расширенной кодовой таблицы ANSI, в то время как данные типа WideChar занимают два байта памяти и кодируют один из 65536 символов кодовой таблицы Unicode. Кодовая таблица Unicode — это стандарт двухбайтовой кодировки символов. Первые 256 символов таблицы Unicode соответствуют таблице ANSI, поэтому тип данных AnsiChar можно рассматривать как подмножество WideChar.

Тип данных

Диапазон значений

Объем памяти

 

 

(байт)

 

 

 

Фундаментальные типы данных

 

AnsiChar

Extended ANSI character set

1

WideChar

Unicode character set

2

Обобщенный тип данных

 

Char

Same as AnsiChar's range

1*

Таблица 2.3. Символьные типы данных

* Примечание: Тип данных Char является обобщенным и соответствует типу AnsiChar. Однако следует помнить, что в будущем тип данных Char может стать эквивалентным типу данных WideChar, поэтому не следует полагаться на то, что символ занимает в памяти один байт.

Пример описания переменной символьного типа:

var

Symbol: Char;

В программе значения переменных и констант символьных типов заключаются в апострофы (не путать с кавычками!), например:

Symbol := 'A'; // Переменной Symbol присваивается буква A

2.3.4. Булевские типы данных

Булевские типы данных названы так в честь Георга Буля (George Boole), одного из авторов формальной логики. Диапазон значений данных булевских типов представлен двумя предопределенными константами: True — истина и False — ложь (таблица 2.4).

Тип данных

Диапазон значений

Объем памяти

 

 

 

(байт)

 

 

 

 

Boolean

False (0),

True (1)

1

ByteBool

False (0),

True (не равно 0)

1

WordBool

False (0),

True (не равно 0)

2

LongBool

False (0),

True (не равно 0)

4

Таблица 2.4. Булевские типы данных

Пример описания булевских данных:

41

var

Flag: Boolean; WordFlag: WordBool; LongFlag: LongBool;

Булевские типы данных широко применяются в логических выражениях и в выражениях отношения. Переменные типа Boolean используются для хранения результатов логических выражений и могут принимать только два значения: False и True (стандартные идентификаторы). Булевские типы данных ByteBool, WordBool и LongBool введены в язык Delphi специально для совместимости с другими языками, в частности с языками C и C++. Все булевские типы данных совместимы друг с другом и могут одновременно использоваться в одном выражении.

2.3.5. Определение новых типов данных

Кроме стандартных типов данных язык Delphi поддерживает типы, определенные программистом. Новый тип данных определяется с помощью зарезервированного слова type, за которым следует идентификатор типа, знак равенства и описание. Описание завершается точкой с запятой. Например, можно определить тип, тождественный существующему типу:

type

= WideChar;

//

TUnicode тождественен типу WideChar

TUnicode

TFloat =

Double;

//

TFloat тождественен типу Double

Нетрудно заметить, что идентификаторы новых типов в примере начинаются заглавной буквой T (первая буква слова type). Такое соглашение о типах программиста принято разработчиками среды Delphi, но оно не является строгим. Тем не менее, мы рекомендуем его придерживаться, так как оно способствует более легкому восприятию исходного текста программы.

Синтаксическая конструкция type позволяет создавать новые порядковые типы:

перечисляемые типы и интервальные типы.

2.3.6. Перечисляемые типы данных

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

type

TDirection = (North, South, East, West);

На базе типа TDirection можно объявить переменную Direction и присвоить ей значение:

var

Direction: TDirection; begin

Direction := North; end.

На самом деле за идентификаторами значений перечисляемого типа стоят целочисленные константы. По умолчанию, первая константа равна 0, вторая — 1 и т.д. Существует возможность явно назначить значения идентификаторам:

type

TSizeUnit = (Byte = 1, Kilobyte = 1024 * Byte, Megabyte = Kilobyte * 1024, Gigabyte = Megabyte * 1024);

2.3.7. Интервальные типы данных

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

42

type

TDigit = 0..9; var

Digit: TDigit; begin

Digit := 5;

Digit := 10; // Ошибка! Выход за границы диапазона end.

В операциях с переменными интервального типа данных компилятор генерирует код проверки на принадлежность диапазону, поэтому последний оператор вызовет ошибку. Это очень удобно при отладке, но иногда отрицательно сказывается на скорости работы программы. Для отключения контроля диапазона откройте окно Project Options, выберите страницу Compiler и снимите пометку пункта Range Checking.

Данные перечисляемых и интервальных типов занимают в памяти 1, 2 или 4 байта в зависимости от диапазона значений типа. Например, если диапазон значений не превышает 256, то элемент данных занимает один байт памяти.

2.3.8. Временной тип данных

Для представления значений даты и времени в среде Delphi существует тип TDateTime. Он объявлен тождественным типу Double. Целая часть элемента данных типа TDateTime соответствует количеству дней, прошедших с полночи 30 декабря 1899 года. Дробная часть элемента данных типа TDateTime соответствует времени дня. Следующие примеры поясняют сказанное:

Значение

Дата

Время

0

30.12.1899

00:00:00

0.5

30.12.1899

12:00:00

1.5

31.12.1899

12:00:00

–1.25

29.12.1899

06:00:00

35431.0

1.1.1997

00:00:00

2.3.9. Типы данных со словом type

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

type

TFileName = string;

В приведенном выше примере тип данных TFileName является псевдонимом для стандартного типа данных string.

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

type

TFileName = type string;

Различие между таким способом создания типа и обычным (без слова type) проявится при изучении массивов, записей и классов. Чтобы подготовленный читатель уже сейчас понял, в

43

чем оно состоит, забежим вперед и приведем поясняющий пример (новичкам советуем пропустить пример и вернуться к нему позже после изучения массивов):

type

TType1 = array [1..10] of Integer; TType2 = type TType1;

var

A:TType1;

B:TType2;

begin

B := A; // Ошибка! end.

Впримере переменные A и B оказываются несовместимы друг с другом из-за слова type в описании типа TType2. Если же переменные A и B принадлежат простым типам данных, то оператор присваивания будет работать:

type

TType1 = Integer; TType2 = type TType1;

var

A:TType1;

B:TType2;

begin

B := A; // Работает end.

2.4.Операции

2.4.1. Выражения

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

(X + Y) / 2;

X, Y, 2 — операнды; '+', '/' — знаки операций; скобки говорят о том, что сначала выполняется операция сложения, потом — деления.

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

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

2.4.2. Арифметические операции

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

Операци

Действие

Тип операндов

Тип результата

я

 

 

 

 

 

 

 

+

Сложение

Целый,

Целый,

 

 

вещественный

вещественный

Вычитание

Целый,

Целый,

44

 

 

вещественный

вещественный

*

Умножение

Целый,

Целый,

 

 

вещественный

вещественный

/

Деление

Целый,

Вещественный

 

 

вещественный

 

Div

Целочисленное

Целый

Целый

 

деление

 

 

Mod

Остаток от деления

Целый

Целый

Таблица 2.5. Арифметические операции

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

Выражение

Результат

6.8 – 2

4.8

7.3 * 17

124.1

–(5 + 9)

–14

–13.5 / 5

–2.7

–10 div 4

–2

27 div 5

5

5 div 10

0

5 mod 2

1

11 mod 4

3

–20 mod 7

–6

2.4.3. Операции отношения

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

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

Операци

Действие

Выражение

Результат

я

 

 

 

 

 

 

 

=

Равно

A = B

True, если A = B

45

<>

Не равно

A <> B

True, если A < B или A

 

 

 

> B

<

Меньше

A < B

True, если A < B

>

Больше

A > B

True, если A > B

<=

Меньше

или A <= B

True, если A < B или A

 

равно

 

= B

>=

Больше

или A >= B

True, если A > B или A

 

равно

 

= B

Таблица 2.6. Операции отношения

Типичные примеры операций отношения:

Выражение

Результат

123 = 132

False

123

<> 132

True

17

<= 19

True

17 > 19

False

7

>= 7

True

2.4.4. Булевские операции

Результатом выполнения логических (булевских) операций является логическое значение True или False (таблица 2.7). Операндами в логическом выражении служат данные типа

Boolean.

Операци

Действие

Выражение

 

A

 

B

 

Результат

я

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Not

Логическое

not A

 

True

 

 

 

False

 

отрицание

 

 

False

 

 

 

True

 

 

 

 

 

 

 

and

Логическое И

A and B

 

True

 

True

 

True

 

 

 

 

True

 

False

 

False

 

 

 

 

False

 

True

 

False

 

 

 

 

False

 

False

 

False

or

Логическое

A or B

True

 

True

 

True

 

ИЛИ

 

 

True

 

False

 

True

 

 

 

 

 

 

 

 

 

 

False

 

True

 

True

 

 

 

 

False

 

False

 

False

46

xor

Исключающее A xor B

True

True

False

 

ИЛИ

True

False

True

 

 

 

 

False

True

True

 

 

False

False

False

Таблица 2.7. Логические операции

Результаты выполнения типичных логических операций:

Выражение

Результат

not (17 > 19)

True

(7 <= 8) or (3 < 2)

True

(7 <= 8) and (3 < 2)

False

(7 <= 8) xor (3 < 2)

True

2.4.5. Операции с битами

Если операнды в булевской операции имеют целочисленный тип, то операция выполняется над битами операндов и называется побитовой. К побитовым операциям также относятся операции сдвига битов влево (shl) и вправо (shr).

Операци

Действие

 

Тип операндов

Тип результата

я

 

 

 

 

 

 

 

 

 

not

Побитовое отрицание

Целый

Целый

and

Побитовое И

 

Целый

Целый

or

Побитовое ИЛИ

Целый

Целый

xor

Побитовое

исключающее

Целый

Целый

 

ИЛИ

 

 

 

shl

Сдвиг влево

 

Целый

Целый

shr

Сдвиг вправо

 

Целый

Целый

Таблица 2.8. Побитовые операции

Примеры побитовых операций:

Выражение

Результат

not $FF00

$00FF

$FF00 or $0FF0

$FFF0

$FF00 and $0FF0

$0F00

$FF00 xor $0FF0

$F0F0

47

$FF00 shl 4

$F000

$FF00 shr 4

$0FF0

2.4.6. Очередность выполнения операций

При выполнении выражений одни операции выполняются раньше других. Например, в выражении

20 + 40 / 2

сначала произойдет деление (ибо скобок, меняющих естественный порядок выполнения операций, нет) и только потом — сложение. Выполнение каждой операции происходит с учетом ее приоритета. Не зная приоритета каждой операции, крайне трудно правильно записать даже самое простое выражение. Значения приоритетов для рассмотренных выше операций представлены в таблице 2.9.

Операция

Приоритет

Описание

 

 

 

–, not

Первый

Унарный минус, отрицаиие

*, /, div, mod, and

Второй

Операции типа умножение

+, –, or, xor

Третий

Операции типа сложение

=, <>, <,>, <=, >=

Четвертый

Операции отношения

Таблица 2.9. Приоритет операций

Чем выше приоритет (первый — высший), тем раньше операция будет выполнена.

2.5. Консольный ввод-вывод

2.5.1. Консольное приложение

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

Сейчас мы рассмотрим лишь средства консольного ввод-вывода данных. Консоль — это клавиатура плюс монитор. С клавиатуры данные вводятся в программу, а на монитор выводятся результаты ее работы. Консольная модель ввода-вывода, при которой данные представляются потоком символов, не позволяет использовать графических средств. Однако она очень подходит для изучения языка Delphi, так как не загромождает примеры программ излишней информацией о среде и библиотеках программирования.

Итак, давайте последовательно создадим консольное приложение:

4. Запустите среду Delphi, выберите в главном меню команду File | Close All, а затем — Formatted: Bullets and Numbering

команду File | New.

5. Выберите “Console Application” и нажмите “OK” (рисунок 2.1).

48

Рисунок 2.1. Окно среды Delphi для создания нового проекта

6. В появившемся окне между ключевыми словами BEGIN и END введите следующие Formatted: Bullets and Numbering строчки (рисунок 2.2):

Writeln('Press Enter to exit...');

ReadLn;

Рисунок 2.2. Текст простейшей консольной программы в окне редактора кода

7. Скомпилируйте и выполните эту программу, щелкнув на пункте Run | Run главного Formatted: Bullets and Numbering меню среды Delphi. На экране появится черное окно (рисунок 2.3), в левом верхнем

углу которого будет содержаться текст "Press ENTER to exit..." ("Нажмите клавишу

Enter ...").

49

Рисунок 2.3. Окно работающей консольной программы

8. Нажмите в этом окне клавишу Enter — консольное приложение завершится.

Теперь, когда есть основа для проверки изучаемого материала, рассмотрим операторы консольного ввода-вывода. К ним относятся Write, Writeln, Read, Readln.

2.5.2. Консольный вывод

Инструкции Write и Writeln служат для вывода чисел, символов, строк и булевских значений на экран. Они имеют следующий формат:

Formatted: Bullets and Numbering

Write(Y1, Y2, ... ,Yn);

Writeln(Y1, Y2, ... ,Yn);

где Y1, Y2,..., Yn — константы, переменные и результаты выражений. Инструкция Writeln аналогична Write, но после своего выполнения переводит курсор в начало следующей строки.

Если инструкции Write и Writeln записаны без параметров:

Write;

Writeln;

то это вызывает пропуск на экране соответственно одной позиции и одной строки.

2.5.3. Консольный ввод

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

Read(X1, X2, ... ,Xn);

Readln(X1, X2, ... ,Xn);

где X1, X2, ..., Xn — переменные, для которых осуществляется ввод значений. Пример:

Read(A);

//

Вводится

значение

переменной

A

Readln(B); //

Вводится

значение

переменной

B

Если одна инструкция вводит несколько значений:

Read(A, B);

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

Если вводится одно значение:

50