Шрифт:
III. Форма записи
do оператор
while(выражение);
Выполнение оператора повторяется до тех пор, пока выражение не станет ложным, или равным нулю.
IV. Пример
do
scanf(" %d" , amp;number);
while(number != 20);
КАКОЙ ЦИКЛ ЛУЧШЕ?
После того как вы решили, что вам необходимо использовать оператор цикла, возникает вопрос: циклом какого вида лучше всего воспользоваться? Во-первых, решите, нужен ли вам цикл с предусловием или же с постусловием. Чаще вам нужен будет цикл с предусловием. По оценкам Кернигана и Ритчи; в среднем циклы с постусловием (do while) составляют только 5% общего числа используемых циклов. Существует несколько причин, по которым программисты предпочитают пользоваться циклами с. предусловием; в их числе один общий принцип, согласно которому лучше посмотреть, куда вы прыгаете, до прыжка, а не после. Вторым моментом является то, что программу легче читать, если проверяемое условие находится в начале цикла. И наконец, во многих случаях важно, чтобы тело цикла игнорировалось полностью, если условие вначале не выполняется.
Положим, вам необходимо использовать цикл с предусловием. Что лучше: цикл for или цикл while? Отчасти это дело вкуса, поскольку все, что вы можете сделать с помощью одного, вы можете сделать и с помощью другого. Для превращения цикла for в цикл while нужно опустить первое и третье выражения:
for(; проверка условия;)
Такая спецификация эквивалентна записи
while(проверка условия)
Для превращения цикла while в цикл for необходимо предварительно осуществить инициализацию некоторых выбранных переменных и включить в тело цикла операторы, корректирующие их значения:
инициализация;
while (проверка условия)
{
тело;
коррекция;
}
Данная запись по своим функциональным возможностям эквивалентна следующей:
for(инициализация; проверка условия, коррекция) тело;
Исходя из соображений стиля программирования, применение цикла tor представляется более предпочтительным в случае, когда в цикле используется инициализация и коррекция переменной, а применение цикла while– в случае, когда этого нет. Поэтому использование цикла while вполне оправданно в случае
while((ch = getchar) != EOF)
Применение цикла for представляется более естественным в случаях, когда в циклах осуществляется счет прохождений с обновлением индекса:
for (count = 1; count <= 100; count++)
ВЛОЖЕННЫЕ ЦИКЛЫ
Вложенным называется цикл, находящийся внутри другого цикла. В этом разделе рассматривается пример, в котором вложенные циклы используются для нахождения всех простых чисел, не превышающих данного значения. Простое число - это такое число, которое делится нацело только на 1 и само на себя. Первыми простыми числами будут 2, 3, 5, 7 и 11.
Самый легкий способ узнать, является ли число простым, состоит в делении его на все числа между 1 и им самим. Если оно делится нацело на какое-нибудь число из этого ряда, то оно - не простое. Мы воспользуемся операцией деления по модулю (%) для проверки, выполнялось ли деление нацело. (Вы не забыли еще, конечно, операцию деления по модулю? Ее результатом является остаток от деления первого операнда на второй. Если одно число делится на другое нацело, результатом операции деления помодулю будет 0.) При обнаружении какого-нибудь одного делителя числа дальнейшие проверки потеряют смысл. Поэтому в программе процесс проверки данного числа завершается после того, как найден его делитель.
Начнем с программы, проверяющей делимость одного числа. В ней имеется всего один оператор цикла.
/* простоечисло1 */
main
{
int number, divisor;
printf(" О каком числе вы
хотите знать, простое ли оно?\n");
scanf(" %d" , &number); /* получение ответа */
while(number <2) /* число отвергается */
{
printf(" Извините, мы не принимаем чисел меньше 2.\n");
printf(" Пожалуйста, попробуйте еще раз.\n");
scanf(" %d" , &number);
}
for(divisor = 2; number % divisor != 0; divisor++);
/* проверка, простое число или нет,
осуществляется внутри спецификации цикла */