3.2
Оператор присваивания
Оператор
присваивания в языке Free Pascal состоит из двух символов: двоеточия и
знака равенства. Символы := всегда пишут слитно. Пробелы допускаются перед
символом двоеточия и после символа равенства.
В общем случае оператор присваивания имеет вид:
имя_переменной := значение;
где значение —
это выражение, переменная,
константа или функция. Выполняется оператор
так. Сначала вычисляется значение выражения,
указанного в правой части оператора, а затем его результат записывается в
область памяти (переменную), имя которой указано слева. Например, запись a:=b означает,
что переменной а присваивается значение выражения b.
Типы переменной a и
выражения b должны совпадать или быть совместимыми для присваивания, то
есть тип, к которому принадлежит b,
должен находиться в границах типа переменной а.
Оператор
присваивания, как и любой другой оператор в языке Free Pascal, отделяется от других точкой с запятой.
3.3
Составной оператор
Составной
оператор — группа операторов,
отделённых друг от друга точкой с запятой, начинающихся со служебного
слова begin и заканчивающихся служебным
словом end:
begin
оператор_1;
...
оператор_n
end;
Транслятор воспринимает составной оператор как один оператор.
3.4
Условные операторы
В языке Free Pascal одна
из основных конструкций алгоритма, разветвляющийся процесс, реализована двумя
условными операторами: if и case.
Рассмотрим каждый из них.
3.4.1
Условный оператор if..then..else
При решении большинства
задач порядок вычислений зависит от определённых условий, например от исходных
данных или от промежуточных результатов, полученных на предыдущих шагах
программы. Для организации вычислений в зависимости от какого-либо условия в языке
Free Pascal используется условный оператор if..then..else,
который в общем виде записывается так:
Рис. 3.8. Алгоритм условного оператора if..then..else
if условие then оператор_1 else оператор_2;
где if..then..else — зарезервированные
слова, условие — выражение логического типа2, оператор_1 и оператор_2 —
любые операторы языка Free Pascal.
Работа условного
оператора организована следующим образом. Сначала вычисляется выражение,
записанное в условии. Если
оно имеет значение истина (True), то
выполняется оператор_1. В противном случае, когда
выражение имеет значение ложь (False), оператор_1 игнорируется
и управление передаётся оператору_2.
Алгоритм, который
реализован в условном операторе if..then..else,
представлен на рис.
3.8.
Например, чтобы
сравнить значения переменных и , нужно создать следующий программный код:
write ( ’ x= ’ ); readln ( x
);
write ( ’ y= ’ ); readln ( y
);
if x=y then
writeln ( ’значение x
равно значению y ’ )
else writeln (
’значение x не равно значению y ’ );
Если в задаче
требуется, чтобы в зависимости от значения условия выполнялся не один оператор,
а несколько, необходимо использовать составной оператор:
if условие then
begin
оператор_1;
оператор_2;
...
оператор_n;
end
else
begin
оператор_1;
оператор_2;
...
оператор_n;
end;
Альтернативная
ветвь else в условном операторе может
отсутствовать, если в ней нет необходимости:
if условие then
оператор;
или
if условие then
begin
оператор_1;
оператор_2;
...
оператор_n;
end;
В таком
"усечённом" виде условный оператор работает так: оператор (группа
операторов) либо выполняется, либо пропускается в зависимости от значения
выражения, представляющего условие. Алгоритм этого условного процесса
представлен на рис.
3.9.
Пример применения
условного оператора, без альтернативной ветви else может быть таким:
write ( ’ x= ’ ); readln ( x
);
write ( ’ y= ’ ); readln ( y
);
c : = 0;
{Значение переменной
c изменяется только при условии,}
{что x не равно y.}
if ( x<>y ) then c :=x+y;
{Вывод на экран
значения переменной c}
{выполняется в любом
случае.}
writeln ( ’Значение
переменной с= ’, c );
Условные операторы
могут быть вложены друг в друга. При вложениях условных операторов всегда
действует правило: альтернатива else считается
принадлежащей ближайшему if,
имеющему ветвь else.
Например, в записи он принадлежит оператору if с условием_1.
Рис. 3.9. Алгоритм условного оператора if без альтернативной ветви
else
if условие_1
then
if условие_2
then
оператор_А
else оператор_Б;
оператор_Б относится
к условию_2, а в конструкции
if условие_1
then
begin
if условие_2
then
оператор_А;
end
else оператор_Б;
Для сравнения
переменных в условных выражениях применяют операции отношения : =,
<>, <, >, <=, >=. Условные выражения
составляют с использованием логических операций and, or и not. В языке Free
Pascal приоритет операций отношения меньше, чем у логических операций, поэтому
составные части сложного логического выражения заключают в скобки.
Допустим, нужно
проверить, принадлежит ли переменная интервалу . Условный оператор будет иметь вид:
if (
x>=a ) and ( x<=b ) then...
Запись
if x>=a and x<=b then...
неверна, так как
фактически будет вычисляться значение выражения
x>=(a and x)<=b.
3.4.2
Оператор варианта case
Оператор варианта case
необходим в тех случаях, когда в зависимости от значений какой-либо переменной
надо выполнить те или иные операторы.
case выражение of
значение_1 :
оператор_1;
значение_2 :
оператор_2;
...
значение_N :
оператор_N
else
альтернативный_оператор
end;
Здесь выражение —
переменная перечислимого типа (включая char и boolean), значение_1,
значение_2,..., значение_N — это конкретное
значение управляющей переменной или выражение, при котором необходимо выполнить
соответствующий оператор, игнорируя остальные варианты. Значения в каждом
наборе должны быть уникальны, то есть они могут появляться только в одном
варианте. Пересечение наборов значений для разных вариантов является ошибкой.
Оператор работает
следующим образом. Вычисляется значение выражения.
Затем выполняется оператор,
помеченный значением, совпадающим со
значением выражения. То есть, если выражение принимает значение_1,
то выполняется оператор_1. Если
выражение принимает значение_2,
то выполняется оператор_2 и
так далее. Если выражение не
принимает ни одно из значений,
то выполняется альтернативный_оператор,
расположенный после ключевого слова else.
Альтернативная
ветвь else может отсутствовать, тогда оператор
имеет вид:
case выражение of
значение_1 : оператор_1;
значение_2 :
оператор_2;
...
значение_N :
оператор_N;
end;
Кроме того, в операторе
case допустимо использование составного оператора. Например:
case выражение of
значение_1 : begin
оператор_A; оператор_B; end;
значение_2 : begin
оператор_C; оператор_D; оператор_E; end;
...
значение_N :
оператор_N;
end;
3.5
Операторы цикла
Циклический процесс,
или просто цикл — это повторение одних и тех же действий. Последовательность
действий, которые повторяются в цикле, называют телом цикла.
Один проход цикла называют шагом, или
итерацией9. Переменные, которые изменяются внутри цикла и влияют на его окончание, называются
параметрами цикла.
При написании
циклических алгоритмов следует помнить следующее. Во-первых, чтобы цикл имел
шанс когда-нибудь закончиться, содержимое его тела должно обязательно влиять на
условие цикла. Во-вторых, условие должно
состоять из корректных выражений и значений, определённых ещё до первого
выполнения тела цикла.
В языке Free Pascal для
удобства программиста предусмотрены три оператора, реализующих циклический
процесс: while, repeat..until и for.
3.5.1
Оператор цикла с предусловием while..do
На рис.
3.24 изображена блок-схема алгоритма цикла с предусловием.
Оператор, реализующий
этот алгоритм, в языке Free Pascal имеет вид:
while выражение do оператор;
Рис.
3.24. Алгоритм циклической структуры с предусловием
Выражение должно
быть логической константой, переменной или логическим выражением.
Работает оператор while следующим
образом. Вычисляется значение выражения.
Если оно истинно (True),
выполняется оператор. Выполнение цикла заканчивается, если
условие ложно, после этого управление передается оператору, следующему за телом
цикла. Выражение вычисляется перед каждой
итерацией цикла. Если при первой проверке выражение ложно
(False), цикл не выполнится ни разу.
Если в цикле надо
выполнить более одного оператора, необходимо использовать составной оператор:
while условие do
begin
оператор_1;
оператор_2;
...
оператор_n;
end;
Рассмотрим пример.
Пусть необходимо вывести на экран значения функции на отрезке с
шагом 0.1.
Применим цикл с
предусловием :
var x, y : real;
begin
{Присваивание
параметру цикла стартового значения.}
x : = 0;
{Цикл с
предусловием.}
while x<=pi do
{Пока параметр цикла не превышает}
{конечное
значение, выполнять тело цикла.}
begin
{Вычислить
значение y.}
y:=exp
( sin ( x ) ) * cos ( x );
{Вывод
на экран пары х и y.}
writeln
( ’ x= ’, x, ’ y= ’, y );
{Изменение
параметра цикла - переход к следующему значению x.}
x:=x +
0.1;
end; {Конец
цикла.}
end.
В результате работы
данного фрагмента программы на экран последовательно будут выводиться сообщения
со значениями переменных x и y:
x= 0; y=1
x= 0.1; y =1.0995
...
x= 3.1; y= -1.0415
3.5.2
Оператор цикла с постусловием repeat..until
Если в цикле с
предусловием проверка условия осуществляется до тела цикла, то в цикле с
постусловием условие проверяется после тела цикла. Сначала выполняются
операторы, являющиеся телом цикла, после чего проверятся условие, если
последнее ложно, то цикл повторяется. Выполнение цикла прекратится, если
условие станет истинным.
Рис. 3.25. Алгоритм циклической структуры с постусловием
В языке Free Pascal
цикл с постусловием реализован конструкцией
repeat
оператор;
until выражение;
или, если тело цикла
состоит более чем из одного оператора
repeat
оператор_1;
оператор_2;
...
оператор_N;
until выражение;
Выражение должно
быть логическим.
Работает цикл следующим
образом. В начале выполняется оператор, представляющий собой тело цикла. Затем
вычисляется значение выражения.
Если оно ложно (False), оператор тела цикла выполняется ещё
раз. В противном случае цикл завершается, и управление передается оператору,
следующему за циклом.
Таким образом, нетрудно
заметить, что цикл с постусловием всегда будет выполнен хотя бы один раз, в
отличие от цикла с предусловием, который может не выполниться ни разу.
Если применить цикл с
постусловием для создания подпрограммы, которая выводит значения функции на отрезке с
шагом 0.1, получим:
var x, y : real;
begin
{Присваивание
параметру цикла стартового значения.}
x : = 0;
{Цикл с
постусловием.}
repeat {Начало
цикла}
y:=exp
( sin ( x ) ) * cos ( x );
writeln ( ’
x= ’, x, ’ y= ’, y );
x:=x
+ 0.1; {Изменение значения параметра цикла.}
until x > pi;
{Закончить работу цикла,}
{когда
параметр превысит конечное значение.}
end.
3.5.3
Оператор цикла for..do
Операторы цикла с
условием обладают значительной гибкостью, но не слишком удобны для организации
"строгих" циклов, которые должны быть выполнены заданное число раз.
Оператор цикла for..do используется
именно в таких случаях:
for
параметр_цикла:=начальное_значение to конечное_значение do
оператор;
for
параметр_цикла:=конечное_значение downto начальное_значение do
оператор;
где оператор — любой
оператор языка, параметр_цикла —
имя переменной целочисленного или перечислимого типов, начальное_значение и конечное_значение должны
быть того же типа, что и параметр_цикла.
Шаг изменения
цикла for всегда постоянен и равен интервалу
между двумя ближайшими значениями типа параметра цикла (при целочисленном
значении параметра цикла шаг равен 1).
В случае если тело
цикла состоит более чем из одного оператора, необходимо использовать составной
оператор:
Рис.
3.26. Алгоритм работы цикла for..do
Рис. 3.27. Представление цикла for...do с помощью блок-схемы
for
параметр_цикла:=начальное_значение to конечное_значение do
begin
оператор_1;
оператор_2;
...
оператор_N;
end;
3.5.4
Операторы передачи управления
Операторы передачи
управления принудительно изменяют порядок выполнения команд. В языке Free
Pascal таких операторов пять: goto, break, continue, exit и halt.
Оператор goto
метка, где метка —
обычный идентификатор, применяют для безусловного перехода, он передаёт
управление оператору с меткой.
метка : оператор;
Обычно применение
оператора goto приводит к усложнению программы и затрудняет отладку.
Использование оператора нарушает принцип структурного программирования11,
согласно которому все блоки, составляющие программу, должны иметь только один
вход и один выход. В большинстве алгоритмов применения оператора goto можно
избежать, в нашей книге мы будем его использовать, но читатель должен знать о
наличии этого оператора в языке.
Операторы break и continue используют
только внутри циклов. Оператор break осуществляет
немедленный выход из циклов repeat, while, for,
и управление передается оператору, находящемуся непосредственно за циклом.
Оператор continue начинает новую итерацию цикла, даже если предыдущая не была
завершена.
Оператор exit осуществляет
выход из подпрограммы.
Оператор halt прекращает
выполнение программы
Питон
Последовательность
операторов
Последовательные действия описываются
последовательными строками программы. Стоит, правда, добавить, что в программах
важны отступы, поэтому все операторы, входящие в последовательность действий,
должны иметь один и тот же отступ:
a = 1
b = 2
a = a + b
b = a - b
a = a - b
print a, b
При работе с Python в интерактивном
режиме как бы вводится одна большая программа, состоящая из
последовательных действий. В примере выше использованы операторы присваивания и
оператор print
.
Оператор условия и выбора
Разумеется, одними только
последовательными действиями в программировании не обойтись, поэтому при
написании алгоритмов используется еще и ветвление:
if a > b:
c = a
else:
c = b
Этот кусок кода на Python интуитивно понятен каждому, кто помнит, что if
по-английски
значит "если", а else
- "иначе". Оператор
ветвления имеет в данном случае две части, операторы каждой из которых
записываются с отступом вправо относительно оператора ветвления. Более общий
случай - оператор выбора - можно записать с помощью следующего
синтаксиса (пример вычисления знака числа):
if a < 0:
s = -1
elif a == 0:
s = 0
else:
s = 1
Стоит заметить, что elif
- это сокращенный else if
.
Без сокращения пришлось бы применять вложенный оператор
ветвления:
if a < 0:
s = -1
else:
if a == 0:
s = 0
else:
s = 1
В отличие от оператора print
, оператор if-else
-
составной оператор.
Циклы
Третьей необходимой алгоритмической
конструкцией является цикл. С помощью цикла можно описать
повторяющиеся действия. В Python имеются два вида циклов: цикл ПОКА (выполняется
некоторое условие) и цикл ДЛЯ (всех значений
последовательности). Следующий пример иллюстрирует цикл ПОКА на
Python:
s = "abcdefghijklmnop"
while s != "":
print s
s = s[1:-1]
Оператор while
говорит интерпретатору Python:
"пока верно условие цикла, выполнять тело цикла".
В языке Python тело цикла выделяется отступом. Каждое исполнение тела
цикла будет называться итерацией. В приведенном примере
убирается первый и последний символ строки до тех пор, пока не останется пустая
строка.
Для большей гибкости при организации
циклов применяются операторы break
(прервать) и continue
(продолжить).
Первый позволяет прервать цикл, а второй - продолжить цикл, перейдя к следующей
итерации (если, конечно, выполняется условие цикла).
Следующий пример читает строки из файла и
выводит те, у которых длина больше 5:
f = open("file.txt", "r")
while 1:
l = f.readline()
if not l:
break
if len(l) > 5:
print l,
f.close()
В этом примере организован бесконечный цикл, который прерывается
только при получении из файла пустой строки (l
), что обозначает
конец файла.
В языке Python логическое значение несет
каждый объект: нули, пустые строки и последовательности, специальный
объект None
и логический литералFalse
имеют
значение "ложь", а прочие объекты значение "истина". Для
обозначения истины обычно используется 1
или True
.
Примечание:
Литералы True и False для
обозначения логических значений появились в Python 2.3.
|
Цикл ДЛЯ выполняет тело цикла для каждого
элемента последовательности. В следующем примере выводится таблица умножения:
for i in range(1, 10):
for j in range(1, 10):
print "%2i" % (i*j),
print
Здесь циклы for
являются вложенными.
Функция range()
порождает список целых чисел из
полуоткрытого диапазона [1, 10)
. Перед каждой итерацией счетчик
цикла получает очередное значение из этого списка. Полуоткрытые
диапазоны общеприняты в Python. Считается, что их использование более удобно и
вызывает меньше программистских ошибок. Например, range(len(s))
порождает
список индексов для списка s
(в Python-последовательности первый
элемент имеет индекс 0
). Для красивого вывода таблицы умножения
применена операция форматирования%
(для целых
чисел тот же символ используется для обозначения операции взятия остатка от
деления). Строка форматирования (задается слева) строится почти как строка
форматирования для printf
из C.
Функции
Программист может определять собственные
функции двумя способами: с помощью оператора def
или прямо в
выражении, посредством lambda
. Второй способ (да и вообще работа с
функциями) будет рассмотрен подробнее в лекции по функциональному
программированию на Python, а здесь следует привести пример определения и
вызова функции:
def cena(rub, kop=0):
return "%i руб. %i коп." % (rub, kop)
print cena(8, 50)
print cena(7)
print cena(rub=23, kop=70)
В этом примере определена функция двух аргументов (из которых второй
имеет значение по умолчанию - 0
).
Вариантов вызова этой функции с конкретными параметрами также несколько. Стоит
только заметить, что при вызове функции сначала должны идти позиционные
параметры, а затем, именованные. Аргументы со значениями по умолчанию должны
следовать после обычных аргументов. Оператор return
возвращает
значение функции. Из функции можно возвратить только один объект , но он может
быть кортежем из нескольких объектов.
После оператора def
имя cena
оказывается
связанным с функциональным объектом.
Исключения
В современных программах передача
управления происходит не всегда так гладко, как в описанных выше конструкциях.
Для обработки особых ситуаций (таких как деление на ноль или попытка чтения из
несуществующего файла) применяется механизм исключений. Лучше всего
пояснить синтаксис оператора try-except
следующим примером:
try:
res = int(open('a.txt').read()) / int(open('c.txt').read())
print res
except IOError:
print "Ошибка ввода-вывода"
except ZeroDivisionError:
print "Деление на 0"
except KeyboardInterrupt:
print "Прерывание с клавиатуры"
except:
print "Ошибка"
В этом примере берутся числа из двух файлов и делятся одно на другое. В
результате этих нехитрых действий может возникнуть несколько исключительных
ситуаций, некоторые из них отмечены в частях except
(здесь
использованы стандартные встроенные исключения Python). Последняя часть except
в
этом примере улавливает все другие исключения, которые не были пойманы выше.
Например, если хотя бы в одном из файлов находится нечисловое значение,
функция int()
возбудит исключение ValueError
.
Его-то и сможет отловить последняя часть except
. Разумеется,
выполнение части try
в случае возникновения ошибки уже не
продолжается после выполнения одной из частей except
.
В отличие от других языков
программирования, в Python исключения нередко служат для упрощения алгоритмов.
Записывая оператор try-except
, программист может думать так:
"попробую, а если сорвется - выполнится код в except
".
Особенно часто это используется для выражений, в которых значение получается по
ключу из отображения:
try:
value = dict[key]
except:
value = default_value
Вместо
if dict.has_key(key):
value = dict[key]
else:
value = default_value
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.