Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по программированию.doc
Скачиваний:
11
Добавлен:
13.11.2019
Размер:
1.2 Mб
Скачать

Void main()

{

int n,j=1; double a=.0;

scanf("%d",&n); n++;

do a+=1.0/j++; while(j<n);

printf("%lf".a);

}

Программа будет работать правильно, но она снова не оптимальна. Можно обойтись без переменной j. Цикл в этом случае следует записать в виде:

do a+=1.0/n- -; while(n);

При этом из программы следует убрать выражение инкремента п++; после функции scanf. Можно видеть, что сумма ряда теперь вычисляется в обратном порядке - от конца к началу, и переменная n каждый раз умень­шается на единицу (декрементируется). Упростилось и условие выхода из цикла. Действительно, цикл нужно выполнять до тех пор, пока n не станет равным нулю, что и записано в скобках после while.

Третий тип циклических выражений - циклы for. Структура цикла в общем виде может быть представле­на так:

for(Выражения1; Выражение2; Выражения3)Выражение4;

Сразу обратим внимание на то, что при использовании цикла for вы можете воспользоваться некими исключе­ниями из правил, которые только в этом цикле и допусти­мы. Выражения1 и Выражения3 не зря написаны здесь во множественном числе. На их месте могут быть записаны несколько выражений присваивания, перечисленные не через точку с запятой, как обычно, а через запятую. То­гда эти группы будут представлять собой своеобразные составные выражения, не нуждающиеся, однако, в фи­гурных скобках. Выражение2 представляет собой обыч­ное условие, принимающее значение 0 или не 0. Выражение4, которое может быть составным уже в обычном виде, является выражением, выполняющимся в цикле. Ин­тересно то, что Выражения1, Выражения3 и даже Выражение4 могут отсутствовать, если в них нет нужды. Правильнее будет сказать, что они могут быть пустыми выражениями, от которых остались только их точки с за­пятой. Более того, для Выражений3 имеет место совсем нестандартная ситуация. Если они присутствуют, то они не должны оканчиваться символом ";". Все эти исключе­ния, по мнению автора, только портят общее представле­ние о языке С. С этим, однако, приходится мирить­ся, поскольку цикл for с его "причудами" очень широко используется программистами. Здесь уместно отметить, что все три цикла взаимозаменяемы.

Работа цикла for заключается в следующем. Снача­ла, причем только один раз, выполняются Выражения1, если они имеются. Понятно, что эти выражения целе­сообразно использовать для выполнения предваряющих цикл присваиваний, для установки некоторых началь­ных значений переменных. Затем вычисляется Выражение2. Если оно равно 0, то на этом работа цикла закан­чивается и программа работает дальше. Если Выражение2 не есть 0, то выполняется Выражение4, которое, как говорилось выше, может быть и пустым. Затем выпол­няются Выражения3 (если они есть), снова проверяется условие в Выражении2 и так далее, до тех пор пока в Выражение2 не образуется 0.

Проиллюстрируем работу цикла for на программе, вычисляющей факториал числа n! = 1*2*3*…*n:

Void main()

{

int n,i.j;

scanf(“%d”.&n);

for(i=1,j=1; i<=n; i++,j*=i);

printf("%d!=%d",n,j);

}

В данном примере как раз отсутствует Выражение4, по­скольку все, что необходимо, выполняется в Выражениях3, которых два. Эти два выражения лучше превратить в одно: j*=++i. Убедитесь, что знаки ++ здесь должны стоять именно перед i (в префиксной форме), а не после i. Сначала надо увеличить i на единицу, а затем исполь­зовать, как это более явно видно из неисправленной про­граммы. Выражения1 также не мешает преобразовать к виду i=j=1;

А теперь перепишем программу в другой форме: