понедельник, 20 декабря 2010 г.

Циклы и условия

Объединил их в один урок, т.к. на самом деле - это одно и тоже - проверка условия и выполнения оператора или блока операторов.
Разница только в том, один раз выполняется блок/операнд или несколько - по условию.

Условия



Как и в множества других языках - блок проверки условия называется if - в переводе если.

После if пишется условие в круглых скобках, а затем один операнд (с замыкающей ;), либо блок (в фигурных скобках).

Например:
if (age > 21) printf("You may'be buy VODKA\n");

Комбинирование условий



В блоке проверки условий можно проверять не одно, а несколько условий - написано в некоторых учебниках и самоучителей.
Это все вранье и чушь! - В блоке if проверяется только одно условие, а операции && - и, и || - или - это операции над значениями.

Допустим if (age > 21 && sex == SX_MAN) на самом деле сначала выполняется решение условия в скобках, все операции имеют разный приоритет (из школы вам известно что умножить приоритетнее, чем сложение), а у операций && и || - самый низкий приоритет.

Выполняется первая часть (проверка идет справа налево) проверка на пол и ее значение запоминается, затем идет проверка на возраст и ее значение запомниается (обе части получают значение true или false), а далее выполняется третья операция && (и) - и если обе части true - то и общее значение будет true.

Если нужно выполнить разные блоки при срабатывание и не срабатывания условия, то используют конструкцию if () {...} else {}
else в переводе иначе.
Логично - сделай так если условие и иначе если не так.

Циклы


При реализации алгоритма цикла можно использовать любой способ т.е. любую запись, и самое главное при любом случае - в машинных кодах получится одно и тоже, но вот для более понятного исходников их делят:

for - для


Цикл for чаще всего используется там, где нужно выполнить заранее известное количество иттераций (циклов).

Синтаксис
for(условия иницилизации ; блок проверки ; блок выполняемый при каждом цикле - блок шага) {...}
Вместо блока операндов, можно также писать один операнд - если это необходимо.

Пример:
for(i=0;i<10;i++) printf("i=%d\n",i);
В примере в блоке условия инициализации - переменной i назначается значение = 0.
В блоке проверки переменная i проверяется, что она (переменная) меньше 10, в блоке шага - переменная i увеличивается на один.

Блок инициализации выполняется всегда - а блок шага только в том случае, если выполняется условия.
Т.е. выполняется i=0; затем проверяется i<10, далее выполняется блок за for - печатается строка printf("%d\n",i), затем выполняется блок шага - i++,
затем опять проверяется условие и если оно = true (меньше 10 в нашем случае) - опять выполняется блок за for и блок шага. И до тех пор пока блок условия - будет = true.

В любом блоке for можно указать несколько действий через запятую, например:
for(i=0,j=0; i<20,j<5; i+=2,j++) printf("i=%d,j=%d\n",i,j);
Т.е. в блоке инициализации выполняем присвоение перменной i и переменной j.

В блоке проверки условий выполняется два условия что i меньше 20 и j меньше 5 - на самом деле цикл будет только при выполнении всех условий - аналогично сработает (и кстати более лучше для понимания) i<20&&j<5
В блоке шага, выполняется также два операнда, увеличение переменной i на два и i на один.
Результат:
i=0,j=0
i=2,j=1
i=4,j=2
i=6,j=3
i=8,j=4


Скажу больше в блоках можно использовать даже функции, например for(i=0,printf("start");i<10;i++,printf("step\n")) printf("i=%d\n",i);

Но кроме использования их в блоках инициализации и проверки - не вижу смысла использовать функции в блоке шага, уж лучше перенести в блок за for, либо использовать....

while - пока


Цикл while - чаще используют если количество иттераций заранее не известно.

Синтаксис:
while (условие) {...}
Блок за while будет выполнятся пока условие = true.

Если условие изначально false то блок не будет выполнятся вообще, если это необходимо используют более редкую конструкцию while с do
Синтаксис:
do {...} while(условие);
Блок do-while выполнится один раз как минимум и будет выполнятся пока условие = true.


Для изменения работы циклов (for и while) - есть ключевые слова break и continue

break - сломать


Цикл прерывается и выполняется слелующий операнд за циклом

continue - продолжить


Цикл принудительно переходит на блок проверки условия, однако у for - выполняется блок шага


Еще про проверки условий



Еще для более удобного представления множественной проверки условий используют конструкцию switch - переключатель
Синтаксис:
switch(выражение)
{
case значение1:
...
break;
case значение2:
...
break;
default:
...
}


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

Блок default выполняется как глобальный else - если не один case не подошел.

Иногда специально не ставят break для выполнение какого-то кода.
Вообще switch как и циклы - это все проверки условия (if) и переходы на строку (goto)

Однако использовать goto - некомильфо и презирается гуру.
Однако если у вас вложенный тройной цикл - то плюйте на гуру и пишите goto, между прочим в коде под Linux для обработки изображений jpeg используется goto, так что - вообще нежелательно - но если очень хочется - то можно.

Комментариев нет:

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