Оператор присваивания
Оператор присваивания состоит из трех частей: в левой части пишется имя переменной, которой присваивается значение; в средней части пишется операция присваивания := (двоеточее равно); в правой части записывается выражение, значение которого вы хотите присвоить переменной. Оператор присваивания выполняется следующим образом: сначала вычисляется значение выражения, стоящего в правой части оператора, а затем оно заносится в переменную, указанную в левой части оператора.
Примеры:
x :=5; | y := x -10; | x := x +2; | y := y /2 |
В первом операторе переменной x присваивается значение 5. Во втором- переменная y получает значение 5-10=-5. Затем значение переменной x увеличивается на два и становится равным 7. Наконец, в последнем операторе значение y уменьшается вдвое и становится равным -2.5. Тип выражения и тип переменной в операторе присваивания должны быть согласованы. Переменной типа real можно присваивать значения типаreal или integer. Переменным остальных типов можно присаивать только значения своих типов, т.е. целой переменной- целое, символьной- символьное, логической- логическое. В соответствии с этими правилами в приведенных выше примерах присваиваний переменная y должна иметь тип real, а x может иметь как типreal, так и integer.
Операторы ввода/вывода
Ввод/вывод информации в программе выполняется с помощью специальных процедур ввода/вывода. Любая процедура делает некоторые действия и общается с программой через список параметров. Так процедура вывода выводит на экран компьютера те параметры, которые передаются ей через список, а процедура ввода вводит информацию с клавиатуры компьютера и помещают ее в переменные, указанные в списке параметров.
Обращение к любой процедуре состоит из двух частей: имени процедуры и списка параметров, заключенного в круглые скобки.
Параметры в списке разделяются запятыми. В процедурах ввода/вывода число параметров может быть любым. При обращении к процедуре без параметров круглые скобки не пишутся.
В Паскале имеется две стандартные процедуры вывода: write и writeln, выводящие значения своих параметров в стандартный файл вывода output (обычно это экран компьютера). Вторая процедура отличается от первой тем, что после вывода значений своих параметров переводит курсор на экране в начало следующей строки. Поясним подробнее, как это делается, на следующем примере (здесь все переменные имеют тип integer ):
y := sqr ( x ) - 1;
n := -15;
write('Печатаем x, y и их сумму:', x, y, x+y);
write(' теперь n', n);
writeln;
writeln('С новой стро', 'ки пе', 'чатаем т','екст, текс', 'т, текст', ', текст!')
Результат на экране будет выглядеть так:
Как видно из этого примера, процедуры вывода не вставляют пробелов между целыми числами при их печати. Из-за этого три числа 5, 24 и 29 слились на экране вместе в 52429. Во второй строке вывода мы воспользовались тем, что пробелы между параметрами при выводе не вставляются и слили вместе разрозненные куски текста в осмысленный текст. Обратите внимание на то, что запятая внутри строкового значения выводится на печать, а вне строки она используется как разделитель параметров в списке.
При выводе между параметрами можно вставить пробелы с помощью строки из пробелов или управляя шириной поля вывода. Ширина поля вывода задается после выводимого параметра: ставится двоеточее, а затем целочисленное выражение, задающее минимальное число символьных позиций, отводимых под значение параметра. Если количество символов в значении параметра при выводе оказалось меньше этой ширины, то перед ним вставляются недостающие пробелы. Переделаем первых два оператора вывода в предыдущем примере, продемонстрировав обе возможности вставки пробелов:
write('Печатаем x, y и их сумму:', x:4, y:4, x+y:4,'теперь n':10, n:3);
Результат будет таким:
Печатаем x, y и их сумму: 5 24 29 теперь n -15
Для выражений типа real спецификация вывода может иметь вид
: n : m , где n - ширина поля вывода, а m - количество цифр числа после точки, выводимых на печать:
write(A1:10:3, A2:10:3);
В Паскале имеется две процедуры ввода: read и readln. Вторая обычно используется для ввода строковых значений и нам пока не требуется. В списке параметров этих процедур должны быть только переменные. Ввод данных осуществляется в соответствии с типами этих переменных: если это числовая переменная (целая или вещественная), то из стандартного файла ввода input считывается число; если же это символьная переменная, то считывается один символ. Логические переменные в списке ввода не используются. При чтении чисел пробелы перед ними в файле ввода input пропускаются. Обычно файл стандартного ввода связан с клавиатурой. При этом все, что вводится с клавиатуры, отображается на экране компьютера. Пусть, например, требуется ввести целое число в переменную n, означающую число элементов суммы ряда. Это можно сделать следующим образом:
read ( n );
Условный оператор
Условный оператор позволяет выполнять разветвления в программе. Его синтаксис следующий:
if логическое выражение then оператор1 else оператор2
Если логическое выражение истинно, то выполняется then-часть (т.е. оператор1 ). В противном случае выполняется else-часть (т.е.оператор2).
В условном операторе (else)-часть может отсутствовать. Часто в (else) и (then)-частях оператора находятся другие условные операторы. Например, математической формуле
y= | { | x при x <0 x 2 при 0 x 1 x 3 при x >1 |
соответствует следующая программа:
else if x<=0 then y := sqr(x)
else y := x*sqr(x)
Чтобы определить в сложном условном операторе к какому if относится какой else используют следующее правило: else-часть относится к ближайшему if, еще не имеющему else-части.
Цикл- это многократно повторяющаяся последовательность операторов. Один повтор такой последовательности называется итерацией цикла. В Паскале имеется три типа циклов: repeat, while и for.
Синтаксис оператора repeat: repeat операторы until логическое выражение
Между служебными словами repeat и until помещаются операторы программы, выполняемые на каждой итерации цикла (слова repeat и until образуют блок). После каждой итерации цикла проверяется \it логическое выражение. Если оно истинно, то итерации прекращаются.
Оператор while имеет следующий синтаксис: while логическое выражение do оператор
Здесь логическое выражение проверяется перед каждой итерацией цикла. Если это условие ложно, то итерации прекращаются. По синтаксису тело цикла while состоит из одного оператора. Поэтому, если в теле цикла необходимо поместить несколько операторов, то их следует заключить в блок. Имеются две формы оператора for:
for p:= выр1 downto выр2 do оператор
Значение переменной цикла p изменяется в пределах от выр1 до выр2 , в первом варианте увеличиваясь, а во втором- уменьшаясь на единицу после каждой итерации. По синтаксису тело цикла for состоит из одного оператора. Поэтому, если в теле цикла необходимо поместить несколько операторов, то их следует заключить в блок .

Переменная цикла for может иметь любой перечислимый тип. Начальное и конечное значения этой переменной, задаваемые в заголовке цикла for, должны иметь тот же тип, что и переменная цикла.
Оператор перехода goto позволяет изменить обычный порядок выполнения операторов программы. Синтаксис этого оператора следующий
goto метка , - где метка- целое число в пределах от 0 до 9999. Этот оператор выполняет переход на оператор, помеченный указанной меткой в виде:
Все метки, используемые в программе, должны быть описаны в подразделе label раздела описаний. Подраздел label должен идти перед подразделами const и var. Он состоит из служебного слова label и одного или нескольких списков меток, заканчивающихся точкой с запятой.
Пример:
Одной меткой можно пометить только один оператор.
Оператор goto следует использовать крайне осторожно. Так, с помощью него нельзя попасть внутрь составного оператора, такого как блок, условный оператор, оператор выбора, цикл. Правила хорошего тона в программировании предписывают избегать использования этого оператора, поскольку необоснованное его применение ухудшает понимание программы. Единственное место, в котором использование оператора gotoобоснованно- это досрочный выход из составного оператора по каким-либо причинам.
Составной условный оператор
Эта форма условного оператора применяется, когда есть более 2 вариантов расчета. Общий вид составного оператора может включать произвольное число условий и ветвей расчета:
if логическое_выражение1 then оператор1
else if логическое_выражение2 then оператор2
...
else if логическое_выражениеN then операторN
else оператор0;
При использовании оператора последовательно проверяются логические выражения 1, 2, ... ,N, если некоторое выражение истинно, то выполняется соответствующий оператор и управление передается на оператор, следующий за условным. Если все условия ложны, выполняется оператор0 (если он задан). Число ветвей N неограниченно, ветви elseоператор0; может и не быть.
Существенно то, что если выполняется более одного условия из N, обработано все равно будет только первое истинное условие. В показанной ниже программе составной условный оператор неверен, если ее разработчик хотел отдельно учесть значения x, меньшие единицы по модулю:
var x:real;
begin
write ('Введите x:'); readln (x);
if x<0 then writeln ('Отрицательный')
else if x=0 then writeln ('Ноль')
else if abs(x)<1 then
writeln ('По модулю меньше 1')
else writeln ('Больше 1');
end.
Условие x<0 сработает, например, для значения x=-0.5, что не позволит программе проверить условие abs(x)<1.
Еще одну распространенную ошибку работы с составным условным оператором показывает произведенный ниже расчет знака n переменной a:
if a<0 then n:=-1;
if a=0 then n:=0
else n:=1;
Применение одного короткого и одного полного условных операторов является здесь грубой ошибкой -- ведь после завершения короткого условного оператора для всех ненулевых значений a будет выполнено присваивание n:=1. Правильных вариантов этого расчета, по меньше мере, два:
if a<0 then n:=-1;
if a=0 then n:=0;
if a>0 then n:=1;
- с помощью 3 коротких условных операторов, вариант не очень хорош тем, что проверяет лишние условия даже тогда, когда знак уже найден.
if a<0 then n:=-1;
else if a<0 then n:=1;
else n:=0;
- с помощью составного условного оператора, этот вариант лучше. На практике следует помнить, что для вещественных значений сравнение с нулем может быть проблематично.
Можно сделать вывод, что при программировании многовариантных расчетов следует соблюдать осторожность, чтобы не допустить "потерянных" или неверно срабатывающих ветвей алгоритма.
В качестве еще одного примера рассчитаем значение функции, заданной графически (рис. 7.2).
Рис. 7.2. Функция, заданная графически
Перепишем функцию в аналитическом виде:
Одним из вариантов запрограммировать вычисление y(x) мог бы быть следующий:
if abs(x)>1 then y:=0
else if x<0 then y:=x+1
else y:=1-x;
Возможна и последовательная проверка условий слева направо, которая породит немного избыточный, но легче воспринимающийся код:
if x<-1 then y:=0
else if x<0 then y:=x+1
else if x<1 then y:=1-x
else y:=0;
Вложенные условные операторы
Когда после ключевых слов then или else вновь используются условные операторы, они называются вложенными. Число вложений может быть произвольно, при этом действует правило: else всегда относится к ближайшему оператору if , для которого ветка else еще не указана. Часто вложением условных операторов можно заменить использование составного.
В качестве примера рассмотрим программу для определения номера координатной четверти p, в которой находится точка с координатами (x,y). Для простоты примем, что точка не лежит на осях координат. Без использования вложений основная часть программы может иметь следующий вид:
if (x>0) and (y>0) then p:=1
else if (x<0) and (y>0) then p:=2
else if (x<0) and (y<0) then p:=3
else p:=4;
Однако использование такого количества условий представляется явно избыточным. Перепишем программу, используя тот факт, что по каждое из условий x>0, x<0 оставляет в качестве значения p только по 2 возможных четверти из 4:
if x>0 then begin
if y>0 then p:=1
else p:=4;
end
else begin
if y>0 then p:=2
else p:=3;
end;
В первом фрагменте программе проверяется от 2 до 6 условий, во втором -- всегда только 2 условия. Здесь использование вложений дало существенный выигрыш в производительности.
Рассмотренный в п. 7.6 пример с определением знака числа может быть переписан и с использованием вложения:
if a>0 then n:=1
else begin
if a<0 then n:=-1
else n:=0;
end;
Однако, как эти операторы, так и составной условный оператор из п. 7.6 проверяют не более 2 условий, так что способы примерно равноценны.