for(printf("Запоминайте введенные числа!\n"); num == 6;)
scanf(" %d", &num);
printf("Это как раз то, что я хочу!\n");
В этом фрагменте первое сообщение оказывается выведенным на печать один раз, а затем осуществляется прием вводимых чисел до тех пор, пока не помтупит число 6.
9. Параметры, входящие в выражения, находящиеся в спецификации цикла, можно изменить при выполнении операций в теле цикла. Предположим, например, что у вас есть цикл со спецификацией следующего вида:
for(n = 1; n < 1000; n + = delta)
И если после нескольких итераций ваша программа решает, что величина параметра deltaслишком мала или велика, оператор ifвнутри цикла может изменить значение параметра. В диалоговой программе пользователь может изменить этот параметр в процессе выполнения цикла.
Короче говоря, большая свобода выбора вида выражений, управляющих работой цикла for, позволяет с помощью этой конструкции делать гораздо больше, чем просто выполнять фиксированное число итераций. Возможности цикла forмогут быть еще более расширены путем использования операций, которые мы вкратце обсудим ниже.
I. КЛЮЧЕВОЕ СЛОВО: FOR
II. ОБЩИЕ ЗАМЕЧАНИЯ:
В операторе forиспользуются три выражения, управляющие работой цикла; они разделены символами "точка с запятой". Инициализирующее выражение вычисляется только один раз до начала выполнения какого-нибудь из операторов цикла. Если проверяемоевыражение оказывается истинным (или не равным нулю), тело цикла выполняется один раз. Затем вычисляется величина корректируемоговыражения, и значение проверяемоговыражения определяется вновь. Оператор for- это цикл с предусловием : решение, выполнить в очередной раз тело цикла или нет, принимается до начала его прохождения. Поэтому может случиться так, что тело цикла не будет выполнено ни разу. Оператор , образующий тело цикла, может быть как простым, так и составным.
III. ФОРМА ЗАПИСИ:
for(инициализация; проверка условия; коррекция) оператор
Тело цикла выполняется до тех пор, пока проверяемое условие не станет ложным или равным нулю
III.ПРИМЕР
for(n = 0; n < 10; n++)
printf(" %d %d\n", n, 2*n + 1);
Выше уже упоминалось о том, что в языке Си имеется несколько операций присваивания .
Важнейшей из них является, конечно, операция =, при использовании которой значение выражения справа от знака присваивается переменной слева от него. Остальные операции присваивания корректируют значения переменных В записи каждой из них имеются имя переменной, стоящее слева от знака операции, и выражение справа от него Переменной присваивается новое значение, равное старому, скорректированному с помощью величины выражения, стоящего справа. Результат зависит от используемой операции. Например: scores+= 20то же самое, что scores = scores + 20, dimes -= 20то же самое, что dimes = dimes - 2, bunnies *= 2то же самое, что bunnies = bunnies * 2, time /= 2.73то же самое, что time = time / 2.73, reduce %= 3то же самое, что reduce = reduce % 3.
Правые части здесь являются обыкновенными числами, но мы могли бы использовать и более сложные выражения
х*= 3*у + 12
то же самое, что и
х = х*(3*у + 12)
Этим операциям присваивания назначен тот же низкий приоритет, что и обычной операции =, т.е. меньший, чем операциям +или *. Это и отражено в последнем примере. Вам совершенно не обязательно использовать все эти формы. Однако они более компактны, и при трансляции обычно позволяют получить более эффективный машинный код, чем традиционная, более длинная запись. Они бывают особенно полезны в том случае, когда вы хотите поместить некоторое выражение в спецификацию цикла for.
Операция "запятая" увеличивает гибкость использования цикла for, позволяя включать в его спецификацию несколько инициализирующих или корректирующих выражений. Например, ниже приводится программа, которая выводит на печать величины почтовых тарифов первого класса обслуживания. (Во время написания этой книги почтовые тарифы были такими: 20 центов за первую унцию и по 17 центов за каждую следующую.)
/* почтовые тарифы*/
#define FIRST 20
#define NEXT 17
main( )
{
int ounces, cost;
printf(" унциистоимость\n");
for(ounces = 1, cost = FIRST; ounces <= 16; ounces++, cost+ = NEXT)
Читать дальше