Операторы ветвлений – язык программирования Си

March 16, 2014 by admin Комментировать »

Если внимательно приглядеться, то вся наша повседневная жизнь состоит из одних «если». На каждом шагуделается выбор: «если — то, иначе — это». Но свобода выбора — вещь весьма иллюзорная, что подтверждается многовековым опытом человечества. В программировании ситуация аналогичная. Широко применяемые операторы ветвлений «if», «if-else», «switch» используюталгоритмыдвоиого и множественного выбора. Логика применяется жёсткая, с чётким указанием дальнейшихдействий. Свобода есть, только уж очень она регламентированная…

Оператор «if» (в переводе с англ. «если»).

Схема алгоритма оператора «if» показана на Рис. 6.20, а. Если условие проверки выполняется, то осуществляется переход к «Оператору-1», если нет, то данный оператор игнорируется и обходится стороной.

Существуютдве формы записи оператора «if» (Рис. 6.20, б, в). В простой форме отсутствуют фигурные скобки, т.к. имеется один-единственный исполняемый оператор. В составной форме операторов много, поэтому их выделяют в отдельный блок, старт и финиш которого обрамляют фигурными скобками.

Рис. 6.20. Оператор «if»: а) схема алгоритма; б) простая форма; в) составная форма.

И в той, и вдругой форме условием проверки выступает некоторое логическое выражение, которое может быть истинным или ложным. Например, «6 > 5» — это истина, «100 < 99» — это ложь. В Табл. 6.8 представлены варианты допустимых логических проверок в языке Си. Запомнить их легко мнемонически, поскольку знаки записываются в таком порядке, в каком читаются, к примеру, «меньше или равно» (<=), «больше или равно» (>=), «не равно» (!=).

Таблица 6.8. Условия логических проверок в языке Си

Проверяемое условие может быть как одиночным «а > Ь», так и множественным «(а > b) && (с > d)». В последнем случае вместо символов «&&» могут подставляться и другие логические операции из Табл. 6.8. Вычисления производятся слеваправо, начиная со скобок. Если в операторе проверяется состояние какой-либо линии порта MK, то после проверки логический уровень на этой линии не изменяется. Данное утверждение относится и к входам, и к выходам.

Пример. В исходном состоянии на одном из выходов MK имеется ВЫСОКИЙ уровень. Если в программе встретится оператор присваивания, изменяющий уровень на противоположный, то напряжение на выходе станет НИЗКИМ. Однако, если в программе встретится оператор проверки «if», который сравнивает состояние линии порта с НИЗКИМ уровнем, то после его выполнения выходной уровень как был ВЫСОКИМ, так им и останется.

При составлении программ, содержащих логические проверки, требуется определённая точность и аккуратность. В частности, начинающие программисты нередко путают знак присваивания «=» и знак проверки равенства «= =», знак логического умножения «&» и знак конъюнктивной проверки «&&», знак логического сложения «||» и знак дизъюнктивной проверки «|| ||». Общее правило для запоминания — одиночные символы применяются в операторах присваивания, а двойные символы — в условиях проверки.

Оператор «if-else» (в переводе с англ. «если-иначе»).

Схема алгоритма оператора «if-else» показана на Рис. 6.21, а. Теоретически возможны четыре формы его записи (Рис. 6.21, б…д), условно обозначаемые римскими цифрами от «I» (максимально просто) до «IV» (максимально сложно).

Логика функционирования связки «if-else» следующая. Если условие проверки, заключённое в круглых скобках после «if», истинное, то выполняется «Оператор-1» (Рис. 6.21, б, г) или блок операторов «1»…«М» (Рис. 6.21, в, д). Далее пропускаются строки, относящиеся к «else», и управление передаётся вниз к следующему оператору программы, который для простоты не показан. Если условие ложное, то производится переход к строке «else», затем выполняются принадлежащие ей команды, после чего управление естественным образом передаётся вниз к следующему оператору программы.

В языке Си допускаются многократные вложения наподобие «if-if-else-else», при этом каждому «else» обязательно должен соответствовать свой «if». Обратное утверждение неверно, т.к. бывают «чистые» операторы «if», но без «else».

Рис. 6.21. Оператор «if-else»: а) схема алгоритма; б) простая форма «I»; в) усложнённая форма «II»; в) усложнённая форма «III»; г) сложная форма «IV».

Оператор «switch» (в переводе с англ. «переключать»).

Все рассмотренные ранее операторы ветвлений хорошо смотрятся при выборе между двумя альтернативами «или так — или эдак». В тех случаях когда требуется произвести выбор одного из множества вариантов, удобнее применять оператор «switch».

На Рис. 6.22, а показана схема алгоритма, а на Рис. 6.22, б, в — две формы записи оператора «switch». Предполагается, что в условие проверки входит целочисленная переменная «а», которая может принимать любое значение от 0x00 до OxFF. Значение переменной последовательно сравнивается с метками «case» (в переводе с англ. «кейс, ящик, коробка»). Как только будет обнаружен «кейс» с содержимым, которое равно значению входной переменной, то управление передаётся конкретному исполняемому оператору «I»…«N».

В конце каждого «кейса» размещается оператор «break», который останавливает дальнейшее выполнение команд и передаёт управление вниз к следующей по очереди строке за пределами оператора «switch». Если после просмотра всех меток не будет обнаружено ни одного совпадения, то ищется строка «default» (может отсутствовать) и выполняется принадлежащий ей оператор (может отсутствовать).

Рис. 6.22. Оператор «switch»: а) схема алгоритма; б) упрощённая форма; в) полная форма.

При отсутствии в программе строки «default» может случиться, что условие сравнения ни разу не сработает и оператор «switch» не выполнит ни одного полезного действия. Тем не менее, на поиск совпадений затрачивается определённое машинное время, поэтому «холостой» оператор «switch» превращается в оператор задержки времени. Насколько большая получается пауза, надо просчитывать при моделировании в симуляторе.

Источник: Рюмик, С. М., 1000 и одна микроконтроллерная схема. Вып. 2 / С. М. Рюмик. — М.:ЛР Додэка-ХХ1, 2011. — 400 с.: ил. + CD. — (Серия «Программируемые системы»).

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты