Вы находитесь на странице: 1из 19

Лабораторная работа № 2

Простые типы данных. Преобразование типов. Операторы.

Введение
Любые данные, т. е. константы, переменные и выражения, в Object Pascal характеризуются
своими типами.
Тип определяет множество допустимых значений, которые может иметь тот или иной объект,
а также множество допустимых операций применимых к нему. Кроме того, тип определяет
формат внутреннего представления данных в памяти компьютера.
Язык Object Pascal поддерживают строгую типизацию данных. Всем переменным и
константам в программе обязательно сопоставлены типы и компилятор строго отслеживает
чтобы операции совершаемые над переменными соответствовали их типу. Например, для
следующего выражения компилятор сгенерирует ошибку.
var x, y, z:integer;
...
x:=y/z;
Тип результата после вычисления выражения будет вещественным, а переменная в которую
должен быть записан результат, имеет целочисленный тип, поэтому компилятор сгенерирует
ошибку.

Описание типов
Все типы делятся на две группы: встроенные и пользовательские. К встроенным типам
относятся такие простые типы как Integer, Real и др. Пользовательские типы строятся на
основе встроенных. К пользовательским типам данных относятся: тип диапазон,
перечисляемый тип. К пользовательским типам данных также относятся все структурные
типы: множество, массив, запись, файл (будут рассмотрены в последующих лабораторных
работах).
Как уже было сказано выше, тип указывается при описании переменных, например
var x: real;
При создании пользовательского типа можно либо полностью привести его после двоеточия,
либо объявить его отдельно, в секции type, например
type MyReal = real;
var x:MyReal;
В данном примере объявлен псевдоним типа real – MyReal, который эквивалентен типу real.

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


Все поддерживаемые типы данных можно разделить на две большие группы:
• простые типы данных;
• структурные типы данных.
Также, иногда, выделяют некоторые другие типы.
Простые типы

Порядковые Вещественные Дата-время

Целые

Логические

Символьный

Перечисляемый

Тип-диапазон
Рисунок 1 – Простые типы данных
Порядковые типы
Порядковые типы отличаются тем, что каждый из них имеет конечное число возможных
значений. Эти значения можно определенным образом упорядочить и, следовательно,
сопоставить некоторое целое число – порядковый номер значения.
Функции, предназначенные для работы с порядковыми типами, приведены в таблице 1.

Таблица 1 – Функции для работы с порядковыми типами.


Наименование Описание
Pred(X) возвращает предыдущее значение порядкового типа;
Succ(X) возвращает следующее значение порядкового типа;
High(X) возвращает максимальное значение порядкового типа;
Low(X) возвращает минимальное значение порядкового типа.

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

Таблица 2 – Целочисленные типы


Наименование Длина, байт Диапазон значений
Byte 1 0…255
ShortInt 1 -128…+127
SmallInt 2 -32768…+32767
Word 2 0…65535
Integer 4 -2147483648 … +2147483647
Cardinal 4 0 … 2147483647
LongWord 4 0 … 4294967295
Int64 8 -263 … 263-1

Обратите внимание на то, что Object Pascal осуществляет автоматическое приведение


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

Таблица 3 – Функции для работы с целыми числами


Функция Описание
dec(x[, i]) Уменьшает значение X на i, а при отсутствии i на 1.
inc(x[, i]) Увеличивает значение X на i, а при отсутствии i на 1.
odd(x) Возвращает True, если аргумент – нечетное число.
При действиях с целыми числами тип результата будет соответствовать типу операндов, а
если операнды относятся к различным целым типам, – общему типу, который включает в
себя оба операнда. Например, для типов ShortInt и Word общим типом будет Integer.
По умолчанию компилятор не генерирует код проверки, осуществляющий контроль за
возможным выходом значения из допустимого диапазона, что может привести к
неправильной работе программы. Например, при выполнении программы из листинга 1 на
экране появится ноль, а не 65536.
Листинг 1
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
program InOutPrg;
var x: Word;
begin
k:=65535;
k:=k+1;
writeln(k);
readln;
end.
Для того чтобы включить контроль переполнения, необходимо указать директиву
компилятора {$Q+} для отключения контроля – {$Q-}.

Вместо {$Q+} можно использовать {$OVERFLOWCHECKS ON}, а вместо {$Q-}


{$OVERFLOWCHECKS OFF}
Измените программу, приведенную в листинге 1, поместив в нее директиву {$Q+} первой
строкой. Запустите ее на выполнение, программа должна аварийно завершиться.

Для целочисленных переменных безопаснее всего применять тип Integer, т. к. диапазон


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

Логические типы
Переменная логического типа может принимать только два значения True (истина) и False
(ложь). Логические типы приведены в таблице 4.

Таблица 4 – Логические типы


Тип Размер
Boolean 1
ByteBool 1
Bool 2
WordBool 2
LongBool 4

Для работы с логическими типами используйте тип Boolean, остальные типы были
добавлены в Object Pascal для совместимости с программами написанными на других
языках программирования.

Символьный тип
Символьный тип, как следует из его названия, предназначен для хранения кода символа.
Внутренняя структура типа совпадает с внутренней структурой беззнаковых целых чисел.
Object Pascal поддерживает два символьных типа AnsiChar и WideChar. Характеристики
этих типов приведены в таблице 5.

Таблица 5 – Символьные типы


Тип Размер, Описание
байт
AnsiChar 1 Код символа в кодировке ANSI. Таблица символов этого стандарта
состоит из 256 символов, причем первые 128 символов жестко
определены стандартом, а остальные 128 могут содержать любые
символы. Во вторую часть кодовой таблицы обычно помещают
символы национальных алфавитов. Недостатком данного
представления символов является то, что невозможно отображение
сразу символов более
чем 2-х алфавитов.
WideChar 2 Символ в формате UNICODE. Таблица символов содержит 65536
символов. В данной таблице находятся символы всех алфавитов.
Char1 1 Является псевдонимом типа AnsiChar
Для преобразования кода символа в символ следует применять следующую функцию
function chr(X:byte):char
Для обратного преобразования используется функция

1 В Object Pascal тип Char является основным. В следующих версиях тип Char может стать псевдонимом для
типа WideChar.
function ord(X:char):byte;
Константу символьного типа можно задать двумя способами. Задать символ в одинарных
кавычках или указать код символа. Следующие две записи эквивалентны.
ch:='A';
ch:=#97; //97 – код символа "A".
Например
var ch:char;
code: byte;
begin
ch:='A';
code:=ord(ch);
ch:=chr(32); //32 — соответствует коду клавиши пробел
end.

Перечисляемый тип
Перечисляемый тип задается перечислением тех значений, которые он может получать.
Каждое значение именуется некоторым идентификатором и располагается в списке,
обрамлённом круглыми скобками.
<имя типа> = (id, id, id,...);
Здесь «имя типа» – идентификатор Object Pascal,
«id» – идентификатор Object Pascal.
Например, тип описывающий некоторый фиксированный набор цветов
type TColors = (red, green, white, yellow);
Применение перечисляемых типов делает программы более наглядными и повышает
надежность программ. Пусть определены следующие типы:
type TColors = (red, green, white, yellow);
TDays=(monday, tuesday, wednesday);
Определены переменные
var col:TColors;
day:TDays;
то допустимы следующие операторы
col:=white;
col:=Succ(green);
day:=Pred(tuesday);
но не допустимы
col:=monday;
day:=col;
Максимальное количество перечисляемых значений зависит от реализации. В настоящее
время размер переменной перечисляемого типа равен 4 байта, что соответствует 2 32
различных значений, т. е. во внутреннем представлении перечисляемый тип представляет
собой тип LongWord.
Как говорилось выше, можно поместить определение типа сразу, после двоеточия, например
var col: (red, green, white, yellow);
day: (monday, tuesday, wednesday);

Тип-диапазон
Тип диапазон представляет собой подмножество некоторого базового порядкового типа. Тип-
диапазон задается границами своих значений.
<мин. зн.> .. <макс. зн.>
Например
type TDigits = '0'..'9';
TMonth = 1..12;
TMyColors = green .. yellow;
При задании типа-диапазона следует иметь ввиду, что символы '..' нельзя разделять
пробелами и что левая граница диапазона не должна превышать правую границу.

Вещественные типы
Вещественные типы предназначены для работы с вещественными числами в формате с
плавающей и фиксированной точкой.
Для представления вещественных чисел используются следующие типы приведенные в
таблице 6.

Таблица 6 – Вещественные типы Object Pascal


Наименование Длина, Точность Диапазон значений
байт (число значащих чисел)
real2 6 11…12 2,9·10-39 … 1,7·1038
single 4 7…8 1,5·10-45 … 3,4·1038
double 8 15…16 5,0·10-324 … 1,7·10308
extended 10 19…20 3,4·10-4951 … 1,1·104932
comp 8 19…20 -263 … 263-1
currency 8 19…20 ±922337203685478

Не рекомендуется использовать устаревший тип real48 в новых программах, т. к. он


разработан для программной эмуляции вещественных чисел. В Object Pascal
переменные такого типа сначала конвертируются в тип extended, затем выполняются
необходимые операции с вещественными числами, после чего происходит обратная
конвертация. Это приводит к существенному падению производительности. Для
большинства программ наиболее оптимально применение типа double (real).

Тип дата-время
Тип дата-время предназначен для хранения даты и времени. Тип дата-время определяется
идентификатором TDateTime и предназначен для одновременного хранения даты и времени.
Во внутреннем представлении переменная этого типа соответствует типу Double. Для работы
с данным типом используются функции приведенные в таблице 73.

Таблица 7 – Подпрограммы для работы с типом TDateTime


Подпрограмма Назначение
function Date:TDateTime; Возвращает текущую дату

2 Начиная с версии Delphi 5.0 тип real соответствует типу double. Для совместимости со старыми
программами введен тип real48 соответствующий типу real из таблицы 6. При использовании директивы
компилятора {$REALCOMPATIBILITY ON} компилятор под типом real будет подразумевать именно тип
real48. По умолчанию {$REALCOMPATIBILITY OFF}
3 Для использования функций из таблицы 7 необходимо подключить модуль SysUtils. (uses SysUtils;)
Подпрограмма Назначение
function DateToStr( Преобразует дату в строку символов
D: TDateTime):string
function DateTimeToStr( Преобразует дату и время в строку символов
D: TDateTime):string;
function Time: TDateTime; Возвращает текущее время
function TimeToStr ( Преобразует время в строку
T: TDateTime):string;
Для использования подпрограмм из таблицы 7 необходимо подключить модуль SysUtils, как
показано ниже.
program Test;
uses SysUtils;

Строковые типы
В Object Pascal определено несколько типов строк, таблица 8.

Таблица 8 – Типы строк поддерживаемые в Object Pascal.


Тип Описание
ShortString Короткая строка. Максимальная длина строки 255 символов. Формат
символов AnsiChar. Максимальная длина строки может быть задана,
например:
s: string[20]; //строка длиной 20 символов
AnsiString Длинная строка. Максимальная длина строки 231 символов.
PChar Строки с завершающим нулем. (используются API Windows).
Максимальная длина строки не ограничена4. Формат символов AnsiChar.
WideString Широкие строки. Максимальная длина строки 216 символов. Формат
символа WideChar.
String По умолчанию является псевдонимом типа AnsiString, если не указана
длина строки.
Строковые константы задаются в одинарных кавычках, например
var s:string;
begin
s:=’Hello World!’;
end.
Для сцепления двух строк в одну необходимо применять оператор "+", например
var s, s1:string;
begin
s:=’Hello’;
s1:=’ World!’;
s:=s + s1;
writeln(s);
end.
В результате выполнения выше приведенной программы на экран будет выведено
Hello World!
Некоторые подпрограммы для работы со строками приведены в таблице 9.

4 Длина строки ограничивается лишь доступной памятью, для 32 разрядных ОС это 4 Гб (в Windows 2 Гб).
Таблица 95 – Подпрограммы для работы со строками
Подпрограмма Описание
function Copy (Source: string; Копирует из строки Source Count символов,
Index, Count: Integer):string; начиная с символа с номером Index.
procedure Delete ( Удаляет Count символов из строки Source,
var Source: string; начиная с символа с номером индекс.
Index, Count: Integer);
procedure Insert (SubSt: string; Вставляет подстроку SubSt в строку St,
var St: string; начиная с символа с номером Index.
Indext: Integer);
function Length Возвращает текущую длину строки.
(S:string):integer;
function Pos ( Отыскивает в строке St первое вхождение
SubSt, St:string):integer; подстроки SubSt и возвращает номер
позиции с которой она начинается. Если
подстрока не найдена возвращается ноль.

Преобразование типов
При написании программ часто бывает необходимым преобразовать тип переменной.
Близкие типы можно преобразовывать с помощью следующей конструкции.
<идентификатор типа>(<переменная>)
Например преобразование типа переменной Integer к типу Word выглядит следующим
образом
var i: Integer;
j: Word;
...
j:=Word(i);
В таблице 10 приведены стандартные функции преобразования типов.

Таблица 10 – Стандартные функции преобразования типов


Подпрограмма Описание
function Trunc(X:real):Integer; Отсекает дробную часть числа
function Round(X:real):Integer; Округляет вещественное число до целого по
правилам арифметики
function Val(St:string; Преобразует строку символов St в
var X; Code:Integer); вещественную или целую переменную (в
зависимости от типа переменной X).
Параметр Code содержит индекс символа
который вызвал ошибку при преобразовании
или 0 если ошибки не произошло.

5 Функции приведенные в этой таблице применимы к типам AnsiString и ShortString.


Подпрограмма Описание
procedure Str( Преобразует число X любого вещественного
X [:Width:[:Decimals]]; или целого типа в строку символов St.
var St:string); Параметры Width и Decimals, если они
присутствуют, задают общую ширину поля,
выделенную под символьное представление
числа, и количество символов в дробной
части соотвественно.
В таблице 11 представлены некоторые подпрограммы для преобразования типов из модуля
SysUtils, который можно подключить как показано выше.

Таблица 11 – Подпрограммы преобразования типов модуля SysUtils.


Подпрограмма Описание
function StrToInt( Преобразование из строки в целое число
s:string):Integer;
function StrToFloat( Преобразование из строки в вещественное
s:string):Extended; число
function IntToStr( Преобразование из целого числа в строку
Value:Integer):string;
function FloatToStr( Преобразование из вещественного числа в
Value:Extended):string; строку
function FloatToStrF( Преобразование из вещественного числа в
Value:Extended; строку. Параметр Format определяет
Format:TFloatFormat; текстовое представление числа в строке.
Precision, Digits):string;
Рассмотрим функцию FloatToStrF подробнее.
function FloatToStrF( Value:Extended;Format:TFloatFormat;
TOL, Digits):string;
Здесь Value – число, которое нужно преобразовать;
Format – определяет формат, в котором будет выведено число, см. таблицу ;
Precision – точность (до какого знака будет выполнено округление);
Digits – число выводимых цифр после десятичного разделителя либо в степени
экспоненты.

Таблица 12 – Значения типа TFloatFormat


Значение Описание
ffGeneral Универсальный формат, в который стремится сохранить результирующее
значение как можно компактнее, удаляются конечные нули и десятичный
разделитель, где это возможно, разделители тысяч не показываются.
Экспоненциальный формат используется, если мантисса является
слишком большой для указанного значения Precision, при этом значение
Digits (0.. 4) определяет минимальное число показываемых цифр
экспоненты. Символ, разделитель целой и дробной части хранится в
переменной DecimalSeparator.
Значение Описание
ffExponent Инженерный формат, экспонента обозначается символом E следующей
за числом. Запись E+15 означает 1015. Экспонента всегда имеет знак +
или -. Этой экспоненте предшествует число, которое всегда имеет одну
цифру перед десятичной точкой.
Используемый функцией параметр Precision дает число отображаемых
цифр перед E, а параметр Digits дает число цифр (0..4) после E.
ffFixed Отображает Precision цифр перед десятичной точкой, и Digits цифр
после. Если слишком много цифр перед десятичной точкой, то вместо
этого используется экспоненциальный формат.
ffCurrency То же самое, что и ffNumber, но с добавлением символа (строки)
денежной единицы, который определен переменной CurrencyString.
ffNumber То же самое, что и ffFixed, за исключением того, что используется
разделитель тысяч. Они определены переменной ThousandSeparator.
Например при выполнении следующего кода
writeln(FloatToStrF(1/3, ffFixed, 4, 5));
writeln(FloatToStrF(1/3, ffFixed, 3, 5));
writeln(FloatToStrF(1/3, ffExponent, 3, 2));
writeln(FloatToStrF(1/3, ffExponent, 3, 4));
writeln(FloatToStrF(1/3, ffExponent, 5, 4));
будет выведено
0,33330
0,33300
3,33E-01
3,33E-0001
3,3333E-0001
Символ разделителя дробной и вещественной части хранится в глобальной переменной
DecimalSeparator модуля SysUtils. По умолчанию её значение берется из системной
локали (для русской локали это запятая), если необходимо заменить этот символ на другой,
например точку, то это нужно сделать самостоятельно.

Приведение типов
Приведение типов – это способность компилятора рассматривать переменную одного типа
как переменную другого типа. В отличие от функций преобразования типов, таких как,
Round, Trunc и т. п при приведении типа не происходит изменения данных, т. е. нет потери
производительности. Приведение типа записывается следующим образом
имя типа(имя переменной)
Например,
var b:Boolean;
begin
b:=True;
writeln(b);
writeln(integer(b));
writeln(Single(integer(b)));
end.
Будет выведено
TRUE
1
1.401298464E-45
Приведение типа используется когда необходимо работать со внутренним
представлением переменной. Это опасная операция и её, по возможности, нужно
избегать. При приведении типа, размер типа должен быть не больше чем
действительный тип переменной.

Операторы
Все операторы условно можно разделить на три группы:
• арифметические операторы,
• логические операторы,
• специальные операторы.

Арифметические операторы
Арифметические операторы применяются при построении арифметических выражений. К
арифметическим операторам относятся +, -, *, /, () и некоторые другие, см. таблицу 13.
Результатом вычисления арифметических операторов является целочисленный или
вещественный тип.

Таблица 13 – Арифметические операторы


Оператор Операция Типы операндов Тип результата
+ Сложение Integer,Real Integer,Real
- Вычитание Integer, Real Integer, Real
* Умножение Integer, Real Integer, Real
/ Деление Integer, Real Real, Real
div Деление нацело Integer Integer
mod Остаток от деления Integer Integer
and Арифметическое «И» Integer Integer
or Арифметическое «ИЛИ» Integer Integer
xor Исключающая дизъюнкция Integer Integer
shl Сдвиг влево Integer Integer
shr Сдвиг вправо Integer Integer
Пример:
a + b – c*(d + e)

Логические операторы
Логические операторы применяются при вычислении логических выражений. К логическим
операторам относятся >, <, <>, =, in, and, not, or. Результат вычисления логического
выражения имеет логический тип.

Таблица 14 – Логические операторы


Операция Название
= равно
Операция Название
<> не равно
< меньше
> больше
<= меньше или равно
>= больше или равно
in принадлежность
not логическое отрицание
and логическое "И"
or логическое "ИЛИ"
xor исключающее "ИЛИ"
Пример
a > b
(a > b)and(a < c)
Допускается смешивать логические и арифметические выражения, например
(a + b)*c = e
К специальным операторам относится оператор присваивания, операторы ввода-вывода и
некоторые другие операторы.
Операторы выполняются слева направо в соответствии с приоритетами приведенными в
таблице 15.

Таблица 15 – Приоритеты операторов


Приоритет Операции Категория операций
Высший () Скобки
Первый + - not @ Унарные операции
Второй * / div mod and shl shr Бинарные операции типа умножения
Третий + - or xor Бинарные операции типа сложения
Четвертый = <> < > <= >= in Бинарные операции отношения
Пятый := Оператор присваивания

Оператор присваивания
Оператор присваивания имеет следующий синтаксис
<идентификатор переменной>:=<выражение>;
Следует отметить, что между символами ":=" недопустимы пробелы. Тип переменной
которой осуществляется присваивание и тип результата вычисления выражения должны
совпадать.

Оператор SizeOf
Этот оператор возвращает размер переменной в байтахю Он имеет следующий синтаксис:
SizeOf(X):Integer;
Здесь X – переменная или имя типа. Оператор возвращает размер переменной заданного типа
в байтах.
Пример:
var i:Integer;
x:real;
i:=SizeOf(x);
...
i:=SizeOf(Single);

Операторы ввода-вывода
Для операций ввода-вывода данных в Object Pascal используется пара операторов read и
write. Эти операторы ввода-вывода универсальны и используются при работе с любыми
устройствами ввода-вывода такими как, клавиатура, консоль, накопители, порты ввода-
вывода и др. Следует также отметить, что эти операторы обрабатываются компилятором
особым образом и поэтому идентификаторы read и write не рекомендуется использовать для
именования собственных объектов.

Оператор write
С помощью оператора write осуществляется вывод данных. По умолчанию устройством
вывода служит консоль. Синтаксис оператора write имеет следующий вид:
write (<выражение>, <выражение>, ... <выражение>);
Выражение может состоять из одной константы или переменной, например
write('x=', x);
Первое выражение равно 'x=' – это строковая константа. Второе выражение равно x. Это
переменная любого простого типа. Следует отметить, что стандартный оператор вывода
может работать с переменными только простых и строковых типов. Оператор write после
вывода не осуществляет перевод курсора на следующую строку. Для того чтобы после
вывода данных курсор переводился на следующую строку необходимо использовать
оператор writeln.
writeln (<выражение>, <выражение>, ... <выражение>);
Оператор writeln без параметров переведет курсор на новую строку.
Операторы write и writeln позволяют производить форматированный вывод. Для этого
применяется расширенная форма операторов.
writeln (<выражение>:Width, ...);
write (<выражение>:Width, ...);
With – определяет общее число символов отведенных на значение. Значение всегда
выводится целиком, даже если оно не помещается в отведенное ему число символов. Эта
возможность бывает полезна вывода таблиц. В этом случае параметр Width задает ширину
колонки в символах. Пример:

Листинг 2 – Вывод таблицы


{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
program formatOut;
begin
writeln('Иванов':15, 15:4);
writeln('Петров':15, 5:4);
writeln('Богданов':15, 150:4);
writeln('Красносельцев':15, 18:4);
end.
В результате работы программы на экран будет выведено примерно следующее
Иванов 15
Петров 5
Богданов 150
Красносельцев 18
Для вещественных чисел доступен дополнительный параметр Digits.
writeln (<выражение>:Width:Digits, ...);
write (<выражение>:Width:Digits, ...);
Здесь Digits – число выводимых знаков после запятой, при этом проводится арифметическое
округление до указанного знака, например

Листинг 3 – Форматированный вывод вещественных чисел


{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
program formatOutReals;
const number=3.5645;
begin
writeln( number:8, number:8:4, number:8:3,
number:8:2, number:8:1, number:8:0);
end.
Вывод программы будет, примерно, таким
3.6E+0000 3.5645 3.565 3.56 3.6 4
Параметр Digits можно указать только совместно с параметром Width. Параметры Width и
Digits могут быть целочисленными константами или переменными, например
Листинг 4
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
program formatOutReals;
const number=3.5645;
var digits, width: byte;
begin
write('width '); readln(width);
write('digits '); readln(digits);
writeln(number:width:digits);
end.

Оператор read
С помощью оператора read осуществляется ввод данных. По умолчанию устройством ввода
служит клавиатура. Синтаксис оператора read имеет следующий вид:
read (<переменная>, < переменная >, ... < переменная >);
Оператор read может работать только с переменными простого и строкового типа. При вводе
нескольких переменных с помощью оператора read они должны разделяться пробелом.
После ввода всех переменных необходимо нажать клавишу «Enter». Если «Enter» был нажат
до ввода всех переменных, то курсор будет переведен на следующую строку и, система будет
ожидать ввода оставшихся данных, например

Листинг 5
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
program InOutPrg;
var x, y, z: Integer;
begin
read(x, y, z);
end.
Попробуйте ввести переменные сначала через пробел, а затем используя клавишу ввод для
каждой переменной. Аналогично оператору write у оператора read существует форма с
переводом на следующую строку после окончания ввода данных.
readln (<переменная>, < переменная >, ... < переменная >);
Оператор readln без параметров приостановит выполнение программы до нажатия клавиши
«Enter».
В листинге 6 приведена программа осуществляющая ввод и вывод данных.

Листинг 6 – Программа суммирования двух целых чисел


{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
program AddPrg;
var x1, x2, sum:Integer;

begin
write('Enter first number: ');
read(x1);
write('Enter second number: ');
read(x2);
sum:=x1+x2;
writeln('Summa ', x1, 'and', x2, ' =', sum);
writeln('Press Enter to exit');
readln;
end.

Комментарии в программах
Комментарий это часть текста которая игнорируется компилятором и служит лишь для
описания логики работы программы или других целей. Object Pascal поддерживает два вида
комментариев: однострочные и многострочные.
Однострочные комментарии задаются двумя обратными слешами без пробела (//). Все
символы введенные после этого символа комментария до конца строки считаются
комментарием и не учитываются компилятором, например
writeln('Vvedite n');
readln(n);
x:=n*n+5; //вычисление выражения
Многострочные комментарии могут располагаться на нескольких строках. Символом начала
многострочного комментария является символ «{». Все символы идущие после считаются
комментарием и игнорируются компилятором. Конец комментария отмечается символом «}»,
например
writeln('Vvedite n');
readln(n);
x{здесь будет результат}:=n*n+5;

{это многострочный
комментарий }
Обратите внимание, что многострочный комментарий может находиться внутри
выражения, но не внутри идентификатора.

Директивы компилятора
Если многострочный комментарий начинается с символа ‘$’, то компилятор рассматривает
введенную строку как директиву компилятора
Все директивы условно можно разделить на две группы:
• директивы условной компиляции;
• директивы задающие режимы работы компилятора.
С одной из директив задающих работу компилятора вы уже знакомы – это директива
APPTYPE, которая задает тип создаваемого приложения консольное (значение CONSOLE) или
графическое (GUI). Все директивы задающие режимы работы компилятора делятся на
локальные и глобальные. Глобальные имеют область действия всю программу, их работа не
зависит от местоположения директивы, например директива APPTYPE является глобальной.
Локальные директивы имеют локальную область действия, например директива {$Q},
рассмотренная выше. Её область действия распространяется до строки с такой же
директивой, но с другим значением, например
{$Q+}

здесь есть контроль переполнения

{$Q-}

здесь код для контроля переполнения не генерируется


Более подробно с директивами компилятора можно познакомиться в документации на
компилятор.

Директивы условной компиляции


Рассмотрим пример применения директив условной компиляции. Допустим что в текст
программы включен код для отладки программы печатающий промежуточный результат на
экран. Естественно, что в окончательную версию программы этот код не должен попасть.
Обычно для реализации этой функции используются следующие три директивы.
DEFINE <имя>
Объявляет имя. Под именем подразумевается любой идентификатор. Например,
{$DEFINE DEBUG}
Чтобы удалить объявление имени нужно указать директиву
UNDEF
Директива
IFDEF <имя>
проверяет объявлено ли указанное имя. Если оно объявлено, то текст идущий после
директивы включается в код программы, иначе он туда не включается.
ENDIF
Указывает на окончание блока IFDEF. Например,

Листинг 7
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

{$DEFINE DEBUG}
program Dirr;
var j, n, summa :integer;
begin
writeln('Vvedite n');
readln(n);
j:=n+5;
{$IFDEF DEBUG}
writeln('j= ', j);
{$ENDIF}

summa:=n + j;
writeln('summa= ', summa);
readln;
end.
Для того чтобы отменить объявление имени DEBUG необходимо просто стереть символ
«$»(или поставить передним точку или пробел) и компилятор пропустит все символы в
фигурных скобках, т. к. будет считать его комментарием. Код, находящийся между
директивами IFDEF и ENDIF, будет пропущен и не попадет в исполняемый модуль. Для
включения этого кода в программу достаточно просто восстановить символ «$» (стереть
точку).
Кроме директив DEFINE, UNDEF, IFDEF и ENDIF существует еще две директивы условной
компиляции это
IFNDEF <имя>
действие обратное директиве IFDEF, если имя не объявлено, то фрагмент включается в
текст.
ELSE
применяется в паре с директивой IFDEF либо директивой IFNDEF, например
{$IFDEF DEBUG}
если объявлено DEBUG включаем этот фрагмент
{$ELSE}
иначе включаем этот фрагмент
{$ENDIF}
Рассмотрим еще одну часто используемую директиву компилятора. Это директива INCLUDE.
Она не относится к директивам условной компиляции, но часто применяется совместно с
ними.
INCLUDE <имя файла>
В то место где указана эта директива вставляется все содержимое указанного файла.
Допускается сокращенная запись этой директивы {$I <имя файла>}
Поместим в файл с именем deb.inc следующую строку writeln('j= ', j);
Перепишем предыдущий пример в следующем виде

Листинг 8
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

{$DEFINE DEBUG}
program Dirr;
var j, n, summa :integer;
begin
writeln('Vvedite n');
readln(n);
j:=n+5;
{$IFDEF DEBUG}
{$INCLUDE deb.inc}
{$ENDIF}

summa:=n + j;
writeln('summa= ', summa);
readln;
end.
Эта директива применяется для сокращения листинга или включения часто используемого
кода.
Разберем для чего нужны следующие директивы компилятора в начале каждой программы
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
Директива MODE переключает Free Pascal в режим совместимости с Delphi. Так как
директивы MODE в Delphi нет, то при попытке откомпилировать программу получим
ошибку – неизвестная директива компилятора. Чтобы этого не происходило поместим эту
директиву между директивами условной компиляции IFDEF и ENDIF. Имя (переменная)
FPC определена в компиляторе Free Pascal и не определена в Delphi, следовательно
компилятор Delphi просто не увидит неизвестную ему директиву MODE, а компилятор
Free Pascal увидит.
Директива APPTYPE задает консольный тип приложения. В Free Pascal по умолчанию
генерируется именно консольное приложение, поэтому ее можно было бы и не указывать, но
в Delphi по умолчанию создается графическое приложение. Поэтому лучше явно указать тип
создаваемого приложения. Таким образом, программы, написанные в лабораторной работе,
можно без правок компилировать как компилятором Free Pascal, так и компилятором Delphi.

Задания к лабораторной работе


1. Напишите программу для вычисления следующих выражений, все переменные
целочисленные:
a+b⋅c−(23+ f )⋅3
(a>3⋅( f +1))∨(2⋅f >3)
Ввод исходных данных организуйте с помощью стандартных операторов ввода
вывода. При вводе и выводе данных должны присутствовать подсказки.
2. Составьте программу для вывода на экран размеров в байтах всех вещественных
типов.
3. Составьте программу для вывода на экран текущей даты и времени.
4. Составьте программу поиска подстроки в строке. Исходные данные строка, подстрока
которую следует искать. На экран должен выводится результат найдена строка или нет
(True или False).
5. Составьте программу для перестановки в заданной строке любых двух слов. ‘Delphi is
best compiler’
6. Составьте программу для вычисления любого выражения, имеющего вещественный
тип результата. Вывод результата на экран должен быть форматированным.
7. Составьте программу для форматированного вывода числа с помощью функции
FloatToStrF.

Вопросы к лабораторной работе


1. Какие простые типы данных вы знаете?
2. Какие целочисленные типы данных вы знаете?
3. Какие типы данных относятся к порядковым, почему?
4. Как задаются символьные константы?
5. Как задать перечисляемый тип данных?
6. Как задать тип диапазон?
7. Какие вещественные типы данных вы знаете?
8. Какие строковые типы данных вы знаете и в чем их отличие?
9. Для чего нужно преобразование типов?
10. Какие функции преобразования типов вы знаете?
11. Приведение типов, отличия от преобразования типов.
12. Какие операторы Object Pascal вам известны?
13. Какие виды комментариев существуют в Object Pascal?
14. Как задать директиву компилятора?
15. Для чего используется условная компиляция, какие директивы компилятора для этого
применяются?
16. Для чего применяется директива компилятора INCLUDE?

Вам также может понравиться