алгоритмом необходимо поместить несколько инструкций, а синтаксис языка разрешает использовать только одну,
Эта инструкция используется для программирования разветвляющихся алгоритмов. Назначение этой инструкции состоит в моделировании на языке Си двух стандартных управляющих конструкций структурного программирования, которые применяются для организации разветвляющихся алгоритмов:
●Альтернатива.
●Действие или обход.
Рассматриваемая инструкция применяется в двух формах:
●Полной
●Сокращенной
Вполной форме инструкция if .. else моделирует стандартную управляющую структуру, которая называется альтернатива, а в сокращенной форме – стандартную управляющую структуру действие или обход.
Рассматриваемая инструкция имеет следующий формат: if(выр)
инструкция1
[else
инструкция2 ]
Инструкция if в общем случае содержит следующие компоненты:
●Зарезервированные слова if и else.
●Внутренние инструкции инструкция1 и инструкция2.
●Выражение выр, предназначенное для принятия решения об использовании внутренних инструкций.
Вформате инструкции if, представленном выше, в квадратные скобки заключена необязательная часть инструкции if. В зависимости от наличия или отсутствия этой части говорят либо о полной форме инструкции if, либо
осокращенной форме. В полной форме необязательная часть присутствует, а в сокращенной – нет.
Полная форма инструкции if позволяет организовать разветвление на два направления. Первое направление (true – ветвь разветвления) представлено единственной инструкцией языка Си инструкция1, а второе направление (false - ветвь) – единственной инструкцией инструкция2.
Логика работы полной инструкции if такова. В зависимости от значения, которое имеет выражение выр (true или false) будет выполняться либо внутренняя инструкция инструкция1, либо внутренняя инструкция инструкция2. Внутренняя инструкция инструкция1 выполняется только в том случае, когда значение выражения выр равно true, в противном случае будет выполняться внутренняя инструкция инструкция2. Нетрудно видеть,
46
что логика работы полной инструкции if соответствует стандартной управляющей конструкции “альтернатива”.
В сокращенной форме инструкции if имеется только одна внутренняя инструкция (инструкция1). Работа такой формы инструкции if отличается от работы полной формы инструкции if только для случая, когда значение выражения выр равно false. В этом случае при использовании сокращенной формы инструкции if не выполняется ни каких действий. Можно сказать, что в этом случае имеет место обход действия, предусмотренного единственной инструкцией инструкция1.
Приведем примеры использования инструкции if.
Пример 1. Даны два числа a и b. Необходимо найти значение наибольшего из этих чисел.
/*
В коде, приведенном ниже a, b max – переменные типа double. Переменные a и b содержат исходные данные, а переменная max – ожидаемый результат
*/
if(a > b) max = a;
else
max = b;
/* Вызов функции printf()расположен в линейной части и выполняется сразу после завершения работы инструкции if */
printf(“Максимальное значение = %0.3f”, max);
/* |
Конец фрагмента программного кода */ |
|
В качестве примера применения сокращенной формы рассматриваемой |
инструкции рассмотрим усложненный вариант задачи, решение которой было выбрано в качестве иллюстрации применения полной инструкции if.
Пример 2. Даны три числа a, b и c. Необходимо найти значение наибольшего из чисел.
Решение. Предположим вначале, что имеется только два числа. Пусть это будут числа a и b. Такая задача уже решена. Ее решение приведено выше. Теперь эту задачу следует решать повторно, сравнивая уже значения переменных с и max. Оказывается, что такое сравнение можно выполнить с помощью сокращенной формы инструкции if. Ниже приведен программный код, содержащий решение рассматриваемой задачи.
/*
В коде, приведенном ниже, a, b, с и max – переменные типа double.Переменные a, b и c содержат исходные данные, а переменная max – ожидаемый результат
*/
if(a > b) else max = a;
max = b; if(c > max)
max = c;
47
printf(“Максимальное значение = %0.3f”, max); |
*/ |
|
/* |
Конец фрагмента программного кода |
|
Внутри каждой из ветвей инструкции if else может быть расположена другая инструкция if. Такие инструкции называются вложенными. Следует отметить, что большая глубина вложенности может приводить к ухудшению читабельности программы. Кроме того, может появиться специальная проблема, называемая проблемой висячего else. Такая проблема имеется,
например, в инструкции if, структура которой приведена ниже. if(выр1)
if(выр2)
инструкция1 else
инструкция2
При чтении приведенной выше конструкции возникает проблема, состоящая в том, что необходимо определить к какой из двух инструкций if единственное зарезервированное слово else. Иными словами, необходимо выяснить внешняя или внутренняя инструкция if является сокращенной. Эта проблема в языке Си решается следующим образом. Компилятор всегда относит слово else к ближайшему слову if, для которого еще нет ветви else. Учитывая все изложенное, можно сделать вывод о том, что в приведенном примере внешняя инструкция if является сокращенной, а внутренняя – полной.
Для регулирования структуры вложенных инструкций if следует использовать фигурные скобки. Ниже приводится переработанный вариант
использования вложенных инструкций if, приведенных выше. if(выр1)
{if(выр2) инструкция1
else}
инструкция2
В новой инструкции if внешняя инструкция является полной, а внутренняя – сокращенной.
Инструкция switch, иногда называемая переключателем, предназначена для организации многовариантного разветвления.
Инструкция switch может иметь сложную структуру. На самом верхнем уровне рассматриваемая инструкция состоит из двух конструктивных частей:
●Заголовок.
●Тело.
Заголовок инструкции switch имеет следующий формат:
48
switch(выр)
Здесь switch – зарезервированное слово, выр – выражение целого типа. Телом может быть единственная инструкция языка Си, в качестве
которой обычно используется составная инструкция.
Инструкции, входящие в состав тела переключателя switch, могут быть помеченными специальными метками. Метка отделяется от помечаемой ею инструкции двоеточием. В теле инструкции switch используются метки двух видов:
●label_case.
●label_default.
Метка вида label_case состоит из двух частей:
●зарезервированное слово case.
●Константное выражение целого типа.
Метка вида label_default состоит из одного зарезервированного слова default.
Выражение выр, входящее в состав заголовка инструкции switch, играет роль своеобразного селектора, выбирающего требуемую метку внутри тела переключателя. Дело заключается в том, что значение этого выражения определяет метку той инструкции, с которой должно начинаться выполнение тела переключателя.
Опишем более детально процесс выполнения инструкции switch.
1.Вычисляется значение выражения выр, входящего в состав заголовка.
2.Если значение выражения выр совпадает со значением константного выражения одной из меток case, то управление передается инструкции тела, которая помечена этой меткой, а затем будут выполняться последовательно все оставшиеся инструкции тела переключателя.
3.Если значение выражения выр не совпадает со значением константного выражения ни одной метки, но имеется инструкция, помеченная меткой default, то управление передается инструкции, помеченной этой меткой.
4.Если значение выражения выр не совпадает со значением константного выражения ни одной метки и отсутствует инструкция, помеченная меткой default, то выполнение инструкции switch на этом
заканчивается и управление передается инструкции, расположенной непосредственно за инструкцией switch.
Как правило, тело инструкции switch – составная инструкция, внутренние инструкции которой помечены метками case и default. После перехода на выбранную инструкцию остальные метки не влияют на выполнение тела переключателя. Для прекращения выполнения тела переключателя следует использовать инструкции перехода (обычно инструкцию break). Посмотрим, к чему может привести их отсутствие.
49
Обратимся к программному коду, приведенному ниже, предполагая, что
используемая в нем переменная n имеет тип int.
/* Использование инструкции switch, в теле которой отсутствуют инструкции перехода
*/
switch(n)
{
case 1 : printf(“.”); case 2 : printf(“..”); case 3 : printf(“...”); case 4 : printf(“....”);
}
Если перед выполнением приведенного выше фрагмента программы значение переменной n было равно 3, то при выполнении инструкции switch будет выведено семь точек, т.к. будут выполнены два последних вызова функции printf().
Чтобы в приведенном фрагменте программы выполнялся только тот вызов функции printf(), которому передано управление, необходимо все помеченные инструкции разделить инструкциями break. В результате
получим следующий программный код:
/* Инструкция switch, в теле которой используются инструкции
break |
|
*/ |
switch(n) |
|
|
{ |
|
: printf(“.”); |
case 1 |
||
case |
2 |
break; |
: printf(“..”); |
||
case |
3 |
break; |
: printf(“...”); |
||
case |
4 |
break; |
: printf(“....”); |
||
|
|
break; |
}
Теперь для любого значения величины n из отрезка [1, 4] будет выполняться только один вызов функции printf().
Заметим, что в ветви, соответствующей значению n == 4, использование инструкции break необязательно, но считается элементом хорошего стиля программирования.
Алгоритм называется циклическим в том случае, когда некоторые его части могут выполняться неоднократно. В общем случае в циклическом алгоритме могут присутствовать следующие функциональные компоненты:
●Инициализация (подготовка к первому выполнению цикла, возобновление цикла).
●Проверка условия нахождения в цикле.
●Рабочая часть цикла.
50