Операторы условной передачи управления
Операторы условной передачи управления– предписатели сохранения (нарушения) естественного хода выполнения программы в зависимости от результатов проверки условий.
Они реализуют в программе предписания логических блоков о выборе необходимого из путей решения.
В Си/Си++ существует один оператор условной передачи управления (условного перехода), используемый в двух вариантах – укороченном и полном.
Укороченный оператор условного перехода
Укороченный оператор условного перехода используется для реализации структуры неполного ветвления (табл. 4.1).
Структуры оператора:
if( P ) ветвь_ДА или if( P )
ветвь_ДА
где if – ключевое слово (если);
P – выражение, соответствующее проверяемому условию;
( ) – ограничители выражения P;
ветвь_ДА – выполняемый оператор (простой или составной).
Выражение P, как и проверяемое условие, может быть логическим или арифметическим. В большинстве случаев в качестве P применяются логические выражения.
Логическое выражение– совокупность операндов, соединённых знаками логических действий.
В простейшем варианте логическое выражение имеет структуру операции отношения:
, где а и b – операнды (арифметические выражения), подлежащие сравнению;
– символ операции отношения.
В качестве операций отношения используются стандартные математические. Соответствие их обозначениям в Си/Си++ представлено в табл. 4.2.
Таблица 4.2
Обозначение в математике | < | = | > | |||
Обозначение в Си/Си++ | < | = = | > | <= | != | >= |
Примеры записи некоторых логических выражений выполнены в табл. 4.3.
Таблица 4.3
Запись в математике | Запись на Си/Си++ |
sin x > 0,351 | sin(x) > 0.351 |
log(a) <= pow( c, 2) | |
cos(b) – 0.6 * d != 0 | |
fabs(t-2.) = = 7.65 – pow(d,1./3.) |
Операции отношения по приоритету выполнения ниже всех арифметических, но между собой делятся на группы с большим и меньшим приоритетом:
· операции <, >, <=, >= имеют одинаковый больший приоритет и выполняются после арифметических операций;
· операции = =,!= имеют одинаковый меньший приоритет и выполняются после отношений, принадлежащих к старшей группе.
ü Внимание! Результатом вычисления логического выражения является логическая константа true (ИСТИНА), если условие выполняется, либо false (ЛОЖЬ), в противном случае.
Так, результат вычисления выражения с<2. при с=3.0 есть false (ЛОЖЬ), а при с=1.5 – true (ИСТИНА).
Арифметические выражения в операторе if используются относительно редко.
Результат вычисления арифметического выражения есть константа. Если полученная константа равна нулю – результат проверки есть false (ЛОЖЬ). Если значение константы не равно нулю – результат проверки есть true (ИСТИНА).
Так, проверка выражения 4-z2 сводится к анализу его результата. Если переменная z целочисленная и имеет значение 2 то результат проверки (4 - 22 = 0) – false (ЛОЖЬ). При любом другом значении z получаемая константа не равна нулю, следовательно, результат проверки – true (ИСТИНА).
ü Внимание! Проверка равенства нецелых операндов, как правило, безрезультатна, ввиду особенности представления вещественных констант в ЭВМ с использованием многоразрядной дробной мантиссы. Попытка выполнения над ними операции = = приводит к не идентичности результатов за счет погрешности в младших разрядах мантиссы.
Таким образом, анализ на ноль не целых операндов не будет давать устойчивых результатов при проверке ( ).
Порядок выполнения укороченного условного оператора:
· вычисляется логическое (арифметическое) выражение P;
· результат вычисления анализируется. Если он не равен нулю (ИСТИНА), выполняется ветвь_ДА, а затем управление передаётся оператору, следующему за if. Если результат равен нулю (ЛОЖЬ) – ветвь_ДА не выполняется и управление передаётся оператору, следующему за if.
ИСТИНА if(P) ветвь_ДА | ИСТИНА if( P ) ветвь_ДА | ЛОЖЬ if( P ) ветвь_ДА | ЛОЖЬ if( P ) ветвь_ДА |
Так, фрагменты программ
. . . if(t<=0.5) x1=g; x2=1.7; . . . | . . . if(t<=0.5) x1=g; x2=1.7; . . . | . . . if(t<=0.5) {x1=g; n=1;} x2=1.7; . . . | if(t<=0.5) { x1=g; n=1; } x2=1.7; |
работают следующим образом:
· вычисляется логическое выражение (t <= 0.5);
· если результат ИСТИНА (например, при t=0.4), то будет выполнен оператор ветви ДА (простой x1=g; или составной {x1=g; n=1;}), а затем следующий за if (x2=1.7;);
· если результат ЛОЖЬ (например, при t = 0.6) оператор ветви ДА (простой x1 = g; или составной {x1 = g; n = 1;}) игнорируется и управление передаётся следующему за if оператору (x2 = 1.7;).
Следовательно, стандартная структура укороченного оператора if позволяет реализовать неполное ветвление при расположении ветви «ДА» непосредственно под проверяемым условием.
Возможно использование укороченного if для реализации второго варианта структуры неполного ветвления (расположение ветви «НЕТ» под проверяемым условием). При этом в качестве ветви ДА применяется goto m; и оператор if принимает вид:
if(Р) goto m;
Правила записи и выполнения
Метка m выбирается произвольно в ряду других меток программы.
Оператор, помеченный меткой m в соответствии с требованиями алгоритма, может располагаться как выше, так и ниже оператора if.
При выполнении проверяемого условия (результат – ИСТИНА), управление передаётся оператору goto, который в свою очередь передаёт управление оператору, помеченному меткой m, нарушая естественный порядок следования операторов.
Если результат проверки есть ЛОЖЬ, сохраняется естественный порядок следования операторов, т.е. управление передаётся оператору, записанному непосредственно под if.
Схема выполнения:
ЛОЖЬ ИСТИНА
if( Р ) goto m;
ветвь_НЕТ
m: . . .
В качестве ветви НЕТ может использоваться один (простой, составной) или несколько операторов. Например,
. . . if(.9>=c) goto M4; y2=15; M4: z=10.; . . . | . . . if(.9>=c) goto M4; y2=15; n=2; M4: z=10.; . . . | . . . if(.9>=c) goto M4; { y2=15; n=2; } M4: z=10.; . . . |
В каждом из фрагментов невыполнение проверяемого условия .9>=c (например, при c=1.6) приводит к выполнению ветви «НЕТ», т.е. операторов, записанных непосредственно под if до помеченного меткой М4, а затем и его тоже. Выполнение условия (например, при c=0.4) приводит к реализации оператора goto M4;, который (минуя операторы ветви «НЕТ») передаёт управление оператору с меткой М4.
В принципе, возможна реализация условно-линейного варианта полного ветвления (ветвь «НЕТ», затем ветвь «ДА») с использованием укороченного if и двух goto.
Структура имеет вид:
if(Р) goto m1;
ветвь_НЕТ
goto m2;
m1: ветвь_ДА
m2:
В качестве ветвей НЕТ (ДА) может использоваться один (простой, составной) или несколько операторов. Например,
. . . if(8 != b) goto m1; y=sin(15.); goto m2; m1:y=log(120.5); m2:printf(“\ny=%.2f”, y); . . . | . . . if(8 != b) goto m1; y=sin(15.); n=2; goto m2; m1:y=log(120.5); n=1; m2:printf(“\ny=%.2f”, y); | if(8 != b) goto m1; { y=sin(15.); n=2; } goto m2; m1:{ y=log(120.5); n=1; } m2:printf(“\ny=%.2f”, y); |
В каждом из фрагментов выполнение проверяемого условия (8 != b), например, при b=6 приводит к реализации оператора goto m1;, который (минуя операторы ветви «НЕТ») передаёт управление оператору (операторам) с его меткой m1. Выполняется ветвь «ДА», после чего сохраняется естественный порядок реализации операторов (вывод результатов). Невыполнение проверяемого условия (8 != b), например, при b=8 приводит к выполнению ветви «НЕТ», т.е. операторов, записанных непосредственно под if, включая goto m2; который в свою очередь передаёт управление (минуя операторы ветви «ДА») на вывод результатов (выход из ветвления).
ü Внимание! Использование укороченного оператора условной передачи управления со структурой if(Р) goto m допускается, но не поощряется правилами программирования, т.к. создаёт сложную структуру ветвления с использованием двух меток.
Полный оператор условного перехода
Полный оператор условного перехода используется для реализации в программе условно-линейного варианта схемы алгоритма, в котором после ветви «ДА» располагается ветвь «НЕТ» (табл. 4.1).
Структура оператора:
if( P )
ветвь_ДА
[else
ветвь_НЕТ]
, где if, else – ключевые слова (если, иначе);
P – выражение, подлежащее проверке;
( ) – ограничители P;
ветвь_ДА – простой (составной) оператор, соответствующий выполнению проверяемого условия;
ветвь_НЕТ – простой (составной) оператор, соответствующий невыполнению проверяемого условия;
[ ] – признак необязательности содержимого.
Оператор выполняется следующим образом:
· вычисляется выражение P;
· если P истинно, выполняется оператор ветви «ДА» и управление передаётся оператору, записанному под ветвью «НЕТ»;
· если P ложно, выполняется оператор ветви «НЕТ», а затем оператор, расположенный под этой ветвью.
Так, фрагмент программы
предписывает проверку логического условия а<=d и, при выполнении его, вычисление y1=s, а затем z=k. Если же проверяемое условие не выполняется (a>d), будет вычислен y1=1.7, а затем z=k.
Фрагменты программ
предписывают проверку логического условия а<=d и, при выполнении его, вычисление y1=s и n=1, а затем z=k.
Если же проверяемое условие не выполняется (a>d), будут вычислены y1=1.7 и n=2, а затем z=k.
Правила записи и использования
Отсутствие указанных в квадратных скобках элементов приводит к получению укороченного (неполного) оператора условного перехода.
В ветви «ДА» может быть один простой оператор или требуемое их количество, оформленное в виде одного составного оператора.
В ветви «НЕТ» должен быть только один простой (составной) оператор.
В каждой из ветвей возможно использование других операторов if для проверки дополнительных условий. В этом случае говорят о вложенных операторах if. При записи вложенных if рекомендуется для наглядности сдвигать их вправо от основного.
Рассмотренные операторы условной передачи управления позволяют выполнить программирование алгоритма (рис. 4.3), представленного двумя условно-линейными изображениями (рис. 4.4).
Анализ условно-линейных схем алгоритма и структур условных операторов позволяет сделать следующие выводы:
· реализовать в программе вариант алгоритма, в котором после проверки условия расположена ветвь “НЕТ” позволяет только неполный оператор условного перехода;
· программировать вариант алгоритма, в котором под проверкой условия располагается ветвь “ДА” возможно только с использованием полного оператора условного перехода.
С учётом изложенного выполним идентификацию переменных и составим программы решения задачи о нагрузках на основания.
Идентификация переменных представлена в табл. 4.4.
Таблица 4.4
Обозначения в алгоритме | Vc | rс | Мкр | L | doc | k1 | p | Mc | F | n |
Обозначения в программе | vc | roc | mkr | l | doc | k1 | PI | mc | f | n |
Составление программы по условно-линейной схеме варианта 1
Анализ первого варианта условно-линейной схемы, в которой под блоком проверки условия расположена ветвь «ДА», а затем ветвь «НЕТ», и структур полного и укороченного оператора if позволяет сделать вывод, что для программирования можно применять только полный if с аналогичным расположением ветвей.
Вариант программы может выглядеть следующим образом:
/* Задача 4.1. Простое ветвление. Полный if */
/* Разработал студент гр. А031 Степанов И.Г. */
#include <stdio.h> /* включающие */
#include <stdlib.h> /* директивы */
#include <math.h> /* препроцессора */
main( )
{
float vc, roc, mkr, l, doc, k1, pi=3.1416, mc, f;
int n;
scanf(“%3f%5f%5f%4f%4f%4f”, &vc, &roc, &mkr, &l, &doc, &k1);
printf(“\n vc=%5.2f roc=%5.3f mkr=%5.2f l=%5.1f” “doc=%5.2f k1=%4.2f\n”, vc, roc, mkr, l, doc, k1);
mc=vc*roc;
if(mc<=mkr) /* полный вариант оператора if */
{
f=mc/pow(l*k1,2); /* операторы */
n=1; /* ветви “ДА” */
}
else
{
f=mc/(pi*pow(doc,2)/4.); /* операторы */
n=2; /* ветви “НЕТ” */
}
printf(“\n mc=%9.3f f=%9.3f n=%6d\n", mc, f, n);
}
15.0.96314.85296.2.650.01 – данные для проверки ветви 1
15.1.15014.85296.2.650.01 – данные для проверки ветви 2
15.0.98014.85296.2.650.01 – данные для расчёта
Несколько строк значений исходных данных при одном операторе ввода показывают необходимость последовательного троекратного выполнения программы. Это нужно для того, чтобы перед решением задачи с указанными в ней значениями, убедиться в работоспособности каждой из ветвей. Отладочные просчёты ведутся со специально подобранными значениями вводимых величин, как правило, граничными в заданном диапазоне. После отладки программы выполняется решение задачи с истинными исходными данными.
Первые две строки численных значений вводимых переменных позволяют провести отладку (проверку работоспособности) программы по каждой из ветвей. При roс=0.963 (первая строка), проверяемое условие выполняется и рассчитывается ветвь «ДА». Для roc=1.15 (вторая строка), условие не выполняется и решение должно пройти по ветви «НЕТ». Третья строка позволяет получить конкретные результаты для реально заданного значения плотности.
Результаты счета представлены в приложении 4.1 (а, б, в).
Составление программы по условно-линейной схеме варианта 2
Анализ второго варианта условно-линейной схемы, в которой под блоком проверки условия расположена ветвь «НЕТ», а затем ветвь «ДА», и структур полного и укороченного оператора if позволяет сделать вывод, что для программирования требуется применить структуру с использованием укороченного if и двух goto.
Вариант программы может иметь вид:
/* Задача 4.1. Простое ветвление. Неполный if */
/* Разработал студент гр. А031 Степанов И.Г. */
#include <stdio.h> /* включающие */
#include <stdlib.h> /* директивы */
#include <math.h> /* препроцессора */
main( )
{
float vc, roc, mkr, l, doc, k1, pi=3.1416, mc, f;
int n;
scanf(“%3f%5f%5f%4f%4f%4f”, &vc, &roc, &mkr, &l, &doc, &k1);
printf(“\n vc=%5.2f roc=%5.3f mkr=%5.2f l=%5.1f”
“doc=%5.2f k1=%4.2f\n”, vc, roc, mkr, l, doc, k1);
mc=vc*roc;
if(mc<=mkr) goto M1; /*укороченный вариант оператора if*/
f=mc/(pi*pow(doc,2)/4.); /* операторы */
n=2; /* ветви “НЕТ” */
goto M2;
M1: f=mc/pow(l*k1,2); /* операторы */
n=1; /* ветви “ДА” */
M2:printf(“\n mc=%9.3f f=%9.3f n=%6d\n", mc, f, n);
}
15.0.96314.85296.2.650.01 – данные для проверки ветви 1
15.1.15014.85296.2.650.01 – данные для проверки ветви 2
15.0.98014.85296.2.650.01 – данные для расчёта
Первые две строки численных значений вводимых переменных необходимы для отладки программы по обеим ветвям в зависимости от разных плотностей. Третья строка позволяет получить конкретные результаты для реально заданного значения плотности.
Результаты счета представлены в приложении 4.2 (а, б, в).
Составление программ завершает этап создания программного продукта задачи о нагрузках на основания.