zz_c_04-2-switch

Итак, мы научились проверять условие, получать "да" или "нет", и в зависимости от результата выполнять нужные операторы. Что делать, если вариантов больше двух? В языке С имеется специальный оператор множественного выбора: code format="c" switch(mark) //оценка { case 5: printf("\nOtlichno"); break; case 4: printf("\nHorosho"); break; case 3: printf("\nTak sebe. Na samom dele - "); case 2: case 1: printf("\nPloho"); break; default: printf("\nTakih ocenok ne byvaet!"); break; } code Что мы видим из этого примера? Соответственно, в нашем примере слово "Ploho" напечатается для оценок 3, 2 и 1.
 * Проверяются несколько условий, но все условия вида "переменная == константа". Переменная задана в строке switch, а константы - в строках case. Проверка ведется на точное совпадение, сверху вниз.
 * Если совпадение произошло, выполняются операторы до конца блока switch - или до оператора break. Если мы не хотим, чтобы выполнение продолжалось для других меток case - ставим break.
 * В конце оператора switch может стоять метка default (по умолчанию). Все случаи, не совпавшие с метками case, будут идти на default.

И что не видим:
 * На самом деле, метки оператора switch могут быть только константами, причем целочисленными (это включает в себя и одиночные символы). То есть проверять совпадение строк этим оператором нельзя.

Ограничения, накладываемые оператором switch, довольно серьезны. Так, например, функцию, заданную такой системой, запрограммировать с его помощью нельзя: /sin(x), при x <0 y=   	{x, при 0<=x <1 \1, иначе

?? эту задачу можно решить с помощью оператора if ?? На самом деле, если б последняя строка была записана как 1, 1<=x то можно было бы применить тупой (но рабочий) способ - запрограммировать каждую строчку отдельным оператом if. code format="c" if (x<0) y=sin(x); if (0<=x && x<1) y=x; if (1<=x) y=1; code

Нетрудно видеть, что условия не пересекаются, т.е. для любого x сработает только одна строчка. Единственная проблема в том, что у нас получилось на один if и два условия больше, чем могло бы быть. Поэтому мы рассмотрим более красивый способ - вложенные if. code format = "c" if (x<0) y=sin(x) else if (x<1) y=x else y=1; code

Что на самом деле присходит, легко понять с помощью блок-схемы: <блок-схема>

Мы не проверяем 0<=x, потому что все x<0 ушли на первое условие. У нас нет третьего if, потому что на третью строку системы попадает все, что осталось от первых двух. Тем не менее, подобная запись имеет недостаток. Если мы имеем много вложенных if, трудно понять к какому if относится какой else. Например: code format="c" if (x<0) y=sin(x) if (x<1) y=x else y=1; code

<идея неплохая но где-то я наврал - надо посмотреть внимательно>