Главная страница / 24. Базовые алгоритмические структуры: 24.4. Основные операторы ...
24.4. Основные операторы циклов и ветвления
← 24.3. Циклические алгоритмические структуры | 24.5. Контрольные вопросы и задания → |
Примеры операторов, поддерживающих описанные в предыдущих разделах структурные конструкции алгоритмов, приведем на примере языков паскаль и С (С++).
Бинарное ветвление на языке Паскаль реализуется оператором if-then-else. Его конструкция имеет следующий вид:
if <логическое выражение > then <оператор 1> else <оператор 2>
Если ветвь реализуется более чем одним оператором, то они объединяются операторными скобками begin ... end. Перед else разделитель «точка с запятой» не ставится.
В качестве примера приведем запись этого оператора для вычисления корней квадратного уравнения по алгоритму, показанному на рис. 23.3.
...
if D>=0 then
begin
x1:=re+im;
x2:=re-im;
key:=0;
end
else
begin
x1:=re;
x2:=im;
key:=1;
end;
...
Обход на языке паскаль реализуется оператором if-then, представляющим упрощенную форму предыдущего без блока else:
if <логическое выражение > then <оператор>
Например,
...
if x<0 then
begin
x:=-x;
y:=sin(x)+exp(x);
end;
...
На языке С++ аналогичные операторы if-else и if имеют следующую форму:
if (<логическое выражение >) <оператор 1> else <оператор 2>;
if (<логическое выражение >) < оператор >;
Примеры их записи:
...
if (x<0)
{
x=-x;
y=sin(x)+exp(x);
}
...
...
if (D>=0)
{
x1=re+im;
x2=re-im;
key=0;
}
else
{
x1=re;
x2=im;
key=1;
}
...
Множественное ветвление на паскале реализуется оператором case-of:
case <s> of
a:<Ветвь A>;
b:<Ветвь B>;
c:<Ветвь C>;
…
else
<Ветвь X>;
end;
В этом операторе S представляет собой выражение любого порядкового типа (целое, символьное и пр.). Оно вычисляется и затем выбирается ветвь с совпадающей по значению меткой (a, b, c в данной записи). После ее исполнения происходит выход из оператора. В качестве меток используются константы того же типа, что и S. Если это значение не совпало ни с одной из меток, то выполняется ветвь, стоящая после служебного слова else. Если действия в ветви требуют несколько операторов, то их следует объединить операторными скобками begin ... end. В конкретном примере применения этого оператора переменным x, y и z присваивается различный набор значений, зависящий от значения переменной-селектора key, которая имеет символьный тип:
...
case key of
'a': begin x:=1; y:=2; z:=3; end;
'b': begin x:=2; y:=3; z:=4; end;
'c': begin x:=3; y:=4; z:=5; end;
else begin x:=0; y:=0; z:=0; end;
end;
...
На C++ множественное ветвление реализуется оператором switch:
switch (<s>)
{
case a:<Ветвь A>; break;
case b:<Ветвь B>; break;
case c:<Ветвь C>; break;
...
default <Ветвь X>;
}
Выражение-селектор S в этом операторе записывается в круглых скобках. Операторы каждой ветви можно не объединять операторными скобками {...}. Но каждая ветвь обычно заканчивается оператором break. Он не является обязательным, но при его отсутствии после текущей ветви будет выполняться следующая. Это расширяет возможности оператора. Например, если break отсутствует в первой ветви и S = a, то после выполнения ветви A будет выполнена ветвь B. При S = b будет выполнена только ветвь B.
Приведенный выше для паскаля пример на языке С++ выглядит следующим образом:
...
switch (key)
{
case 'a': x=1; y=2; z=3; break;
case 'b': x=2; y=3; z=4; break;
case 'c': x=3; y=4; z=5; break;
default: x=0; y=0; z=0;
}
...
Цикл с послеусловием на языке паскаль реализуется оператором repeat-until:
repeat <тело цикла> until <логическое выражение >;
Тело цикла окаймляется служебными словами repeat и until. Цикл повторяется до тех пор, пока логическое выражение, следующее после until, не примет значение Истина. Даже если в тело цикла входит несколько операторов, то операторные скобки begin ... end использовать не нужно. Пример использования этого оператора для нахождения суммы чисел от 1 до n:
...
Sum:=0;
i:=1;
repeat
Sum:=Sum+i;
i:=i+1;
until i>n;
...
На языке С++ цикл с послеусловием реализуется оператором do-while:
do <оператор тела цикла> while (<логическое выражение >);
В отличие от паскаля, возврат на начало цикла будет происходить, пока логическое выражение имеет значение Истина. Когда логическое выражение примет значение Ложь, оператор тела цикла выполнится последний раз и цикл завершится. Логическое выражение записывается в круглых скобках. Тело цикла, состоящее из некоторых операторов, объединяется в составной операторными скобками {...}. Пример оператора do-while выглядит следующим образом:
...
Sum=0;
i=1;
do
{
Sum=Sum+i;
i++;
}
while (i<=n);
...
Цикл с предусловием на паскале представлен оператором while:
while <логическое выражение > do <оператор тела цикла>;
Оператор тела цикла исполняется, пока логическое выражение имеет значение Истина. Тело цикла, состоящее из нескольких операторов, требует операторных скобок begin ... end. Пример записи этого цикла для расчета суммы предыдущего примера выглядит следующим образом:
...
Sum:=0;
i:=1;
while i<=n do
begin
Sum:=Sum+i;
i:=i+1;
end;
...
На языке C++ цикл с предусловием представлен аналогичным оператором while:
while (<логическое выражение >) <тело цикла>;
Различие с паскалем только в наличии скобок у логического выражения и в отсутствии служебного слова do. Тело цикла, состоящее из некоторых операторов, объединяется в составной операторными скобками {...}. Пример:
...
Sum=0;
i=1;
while (i<=n)
{
Sum=Sum+i;
i++;
}
...
Цикл по переменной на языке паскаль возможен только по переменной целого типа и с шагом, равным единице. Он реализуется операторами for-to-do (прямой цикл) и for-downto-do (обратный цикл):
for var:=<b> to <e> do <оператор тела цикла>
for var:=<b> downto <e> do <оператор тела цикла>
В этих конструкциях
- var – управляющая переменная цикла целого типа;
- B – выражение, задающее ее начальное значение;
- E – выражение, задающее ее конечное значение.
В прямом цикле должно выполняться условие E > B, а в обратном – E < B. Если это не выполняется, тело цикла не будет исполняться ни разу. Если тело цикла реализуется несколькими операторами, то они должны объединяться операторными скобками begin ... end.
Использование этих циклов для расчета суммы приведенных выше примеров выглядит следующим образом:
...
Sum:=0;
for i:=1 to n do
Sum:=Sum+i;
...
...
Sum:=0;
for i:=n downto 1 do
Sum:=Sum+i;
...
Удобно использовать эти циклы для работы с массивами, например, для расчета среднего значения Xmean элементов одномерного массива X:
...
Sum:=0;
for i:=1 to n do
Sum:=Sum+X[i];
Xmean:=Sum/n;
...
Для вывода на дисплей элементов матрицы A, состоящей из m строк и n столбцов, используется двойной цикл по индексу строки i и индексу столбца j:
...
for i:=1 to m do
begin
for j:=1 to n do
write(A[i,j]:6:2,’ ‘);
writeln;
end;
...
Ограничение, связанное с целым (порядковым) типом управляющей переменной в этих циклах создает небольшие неудобства при осуществлении цикла по вещественной переменной, например, при расчете таблицы значений вещественной функции y(x) вещественного аргумента x в пределах от Xmin до Xmax с шагом Xstp. Но они легко преодолеваются, особенно, если результаты нужно записывать в массивы:
...
n:=round((Xmax-Xmin)/Xstp)+1;
for i:=1 to n do
begin
X[i]:=Xmin+(i-1)*Xstp;
Y[i]:=f(X[i]);
end;
...
В этом фрагменте сначала вычисляется число точек зависимости n. Функция round() превращает вещественный результат деления в целый тип, используя правила округления. В цикле по очевидной формуле рассчитывается и записывается в соответствующий элемент массива X[] текущее значение аргумента. Затем рассчитывается и присваивается соответствующему элементу массива Y[] значение функции f() от этого аргумента.
На языке С++ цикл по переменной реализуется оператором for:
for (var = <ИВ >; <ЛВ>; <МВ> ) <оператор тела цикла>
где
- ИВ – инициирующее выражение, присваивающее начальное значение управляющей переменной цикла var;
- ЛВ – логическое выражение – условие повторения цикла;
- МВ – модифицирующее выражение, изменяющее значение управляющей переменной цикла.
Цикл повторяется, пока ЛВ имеет значение Истина . Тело цикла представляет собой либо простой, либо составной оператор со скобками {...}. Переменная цикла может быть вещественной.
Язык С++, в отличие от паскаля, позволяет внутри тела цикла изменять значение управляющей переменной, но делать это не рекомендуется.
Приведенные выше примеры цикла по переменной на языке С++ выглядят следующим образом.
Расчет суммы:
...
Sum=0;
for (i=1; i<=n; i++)
Sum=Sum+i;
...
Расчет среднего значения элементов массива:
...
Sum=0;
for (i=1; i<=n; i++)
Sum=Sum+X[i];
Xmean=Sum/n;
...
Вывод на дисплей матрицы A:
...
for (i:=1; i<=m; i++)
{
for (j=1; j<=n; j++)
printf(“%6.2f ”,A[i][j]);
printf(“\n”);
}
...
Расчет таблицы вещественной функции:
...
n=round((Xmax-Xmin)/Xstp)+1;
for (i=1; i<=n; i++)
{
X[i]=Xmin+(i-1)*Xstp;
Y[i]=f(X[i]);
}
...
Для округления здесь также используется функция round(), которой в стандартном С++ нет, но она легко может быть разработана. Текст ее не приводим, так как для примера записи цикла это не имеет существенного значения.
← 24.3. Циклические алгоритмические структуры | 24.5. Контрольные вопросы и задания → |