Книга: Язык Си - руководство для начинающих

ВЛОЖЕННЫЕ ЦИКЛЫ

ВЛОЖЕННЫЕ ЦИКЛЫ

     Вложенным называется цикл, находящийся внутри другого цикла. В этом разделе рассматривается пример, в котором вложенные циклы используются для нахождения всех простых чисел, не превышающих данного значения. Простое число - это такое число, которое делится нацело только на 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;

int count = 0;

 printf(" Укажите, пожалуйста, верхний предел для поиска простых чисел.n");

printf(" Верхний предел должен быть 2 или больше.n");

scanf(" %d", &limit);

while(limit < 2) /* вторая попытка, если ошибка при вводе */

{

       printf(" Вы были невнимательны! Попробуйте еще раз. n");

        scanf(" %d", &limit);}printf(" Сейчас будут печататься простые числа!n");

for(number = 2; number <= limit; number++) /* внешний цикл*/

{

  for(divisor =2; number % divisor != 0; divisor++);

   if(divisor == number)

        {

 printf(" %5d", number);

          if(++count % 10 == 0)

               printf(" n"); /* новая строка начинается

                                      через каждые 10 простых чисел */

        }

}

printf(" n Вот и все!n");

}

     Во внешнем цикле каждое число, начиная с 2 и кончая величиной limit, последовательно берется для проверки. Указанная проверка осуществляется во внутреннем цикле. Мы использовали переменную count для хранения счетчика получаемых простых чисел. При печати каждое одиннадцатое простое число мы начинаем с новой строки. Ниже приводится пример результатов, получаемых с помощью такой программы:

Укажите, пожалуйста, верхний предел для поиска простых чисел.

Верхний предел должен быть 2 или больше.

250

Сейчас будут печататься простые числа!

 2     3      5     7    11    13   17    19  23    29

 31   37    41    43   47    53   59    61 67     71

 73   79    83    89   97   101  103  107        109  113

127  131  137  139  149  151  157  163        167  173

179  181  191  193  197  199  211  223        227  229   233  239  241

Вот и все!

Оглавление книги


Генерация: 1.769. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз