Статья
Версия для печати
Обсудить на форуме
Урок С/С++ 10. Структура выбора


Предыдущий урок-----Следующий урок

1. Для начала дадим понятие блока, оно понадобится нам во многих случаях. Блок - это список операторов, заключенный в фигурные скобки:

  { a=b+2; b++; }

Зачем он нужен? Блок позволяет рассматривать несколько операторов как один. Это просто было небольшое отступление, которое мы упустили в предыдущих уроках Кроме того, в блоке можно определить переменную, которая будет автоматически уничтожена при выходе из блока, но с так называемыми областями видимости и сроками жизни переменных мы будем разбираться немного позже.



2. If. А теперь перейдем непосредственно к конструкции выбора (или ветвления). Позволю себе (да простят меня те, кто читает оба моих курса) тупо повторить часть текста из урока по сходной теме курса VB

Суть вобщем-то проста. В русском языке в повседневной жизни мы используем ее постоянно. Это наше весьма распространенное если. Если нам позвонят в дверь, мы пойдем открывать. В данном случае позвонят в дверь - это проверяемое условие.(помните еще урок про логические операторы?), а пойдем открывать- это оператор, который будет выполнен ТОЛЬКО в случае правильности этого условия. Это самый простой пример ветвления. Какая же здесь ветка? Один оператор действия- откуда же ветка получится? Дело в том что ветка выглядит так: или я иду открывать---или я ничего не делаю.

   Как этот вариант будет записываться?

if (логическое выражение)

оператор;

Для нашего случая:

if( позвонят в дверь= =true)

   Пойдем открывать;


Небольшое отступление относительно ступенчатой записи. Желательно, чтобы вы, набирая строки кода, придерживались этого стиля записи. Так проще читать код. Человеку, естественно. Компилятору абсолютно все равно- сделали вы такой отступ или нет, он их не учитывает. А вам самим, и тем, кто будет читать код кроме вас, удобнее ориентироваться. В данном случае мы видим, что у нас начинается блок if, а внутри него оператор. Или несколько операторов. В этом случае мы напишем операторы один под другим, давая этим понять что они равноценны. И вот тут нам нужны будут скобки, берущие эти несколько операторов в блок.

   Давайте, рассмотрим 2 варианта записи:

Код:
if( условие)

оператор1;

оператор2;

и

Код:
if (условие)
{
оператор1;

оператор2;     
}

Как мы видим, во втором случае, операторы должны выполняться как один из-за поставленных скобок блока (как мы упоминали в начале нашего урока). Таким образом, мы получаем весьма существенную разницу при выполнении этих двух вариантов.

   В первом случае при истинном условии выполняется оператор1, а оператор 2 выполняется В ЛЮБОМ случае, даже если условие ложно. Помните- то, что мы отодвинули его отступом на уровень второго оператора-это сигнал только для нас, но никак не для компилятора. Он считает, что первый оператор входит в блок if, а вот после ;, которая показывает окончание первого оператора, заканчивается и весь блок if. И выполняется оператор2, который уже никакого отношения к if не имеет. Значит, он выполняется вне зависимости от проверяемого условия.

   Во втором случае при истинном условии выполняются ОБА оператора. Почему? А потому, что они объединены скобками блока и выполняются как единое целое. А если условие ложно- не выполнится ни оператор1, ни оператор2. Вот вам и две маленькие скобочки!



3. If...else. Усложним задачу.

   Вариант, когда при ложности условия тоже должны выполняться какие-то операторы выглядит так: если мне сегодня надо на работу - условие истинно - я встану в 7ч, умоюсь, оденусь, перекушу и поеду на работу. Если не надо  условие ложно (т.е. иначе)- я посплю до 10 часов и пойду гулять.

Как это будет выглядеть:
Код:
if(проверяемое условие)
оператор1 (или блок операторов, как мы уже выяснили)

else
оператор2(или блок операторов)
В нашем случае:

Код:
if (работа)
{
встать в 7ч;

умыться;

одеться;

перекусить;

поехать на работу;
}
else
{
сплю до 10ч;

иду гулять;

//не забудьте указать до скольки, а то как уйдете!!! (
}
Итак:

Выполнение оператора if начинается с вычисления выражения.

Далее выполнение осуществляется по следующей схеме:
  • если выражение истинно (т.е. отлично от 0), то выполняется оператор-1.
  • если выражение ложно (т.е. равно 0),то выполняется оператор-2.
  • если выражение ложно и отсутствует оператор-2 , то выполняется следующий за if оператор.


Пример:
Код:
if (i < j)   i++;

else { j = i-3;   i++; }



4. Вложенные конструкции. Операторы if могут быть вложены один в другой. Вложенный оператор if может находиться внутри конструкции if или внутри конструкции else другого оператора if. Чтобы сделать программу более читабельной, рекомендуется группировать операторы и конструкции во вложенных операторах if, используя фигурные скобки. Если же фигурные скобки опущены, то компилятор связывает каждое ключевое слово else с наиболее близким if, для которого нет else.

Примеры:

Код:
int main ( )
{

int t=2, b=7, r=3;

if (t>b)
{
if (b < r)  r=b;
}
else r=t;

return (0);

}

В результате выполнения этой программы r станет равным 2.

Если же в программе опустить фигурные скобки, стоящие после оператора if, то программа будет иметь следующий вид:

Код:
int main  ( )
{
int t=2,b=7,r=3;

if ( t>b )

if ( b < c ) t=b;

else r=t;

return (0);
}

В этом случае r получит значение равное 3, так как ключевое слово else относится ко второму оператору if, который не выполняется, поскольку не выполняется условие, проверяемое в первом операторе if.

Следующий фрагмент иллюстрирует вложенные операторы if:

Код:
char ZNAC;

int x,y,z;

...

if (ZNAC == '-') x = y - z;

else  if (ZNAC == '+') x = y + z;

else if (ZNAC == '*') x = y * z;

else if (ZNAC == '/') x = y / z;

else ...

Из рассмотрения этого примера можно сделать вывод, что конструкции использующие вложенные операторы if, являются довольно громоздкими и не всегда достаточно надежными. Другим способом организации выбора из множества различных вариантов является использование специального оператора выбора switch, с которым познакомимся на следующем уроке.

(Примечание от Альфа:
Конструкция вида

Код:
if (...) ...
else if (...) ...
else if (...) ...
...
else ...

является достаточно типовой для перебора различных вариантов (можно сказать, одной из идиом С++), для удобства чтения форматируется без отступа и фактически не рассматривается как вложенная (хотя формально таковой является). Кроме того, непонятно, откуда взялся вывод о громоздкости и ненадежности этой конструкции. Например, я применил ее в своей статье о рекурсии в разделе об определении соответствия строки шаблону.)




Задания.

  • Ввести два числа. Меньшее из них вы должны заменить суммой введенных чисел, большее- разностью. Результаты вывести на экран.
  • Ввести число. На экран вывести сообщение о том является ли это число положительным, отрицательным или нулем.
  • Задача: метеоролог снимает 4 замера скорости ветра в сутки. Вам необходимо ввести
Эти четыре числа в программу, вычислить среднесуточную скорость ветра и вывести ее на экран. ОБЯЗАТЕЛЬНО: произвести проверку вводимых чисел, чтобы не было введено недопустимого значения (отрицательного). Если это произойдет  не выводить на экран результат (среднюю скорость), а вывести сообщение Неправильный ввод данных!


Автор: Never
Версия для печати
Обсудить на форуме