Представление основных структур
Программирования на языке Паскаль
Операции и выражения
Переменные и константы – простейшие частные случаи выражения. Выражения состоят из операндов, знаков операций и круглых скобок. Операндом может быть константа, переменная, граница параметра–массива (об этом позже) или обозначение функции. Смысл выражения в том, чтобы пассивные составляющие (операнды) связать через активные составляющие (+, –, *, / и прочее) и получить некоторое новое значение.
Выражение не просто имеет некоторое значение, но и обладает совершенно определенным типом, который зависит от операндов и операций.
Для того, чтобы описать последовательность, в которой должны стоять операнды в выражениях, целесообразно упорядочить операции по уровням.
1. Операции более низкого уровня выполняются раньше, чем операции более высокого уровня.
2. Операции одного уровня выполняются поочередно слева направо.
3. Операции, заключенные в круглые скобки, выполняются раньше операций, записанных за скобками.
Эти правила действуют для всех типов выражений.
Арифметические операции и выражения
Арифметические выражения имеют тип real или integer, причем мы всегда под real будем понимать также single, double, extended и comp, а под integer – byte, word, shortint и longint.
Пример арифметического выражения:
(– b + sqrt ( sqr( b ) – 4 * a * c ) ) / ( 2 * a )
При составлении выражений следует выполнять следующие правила:
1. Записывать все составные части выражений в одну строку.
2. Использовать скобки только одного типа – круглые. Применение фигурных и квадратных скобок в выражениях запрещается, так как они имеют особое назначение.
3. Нельзя записывать подряд два знака арифметических операций.
К арифметическим операциям относятся: первый уровень *, /, mod и div; второй уровень +, –. То есть при вычислении арифметического выражения действуют обычные правила старшинства операций: сначала выполняются умножение, деление, деление нацело и нахождение остатка от деления нацело в том порядке, в каком они входят в выражение, а затем сложение и вычитание. Между знаком div (или mod) и числами, участвующими в делении, должно находиться хотя бы по одному пробелу.
Несколько примеров:
5 + 2 * 10 = 25;
10.2 * 5 – 7 + 8.6/2 = 22.3;
(5 + 105) div 7 = 5
Тип результата в зависимости от типа операндов:
Запишем несколько обычных математических выражений на Паскале.
Если при расстановке скобок возникнут сомнения, вспомните правило: “Лишние скобки не мешают”.
Нельзя размещать два знака операций рядом; последовательности символов 3 * – 2, х1 / – x2 – это не выражения, выражениями будут 3 * (–2), x1 / (–x2).
В выражениях может присутствовать вызов функций. Функция передает свое значение в выражение. В Паскале имеется множество стандартных функций, о которых речь будет идти почти в каждом разделе.
Правила записи стандартных функций:
1. Имя функции записывается буквами латинского алфавита.
2. Аргумент функции записывается в круглых скобках после имени функции.
3. Аргументом функции может быть константа, переменная или арифметическое выражение.
Приведем ряд стандартных математических функций.
abs(x) x
exp(x) ех
cos(x) cos x
sin(x) sin x
arctan(x) arctg x
ln(x) ln x
sqr(x) x2
sqrt(x) x
random(x) Если x отсутствует, значением функции является случайное число типа real из диапазона 0<= ...<1. Если задается параметр x, значением функции будет случайное число из диапазона 0<=...<x.
Логические операции
Логические выражения имеют значение типа boolean, то есть true или false.
Выражение, служащее для вычисления логического значения, называется логическим выражением или логическим условием.
Одним из видов логического выражения является отношение. Отношение – это два выражения, соединенные операцией отношения. Например,
y < 0, a > b, x = y, x < a – b.
Операции отношения: > (больше), < (меньше), > (не меньше), < (не больше), = (равно), ( не равно) – на языке Паскаль записываются соответственно: >, <, >=, <=, =, <> и имеют более низкий приоритет по сравнению с арифметическими операциями. Иными словами, сначала выполняются арифметические операции, а потом операции отношения.
Условие a + b c + d на языке Паскаль записывается так: a + b <> c + d.
Высказывания о значениях переменных могут быть истинными или ложными в зависимости от самих значений переменных. Так, если s = 5, t = 6, то высказывание s > t – ложное, высказывание s < t + 12 – истинное.
Логические значения упорядочены. Выражение true > false является истинным.
Из простых высказываний в Паскале разрешается строить более сложные. Пусть А и В – некоторые высказывания, тогда А and В – это новое высказывание, утверждающее истинность обоих высказываний А и В; А or В – это новое высказывание, утверждающее истинность хотя бы одного из высказываний А и В. Если С – высказывание, то not С – это новое высказывание, утверждающее, что С – ложное высказывание.
Уровень Операция Тип Тип
операции операнда результата
0 not boolean boolean
1 and boolean boolean
2 or boolean boolean
3 <> простой тип boolean
3 = простой тип boolean
3 < простой тип boolean
3 <= простой тип boolean
3 > простой тип boolean
3 >= простой тип boolean
Операции над высказываниями (логические операции) and, or, not называются соответственно конъюнкцией, дизъюнкцией и отрицанием.
Следующие таблицы уточняют словесные объяснения.
Пример:
1) a and b or c;
2) a and (b or c);
3) i <10;
4) (i<10) and (k<= 0).
При определении истинности высказывания, построенного из отношений с помощью знаков логических операций и круглых скобок, действуют следующие правила старшинства операций: самая старшая операция отрицание, следующая – конъюнкция, потом – дизъюнкция.
Первой из двух операций одного старшинства выполняется та, знак которой в выражении встречается раньше. Круглые скобки изменяют этот естественный порядок. Для высказывания
(x > y) or (y > z) and not ((x > 0) or (z > x))
устанавливается следующий порядок логических операций:
4 3 2 1
(x > y) or (y > z) and not ((x > 0) or (z > x))
При x = –1, z = –2, y = 1 результатом будет значение true.
(x > 0) – false, (z > x) – false;
(x > 0) or (z > x) – false;
not ((x > 0) or (z > x)) – true;
(x > y) – false, (y > z) – true;
(y > z) and not ((x > 0) or (z > x)) – true.
В конечном итоге false or true дает true.
Оператор присваивания
Отдельные инструкции, входящие в программу, принято называть операторами. В раздел операторов (исполняемой части) программы помещаются операторы, которые должны быть выполнены с определенными в описательной части данными.
Арифметическое выражение не является оператором, а представляет собой правило (формулу), в соответствии с которым может быть вычислено некоторое значение. Оно может использоваться как составная часть различных операторов, в частности, оператора присваивания.
Оператор присваивания является важнейшим оператором любого языка программирования. С его помощью можно присвоить переменной значение выражения. Выражение оценивается, то есть определяется его значение, и это значение присваивается переменной. В результате прежнее значение переменной перезаписывается, а поэтому старое значение утрачивается. Знаком присваивания в Паскале является совокупность знаков ( := ). Например, в операторе присваивания Y := (A * X + B) * X + C справа от знака := записано выражение (A * X + B) * X + C, а слева – переменная Y. Нужно запомнить: слева не может быть выражение.
Пусть i = 1. После выполнения оператора присваивания i := i + 1, переменная i будет иметь значение 2 (рис. 34).
При использовании оператора присваивания v:= e следует учитывать, что переменная v и выражение е должны иметь одинаковый тип. Имеется лишь одно исключение из этого правила: переменная может иметь тип real, а выражение значение типа integer.
Пример:
Пусть
var i, j : integer; x, y : real; a, b : char; p, q : boolean;
Следующие операторы присваивания верны:
p := i < 5;
a := ‘+’;
x := i + j mod 7;
y := 275;
y := x*(sqr(2));
Следующие операторы неверны, поскольку не учитывают типа:
i := 3.678;
b := ‘stoka’;
a := +;
Задача 1. Составить программу вычисления площади треугольника по трем сторонам a, b, c.
Алгоритм решения задачи представим в виде схемы.
Программа на Паскале
program task1;
var a, b, c, p, s : real;
begin
readln(a, b, c);
p := (a + b + c)/2;
s := sqrt(p*(p –a) * (p – b)*(p – c));
write(s)
end.
Как уже говорилось ранее, совершенно не обязательно записывать каждый оператор на новой строке. Верной была бы и следующая запись:
program task1; var a, b, c, p, s : real; begin readln(a, b, c); p := (a + b + c)/2;
s := sqrt(p*(p –a) * (p – b)*(p – c)); write(s) end.
Важно, чтобы после каждого оператора стояла ; .
Прокомментируем каждый оператор программы.
program task1; Заголовок программы с именем программы task1. Еще раз напомним, что это не обязательный оператор, его может не быть.
var a, b, c, p, s : real; Раздел описаний. Все переменные в Паскале должны быть описаны. a, b, c, p, s – это все переменные, которые встречаются в программе и все они вещественного типа.
begin Оператором begin открывается основной блок программы – блок операторов.
readln(a, b, c); Функция readln вводит численные значения переменных a, b, c. Идентификаторы этих переменных записываются в скобках и через запятую.
p := (a + b + c)/2; Оператор присваивания. Те численные значения, которое получили переменные a, b, c при вводе, суммируются; полученная сумма делится на 2; результат присваивается переменной с именем p.
s := sqrt(p*(p –a) * (p – b)*(p – c)); Оператор присваивания.
write(s); Функция вывода. На экран дисплея выводится численное значение переменной s.
end. Последний оператор программы. Закрывает раздел операторов. После последнего оператора end ставится точка.
После того, как программа написана и для нее выбраны исходные данные, нужно, чтобы эта программа была выполнена. Программа вводится в оперативную память ЭВМ (например, с клавиатуры), дается команда на компиляцию и выполнение. Процессор выполняет программу. Оператор readln потребует ввода трех численных значений. Оператор write выведет численное значение переменной s.
Составной оператор
Составной оператор – это последовательность произвольных операторов программы, заключенная в операторные скобки – зарезервированные слова begin ... end. Операторы разделяются точкой с запятой ; (рис. 36).
Исполняемая часть программы является составным оператором такого рода.
Составной оператор служит, в первую очередь, для того, чтобы несколько операторов синтаксически объединить в один. Это часто требуется там, где нужно выполнить несколько операторов, когда допустим лишь один. Понятие составного оператора позволяет с помощью команд begin и end объединить несколько операторов и рассматривать их с точки зрения синтаксиса как один оператор. На характер операторов, входящих в составной оператор, не накладывается никаких ограничений. Среди них могут быть и другие составные операторы.
begin
.........
begin
............
begin
............
............
............
end;
............
end;
............
end;
При исполнении операторов точка с запятой служит разделителем для двух операторов. Точкой с запятой перед заключительным end можно пренебречь.
begin begin
read(i); read(i);
write(i); write(i)
end. end.
Обе записи верны, поскольку можно считать, что между write(i); и end находится пустой оператор. Пустой оператор – оператор, который не выполняет никаких операций и ничего не изменяет в данных и в программе. Пустому оператору соответствует отсутствие записи на том месте, где по правилам должен быть какой–нибудь оператор. После него можно ставить символ точки с запятой, например:
A : = B;
R : = 2;
;
K : + 7.2;
У начинающих программистов часто возникает вопрос: где правильно поставить знак точки с запятой? Чтобы на него ответить, обратимся к обычному естественному языку. В любом перечне элементов между ними ставится запятая, например:
А, В, С, Д.
Если эти элементы объединить в одну группу, заключив их в круглые скобки (А, В, С, Д), то запятая ставится опять–таки между элементами: после открывающей и перед закрывающей скобками запятая не указывается. Если эта группа элементов входит в состав другой группы, то запятая ставится и между группами, например:
((А, В, С, Д), (К, М), Е, (Х, У))
Подобная система введена и в языке Паскаль, только в нем роль круглых скобок выполняют операторные скобки BEGIN – END, вместо запятой ставится точка с запятой, а вместо элементов – операторы.
Условный оператор
Условный операторпозволяет проверить некоторое условие и в зависимости от результата выполнить то или иное действие. С помощью этого оператора программируются алгоритмы разветвляющейся структуры.
Структура условного оператора:
IF <условие>THEN <оператор1> ELSE <оператор2>,
где IF, THEN, ELSE – зарезервированные слова (если, то, иначе);
<условие> – произвольное выражение логического типа;
<оператор1>,<оператор2> – любые операторы языка.
Условный оператор работает по следующему алгоритму. Вначале вычисляется условное выражение <условие>. Если результат есть TRUE (истина), то выполняется <оператор1>, а <оператор2> пропускается; если результат есть FALSE (ложь), наоборот, <оператор1> пропускается, а выполняется <оператор2>. Например:
var
x, y, max : real;
.................
if x > max
then y := max
else
y := x;
Этот условный оператор читается: если условие x > max выполняется, то y := max, иначе y := x.
Часть ELSE <оператор2> условного оператора может быть опущена. Тогда при значении TRUE условного выражения выполняется <оператор1>, в противном случае этот оператор пропускается (рис. 37).
Если требуется выполнить после then или else несколько операторов, они обрамляются командами begin и end, образуя тем самым составной оператор. Перед else никогда не ставится точка с запятой (поскольку это еще не конец оператора if).
Задача 2.Пусть задана функция
Написать программу вычисления значения Y по значению X.
Программа может выглядеть так:
program task2; { заголовок программы}
var x, y : real; { описание переменных}
begin {начало исполняемой части}
readln(x); { – // – }
if x <= 0 then y:= 0 else y := x*x*x; { – // – }
write(y) { – // – }
end. { конец исполняемой части }
<Оператор1> и <Оператор2> по определению любой оператор язака, следовательно и условный.
Задача 3.Пусть значение Y зависит от значения X.
Cocтавить программу вычисления значения Y по значению X (рис. 40).
Программа
program task3;
var x, y : real;
begin
read(x);
if x < 2 then
y := x
else
if x < 3 then
y := 2
else
y := –x+5;
write(y)
end.
Если удовлетворено условие х < 2, то y получит значение, равное значению х, это значение затем будет выведено. Если условие х < 2 не удовлетворяется, то значение y будет определено выполнением условного оператора
if x < 3 then y := 2 else y := –x + 5
Если else отсутствует, а после оператора then вновь стоит оператор if, то возникает неоднозначность трактовки условий. Эта неоднозначность решается следующим образом: любая встретившаяся часть else соответствует ближайшей к ней “сверху” части then условного оператора. Приведенное выше выражение понимается так
if <выражение 1> then
begin
if <выражение 2> then
<выражение 1>
else
<выражение 2>
end
Задача 4.Написать программу вычисления функции Z. (рис. 41).
Программа
program task4;
var X, Z : real;
begin
readln (x);
if X < 1 then
Z := sin(x)
else
if X < 2 then
Z := cos(x)
else
Z := cos(x)/2;
write (‘Z= ‘, Z:5:3)
end.
Для того чтобы выделить три ветви решения, достаточно двух условных операторов if X < 1 then Z := sin(x) else <условный оператор 2>.
<Условный оператор 2>: if X <2 then Z := cos(x) else Z:= cos(x)/2.
Cледует обратить внимание на оператор (будем условно называть так процедуру в этом случае) вывода write. В операторе write (‘Z= ‘, Z:5:3) дана команда на вывод константы ‘Z= ‘ и переменной Z с форматом вывода: пять позиций на все число, из них три на дробную часть.
О процедуре write
Операторы вывода допускают использование указания о ширине поля, отводимого под значение выводимой величины, в явном виде. Ширина поля вывода определяется типом устройства, использующимся в данной ЭВМ. Форма представления выводимых переменных определяется типом переменных: значения величин целого типа выводятся в обычной форме; значения величин действительного типа – в виде нормализованного числа действительного типа с порядком: значения логического типа – в виде логических значений TRUE и FALSE; значения символьных переменных – в виде соответствующих символов.
Общий вид записи операторов при выводе значений целого типа:
write(b:m); writeln(b:m); ,
где b – имя выводимой переменной; m – константа или выражение целого типа, отводимое под значение .
Например:
write(dd:6,ir:8);
Значения переменных dd и ir размещаются в одной строке и занимают соответственно шесть и восемь позиций. Каждое значение размещается в отведенном поле и занимает крайние правые позиции. При этом незаполненные позиции остаются свободными, образуя пробелы. Если значение переменной не размещается в отведенном поле, то увеличивается число позиций.
При выводе значений действительного типа с фиксированной точкой указывается ширина поля, отводимая под все значение и под дробную часть числа. Общий вид записи операторов выглядит следующим образом:
write(b:m:n); writeln(b:m:n);
где m – поле, отводимое под запись значения; n – часть поля, отводимого под дробную часть числа.
Например:
write(a:8:3);
В данном случае под значение а выделяется восемь позиций, три из которых отводится под дробную часть числа.
Если при выводе действительных значений не указывается количество позиций, отведенных под дробную часть числа, то результат получается в нормализованном виде с десятичным порядком.
Можно задавать количество пробелов. Для этого необходимо записать оператор вывода в виде
write(‘ ‘:q); ,
где q – константа целого типа, указывающая число пробелов.
Пример размещения информации при выводе:
program;
const
pi = 3.141592;
t = 401;
w = true;
sim = ‘D’;
begin
writeln(‘pi=‘,pi:8:6);
writeln(t:6,’ ‘:6,w:4,’ ‘:6,sim:1)
end.
Информация выводится в две строки в виде:
pi=3.141592
401 true d
– обозначение пробела.
О процедуре ввода
Для ввода данных в языке Паскаль предусмотрены стандартные встроенные программы (процедуры) – READ и READLN. Оператор ввода служит для ввода данных в процессе выполнения программы. Процедура READ используется в виде:
а) read (a1, a2, a3, ..., an) – каждое вводимое значение присваивается последовательно переменным a1, a2, a3, ..., an;
б) readln (a1, a2, a3, ..., an) – каждое вводимое значение присваивается последовательно переменным a1, a2, a3, ..., an, после чего происходит переход на новую строку (следующий оператор ввода будет вводить данные с новой строки);
в) readln – переход на новую строку при вводе данных.
Логические данные в Паскале вводить не разрешается.
При вводе числовые данные должны разделяться пробелом или символом окончания ввода (клавиша enter).
Пример ввода:
var a, b, c : real;
k, t : integer;
. . .
read (a, b, c);
readln;
read (k, t);
После набора на экране дисплея всей программы и запуска ее на выполнение происходит останов машины при встрече read(a, b, c). На клавиатуре ЭВМ необходимо набрать три действительных числа, затем с новой строки (выполняется оператор readln) – два целых числа соответственно оператору read(k, t). Например,
0.5 6.23 –7.1
3 48
При этом переменные получат следующие значения: a = 0.5, b = 6.23, c = –7.1, k = 3, t = 48, и выполнение программы продолжится.
Числа можно отделять друг от друга не только пробелами, но и символом окончания ввода (клавиша enter), то есть каждое число вводится с новой строки.
Ввод символьных данных имеет особенности. Поскольку пробел, как и любой символ языка Паскаль, относится к символьным данным, символьные данные вводятся сплошной строкой в соответствии с оператором ввода. Напомним, что одной переменной можно присвоить значение только одного символа.
Пусть имеется фрагмент программы
var a, b, c : char;
. . .
read( a, b, c);
Данные вводятся в виде: SNR. Переменные a, b, c получат следующие значения:
a = ‘S’, b = ‘N’, c = ‘R’.
Для правильного ввода символьных данных рекомендуется перед каждым оператором ввода символьных данных ставить оператор перехода на новую строку readln, чтобы ввод осуществлялся всегда с новой строки.
С вводом данных связана стандартная функция EOLN. Она принимает значение true, если достигнут конец строки; в противном случае – значение false.
Оператор выбора
По практическим соображениям существует еще один тип условного оператора. Оператор выбора позволяет выбрать одно из нескольких возможных продолжений программы. Структура оператора выбора:
CASE <ключ выбора> OF <список выбора> ELSE <оператор> END
Здесь CASE, OF, ELSE, END – зарезервированные слова (случай, из, иначе, конец); <ключ выбора> – выражение порядкового типа (любого из рассмотренных, кроме типов REAL и STRING); <список выбора> – одна или более конструкций вида: <константа выбора> : <оператор>; <константа выбора> – константа того же типа, что и выражение <ключ выбора>; <оператор> – произвольный оператор.
Поясним общий вид оператора. В этой записи с – ключ выбора; ni : pi – список выбора; ni – константа выбора; pi – оператор.
CASE c OF
n1 : p1;
n2 : p2;
n3 : p3;
.............
nn : pn
ELSE
p
end;
Оператор работает следующим образом. Вначале вычисляется значение выражения <ключ выбора>, а затем в последовательности операторов <список выбора> отыскивается такой, которому предшествует константа, равная вычисленному значению. Найденный оператор выполняется, после чего оператор выбора завершает свою работу. Если в списке выбора не будет найдена константа, соответствующая вычисленному значению ключа выбора, управление передается оператору, стоящему за словом ELSE.
Часть ELSE <оператор> можно опускать. Тогда при отсутствии в списке выбора нужной константы ничего не произойдет и оператор выбора просто завершит свою работу.
Задача 5.В зависимости от вводимого признака q рассчитать значение функции Z.
0, если q = 0;
sin(x), если q = 1;
Z = eX, если q = 2;
log(x), если q = 3;
x*x во всех остальных случаях.
На рис. 42 приведена структура, которая называется “множественный выбор”.
В зависимости от вводимого значения q вычисления осуществляются по одной ветви из пяти.
Программа.
program task4;
var X, Z : real; q : integer;
begin
write(‘Введите X ‘); readln(x);
write(‘Введите признак: 0, 1, 2, 3. 0 – 0, 1 – sin(x), 2 – exp(x), 3 – log(x) ‘);
readln(q);
case q of
0 : Z := 0;
1 : Z := sin(x);
2 : Z := exp(x);
3 : Z := ln(x)
else
Z := x*x
end;
write(‘Z = ‘, Z)
end.
Задача 6.Ввести два числа, знак арифметического действия и вывести на экран результат соответствующего действия.
Программа.
program task6;
var
op : char;
x, y, z : real;
begin
write(‘x, y = ‘);
readln(x,y);
write(‘операция: ‘);
readln(op);
case op of
‘+’ : z:= x + y;
‘–’ : z:= x – y;
‘*’ : z:= x * y;
‘/’ : z:= x / y;
else
write(‘Такое действие не предусмотрено!’);
end;
write(‘Результат = ‘, z)
end.
В программе ключом выбора является переменная литерного типа. В зависимости от введенного значения символа выполнится одно из арифметических действий: сложение, вычитание, умножение или деление. Если будет введен какой–либо другой символ, то результатом будет сообщение: “Такое действие не предусмотрено!”.
Программа вводит две строки: первая содержит два произвольных числа, разделенных пробелом, вторая – символ арифметического действия. На следующей строке будет выведен результат. Например:
2 2
*
Результат = 4
или
18.5 0.12
+
Результат = 18.62
Операторы повторений
В языке Паскаль имеются три различных оператора, с помощью которых можно запрограммировать повторяющиеся фрагменты программ. Операторы повторения(циклы) предусматривают выполнение некоторых операторов несколько раз. Если число повторений известно заранее (до начала повторений), то в такой ситуации лучше воспользоваться оператором цикла с параметром. В других случаях следует использовать операторы цикла с предусловием и постусловием.