Презентацию к данной работе Вы можете скачать здесь.
Этот курс лекций построен на основе учебника автора 'Паскаль. Программирование на языке высокого уровня' , который выпускается издательством ПИТЕР с 2003 года. Учебник имеет гриф Министерства образования Российской федерации и удостоен в 2010 году премии Правительства Санкт-Петербурга 'За выдающиеся достижения в сфере высшего и профессионального образования' в составе учебно-методического комплекса по языкам программирования.
В этот комплекс входят также учебники и практикумы по языкам C/C++ и С#
, построенные по единому принципу.
Соответствующие учебные курсы можно найти на этом сайте. В 2010 году вышло второе
издание учебника , объединенное с практикумом и
справочной информацией. В комплекс входит более 250 индивидуальных вариантов заданий
на лабораторные работы в расчете на учебную группу из 20 человек (все варианты можно
найти в учебнике) и более 1000 тестовых вопросов. Преподавателям будут полезны презентации
лекций. На сайте интернет-школы программирования
можно проверить правильность выполнения некоторых лабораторных работ с помощью системы
Доброжелательную и конструктивную критику, а также предложения по улучшению курса направляйте автору по адресу pta-ipm@yandex.ru.
Для решения задачи на компьютере требуется написать программу. Программа состоит из исполняемых операторов и операторов описания. Исполняемый оператор задает законченное действие, выполняемое над данными. Примеры исполняемых операторов: вывод на экран, занесение числа в память, выход из программы.
Оператор описания, как и следует из его названия, описывает данные, над которыми в программе выполняются действия. Примером описания (конечно, не на Паскале, а на естественном языке) может служить предложение 'В памяти следует отвести место для хранения целого числа, и это место мы будем обозначать А'.
Исполняемые операторы для краткости часто называют просто операторами, а операторы описания — описаниями. Описания должны предшествовать операторам, в которых используются соответствующие данные. Операторы исполняются последовательно, один за другим, если явным образом не задан иной порядок.
Рассмотрим простейшую программу на Паскале. Все, что она делает — вычисляет и выводит на экран сумму двух целых чисел, введенных с клавиатуры.
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, результат будет выглядеть так:
Cумма чисел 2 и 3 равна 5
В строке 4 выполняется вычисление суммы и присваивание ее значения переменной sum. Справа от знака операции присваивания, обозначаемой символами :=, находится выражение — правило вычисления значения.
Чтобы выполнить программу, требуется перевести ее на язык, понятный процессору, — в машинные коды. Этим занимается компилятор.Каждый оператор языка переводится в последовательность машинных команд. Компилятор планирует размещение данных в оперативной памяти в соответствии с операторами описания. Попутно он ищет синтаксические ошибки, то есть ошибки записи операторов. Кроме этого, в Паскале на компилятор возложена еще одна обязанность — подключение к программе стандартных подпрограмм (например, ввода данных или вычисления синуса угла).
Все тексты на языке пишутся с помощью его алфавита. Алфавит Паскаля включает:
_ ;0 до 9 ;+, *, { и @ ;Из символов составляются лексемы (tokens ), то есть минимальные единицы языка, имеющие самостоятельный смысл:
Лексемы языка программирования аналогичны словам естественного языка. Например, лексемами являются число 128, имя Vasia, ключевое слово goto и знак операции сложения +. Компилятор при синтаксическом разборе текста программы определяет границы одних лексем по другим, например разделителям или знакам операций. Из лексем строятся выражения и операторы. Рассмотрим каждый вид лексем подробнее.
Константа — величина, не изменяющая свое значение в процессе работы программы. Классификация констант Паскаля приведена в шапке таблица 1.1. Нижние строки таблицы представляют собой примеры соответствующих констант.
| Целые | Вещественные | Символьные | Строковые | ||
|---|---|---|---|---|---|
| Десятичные | Шестнадцатеричные | С плавающей точкой | С порядком | ||
2 |
$0101 |
–0.26 |
1.2e4 |
'k' |
'абырвалг' |
15 |
$FFA4 |
.005 |
0.1E–5 |
#186 |
'I''m fine' |
21. |
^M |
||||
Десятичные целые константы представляются в естественной форме. Шестнадцатеричная константа состоит из шестнадцатеричных цифр (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F), предваряемых знаком $.
Вещественные константы записываются с точкой перед дробной частью. Либо целая, либо дробная часть могут отсутствовать. Вещественная константа с порядком представляется в виде мантиссы и порядка. Мантисса записывается слева от знака представлены числа 1,2 104 и 0,1 10–5 . Пробелы внутри числа не допускаются.
Символьные константы служат для представления любого символа из набора, используемого в данном компьютере. Так как под каждый символ отводится 1 байт, всего используется 256 символов. Каждому символу соответствует свой код. В операционной системе MS-DOS для кодировки символов используется стандарт ASCII, являющийся международным только в первой половине кодов (от 0 до 127), вторая половина кодов (от 128 до 255) является национальной и различна для разных стран. Первые 32 символа являются управляющими:хотя многие из них имеют графическое представление, предназначены они для передачи управляющих сигналов внешним устройствам, например монитору, принтеру или модему. Символьные константы записываются в одной из трех форм:
#186 приведено представление символа ¦ ).^M представлен символ с кодом 13).Строковая константа — это последовательность любых ASCII-символов, расположенная на одной строке и заключенная в апострофы. Если требуется представить сам апостроф, он дублируется. Максимальная длина строковой константы — 126 символов.
Имена в программах служат той же цели, что и имена людей, — чтобы обращаться к программным объектам и различать их, то есть идентифицировать. Поэтому имена также называют идентификаторами.
Имена дает программист, при этом следует соблюдать следующие правила:
Например, правильными именами будут Vasia, A, A13, A_and_B и _____, а неправильными — 2late, Big и Sюр. Имена даются элементам программы, к которым требуется обращаться: переменным, константам, процедурам, функциям, меткам и т. д.
Ключевые ( зарезервированные ) слова — это идентификаторы, имеющие специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. Например, для goto, а для описания переменных — var. Имена, создаваемые программистом, не должны совпадать с ключевыми словами.
Знак операции — это один или более символов, определяющих действие
над операндами. Внутри знака операции пробелы не допускаются. Например, операция
сравнения 'меньше или равно' обозначается <=, а целочисленное деление записывается
как div. Операции делятся на унарные (с одним операндом) и бинарные (с двумя).
Данные, с которыми работает программа, хранятся в оперативной памяти. Компилятору необходимо точно знать, сколько места они занимают, как именно закодированы и какие действия с ними можно выполнять. Все это задается при описании данных с помощью типа. Тип данных однозначно определяет:
Например, целые и вещественные числа, даже если они занимают одинаковый объем памяти, имеют совершенно разные диапазоны возможных значений; целые числа можно умножать друг на друга, а, например, символы — нельзя. Каждое выражение в программе имеет определенный тип. Компилятор использует информацию о типе при
Рассмотрим классификацию типов в таблица 1.2.
| Стандартные | Определяемые программистом | ||
|---|---|---|---|
| Простые | Составные | ||
| Логические | |||
| Целые | |||
| Вещественные | Перечисляемый | Массивы | Файлы |
| Символьный | Интервальный | Строки | Процедурные типы |
| Строковый | Адресные | Записи | Объекты |
| Адресный | Множества | ||
| Файловые | |||
Стандартные типы не требуют предварительного определения. Для каждого типа существует ключевое слово, которое используется при описании переменных, констант и т. д. Если же тип данных определяет сам программист, он описывает его характеристики и дает ему имя, которое затем применяется точно так же, как имена стандартных типов. Описание собственного типа данных должно задавать всю информацию, необходимую для его использования: внутреннее представление и допустимые действия.
Внутреннее представление. Основной логический тип данных Паскаля называется boolean. Величины этого типа занимают в памяти 1 байт и могут принимать всего два значения: true (истина) или false (ложь). Внутреннее представление значения false — 0 (нуль), значения true — 1.
Операции. К величинам логического типа применяются логические операции ). Для наглядности вместо значения false в таблице используется 0, а вместо true — 1.
| a | b | a and b | a or b | a xor b | not a |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
Операция and называется ' логическое И ', или логическое умножение. Ее результат имеет значение true, только если оба операнда имеют значение true.
Результат операции or ( логическое ИЛИ, логическое сложение) имеет значение true, если хотя бы один из операндов имеет значение true. Например, false or true true, true or true true.
Операция xor — так называемое исключающее ИЛИ, или операция неравнозначности. Ее результат истинен, когда значения операндов не совпадают.
Логическое отрицание not является унарной операцией, то есть имеет один операнд, который и инвертирует. Например, not true даст в результате false.
Величины логического типа можно сравнивать между собой с помощью . Результат этих операций имеет логический тип.
| Операция | Знак операции | Операция | Знак операции |
|---|---|---|---|
| Больше | > |
Меньше или равно | <= |
| Больше или равно | >= |
Равно | = |
| Меньше | < |
Не равно | <> |
). Внутреннее представление определяет диапазоны допустимых значений величин (от нулей до единиц во всех двоичных разрядах).
| Тип | Название | Размер | Знак | Диапазон значений |
|---|---|---|---|---|
integer |
Целое | 2 байта | Есть | –32 768 .. 32 767 (–215 .. 215–1) |
shortint |
Короткое целое | 1 байт | Есть | –128 .. 127 (–2 7 .. 27–1) |
byte |
Байт | 1 байт | Нет | 0 .. 255 (0 .. 28–1) |
word |
Слово | 2 байта | Нет | 0 .. 65 535 (0 .. 2 16–1) |
longint |
Длинное целое | 4 байта | Есть | –2 147 483 648 .. 2 147 483 647 (–2 31 .. 231–1) |
). Результат их выполнения всегда целый (при делении дробная часть отбрасывается).
| Операция | Знак операции | Операция | Знак операции |
|---|---|---|---|
| Сложение | + |
Деление | div |
| Вычитание | – |
Остаток от деления | mod |
| Умножение | * |
К целым величинам можно также применять операции отношения, а также поразрядные операции and, or, xor и not. При выполнении этих операций каждая величина представляется как совокупность двоичных разрядов. Действие выполняется над каждой парой соответствующих разрядов операндов: первый разряд с первым, второй — со вторым, и т. д. Например, результатом операции 3 and 2 будет 2, поскольку двоичное представление числа 3 — 11, числа 2 — 10.
Для работы с целыми величинами предназначены также операции сдвига влево и вправо shr. Слева от знака операции указывается, с какой величиной будет выполняться операция, а справа — на какое число двоичных разрядов требуется сдвинуть величину. Например, результатом операции 12 shr 2 будет значение 3, а выполнив операцию 12 , то есть сдвинув это число влево на 1 разряд, получим 24. Освободившиеся при сдвиге влево разряды заполняются нулями, а при сдвиге вправо — знаковым разрядом.
(в тригонометрических функциях угол задается в радианах).
| Имя | Описание | Результат | Пояснения |
|---|---|---|---|
| Функции | |||
abs |
Модуль | Целый | |x| записывается abs(x) |
arctan |
Арктангенс угла | Вещественный | arctg x записывается arctan(x) |
cos |
Косинус угла | Вещественный | cos x записывается cos(x) |
exp |
Экспонента | Вещественный | e x записывается exp(x) |
ln |
Натуральный логарифм | Вещественный | log ex записывается ln(x) |
|
Проверка на четность | Логический | даст в результате true |
pred |
Предыдущее значение | Целый | pred(3) даст в результате 2 |
sin |
Синус угла | Вещественный | sin x записывается sin(x) |
sqr |
Квадрат | Целый | x 2 записывается sqr(x) |
sqrt |
Квадратный корень | Вещественный | $$\surd x$$ записывается sqrt(x) |
succ |
Следующее значение | Целый | succ(3) даст в результате 4 |
| Процедуры | |||
inc |
Инкремент | inc(x) — увеличить х на 1 inc(x, 3) — увеличить х на 3 |
|
dec |
Декремент | dec(x) — уменьшить х на 1 dec (x, 3) — уменьшить х на 3 |
|
Внутреннее представление.Вещественные типы данных хранятся в памяти компьютера иначе, чем
Существует несколько вещественных типов, различающихся точностью и диапазоном представления данных (таблица 1.8). Точность числа определяется длиной мантиссы, а диапазон — длиной порядка.
| Тип | Название | Размер | Значащих десятичных цифр | Диапазон значений |
|---|---|---|---|---|
real |
Вещественный | 6 байт | 11–12 | 2.9e–39 .. 1.7e+38 |
single |
Одинарной точности | 4 байта | 7–8 | 1.5e–45 .. 3.4e+38 |
double |
Двойной точности | 8 байт | 15–16 | 5.0e–324 .. 1.7e+308 |
extended |
Расширенный | 10 байт | 19–20 | 3.4e–4932 .. 1.1e+4923 |
comp |
Большое целое | 8 байт | 19–20 | –9.22e18 .. 9.22e18 (–2 63 .. 2 63–1) |
Величины типа . Результат их выполнения — вещественный.
| Операция | Знак операции | Операция | Знак операции |
|---|---|---|---|
| Сложение | + |
Умножение | * |
| Вычитание | – |
Деление | / |
В общем случае при выполнении любой операции операнды должны быть одного и того же типа, но целые и вещественные величины смешивать разрешается.
/, если целый — операцию div.К вещественным величинам можно также применять операции отношения.
Стандартные функции.К вещественным величинам можно применять стандартные функции, приведенные в таблице 1.10 (в тригонометрических функциях угол задается в радианах).
| Имя | Описание | Результат | Пояснения |
|---|---|---|---|
abs |
Модуль | Вещественный | |x| записывается abs(x) |
arctan |
Арктангенс угла | Вещественный | arctg x записывается arctan(x) |
cos |
Косинус угла | Вещественный | cos x записывается cos(x) |
exp |
Экспонента | Вещественный | e x записывается exp(x) |
frac |
Дробная часть аргумента | Вещественный | frac(3.1) даст в результате 0,1 |
int |
Целая часть аргумента | Вещественный | int(3.1) даст в результате 3,0 |
ln |
Натуральный логарифм | Вещественный | log ex записывается ln(x) |
pi |
Значение числа $$\pi$$ | Вещественный | 3,1415926536 |
round |
Округление до целого | Целый | round(3.1) даст в результате 3 round (3.8) даст в результате 4 |
sin |
Синус угла | Вещественный | sin x записывается sin(x) |
sqr |
Квадрат | Вещественный | x 2 записывается sqr(x) |
sqrt |
Квадратный корень | Вещественный | $$\surd x$$ записывается sqrt(x) |
trunc |
Целая часть аргумента | Целый | trunc(3.1) даст в результате 3 |
Этот тип данных, обозначаемый ключевым словом char, служит для представления
любого символа из набора допустимых символов. Под каждый символ отводится 1 байт.
К символам можно применять операции отношения (<, <=, >, >=, =, <>),
при этом сравниваются коды символов. Меньшим окажется символ, код которого меньше.
Других операций с символами нет. Стандартных подпрограмм для работы с символами тоже немного (таблица 1.11).
| Имя | Описание | Результат | Пояснения |
|---|---|---|---|
ord |
Порядковый номер символа | Целый | ord('b') даст в результате 98
ord('ю') даст в результате 238
|
chr |
Преобразование в символ | Символьный | chr(98) даст в результате 'b' chr(238) даст в результате 'ю ' |
pred |
Предыдущий символ | Символьный | pred('b') даст в результате ' a ' |
succ |
Последующий символ | Символьный | succ('b') даст в результате ' c ' |
|
Перевод в верхний регистр (только для символов из диапазона ' a ' … ' z ') |
Символьный | даст в результате ' B ' |
В группу порядковых объединены целые, символьный, логический, перечисляемый и интервальный типы. Сделано это потому, что они обладают следующими общими чертами:
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
Количество и порядок следования остальных разделов произвольны, ограничение только одно: любая величина должна быть описана до ее использования. Признаком конца раздела описания является начало следующего раздела. В программе может быть несколько однотипных разделов описаний.
В разделе описания переменных необходимо определить все переменные, которые будут использоваться в основной программе. Раздел описания констант служит для того, чтобы вместо значений констант можно было использовать в программе их имена. Такие константы называют именованными, например:
const MaxLen = 100; g = 9.8;
koeff = 5;
Применение именованных констант при осмысленном выборе имен улучшает читабельность программы и облегчает внесение в нее изменений. А еще в разделе описания констант описываются переменные, которым требуется присвоить значение до начала работы программы:
const weight : real = 61.5;
Синтаксически такая переменная отличается от константы наличием типа. Впоследствии ею можно пользоваться так же, как и другими переменными.
Раздел описания меток начинается с ключевого слова label, за которым через запятую следует перечисление всех меток, встречающихся в программе. Метки служат для организации перехода на конкретный оператор с помощью оператора безусловного перехода goto. Метка — это либо имя, либо положительное число, не превышающее 9999. Метка ставится перед любым исполняемым оператором и отделяется от него двоеточием:
label 1, 2, error;
Присваивание — это занесение значения в память. В общем виде оператор присваивания записывается так:
переменная := выражение
Здесь символами := обозначена операция присваивания. Механизм выполнения оператора присваивания такой: вычисляется выражение и его результат заносится в память по адресу, который определяется именем переменной, находящейся слева от знака операции:
переменная <- выражение
Примеры операторов присваивания:
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;
Вводить можно целые, вещественные, символьные и строковые величины. Вводимые значения должны разделяться любым количеством пробельных символов (пробел, табуляция, перевод строки).
Ввод значения каждой переменной выполняется так.
Например, при вводе вещественного числа 3.78 в переменную типа real оно преобразуется из четырех символов (3, 'точка', 7 и 8) в шестибайтовое представление в виде мантиссы и порядка.
Процедура readln после ввода всех значений выполняет переход на следующую строку исходных данных. Иными словами, если в следующей части программы есть ввод, он будет выполняться из следующей строки исходных данных. При использовании процедуры read очередные исходные данные будут взяты из той же строки. Процедура readln без параметров просто ожидает нажатия клавиши Enter.
Особенность ввода символов и строк состоит в том, что пробельные символы в них ничем не отличаются от всех остальных, поэтому разделителями являться не могут. Например, пусть определены переменные
var a : integer;
b : real;
c : 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
Теперь, когда мы познакомились с примером, можно сформулировать общие правила записи процедур вывода.
Теперь наконец-то мы изучили достаточно материала, чтобы с полным пониманием написать первую законченную программу.
Пример. Программа, которая переводит температуру в градусах по Фаренгейту в градусы Цельсия по формуле: С = 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. При вычислении целые константы преобразуются компилятором
в вещественную форму. В пятом операторе выводятся исходное и рассчитанное значение с соответствующими пояснениями.
Презентацию к данной работе Вы можете скачать здесь.
Этот курс лекций построен на основе учебника автора 'Паскаль. Программирование на языке высокого уровня' , который выпускается издательством ПИТЕР с 2003 года. Учебник имеет гриф Министерства образования Российской федерации и удостоен в 2010 году премии Правительства Санкт-Петербурга 'За выдающиеся достижения в сфере высшего и профессионального образования' в составе учебно-методического комплекса по языкам программирования.
В этот комплекс входят также учебники и практикумы по языкам C/C++ и С#
, построенные по единому принципу.
Соответствующие учебные курсы можно найти на этом сайте. В 2010 году вышло второе
издание учебника , объединенное с практикумом и
справочной информацией. В комплекс входит более 250 индивидуальных вариантов заданий
на лабораторные работы в расчете на учебную группу из 20 человек (все варианты можно
найти в учебнике) и более 1000 тестовых вопросов. Преподавателям будут полезны презентации
лекций. На сайте интернет-школы программирования
можно проверить правильность выполнения некоторых лабораторных работ с помощью системы
Доброжелательную и конструктивную критику, а также предложения по улучшению курса направляйте автору по адресу pta-ipm@yandex.ru.
Для решения задачи на компьютере требуется написать программу. Программа состоит из исполняемых операторов и операторов описания. Исполняемый оператор задает законченное действие, выполняемое над данными. Примеры исполняемых операторов: вывод на экран, занесение числа в память, выход из программы.
Оператор описания, как и следует из его названия, описывает данные, над которыми в программе выполняются действия. Примером описания (конечно, не на Паскале, а на естественном языке) может служить предложение 'В памяти следует отвести место для хранения целого числа, и это место мы будем обозначать А'.
Исполняемые операторы для краткости часто называют просто операторами, а операторы описания — описаниями. Описания должны предшествовать операторам, в которых используются соответствующие данные. Операторы исполняются последовательно, один за другим, если явным образом не задан иной порядок.
Рассмотрим простейшую программу на Паскале. Все, что она делает — вычисляет и выводит на экран сумму двух целых чисел, введенных с клавиатуры.
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, результат будет выглядеть так:
Cумма чисел 2 и 3 равна 5
В строке 4 выполняется вычисление суммы и присваивание ее значения переменной sum. Справа от знака операции присваивания, обозначаемой символами :=, находится выражение — правило вычисления значения.
Чтобы выполнить программу, требуется перевести ее на язык, понятный процессору, — в машинные коды. Этим занимается компилятор.Каждый оператор языка переводится в последовательность машинных команд. Компилятор планирует размещение данных в оперативной памяти в соответствии с операторами описания. Попутно он ищет синтаксические ошибки, то есть ошибки записи операторов. Кроме этого, в Паскале на компилятор возложена еще одна обязанность — подключение к программе стандартных подпрограмм (например, ввода данных или вычисления синуса угла).
Все тексты на языке пишутся с помощью его алфавита. Алфавит Паскаля включает:
_ ;0 до 9 ;+, *, { и @ ;Из символов составляются лексемы (tokens ), то есть минимальные единицы языка, имеющие самостоятельный смысл:
Лексемы языка программирования аналогичны словам естественного языка. Например, лексемами являются число 128, имя Vasia, ключевое слово goto и знак операции сложения +. Компилятор при синтаксическом разборе текста программы определяет границы одних лексем по другим, например разделителям или знакам операций. Из лексем строятся выражения и операторы. Рассмотрим каждый вид лексем подробнее.
Константа — величина, не изменяющая свое значение в процессе работы программы. Классификация констант Паскаля приведена в шапке таблица 1.1. Нижние строки таблицы представляют собой примеры соответствующих констант.
| Целые | Вещественные | Символьные | Строковые | ||
|---|---|---|---|---|---|
| Десятичные | Шестнадцатеричные | С плавающей точкой | С порядком | ||
2 |
$0101 |
–0.26 |
1.2e4 |
'k' |
'абырвалг' |
15 |
$FFA4 |
.005 |
0.1E–5 |
#186 |
'I''m fine' |
21. |
^M |
||||
Десятичные целые константы представляются в естественной форме. Шестнадцатеричная константа состоит из шестнадцатеричных цифр (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F), предваряемых знаком $.
Вещественные константы записываются с точкой перед дробной частью. Либо целая, либо дробная часть могут отсутствовать. Вещественная константа с порядком представляется в виде мантиссы и порядка. Мантисса записывается слева от знака представлены числа 1,2 104 и 0,1 10–5 . Пробелы внутри числа не допускаются.
Символьные константы служат для представления любого символа из набора, используемого в данном компьютере. Так как под каждый символ отводится 1 байт, всего используется 256 символов. Каждому символу соответствует свой код. В операционной системе MS-DOS для кодировки символов используется стандарт ASCII, являющийся международным только в первой половине кодов (от 0 до 127), вторая половина кодов (от 128 до 255) является национальной и различна для разных стран. Первые 32 символа являются управляющими:хотя многие из них имеют графическое представление, предназначены они для передачи управляющих сигналов внешним устройствам, например монитору, принтеру или модему. Символьные константы записываются в одной из трех форм:
#186 приведено представление символа ¦ ).^M представлен символ с кодом 13).Строковая константа — это последовательность любых ASCII-символов, расположенная на одной строке и заключенная в апострофы. Если требуется представить сам апостроф, он дублируется. Максимальная длина строковой константы — 126 символов.
Имена в программах служат той же цели, что и имена людей, — чтобы обращаться к программным объектам и различать их, то есть идентифицировать. Поэтому имена также называют идентификаторами.
Имена дает программист, при этом следует соблюдать следующие правила:
Например, правильными именами будут Vasia, A, A13, A_and_B и _____, а неправильными — 2late, Big и Sюр. Имена даются элементам программы, к которым требуется обращаться: переменным, константам, процедурам, функциям, меткам и т. д.
Ключевые ( зарезервированные ) слова — это идентификаторы, имеющие специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. Например, для goto, а для описания переменных — var. Имена, создаваемые программистом, не должны совпадать с ключевыми словами.
Знак операции — это один или более символов, определяющих действие
над операндами. Внутри знака операции пробелы не допускаются. Например, операция
сравнения 'меньше или равно' обозначается <=, а целочисленное деление записывается
как div. Операции делятся на унарные (с одним операндом) и бинарные (с двумя).
Данные, с которыми работает программа, хранятся в оперативной памяти. Компилятору необходимо точно знать, сколько места они занимают, как именно закодированы и какие действия с ними можно выполнять. Все это задается при описании данных с помощью типа. Тип данных однозначно определяет:
Например, целые и вещественные числа, даже если они занимают одинаковый объем памяти, имеют совершенно разные диапазоны возможных значений; целые числа можно умножать друг на друга, а, например, символы — нельзя. Каждое выражение в программе имеет определенный тип. Компилятор использует информацию о типе при
Рассмотрим классификацию типов в таблица 1.2.
| Стандартные | Определяемые программистом | ||
|---|---|---|---|
| Простые | Составные | ||
| Логические | |||
| Целые | |||
| Вещественные | Перечисляемый | Массивы | Файлы |
| Символьный | Интервальный | Строки | Процедурные типы |
| Строковый | Адресные | Записи | Объекты |
| Адресный | Множества | ||
| Файловые | |||
Стандартные типы не требуют предварительного определения. Для каждого типа существует ключевое слово, которое используется при описании переменных, констант и т. д. Если же тип данных определяет сам программист, он описывает его характеристики и дает ему имя, которое затем применяется точно так же, как имена стандартных типов. Описание собственного типа данных должно задавать всю информацию, необходимую для его использования: внутреннее представление и допустимые действия.
Внутреннее представление. Основной логический тип данных Паскаля называется boolean. Величины этого типа занимают в памяти 1 байт и могут принимать всего два значения: true (истина) или false (ложь). Внутреннее представление значения false — 0 (нуль), значения true — 1.
Операции. К величинам логического типа применяются логические операции ). Для наглядности вместо значения false в таблице используется 0, а вместо true — 1.
| a | b | a and b | a or b | a xor b | not a |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
Операция and называется ' логическое И ', или логическое умножение. Ее результат имеет значение true, только если оба операнда имеют значение true.
Результат операции or ( логическое ИЛИ, логическое сложение) имеет значение true, если хотя бы один из операндов имеет значение true. Например, false or true true, true or true true.
Операция xor — так называемое исключающее ИЛИ, или операция неравнозначности. Ее результат истинен, когда значения операндов не совпадают.
Логическое отрицание not является унарной операцией, то есть имеет один операнд, который и инвертирует. Например, not true даст в результате false.
Величины логического типа можно сравнивать между собой с помощью . Результат этих операций имеет логический тип.
| Операция | Знак операции | Операция | Знак операции |
|---|---|---|---|
| Больше | > |
Меньше или равно | <= |
| Больше или равно | >= |
Равно | = |
| Меньше | < |
Не равно | <> |
). Внутреннее представление определяет диапазоны допустимых значений величин (от нулей до единиц во всех двоичных разрядах).
| Тип | Название | Размер | Знак | Диапазон значений |
|---|---|---|---|---|
integer |
Целое | 2 байта | Есть | –32 768 .. 32 767 (–215 .. 215–1) |
shortint |
Короткое целое | 1 байт | Есть | –128 .. 127 (–2 7 .. 27–1) |
byte |
Байт | 1 байт | Нет | 0 .. 255 (0 .. 28–1) |
word |
Слово | 2 байта | Нет | 0 .. 65 535 (0 .. 2 16–1) |
longint |
Длинное целое | 4 байта | Есть | –2 147 483 648 .. 2 147 483 647 (–2 31 .. 231–1) |
). Результат их выполнения всегда целый (при делении дробная часть отбрасывается).
| Операция | Знак операции | Операция | Знак операции |
|---|---|---|---|
| Сложение | + |
Деление | div |
| Вычитание | – |
Остаток от деления | mod |
| Умножение | * |
К целым величинам можно также применять операции отношения, а также поразрядные операции and, or, xor и not. При выполнении этих операций каждая величина представляется как совокупность двоичных разрядов. Действие выполняется над каждой парой соответствующих разрядов операндов: первый разряд с первым, второй — со вторым, и т. д. Например, результатом операции 3 and 2 будет 2, поскольку двоичное представление числа 3 — 11, числа 2 — 10.
Для работы с целыми величинами предназначены также операции сдвига влево и вправо shr. Слева от знака операции указывается, с какой величиной будет выполняться операция, а справа — на какое число двоичных разрядов требуется сдвинуть величину. Например, результатом операции 12 shr 2 будет значение 3, а выполнив операцию 12 , то есть сдвинув это число влево на 1 разряд, получим 24. Освободившиеся при сдвиге влево разряды заполняются нулями, а при сдвиге вправо — знаковым разрядом.
(в тригонометрических функциях угол задается в радианах).
| Имя | Описание | Результат | Пояснения |
|---|---|---|---|
| Функции | |||
abs |
Модуль | Целый | |x| записывается abs(x) |
arctan |
Арктангенс угла | Вещественный | arctg x записывается arctan(x) |
cos |
Косинус угла | Вещественный | cos x записывается cos(x) |
exp |
Экспонента | Вещественный | e x записывается exp(x) |
ln |
Натуральный логарифм | Вещественный | log ex записывается ln(x) |
|
Проверка на четность | Логический | даст в результате true |
pred |
Предыдущее значение | Целый | pred(3) даст в результате 2 |
sin |
Синус угла | Вещественный | sin x записывается sin(x) |
sqr |
Квадрат | Целый | x 2 записывается sqr(x) |
sqrt |
Квадратный корень | Вещественный | $$\surd x$$ записывается sqrt(x) |
succ |
Следующее значение | Целый | succ(3) даст в результате 4 |
| Процедуры | |||
inc |
Инкремент | inc(x) — увеличить х на 1 inc(x, 3) — увеличить х на 3 |
|
dec |
Декремент | dec(x) — уменьшить х на 1 dec (x, 3) — уменьшить х на 3 |
|
Внутреннее представление.Вещественные типы данных хранятся в памяти компьютера иначе, чем
Существует несколько вещественных типов, различающихся точностью и диапазоном представления данных (таблица 1.8). Точность числа определяется длиной мантиссы, а диапазон — длиной порядка.
| Тип | Название | Размер | Значащих десятичных цифр | Диапазон значений |
|---|---|---|---|---|
real |
Вещественный | 6 байт | 11–12 | 2.9e–39 .. 1.7e+38 |
single |
Одинарной точности | 4 байта | 7–8 | 1.5e–45 .. 3.4e+38 |
double |
Двойной точности | 8 байт | 15–16 | 5.0e–324 .. 1.7e+308 |
extended |
Расширенный | 10 байт | 19–20 | 3.4e–4932 .. 1.1e+4923 |
comp |
Большое целое | 8 байт | 19–20 | –9.22e18 .. 9.22e18 (–2 63 .. 2 63–1) |
Величины типа . Результат их выполнения — вещественный.
| Операция | Знак операции | Операция | Знак операции |
|---|---|---|---|
| Сложение | + |
Умножение | * |
| Вычитание | – |
Деление | / |
В общем случае при выполнении любой операции операнды должны быть одного и того же типа, но целые и вещественные величины смешивать разрешается.
/, если целый — операцию div.К вещественным величинам можно также применять операции отношения.
Стандартные функции.К вещественным величинам можно применять стандартные функции, приведенные в таблице 1.10 (в тригонометрических функциях угол задается в радианах).
| Имя | Описание | Результат | Пояснения |
|---|---|---|---|
abs |
Модуль | Вещественный | |x| записывается abs(x) |
arctan |
Арктангенс угла | Вещественный | arctg x записывается arctan(x) |
cos |
Косинус угла | Вещественный | cos x записывается cos(x) |
exp |
Экспонента | Вещественный | e x записывается exp(x) |
frac |
Дробная часть аргумента | Вещественный | frac(3.1) даст в результате 0,1 |
int |
Целая часть аргумента | Вещественный | int(3.1) даст в результате 3,0 |
ln |
Натуральный логарифм | Вещественный | log ex записывается ln(x) |
pi |
Значение числа $$\pi$$ | Вещественный | 3,1415926536 |
round |
Округление до целого | Целый | round(3.1) даст в результате 3 round (3.8) даст в результате 4 |
sin |
Синус угла | Вещественный | sin x записывается sin(x) |
sqr |
Квадрат | Вещественный | x 2 записывается sqr(x) |
sqrt |
Квадратный корень | Вещественный | $$\surd x$$ записывается sqrt(x) |
trunc |
Целая часть аргумента | Целый | trunc(3.1) даст в результате 3 |
Этот тип данных, обозначаемый ключевым словом char, служит для представления
любого символа из набора допустимых символов. Под каждый символ отводится 1 байт.
К символам можно применять операции отношения (<, <=, >, >=, =, <>),
при этом сравниваются коды символов. Меньшим окажется символ, код которого меньше.
Других операций с символами нет. Стандартных подпрограмм для работы с символами тоже немного (таблица 1.11).
| Имя | Описание | Результат | Пояснения |
|---|---|---|---|
ord |
Порядковый номер символа | Целый | ord('b') даст в результате 98
ord('ю') даст в результате 238
|
chr |
Преобразование в символ | Символьный | chr(98) даст в результате 'b' chr(238) даст в результате 'ю ' |
pred |
Предыдущий символ | Символьный | pred('b') даст в результате ' a ' |
succ |
Последующий символ | Символьный | succ('b') даст в результате ' c ' |
|
Перевод в верхний регистр (только для символов из диапазона ' a ' … ' z ') |
Символьный | даст в результате ' B ' |
В группу порядковых объединены целые, символьный, логический, перечисляемый и интервальный типы. Сделано это потому, что они обладают следующими общими чертами:
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
Количество и порядок следования остальных разделов произвольны, ограничение только одно: любая величина должна быть описана до ее использования. Признаком конца раздела описания является начало следующего раздела. В программе может быть несколько однотипных разделов описаний.
В разделе описания переменных необходимо определить все переменные, которые будут использоваться в основной программе. Раздел описания констант служит для того, чтобы вместо значений констант можно было использовать в программе их имена. Такие константы называют именованными, например:
const MaxLen = 100; g = 9.8;
koeff = 5;
Применение именованных констант при осмысленном выборе имен улучшает читабельность программы и облегчает внесение в нее изменений. А еще в разделе описания констант описываются переменные, которым требуется присвоить значение до начала работы программы:
const weight : real = 61.5;
Синтаксически такая переменная отличается от константы наличием типа. Впоследствии ею можно пользоваться так же, как и другими переменными.
Раздел описания меток начинается с ключевого слова label, за которым через запятую следует перечисление всех меток, встречающихся в программе. Метки служат для организации перехода на конкретный оператор с помощью оператора безусловного перехода goto. Метка — это либо имя, либо положительное число, не превышающее 9999. Метка ставится перед любым исполняемым оператором и отделяется от него двоеточием:
label 1, 2, error;
Присваивание — это занесение значения в память. В общем виде оператор присваивания записывается так:
переменная := выражение
Здесь символами := обозначена операция присваивания. Механизм выполнения оператора присваивания такой: вычисляется выражение и его результат заносится в память по адресу, который определяется именем переменной, находящейся слева от знака операции:
переменная <- выражение
Примеры операторов присваивания:
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;
Вводить можно целые, вещественные, символьные и строковые величины. Вводимые значения должны разделяться любым количеством пробельных символов (пробел, табуляция, перевод строки).
Ввод значения каждой переменной выполняется так.
Например, при вводе вещественного числа 3.78 в переменную типа real оно преобразуется из четырех символов (3, 'точка', 7 и 8) в шестибайтовое представление в виде мантиссы и порядка.
Процедура readln после ввода всех значений выполняет переход на следующую строку исходных данных. Иными словами, если в следующей части программы есть ввод, он будет выполняться из следующей строки исходных данных. При использовании процедуры read очередные исходные данные будут взяты из той же строки. Процедура readln без параметров просто ожидает нажатия клавиши Enter.
Особенность ввода символов и строк состоит в том, что пробельные символы в них ничем не отличаются от всех остальных, поэтому разделителями являться не могут. Например, пусть определены переменные
var a : integer;
b : real;
c : 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
Теперь, когда мы познакомились с примером, можно сформулировать общие правила записи процедур вывода.
Теперь наконец-то мы изучили достаточно материала, чтобы с полным пониманием написать первую законченную программу.
Пример. Программа, которая переводит температуру в градусах по Фаренгейту в градусы Цельсия по формуле: С = 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. При вычислении целые константы преобразуются компилятором
в вещественную форму. В пятом операторе выводятся исходное и рассчитанное значение с соответствующими пояснениями.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.