Лекция 1. Основные понятия языка
Язык Паскаль был разработан в 1970 г. Никлаусом Виртом как язык, обеспечивающий строгую типизацию и интуитивно понятный синтаксис. Он был назван в честь французского математика, физика и философа Блеза Паскаля.
Никлаус Вирт | Блез Паскаль |
Одной из целей создания языка Паскаль Никлаус Вирт считал обучение студентов структурному программированию. До сих пор Паскаль заслуженно считается одним из лучших языков для начального обучения программированию. Его современные модификации, такие как Object Pascal, широко используются в промышленном программировании (среда Delphi).
Для решения задачи на компьютере требуется написать программу. Программа состоит из исполняемых операторов и операторов описания. Исполняемый оператор задает законченное действие, выполняемое над данными. Примеры исполняемых операторов: вывод на экран, занесение числа в память, выход из программы.
Оператор описания, как и следует из его названия, описывает данные, над которыми в программе выполняются действия. Примером описания на естественном языке может служить предложение «В памяти следует отвести место для хранения целого числа, и это место мы будем обозначать А».
Исполняемые операторы для краткости часто называют просто операторами, а операторы описания — описаниями. Описания должны предшествовать операторам, в которых используются соответствующие данные. Операторы исполняются последовательно, один за другим, если явным образом не задан иной порядок.
Рассмотрим простейшую программу на Паскале. Все, что она делает — вычисляет и выводит на экран сумму двух целых чисел, введенных с клавиатуры.
var a, b, sum: integer; { 1 }
begin { 2 }
readln(a, b); { 3 }
sum:= a + b; { 4 }
writeln('Cумма чисел ', a, ' и ', b, ' равна ', sum); { 5 }
end. { 6 }
В программе шесть строк, каждая из них помечена комментарием с номером (внутри фигурных скобок можно писать все, что угодно).
В строке 1 расположен оператор описания используемых в программе величин. Для каждой из них задается имя, по которому к ней будут обращаться, и ее тип. «Волшебным словом» var обозначается тот факт, что a, b и sum — переменные, то есть величины, которые во время работы программы могут менять свои значения. Для всех переменных задан целый тип, он обозначается integer. Тип необходим для того, чтобы переменным в памяти было отведено соответствующее место.
Исполняемые операторы программы располагаются между служебными словами begin и end, которые предназначены для объединения операторов и сами операторами не являются. Операторы отделяются друг от друга точкой с запятой.
Ввод с клавиатуры выполняется в строке 3 с помощью стандартной процедуры с именем readln. В скобках после имени указывается, каким именно переменным будут присвоены значения. Для вывода результатов работы программы в строке 5 используется стандартная процедура writeln. В скобках через запятую перечисляется все, что мы хотим вывести на экран, при этом пояснительный текст заключается в апострофы. Например, если ввести в программу числа 2 и 3, результат будет выглядеть так:
Сумма чисел 2 и 3 равна 5
В строке 4 выполняется вычисление суммы и присваивание ее значения переменной sum. Справа от знака операции присваивания, обозначаемой символами:=, находится выражение — правило вычисления значения.
Чтобы выполнить программу, требуется перевести ее на язык, понятный процессору, — в машинные коды. Этим занимается компилятор. Каждый оператор языка переводится в последовательность машинных команд. Компилятор планирует размещение данных в оперативной памяти в соответствии с операторами описания. Попутно он ищет синтаксические ошибки, то есть ошибки записи операторов. Кроме этого, в Паскале на компилятор возложена еще одна обязанность — подключение к программе стандартных подпрограмм (например, ввода данных или вычисления синуса угла).
Алфавит и лексемы
Все тексты на языке пишутся с помощью его алфавита. Алфавит Паскаля включает:
· прописные и строчные латинские буквы, знак подчеркивания _;
· цифры от 0 до 9;
· специальные символы, например +, *, { и @;
· пробельные символы: пробел, табуляцию и переход на новую строку.
Из символов составляются лексемы (tokens), то есть минимальные единицы языка, имеющие самостоятельный смысл:
· константы;
· имена (идентификаторы);
· ключевые слова;
· знаки операций;
· разделители (скобки, точка, запятая, пробельные символы).
Лексемы языка программирования аналогичны словам естественного языка. Например, лексемами являются число 128, имя Vasia, ключевое слово goto и знак операции сложения +. Компилятор при синтаксическом разборе текста программы определяет границы одних лексем по другим, например, разделителям или знакам операций. Из лексем строятся выражения и операторы. Рассмотрим каждый вид лексем подробнее.
Константы
Константа — величина, не изменяющая свое значение в процессе работы программы. Классификация констант Паскаля приведена в шапке таблица 1.1. Нижние строки таблицы представляют собой примеры соответствующих констант.
Таблица 1.1. Классификация констант Паскаля
Десятичные целые константы представляются в естественной форме. Шестнадцатеричная константа состоит из шестнадцатеричных цифр (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F), предваряемых знаком $.
Вещественные константы записываются с точкой перед дробной частью. Либо целая, либо дробная часть могут отсутствовать. Вещественная константа с порядком представляется в виде мантиссы и порядка. Мантисса записывается слева от знака E или e, порядок — справа от знака. Значение константы равно произведению мантиссы и возведенного в указанную в порядке степень числа 10.
В таблице 1.1 представлены числа 1,2 104 и 0,1 10–5. Пробелы внутри числа не допускаются.
Символьные константы служат для представления любого символа из набора, используемого в данном компьютере. Так как под каждый символ отводится 1 байт, всего используется 256 символов. Каждому символу соответствует свой код. В операционной системе MS-DOS для кодировки символов используется стандарт ASCII, являющийся международным только в первой половине кодов (от 0 до 127), вторая половина кодов (от 128 до 255) является национальной и различна для разных стран. Первые 32 символа являются управляющими: хотя многие из них имеют графическое представление, предназначены они для передачи управляющих сигналов внешним устройствам, например монитору, принтеру или модему. Символьные константы записываются в одной из трех форм:
1. Символ, заключенный в апострофы.
2. Десятичный код символа, предваряемый знаком #. Применяется для представления символов, отсутствующих на клавиатуре (в таблица 1.1 в виде #186 приведено представление символа ¦).
3. Буква, предваряемая знаком ^. Используется для представления управляющих символов. Код буквы должен быть на 64 больше, чем код представляемого таким образом символа (в таблица 1.1 в виде ^M представлен символ с кодом 13).
Строковая константа — это последовательность любых ASCII-символов, расположенная на одной строке и заключенная в апострофы. Если требуется представить сам апостроф, он дублируется. Максимальная длина строковой константы — 126 символов.
Имена, ключевые слова и знаки операций
Имена в программах служат той же цели, что и имена людей, — чтобы обращаться к программным объектам и различать их, то есть идентифицировать. Поэтому имена также называют идентификаторами.
Имена дает программист, при этом следует соблюдать следующие правила:
· имя должно начинаться с буквы (или знака подчеркивания);
· имя должно содержать только буквы, знак подчеркивания и цифры;
· прописные и строчные буквы не различаются;
· длина имени практически не ограничена.
Например, правильными именами будут Vasia, A, A13, A_and_B и _____, а неправильными — 2late, Big gig и Sюр. Имена даются элементам программы, к которым требуется обращаться: переменным, константам, процедурам, функциям, меткам и т. д.
Ключевые (зарезервированные) слова — это идентификаторы, имеющие специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. Например, для оператора перехода определено ключевое слово goto, а для описания переменных — var. Имена, создаваемые программистом, не должны совпадать с ключевыми словами.
Знак операции — это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. Например, операция сравнения 'меньше или равно' обозначается <=, а целочисленное деление записывается как div. Операции делятся на унарные (с одним операндом) и бинарные (с двумя).
Типы данных
Данные, с которыми работает программа, хранятся в оперативной памяти. Компилятору необходимо точно знать, сколько места они занимают, как именно закодированы и какие действия с ними можно выполнять. Все это задается при описании данных с помощью типа. Тип данных однозначно определяет:
· внутреннее представление данных, а следовательно и множество их возможных значений;
· допустимые действия над данными (операции и функции).
Например, целые и вещественные числа, даже если они занимают одинаковый объем памяти, имеют совершенно разные диапазоны возможных значений; целые числа можно умножать друг на друга, а, например, символы — нельзя. Каждое выражение в программе имеет определенный тип. Компилятор использует информацию о типе при проверке допустимости описанных в программе действий.
Классификация типов
Рассмотрим классификацию типов в таблице 1.2.
Таблица 1.2. Классификация типов Паскаля
Стандартные типы не требуют предварительного определения. Для каждого типа существует ключевое слово, которое используется при описании переменных, констант и т. д. Если же тип данных определяет сам программист, он описывает его характеристики и дает ему имя, которое затем применяется точно так же, как имена стандартных типов. Описание собственного типа данных должно задавать всю информацию, необходимую для его использования: внутреннее представление и допустимые действия.
ПРИМЕЧАНИЕ Типы, выделенные в таблица 1.2 полужирным шрифтом, объединяются термином «порядковые»'. Этот термин рассмотрен далее в этой лекции.
Стандартные типы данных
1 Логические типы
Внутреннее представление. Основной логический тип данных Паскаля называется boolean. Величины этого типа занимают в памяти 1 байт и могут принимать всего два значения: true (истина) или false (ложь). Внутреннее представление значения false — 0 (нуль), значения true — 1.
Операции. К величинам логического типа применяются логические операции and, or, xor и not (таблица 1.3). Для наглядности вместо значения false в таблице используется 0, а вместо true — 1.
Таблица 1.3. Логические операции
Операция and называется ' логическое И ', или логическое умножение. Ее результат имеет значение true, только если оба операнда имеют значение true.
Результат операции or (логическое ИЛИ, логическое сложение) имеет значение true, если хотя бы один из операндов имеет значение true. Например, false or true true, true or true true.
Операция xor — так называемое исключающее ИЛИ, или операция неравнозначности. Ее результат истинен, когда значения операндов не совпадают.
Логическое отрицание not является унарной операцией, то есть имеет один операнд, который и инвертирует. Например, not true даст в результате false.
Величины логического типа можно сравнивать между собой с помощью операций отношения, перечисленных в таблице 1.4. Результат этих операций имеет логический тип.
Таблица 1.4. Операции отношения
Целые типы
Внутреннее представление. Целые числа представляются в компьютере в двоичной системе счисления. В Паскале определены несколько целых типов данных, отличающиеся длиной и наличием знака: старший двоичный разряд либо воспринимается как знаковый, либо является обычным разрядом числа (таблица 1.5). Внутреннее представление определяет диапазоны допустимых значений величин (от нулей до единиц во всех двоичных разрядах).
Таблица 1.5. Целые типы данных
Операции. С целыми величинами можно выполнять арифметические операции (таблица 1.6). Результат их выполнения всегда целый (при делении дробная часть отбрасывается).
Таблица 1.6. Арифметические операции для целых величин
К целым величинам можно также применять операции отношения, а также поразрядные операции and, or, xor и not. При выполнении этих операций каждая величина представляется как совокупность двоичных разрядов. Действие выполняется над каждой парой соответствующих разрядов операндов: первый разряд с первым, второй — со вторым, и т. д. Например, результатом операции 3 and 2 будет 2, поскольку двоичное представление числа 3 — 11, числа 2 — 10.
Для работы с целыми величинами предназначены также операции сдвига влево shl и вправо shr. Слева от знака операции указывается, с какой величиной будет выполняться операция, а справа — на какое число двоичных разрядов требуется сдвинуть величину. Например, результатом операции 12 shr 2 будет значение 3, а выполнив операцию 12 shl 1, то есть сдвинув это число влево на 1 разряд, получим 24. Освободившиеся при сдвиге влево разряды заполняются нулями, а при сдвиге вправо — знаковым разрядом.
Стандартные функции и процедуры. К целым величинам можно применять стандартные функции и процедуры, перечисленные в таблице 1.7 (в тригонометрических функциях угол задается в радианах).
Таблица 1.7. Стандартные функции и процедуры для целых величин
Правила записи стандартных функций:
1. Имя функции записывается латинскими буквами.
2. Аргумент функции записывается в круглых скобках после имени функции.
3. Аргументом функции может быть: константа, переменная или арифметическое выражение.
Например:
Рассмотрим примеры использования арифметических действий.
Правильно:
Неправильно:
Слева по отношению к оператору присваивания должен стоять более широкий тип:
Вещественные типы
Внутреннее представление. Вещественные типы данных хранятся в памяти компьютера иначе, чем целые. Внутреннее представление вещественного числа состоит из двух частей — мантиссы и порядка, и каждая часть имеет знак. Например, число 0,087 представляется в виде 0,87 10–1, и в памяти хранится мантисса 0,87 и порядок –1 (для наглядности мы пренебрегли тем, что данные на самом деле представляются в двоичной системе счисления и несколько сложнее).
Существует несколько вещественных типов, различающихся точностью и диапазоном представления данных (таблица 1.8). Точность числа определяется длиной мантиссы, а диапазон — длиной порядка.
Таблица 1.8. Вещественные типы данных
ПРИМЕЧАНИЕ. Для первых четырех типов в таблица 1.8 приведены абсолютные величины минимальных и максимальных значений.
Величины типа comp хранятся так же, как целые, но отнести его к целым мешает то, что тип comp не относится к порядковым типам. Операции. С вещественными величинами можно выполнять арифметические операции, перечисленные в таблице 1.9. Результат их выполнения — вещественный.
Таблица 1.9. Арифметические операции для вещественных величин
В общем случае при выполнении любой операции операнды должны быть одного и того же типа, но целые и вещественные величины смешивать разрешается.
ПРИМЕЧАНИЕ Обратите внимание, что целочисленное и вещественное деление записываются с помощью разных знаков операций. Если требуется получить вещественный результат деления двух целых величин, нужно использовать операцию /, если целый — операцию div.
К вещественным величинам можно также применять операции отношения.
Стандартные функции. К вещественным величинам можно применять стандартные функции, приведенные в таблице 1.10 (в тригонометрических функциях угол задается в радианах).
Таблица 1.10. Стандартные функции и процедуры для вещественных величин
Символьный тип
Этот тип данных, обозначаемый ключевым словом char, служит для представления любого символа из набора допустимых символов. Под каждый символ отводится 1 байт. К символам можно применять операции отношения (<, <=, >, >=, =, <>), при этом сравниваются коды символов. Меньшим окажется символ, код которого меньше. Других операций с символами нет. Стандартных подпрограмм для работы с символами тоже немного (таблица 1.11).
Таблица 1.11. Стандартные функции для символьных величин
Порядковые типы
В группу порядковых объединены целые, символьный, логический, перечисляемый и интервальный типы. Сделано это потому, что они обладают следующими общими чертами:
· все возможные значения порядкового типа представляют собой ограниченное упорядоченное множество;
· к любому порядковому типу может быть применена стандартная функция Ord, которая в качестве результата возвращает порядковый номер конкретного значения в данном типе;
· к любому порядковому типу могут быть применены стандартные функции Pred и Succ, которые возвращают предыдущее и последующее значения соответственно;
· к любому порядковому типу могут быть применены стандартные функции Low и High, которые возвращают наименьшее и наибольшее значения величин данного типа.
При изучении операторов Паскаля мы увидим, что в некоторых из них допускается использовать только величины порядковых типов.
Приведение типов
Иногда при программировании требуется явным образом преобразовывать величину одного типа в величины другого. Для этого служит операция приведения типа, которая записывается так:
имя_типа (преобразуемая_величина)
Например:
integer ('A')
byte(500)
Размер преобразуемой величины должен быть равен числу байтов, отводимых под величины типа, в который она преобразуется. Исключение составляют преобразования более длинных целых типов в более короткие: в этом случае лишние биты просто отбрасываются. Приведение типа изменяет только точку зрения компилятора на содержимое ячеек памяти, никакие преобразования внутреннего представления при этом не выполняются.
Линейные программы
Линейной называется программа, все операторы которой выполняются в том порядке, в котором они записаны. Это самый простой вид программ.
Переменные
Переменная — это величина, которая во время работы программы может менять свое значение. Все переменные, используемые в программе, должны быть описаны в разделе описания переменных, начинающемся со служебного слова var. Для каждой переменной задается ее имя и тип, например:
var number: integer;
x, y: real;
option: char;
Имя переменной определяет место в памяти, по которому находится значение переменной. Имя дает программист. Оно должно отражать смысл хранимой величины и быть легко распознаваемым.
Тип переменных выбирается исходя из диапазона и требуемой точности представления данных.
При объявлении можно присвоить переменной некоторое начальное значение, то есть инициализировать ее. Под инициализацией понимается задание значения, выполняемое до начала работы программы. Инициализированные переменные описываются после ключевого слова const.
const number: integer = 100;
x: real = 0.02;
option: char = 'ю';
По умолчанию все переменные, описанные в главной программе, обнуляются.
Выражения
Выражение — это правило вычисления значения. В выражении участвуют операнды, объединенные знаками операций. Операндами выражения могут быть константы, переменные и вызовы функций. Операции выполняются в определенном порядке в соответствии с приоритетами, как и в математике. Для изменения порядка выполнения операций используются круглые скобки, уровень их вложенности практически не ограничен.
Результатом выражения всегда является значение определенного типа, который определяется типами операндов. Величины, участвующие в выражении, должны быть совместимых типов. Например, допускается использовать в одном выражении величины целых и вещественных типов. Результат такого выражения будет вещественным.
Ниже приведены операции Паскаля, упорядоченные по убыванию приоритетов.
· Унарная операция not, унарный минус –, взятие адреса @.
· Операции типа умножения: *, /, div, mod, and, shl, shr.
· Операции типа сложения: +, –, or, xor.
· Операции отношения: =, <, >, <>, <=, >=, in.
Функции, используемые в выражении, вычисляются в первую очередь. Константа и переменная являются частными случаями выражения.
Примеры выражений:
t + sin(x)/2 * x — результат имеет вещественный тип;
a <= b + 2 — результат имеет логический тип;
(x > 0) and (y < 0) — результат имеет логический тип.
Порядок вычисления первого выражения такой: сначала выполняется обращение к стандартной функции sin и результат делится на 2, затем получившееся число умножается на x, и только после этого выполняется сложение с переменной t. Скобки в третьем выражении необходимы по той причине, что приоритет операций отношения ниже, чем логической операции and.
Структура программы
Программа на Паскале состоит из заголовка, разделов описаний и раздела операторов.
program имя; { заголовок – не обязателен }
разделы описаний
begin
раздел операторов
end. (* программа заканчивается точкой *)
Программа может содержать комментарии, заключенные в фигурные скобки { } или в скобки вида (* *). Комментарии служат для документирования программы — компилятор их игнорирует, поэтому на их содержимое никаких ограничений не накладывается. Операторы отделяются друг от друга символом; (точка с запятой).
В разделе операторов записываются исполняемые операторы программы. Ключевые слова begin и end не являются операторами, а служат для их объединения в так называемый составной оператор, или блок. Блок может записываться в любом месте программы, где допустим обычный оператор.
Разделы описаний бывают нескольких видов: описание модулей, констант, типов, переменных, меток, процедур и функций. Модуль — это подключаемая к программе библиотека ресурсов (подпрограмм, констант и т.п.).
Раздел описания модулей, если он присутствует, должен быть первым. Описание начинается с ключевого слова uses, за которым через запятую перечисляются все подключаемые к программе модули, как стандартные, так и собственного изготовления, например:
uses crt, graph, my_module;
Количество и порядок следования остальных разделов произвольны, ограничение только одно: любая величина должна быть описана до ее использования. Признаком конца раздела описания является начало следующего раздела. В программе может быть несколько однотипных разделов описаний.
В разделе описания переменных необходимо определить все переменные, которые будут использоваться в основной программе. Раздел описания констант служит для того, чтобы вместо значений констант можно было использовать в программе их имена. Такие константы называют именованными, например:
const MaxLen = 100; g = 9.8;
koeff = 5;
Применение именованных констант при осмысленном выборе имен улучшает читабельность программы и облегчает внесение в нее изменений. Кроме того, в разделе описания констант описываются переменные, которым требуется присвоить значение до начала работы программы:
const weight: real = 61.5;
Синтаксически такая переменная отличается от константы наличием типа. Впоследствии ею можно пользоваться так же, как и другими переменными.
Раздел описания меток начинается с ключевого слова label, за которым через запятую следует перечисление всех меток, встречающихся в программе. Метки служат для организации перехода на конкретный оператор с помощью оператора безусловного перехода goto. Метка — это либо имя, либо положительное число, не превышающее 9999. Метка ставится перед любым исполняемым оператором и отделяется от него двоеточием:
Оператор присваивания
Присваивание — это занесение значения в память. В общем виде оператор присваивания записывается так:
переменная:= выражение
Здесь символами:= обозначена операция присваивания. Механизм выполнения оператора присваивания такой: вычисляется выражение и его результат заносится в память по адресу, который определяется именем переменной, находящейся слева от знака операции:
переменная <- выражение
Примеры операторов присваивания:
a:= b + c / 2;
b:= a;
a:= b;
x:= 1;
x:= x + 0.5;
Обратите внимание: b:= a и a:= b — это совершенно разные действия!
ПРИМЕЧАНИЕ Чтобы не перепутать, что чему присваивается, запомните мнемоническое правило: присваивание — это передача данных «налево».
Правая и левая части оператора присваивания должны быть совместимы по присваиванию (о совместимости мы поговорим в конце третьей лекции). Например, выражение целого типа можно присвоить вещественной переменной.
Процедуры ввода-вывода
Любая программа при вводе исходных данных и выводе результатов взаимодействует с внешними устройствами. Совокупность стандартных устройств ввода и вывода, то есть клавиатуры и экрана дисплея, называется консолью. Обмен данными с консолью является частным случаем обмена с внешними устройствами.
Ввод с клавиатуры
Для ввода с клавиатуры определены процедуры read и readln.
read(список);
readln[(список)];
В скобках указывается список имен переменных через запятую. Квадратные скобки указывают на то, что список может отсутствовать. Например:
read(a, b, c);
readln(y);
readln;
Вводить можно целые, вещественные, символьные и строковые величины. Вводимые значения должны разделяться любым количеством пробельных символов (пробел, табуляция, перевод строки).
Ввод значения каждой переменной выполняется так.
1. Значение переменной выделяется как группа символов, расположенных между разделителями.
2. Эти символы преобразуются во внутреннюю форму представления, соответствующую типу переменной.
3. Значение записывается в ячейку памяти, определяемую именем переменной.
Например, при вводе вещественного числа 3.78 в переменную типа real оно преобразуется из четырех символов (3, 'точка', 7 и 8) в шестибайтовое представление в виде мантиссы и порядка.
Процедура readln после ввода всех значений выполняет переход на следующую строку исходных данных. Иными словами, если в следующей части программы есть ввод, он будет выполняться из следующей строки исходных данных. При использовании процедуры read очередные исходные данные будут взяты из той же строки. Процедура readln без параметров просто ожидает нажатия клавиши Enter.
Особенность ввода символов и строк состоит в том, что пробельные символы в них ничем не отличаются от всех остальных, поэтому разделителями являться не могут. Например, пусть определены переменные
var a: integer;
b: real;
d: char;
и в программе есть процедура ввода read(a, b, c). Допустим, переменной а надо задать значение, равное 2, переменной b — 3,78, а в переменную c требуется записать символ #. Любой вариант расположения исходных данных приведет к неверному результату, потому что после второго числа требуется поставить пробельный символ для того, чтобы его можно было распознать, и этот же символ будет воспринят как значение переменной c.
Правильным решением является ввод чисел и символов в разных процедурах и размещение символов в отдельной строке, например:
readln(a, b);
readln(c);
Ввод данных выполняется через буфер — специальную область оперативной памяти. Фактически данные сначала заносятся в буфер, а затем считываются оттуда процедурами ввода. Занесение в буфер выполняется по нажатию клавиши Enter вместе с ее кодом (#13 #10). Процедура read, в отличие от readln, не очищает буфер, поэтому следующий после нее ввод будет выполняться с того места, на котором закончился предыдущий, то есть начиная с символа конца строки.
read(a); { считывается целое }
write('Продолжить? (y/n) ');
readln(c); { вместо ожидания ввода символа считывается символ #13 из предыдущего ввода }
Чтобы избежать подобной ситуации, следует вместо read использовать readln.
Вывод на экран
При выводе выполняется преобразование из внутреннего представления в символы, выводимые на экран. Для этого определены стандартные процедуры write и writeln.
write(список);
writeln[(список)];
Процедура write выводит указанные в списке величины на экран, а writeln вдобавок к этому переводит курсор на следующую строку. Процедура writeln без параметров просто переводит курсор на следующую строку.
Выводить можно величины логических, целых, вещественных, символьного и строкового типов. В списке могут присутствовать не только имена переменных, но и выражения, а также их частный случай — константы. Кроме того, для каждого выводимого значения можно задавать его формат, например:
writeln('Значение a = ', a:4, ' b = ', b:6:2, sin(a) + b);
Рассмотрим этот оператор подробно (переменные a и b описаны выше). В списке вывода пять элементов, разделенных запятыми. В начале записана строковая константа в апострофах, которая выводится без изменений, со всеми пробелами. В непосредственной близости от нее будет выведено значение целой переменной a. После имени переменной через двоеточие указано количество отводимых под нее позиций, внутри которых значение выравнивается по правому краю (после второго двоеточия записано количество цифр десятичной части).
Третьим элементом списка является строковая константа, поясняющая расположенное после нее значение переменной b. Для b указаны две форматные спецификации, означающие, что под эту переменную отводится всего шесть позиций, причем две из них — под дробную часть (еще одна позиция будет занята десятичной точкой, итого на целую часть остается три позиции).
Последний элемент списка вывода — выражение, значение которого будет выведено в форме по умолчанию (с порядком):
Значение a = 2 b = 3.78 4.6892974268E+00
Общие правила записи процедур вывода:
· Список вывода разделяется запятыми.
· Список содержит выражения, а также их частные случаи — переменные и константы логических, целых, вещественных, символьного и строкового типов.
· После любого значения можно через двоеточие указать формат, то есть количество отводимых под него позиций. Если значение короче, оно 'прижимается' к правому краю отведенного поля, если длиннее, поле 'раздвигается' до необходимых размеров.
· Для вещественных чисел можно указать второй формат, указывающий, сколько позиций из общего количества отводится под дробную часть числа. Необходимо учитывать, что десятичная точка также занимает одну позицию. Если второй или оба формата не указаны, вещественное число выводится в форме с порядком.
· Если форматы не указаны, под целое число, символ и строку отводится минимально необходимое для их представления количество позиций. Под вещественное число всегда отводится 17 позиций, причем 10 из них — под его дробную часть.
· Форматы могут быть выражениями целого типа.
Рассмотрим пример.
Пример. Программа, которая переводит температуру в градусах по Фаренгейту в градусы Цельсия по формуле: С = 5/9 (F – 32), где C — температура по Цельсию, а F — температура по Фаренгейту.
program temperature;
var fahr, cels: real; { 1 }
begin
writeln('Введите температуру по Фаренгейту'); { 2 }
readln(fahr); { 3 }
cels:= 5 / 9 * (fahr – 32); { 4 }
writeln('По Фаренгейту: ', fahr:6:2, ' в градусах Цельсия: ', cels:6:2); {5}
end.
Для хранения исходных данных и результатов требуется выделить место в памяти. Это сделано в операторе 1. Для переменных fahr и cels выбран вещественный тип real. Оператор 2 представляет собой приглашение ко вводу данных. Ввод выполняется в операторе 3 с помощью процедуры readln. В операторе 4 вычисляется выражение, записанное справа от операции присваивания, и результат присваивается переменной cels. При вычислении целые константы преобразуются компилятором в вещественную форму. В пятом операторе выводятся исходное и рассчитанное значение с соответствующими пояснениями.
Задача 1. Написать программу, которая вводит значения двух любых чисел, выводит на экран сумму, разность, произведение и частное от деления этих чисел. Ввод каждого числа произвести с отдельной строке. Каждый результат также нужно поместить на отдельную строку, пояснив в комментарии, чему соответствует выводимое число.
Задача 2. Написать программу определения цифр трехзначного числа.
Задача 3. Написать программу перевода суммы в рублях в американские доллары и евро.