Положим, вам необходимо использовать цикл с предусловием. Что лучше: цикл 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++);
/* проверка, простое число или нет,
осуществляется внутри спецификации цикла */
if (divisor == number) /* выполняется после завершения цикла */
printf(" %d - простое число.\n", number);
else printf(" %d - не простое число.\n", number);
}
Мы воспользовались структурой цикла while, чтобы избежать ввода значений, которые могли бы привести к аварийному завершению программы.
Обратите внимание, что все вычисления выполняются внутри спецификации цикла for. Величина переменной numberпоследовательно делится на возрастающие значения делителей до тех пор, пока не произойдет деление нацело (т. е. number % divisorстанет равным 0). Если первым делителем, который приведет к такому результату окажется само это число, то значение переменной number- простое число. В противном случае данное число будет иметь меньший делитель, и это приведет к тому, что цикл завершится раньше.
Для нахождения всех простых чисел, меньших некоторой заданной величины, нам нужно будет заключить наш цикл forв некоторый другой цикл. На псевдокоде это будет выглядеть следующим образом:
для числа ( number)=1 до верхнего предела limitпроверять, является ли число
простым
Вторая строка представляет собой нашу предыдущую программу.
Переводя эту запись на язык Си, получим программу:
/* простыечисла2 */
main( )
{
int number, divisor, limit;
Читать дальше