Лекция 3 Вещественные типы данных и линейная программа

3.1 Константы, переменные и простые типы

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

3.1.1 Константы. Константа предназначена для хранения некоторого постоянного значения, которое не может изменяться в процессе работы программы. Синтаксическая диаграмма константы имеет вид:

Согласно диаграмме описание одной или нескольких констант начинается со служебного слова Const. Далее в соответствие со стрелкой, начинающейся от овального блока с именем Const и заканчивающейся на прямоугольном блоке с именем «Идентификатор», проставляется имя константы. Из прямоугольного блока с элементом «Идентификатор» идут две стрелки. Каждая из них характеризует один из правильных способов описания константы. Пройдёмся в направлении через обязательный знак равенства и далее через прямоугольный блок «Тип», круглый блок с обязательным знаком =, прямоугольный блок «Значение» к круглому блоку с обязательным знаком ;. Понятия «Идентификатор», «Тип» и «Значение» могут быть расшифрованы дополнительными синтаксическими диаграммами. Мы ограничимся пояснениями. «Идентификатор» - это имя константы, являющееся правильным идентификатором, для обозначения ячейки памяти, где хранится информация. Тип информации задаётся его именем (блок «Тип»). Само значение данного типа соответствует блоку «Значение». Пример описания константы для работы с числом Эйлера е=2.7182:

НЕ нашли? Не то? Что вы ищете?

Const

Е:Real=2.7182;

Приведённый пример использует для работы с числовыми константами один из пяти допустимых в Турбо Паскале числовых вещественных типов, тип Real. Согласно синтаксической диаграмме константа может быть объявлена без указания типа данных. Пример:

Const

Е =2.7182;

Обратите внимание, синтаксическая диаграмма константы содержит путь со стрелкой, начинающейся после знака точки с запятой и возвращающей описание ко входу в прямоугольный блок со словом «Идентификатор». Это позволяет объявить ещё одну или несколько констант. Пример:

Const

Time =211.1; Day: =5;

3.1.2 Переменные. Переменная предназначена для хранения некоторого значения, которое может изменяться в процессе работы программы. Синтаксическая диаграмма переменных имеет вид:

В отличие от описания констант она предполагает обязательное указание типа. Объявление начинается служебным словом Var. Тип переменной указывается после её объявления через двоеточие. Пример:

Var

My_Var:Real;

В данном примере используется тип вещественного числа Real. Для хранения информации этого типа резервируется 6 байтов памяти. Значением переменной может быть любое вещественное число, абсолютная величина которого находится в пределах от 2.9×10-39 до 1.7×1038. Если Вы попытаетесь в ячейку памяти с именем My_Var записать число 10100 или, скажем, строку ‘Изучаем Паскаль’, компилятор выдаст сообщение об ошибке. Переменные в отличие от констант могут изменяться при выполнении программы.

3.1.3 Понятие типа. Значения констант и переменных относятся строго к одному типу. Тип характеризует:

- формат внутреннего представления данных в компьютере;

- множество значений, которые может принимать константа или переменная;

- группу возможных операций над значениями данного типа.

Автоматическое изменение типа в процессе работы программы запрещено. Исключением служат некоторые специально оговариваемые случаи.

Синтаксическая диаграмма типа представлена ниже. Она содержит указания на необходимость использования служебного слова Type, знака равенства и двух элементов: «Идентификатор», «Имя типа». «Идентификатор» является именем типа, «Имя типа» требующих дополнительного пояснения. Например, достаточно пояснить, что «Имя типа» задаётся любым идентификатором, определение которого дано ранее.

:

Синтаксическая диаграмма типа потребуется в дальнейшем для описания пользовательских типов, в частности, типов данных. На первом этапе мы ограничимся работой с простыми стандартными типами данных. Например, в программе на рис. 1.1 используется один из пяти числовых вещественных типов данных, тип Real.

3.1.4 Простые типы. Язык Турбо Паскаль насчитывает пять видов различных типов: простые, структурированные, ссылочные, процедурные и объектные. В настоящем разделе рассматриваются простые или скалярные типы. Именами типов служат правильные идентификаторы. Некоторые имена являются стандартными или предопределёнными. Примером такого имени может служить Real. По ходу изучения Турбо Паскаля нам встретятся и другие имена типов, относящихся к стандартным: Extended, Byte, Boolean и т. д.

Простые типы делятся на две группы: порядковые и вещественные (рис. 2.1).

Вещественные Порядковые
Целые
Логические
Символьные
Перечисляемые

Тип диапазон

Рис. 2.1 Простые типы данных в алгоритмическом языке Турбо Паскаль

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

3.2 Типы вещественных чисел

3.2.1 Форма представления вещественного числа. Различают две формы представления вещественных чисел:

- числа в виде десятичной дроби с фиксированной разделительной точкой;

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

При записи числа в программе знак плюс может опускаться. Пример правильной записи вещественного числа с фиксированной точкой:

- 2.3 + 0.0

Запись тех же чисел в полулогарифмической форме имеет вид:

- 0.23ЕЕ-3 9.00011Е1 7.21Е2

3.2.2 Синтаксическая диаграмма вещественного числа. Синтаксическая диаграмма вещественного числа в произвольной форме имеет вид:

3.2.3 Типы вещественных чисел. Язык Турбо Паскаль позволяет работать с пятью типами вещественных чисел: Real, Single, Double, Extend, Comp (табл. 3.1). Каждый тип имеет свои отличительные характеристики. Так, число типа Extended может принимать отрицательные и положительные значения от -1.1×104932 до +1.1×104932. Минимальное значение числа величине их по модулю равно 3.4×10-4932.

Переменные типа Real могут использоваться в компьютерах с любым процессором. Работа с типами Single, Double, Extend, Comp возможна только при подключении сопроцессора 80x87, что достигается через опции Option и Compile главного меню ИСР.

Таблица 3.1 - Типы вещественных чисел

Имя типа

Минимум модуля, числа, исключая 0

Максимум модуля числа

Число значи-

мых цифр

Длина числа, байты

Real

1.7E-39

1.6E38

11-12

6

Single

1.5E-45

3.4E38

7-8

4

Double

5.0E-324

1.7E308

15-16

8

Extended

3.4E-4932

1.1E4932

19-20

10

Comp

1

9.2E18

19-20

8

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

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

Генерация кода при выполнении операций с вещественными числами зависит от наличия в компьютере сопроцессора 80х87. Выбор способа генерирования определяется директивами {$N} и {$E}. В состоянии {$N-}, устанавливаемом по умолчанию, используется код для работы с числами типа Real. В состоянии {$N+} генерируется код, позволяющий выполнять действия над вещественными числами всех типов с помощью сопроцессора 80x87. Если сопроцессор отсутствует, то для работы со всеми пятью типами запускают директиву {$E+}, которая сначала проверяет наличие сопроцессора. Если он имеется, то он подключается к арифметическим действиям над всеми типами вещественных чисел. В противном случае включается режим эмуляции. Состояние {$E-} не поддерживает эмуляции сопроцессора.

Имя директивы записывается в начальной части программы или в той позиции текста, откуда она должна выполняться. В случае генерирования кода под управлением операционной системы Windows директива {$E+} игнорируется. Максимальная скорость арифметических операций достигается при одновременном включении двух директив {$N-,$E+}.

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

(4.2+a)*b – x, s/3.2/f*r+2.4, 6.3, Star

Во втором выражении сначала s делится на 3.2, полученный результат делится на f, затем полученное значение умножается на r и т. д.

Пример неправильных арифметических выражений:

(4.2+a@)*b – x – использован недопустимый символ @;

y:=(a+b))/(a-b) – использован недопустимый знак :=.

3.3 Линейная программа

3.3.1 Структура линейной программы. Линейная программа строится на основе базовой конструкции «Следование». Как и все программы, её структура предусматривает три раздела:

- заголовок программы;

- раздел объявлений (описаний);

- операторный раздел.

Заголовок программы. Синтаксическая диаграмма имеет вид:

Следовательно, формат заголовка можно представить как:

Program <Имя программы >;

Пример заголовка:

Program Base_Data;

Заголовок программы может отсутствовать.

3.3.2 Описательный раздел. Раздел описаний содержит объявления используемых модулей, директив, меток, констант, типов, переменных и других объектов программы. Его структура представляется в виде:

Uses <Перечень подключаемых модулей>;

<Перечень вызываемых директив >;

Label <Подраздел объявлений меток>;

Type <Подраздел объявлений нестандартных типов>;

Const <Подраздел объявлений констант>;

Var <Подраздел объявлений переменных>;

где слова Uses, Label, Type, Const, Var относятся к категории служебных.

Служебное слово Uses предшествует списку вызываемых модулей. ИСР содержит обширную библиотеку из стандартных функций и процедур, обеспечивающих выполнение наиболее часто встречающихся операций. Например, для построения прямоугольника, окрашивания его в определённый цвет, вычисления квадратного корня из числа, вывода символа в заданную точку экрана и решения многих других задач достаточно использовать готовый инструментарий, функционирование которого поддерживается одним из модулей. Имя модуля, обеспечивающего возможность работы с нужным объектом, записывается сразу после служебного слова Uses. Если модулей несколько, то они разделяются запятыми.

Пример. Пусть в программе предполагается использовать процедуру очистки экрана ClrScr, действие которой поддерживается модулем Crt, и функции и процедуры для работы в графическом режиме, поддерживаемые модулем Graph. Соответствующее объявление в описательном разделе имеет вид:

Uses Crt, Graph;

Описание меток начинается со служебного слова Label, после которого следует перечень меток. Метки отделяются друг от друга запятыми, например:

Label

12,Stop, Mister_X;

Правила объявления констант и переменных и типов обсуждались в лекции 2.

Пример организации описательного раздела:

Uses Crt; {1}

{$N+,$E+} {2}

Label

21,22,23; {3}

Type

Number=Real; {4}

Const

A:Number=561.2;B=2.1E-24; {5}

Var

X, Y,Z:Single; {6}

Описание содержит имя модуля Crt, две директивы {$N+,$E+}, имя нового типа, две константы и три переменные. Имена объявляемых типов принято связывать с новыми типами, называемых пользовательскими. В данном случае имя Number отнесено к стандартному типу Real, что разрешено правилами, хотя использование этого приёма не желательно.

Константа А=561.2 отнесена к типу Number. Тип константы можно не указывать, как это сделано при описании константы В. Порядок следования описываемых элементов может быть любым, за исключением двух случаев:

- описание всегда начинается объявлением того модуля (или модулей), который необходим для данной программы;

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

3.3.3 Операторный раздел. Исполняемая часть программы в обязательном порядке располагается между служебными словами Begin и End. Она может содержать оператор присвоения, процедуры ввода – вывода и некоторые другие процедуры. Все операторы, функции и процедуры программы разделяются знаком ;.

Операторная (исполняемая) часть состоит из операторов, выполняемых друг за другом в направлении от верхней строки текста программы к нижней. На рис. 2.3 представлена блок - схема исполняемой части линейной программы.

3.3.4 Оператор присвоения. Оператор присвоения является одним из основных операторов для работы с данными различного типа. Формат его использования имеет вид:

Y:=<Выражение>

где под выражением понимается константа, переменная, функция или выражение, например, арифметическое.

Действие оператора присвоения в случае арифметических операций сводится к вычислению арифметического выражения и занесения результата в ячейку памяти для переменной Y. Рассмотрим выполнение фрагмента программы с четырьмя операторами присвоения:

A:=5.1538; {1}

B:=2.9645*A; {2}

C:=3.1* B; {3}

С:=C-7.3 {4}

Обратите внимание на то, что операторы разделяются знаком ;. Правая часть во всех операторах присвоения содержит арифметическое выражение. В первой строке программы оно равно числу 5.1538. Действие оператора {1} состоит в том, что число 5.1538 помещается в ячейку памяти с именем А. Во второй строке {2} выполняется умножение числа 2.9645 на число, хранящееся в ячейке памяти с именем А, в данном случае равное 5.1538, с последующим хранением результата в ячейке памяти с именем В.

В третьей строке {3} число, содержащееся в ячейке В, умножается на 3.1, а полученный результат помещается в ячейку С.

Принципиальное отличие оператора присвоения от знака равенства, используемого в алгебре, иллюстрируется четвёртой строкой {4} фрагмента. Здесь фактически выполняются три действия. Сначала запрашивается число из ячейки памяти с именем С. Далее, из этого числа производится вычитание числа 7.3. И последнее действие – полученный результат заносится в ту же ячейку С. В результате произведённых действий информация о числе, хранившееся в ячейке памяти С до выполнения оператора присвоения в строке {4}, теряется.

3.3.5 Пустой и составной операторы. Совокупность любых операторов, расположенных между зарезервированными словами Begin и End, называется составным оператором. Слова Begin и End присутствуют в программе только в паре. Они играют роль своеобразных скобок и часто называются структурными скобками. Количество операторов в структурной скобке не ограничивается. Пример использования структурных скобок:

Begin {1}

Number:=X/(1.6+X); {2}

Y:=Number(1+ Number)/(1- Number) {3}

End; {4}

Допускается использование структурной скобки, не содержащей операторов. Например, разрешена запись

Begin

End;

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

Количество вложенных составных операторов не ограничивается. Например, конструкция

Begin {1}

Begin {2}

Begin {3}

X:=4.61 {4}

End {5}

End {6}

End; {7}

вполне допустима.

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

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

Точка с запятой так же отсутствует и в строках программы с номерами 4-6. Перед служебным словом End, если оно завершает структурную скобку Begin..End, разделительный знак «;» может проставляться или не проставляться. Ошибки не будет. Так же как не будет ошибки при использовании этого знака повторно. Поэтому фрагмент программы

Begin

Number:=X/(1.6+X);;;;;

Y:=Number(1+ Number)/(1- Number);;

End;

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

……………..

X:=76.9;

23:;

…………….

используется метка 23, которая стоит перед пустым оператором.

3.3.6 Ввод информации. Исходные данные для программы вводятся с помощью оператора присвоения, как это было показано в предыдущем пункте на примере переменной Х, или с помощью процедур Read и Rеаdln. Присутствие этих процедур приостанавливают выполнение программы. После введения данных с клавиатуры и нажатия клавиши Enter программа продолжит работу. Синтаксическая диаграмма процедуры Read имеет вид:

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

Read([X1,][X2,]...) (1.1)

Синтаксическая диаграмма процедуры Rеаdln и формат её использования имеют аналогичный вид. Отличие процедур Read, ReadLn проявляется при работе с файловыми переменными, о чём поговорим позднее. Эти процедуры часто используются для вывода на дисплей поясняющей информации.

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

Если в строке (1.1) переменные не указаны, то выполнение программы приостанавливается. Для продолжения работы следует нажать клавишу Enter.

3.3.7 Вывод информации. Вывод информации на дисплей производится процедурами Write и WriteLn. Синтаксическая диаграмма их одинакова и для процедуры Write имеет вид:

Формат использования процедуры Write запишем в форме

Write([‘A1’,][X1,][Х2]...) (1.2)

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

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

WriteLn(‘Интегрированная среда алгоритмического ’);

WriteLn(‘языка Турбо Паскаль предоставляет программисту’);

WriteLn(‘большие возможности для редактирования’);

WriteLn(‘ и отладки программы.’);

выводит на экран дисплея сообщение:

Интегрированная среда алгоритмического

языка Турбо Паскаль предоставляет программисту

большие возможности для редактирования

и отладки программы.

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

X:=3.14;

X:=X*X;

WriteLn(X);

выводит на дисплей число

9.E+00

Уменьшение разрядности достигается использованием формата вывода в виде:

WriteLn(X:m:n) (1.3)

где

m – общее число позиций на экране, резервируемое для числа с учётом его отрицательного знака (знак + не выводится) и разделительной десятичной точки,

n - количество позиций на экране, резервируемое для дробной части числа.

Если количество позиций k, необходимое для записи данного числа, меньше значения m, то дробная часть выводимого значения содержит n цифр. Пробелы, компенсирующие разницу между предоставляемым количеством позиций и размером выводимого числа, проставляются слева. В противном случае при k>m гарантируется вывод всей целой части без пробелов.

Целый тип может выводиться с указанием только количества позиций, отводимых для целой части. Пример вывода двух вещественных X1, X2 и двух целых N1, N2 чисел. В соответствие с фрагментом программы

X1:=6513.142;X2:=3256.0283;N1:=28;N2:=82;

Write(X1:10:2,X2:10:2);

Write(N1:10,N2:10);

на экран дисплея выводится:

65132

В приведённом случае каждому вещественному числу Х1, Х2 выделено по восемь позиций на дисплее, из них десятичному знаку – одна, дробной части – две позиции. Т. к. количество цифр в дробной части урезается на 1, то для пробелов между соседними вещественными числами остаётся 8-7=1 позиция. При выводе дробной части производится не усечение десятичной дроби, а округление её.

Каждому целому числу N1, N2 также выделяется 8 позиций. Т. к. эти числа не содержат дробных частей, то величина пробелов между ними составляет 8-2=6 позиций.

В чём состоит различие процедуры Write от WriteLn? При использовании последней процедуры вывод на экран данных завершается переводом курсора в начало следующей строки. В противном случае курсор остаётся в той же строке справа от выводимого значения. Если в только что рассмотренном примере заменить имя процедуры Write на WriteLn, то после выполнения программы на дисплее высветится сообщение из двух строк:

6513

28 82

Как видим, действие первой процедуры WriteLn((X1:10:2,X2:10:2) оканчивается перебросом курсора в следующую строку, поэтому вторая процедура WriteLn(N1:10,N2:10) начинает вывод во вторую строку.

3.3.8 Пример ввода-вывода информации в линейной программе. В качестве примера использования процедур ввода и вывода рассмотрим работу линей


ной программы для вычисления арифметического выражения

при заданных значениях констант a = 7.8 и b = 2.4 и некотором значении переменной х, задаваемом с клавиатуры. Программа начинается с инициирования модуля Crt, который поддерживает работу процедур ClrScr и ReadKey. Первая из них очищает экран дисплея, вторая удерживает изображение информации, выводимой в результате работы программы. Текст программы представлен ниже.

Uses Crt;{Вызов модуля для обеспечения работы процедур ClrScr и ReadKey}

Const {Объявление констант А и В}

A=7.8;

B=2.4;

Var {Объявление переменных X, Y}

X, Y:Real;

Begin {Начало программы}

ClrScr; {Очистка экрана}

WriteLn('Введите число'); {Вывод сообщения на экран о выполнении

пользователем операции ввода числа с клавиатуры}

ReadLn(X); {Помещение введённого числа с клавиатуры

в ячейку памяти с именем Х}

Y:=A*X+B*X; {Расчёт числителя выражения с помещением

последнего в ячейку c именем Y}

Y:=Y/(A*A*X-B); {Определение частного от деления содержимого

ячейки Y на значение арифметического выражения A*A*X-B

с помещением последнего в ячейку паvяти с именем Y}

WriteLn('Арифметическое выражение Y=',Y:4:2); {Вывод на экран

дисплея сообщения и полученного числа в заданном формате}

ReadKey {Процедура удерживает на дисплее результат работы про

граммы}

End. {Конец программы}

Обратите внимание, что расчёт дроби производится в два этапа. Сначала вычисляется её числитель, затем рассчитывается само выражение, причём ячейка памяти Y используется дважды: первый раз в неё помещается значение числителя, во второй раз – искомое значение выражения. А теперь войдите в ИСР и наберите текст этой программы. После её запуска на экране появится сообщение

Введите число

Наберите на клавиатуре значение переменной Х, например, равное 2, и нажмите Enter. На экране высветится дополнительное сообщение

Арифметическое выражение Y=0.71