На рис. 3 представлен алгоритм, соответствующий инструкции if–then.
Рис. 3. Алгоритм, реализуемый инструкцией if–then
Например, инструкция
if n=m
then c:=c+l;
увеличивает значение переменной с только в том случае, если значения переменных n и m равны.
В предыдущем примере, в программе контроля веса, множественный выбор был реализован при помощи вложенных одна в другую инструкций if. Такой подход не всегда удобен, особенно в том случае, если количество вариантов хода программы велико.
В языке Delphi есть инструкция case, которая позволяет эффективно реализовать множественный выбор. В общем виде она записывается следующим образом:
case Селектор of список1:
begin
{инструкции 1} end; список2:
begin
{инструкции 2} end; списокМ:
begin
{инструкции N}
end;
else
begin
(инструкции)
end;
end;
где:
Селектор – выражение, значение которого определяет дальнейший ход выполнения программы (т.е. последовательность инструкций, которая будет выполнена);
Список N – список констант. Если константы представляют собой диапазон чисел, то вместо списка можно указать первую и последнюю константу диапазона, разделив их двумя точками. Например, список 1, 2, 3, 4, 5, 6 может быть заменен диапазоном 1..6.
Выполняется инструкция case следующим образом:
1. Сначала вычисляется значение выражения–селектора.
2. Значение выражения–селектора последовательно сравнивается с константами из списков констант.
3. Если значение выражения совпадает с константой из списка, то выполняется соответствующая этому списку группа инструкций. На этом выполнение инструкции саsе завершается.
4. Если значение выражения–селектора не совпадает ни с одной константой из всех списков, то выполняется последовательность инструкций, следующая за else.
Синтаксис инструкции case позволяет не писать else и соответствующую последовательность инструкций. В этом случае, если значение выражения не совпадает ни с одной константой из всех списков, то выполняется следующая за case инструкция программы.
На рис. 4 приведен алгоритм, реализуемый инструкцией case.
Рис. 4. Алгоритм, реализуемый инструкцией case
Алгоритмы решения многих задач являются циклическими, т.е. для достижения результата определенная последовательность действий должна быть выполнена несколько раз.
Например, программа контроля знаний выводит вопрос, принимает ответ, добавляет оценку за ответ к сумме баллов, затем повторяет это действие еще и еще раз, и так до тех пор, пока испытуемый не ответит на все вопросы.
Другой пример. Для того чтобы найти фамилию человека в списке, надо проверить первую фамилию списка, затем вторую, третью и т.д. до тех пор, пока не будет найдена нужная фамилия или не будет достигнут конец списка.
Алгоритм, в котором есть последовательность операций (группа инструкций), которая должна быть выполнена несколько раз, называется циклическим, а сама последовательность операций именуется циклом.
В программе цикл может быть реализован при помощи инструкций for, while и repeat.
Рассмотрим следующую задачу. Пусть нужно написать программу, которая вычисляет значение функции у = 5х2 – 7 в точках –1, –0.5, 0, 0.5 и 1
(таблица должна быть выведена в поле метки формы приложения). Процедура, обеспечивающая решение поставленной задачи, может выглядеть так:
Процедура TForm1. ButtonlClick (Sender: TObject); var
у: real; // значение функции
x: real; // аргумент функции
dx: real; // приращение аргумента
st: string; // изображение таблицы
begin
st:='';
x:= –1; dx:= 0.5;
у:= 5*х*х –7;
st:= st+ FloatToStr(x)+' '+ FloatToStr(y)+chr(13);
x:=x + dx;
у:= 5*х*х –7;
st:= st+ FloatToStr(x)+* '+ FloatToStr(y)+chr(13);
x:=x + dx;
у:= 5*х*х –7;
st:= st+ FloatToStr(x)+* '+ FloatToStr(y)+chr(13);
x:=x + dx;
у:= 5*х*х –7;
st:= st+ FloatToStr(x)+' ' + FloatToStr(y)+chr(13);
x:=x + dx;
у:= 5*х*х –7;
st:= st+ FloatToStr(x)+' '+ FloatToStr(y)+chr(13);
x:=x + dx;
Label1. Caption:= st;
end;
Из текста процедуры видно, что группа инструкций
у:= 5*х*х –7;
st:= st+ FloatToStr(x)+' '+ FloatToStr(y)+chr(13);
x:=x + dx;
Обеспечивающая вычисление значения функции, формирование строки таблицы и увеличение аргумента, выполняется 5 раз.
Воспользовавшись инструкцией for, приведенную процедуру можно переписать следующим образом:
Процедура TForm1. ButtonlClick (Sender: TObject);
var
у: real; // значение функции
x: real; // аргумент функции
dx: real; // приращение аргумента
st: string; // изображение таблицы
i: integer; // счетчикциклов
begin
st:=''; x:= –1; dx:= 0.5;
for i:=l to 5 do begin
у:= 5*x*x –7;
st:= st+ FloatToStr(x)+' '+ FloatToStr(y)+chr(13); x:=x + dx; end;
Label1. Caption:= st;
end;
Второй вариант процедуры, во-первых, требует меньше усилий при наборе, во-вторых, процедура более гибкая: для того чтобы увеличить количество строк в выводимой таблице, например до десяти, достаточно в строке for i:=1 to 5 do число 5 заменить на 10.
Инструкция for используется в том случае, если некоторую последовательность действий (инструкций программы) надо выполнить несколько раз, причем число повторений заранее известно.
В общем виде инструкция for записывается следующим образом: for счетчик:= нач_знач to кон_знач do begin
// здесь инструкции, которые надо выполнить несколько раз end
где:
счетчик – переменная–счетчик числа повторений инструкций цикла;
нач_знач – выражение, определяющее начальное значение счетчика циклов;
кон_знач – выражение, определяющее конечное значение счетчика циклов.
Переменная счетчик, выражения нач_знач и кон_знач должны быть целого типа.
Количество повторений инструкций цикла можно вычислить по формуле
(кон_знач – нач_знач + l).
Примеры:
for i:=l to 10 do begin
label1.caption:=label1.caption + '*'; end;
for i: =1 to n do s:= s+i;
Примечание
Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.
Алгоритм, соответствующий инструкции for, представлен на рис. 5. Обратите внимание, что если начальное значение счетчика больше конечного значения, то последовательность операторов между begin и end не будет выполнена ни разу.
Кроме того, после каждого выполнения инструкций тела цикла счетчик циклов увеличивается автоматически.
Переменную–счетчик можно использовать внутри цикла (но ни в коем случае не изменять).
Рис. 5. Алгоритм инструкции for
Инструкция (цикл) while используется в том случае, если некоторую последовательность действий (инструкций программы) надо выполнить несколько раз, причем необходимое число повторений во время разработки программы неизвестно и может быть определено только во время работы программы.
Типичными примерами использования цикла while являются вычисления с заданной точностью, поиск в массиве или в файле.
В общем виде инструкция while записывается следующим образом:
while условие do begin
// здесь инструкции, которые надо выполнить несколько раз
end
где условие – выражение логического типа, определяющее условие выполнения инструкций цикла.
1. Инструкция while выполняется следующим образом:
2. Сначала вычисляется значение выражения условие.
3. Если значение выражения условие равно False (условие не выполняется), то на этом выполнение инструкции while завершается.
4. Если значение выражения условие равно True (условие выполняется), то выполняются расположенные между begin и end инструкции тела цикла. После этого снова проверяется выполнение условия. Если условие выполняется, то инструкции цикла выполняются еще раз. И так до тех пор, пока условие не станет ложным (False).
Алгоритм, соответствующий инструкции while, представлен на рис. 6.
Внимание!
Для того чтобы инструкции цикла while, которые находятся между begin и end, были выполнены хотя бы один раз, необходимо, чтобы перед выполнением инструкции while значение выражения условие было истинно.
Рис. 6. Алгоритм инструкции while
Для того чтобы цикл завершился, нужно, чтобы последовательность инструкций между begin и end влияла на значение выражения условие (изменяла значения переменных, входящих в выражение условие).
Инструкция repeat, как и инструкция while, используется в программе в том случае, если необходимо выполнить повторные вычисления (организовать цикл), но число повторений во время разработки программы неизвестно и может быть определено только во время работы программы, т.е. определяется ходом вычислений.
В общем виде инструкция repeat записывается следующим образом:
repeat
// инструкции unti1 условие
где условие – выражение логического типа, определяющее условие завершения цикла.
Инструкция repeat выполняется следующим образом:
1. Сначала выполняются находящиеся между repeat и until инструкции тела цикла.
2. Затем вычисляется значение выражения условие. Если условие ложно (значение выражения условие равно False), то инструкции тела цикла выполняются еще раз.
3. Если условие истинно (значение выражения условие равно True), то выполнение цикла прекращается.
Таким образом, инструкции цикла, находящиеся между repeat и unti1, выполняются до тех пор, пока условие ложно (значение выражения условие
равно False).
Алгоритм, соответствующий инструкции repeat, представлен на рис. 7.
Рис. 7. Алгоритм, соответствующий инструкции repeat
Внимание!
Инструкции цикла, находящиеся между repeat и until, выполняются как минимум один раз. Для того чтобы цикл завершился, необходимо, чтобы инструкции цикла, располагающиеся между repeat и until, изменяли значения переменных, входящих в выражение условие.
Инструкции if и case используются для перехода к последовательности инструкций программы в зависимости от некоторого условия. Поэтому их иногда называют инструкциями условного перехода. Помимо этих инструкций управления ходом выполнения программы существует еще одна – инструкция безусловного перехода goto.