Паскаль. Основы программирования

Условия в программах с циклами


Рассмотрим два примера, в программах которых используются не только циклы, но и в циклах необходимо применение условного оператора

 if ... then ... else ...

Пример 3. Составить программу разложения натурального числа n на простые множители.

Прежде вспомним, что к простым числам относятся все те натуральные числа, которые имеют только два делителя - единицу и само себя.

Натуральные числа, имеющие более двух делителей называются составными.

Единица имеет только один делитель - само себя и поэтому она не может относится ни к простым, ни к составным числам. Если выписать простые числа в порядке их возрастания, начиная от самого меньшего - 2, то получим следующий ряд чисел:

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, ...

А теперь вспомним, как в младших классах мы раскладывали натуральные числа на простые множители.

Для этого берем первое простое число - 2 и пробуем делить данное натуральное число на 2, если число делится на 2, тогда надо 2 записать, а число разделить на 2 и снова полученный результат пробуем делить на два, если делится, тогда повторяем процесс деления, если не делится, тогда пробовать делить на следующее простое число - 3 и так далее.

Обычно такой процесс мы записывали "столбиком":

Например:                                            или

 

                                
 

Таким образом, число 360 можно разложить на следующие простые множители: 360 = 2

2
2
3
3
5.



Самый простой алгоритм для составления программы может быть таким.

Алгоритм

 

В качестве первого делителя взять 2, присвоить это значение некоторой переменной i;

начать цикл "пока i <= n";

если

данное число n делится на i, тогда выдать на экран значение i и разделив данное число на  i, присвоить новое значение той же переменной n (n := n div i);

далее цикл продолжить, но значение i не увеличивать на 1, а проверить деление нового значения n на прежнее значение i;

если n не делится на i, тогда i увеличить на 1 (i := i + 1) и продолжить цикл, т.е.
выполнить проверку условия цикла (i <= n), а затем снова проверить деление n на уже новое значение i.

Обратите внимание,  что при таком алгоритме в качестве делителей уже не попадут составные числа. Объясните почему?

Программа

Program

Problem3; { Разлож. числа на прост. множит.. 1- й спос. }

    uses WinCrt;

    var

       n, i : integer;

    begin

       write('Введите натуральное число '); readln(n);

       write('Простые делители числа ', n, ' следующие; ');

       i := 2;

       while i <= n do

           if n mod i =0 then

                                    begin

                                       write(i, ' ');

                                       n := n div i

                                    end

                                 else i := i + 1

    end.

Конечно, эта программа далека от совершенства и не может иметь претензии на оригинальность.

Она заставляет компьютер выполнять много лишних проверок на деление.

Вот более совершенный алгоритм.

Он основывается на следующих соображениях.

Вначале находим все делители, равные 2. Для этого последовательно делим число 360 на 2:



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

Делим на 3: 45:3 = 15, 15:3 = 5.

Делим на 5: 5:5 = 1.

Делим на 7, не делится, пробуем делить на следующее нечетное число.

Делим на 9, не делится, переходим к следующему нечетному числу.

Делим на 11, не делится, и так далее.

До тех пор будем пробовать деление на нечетные числа, пока они будут меньше или равны получаемому частному от деления числа на соответствующий делитель.

На основании этих соображений составляем программу.

Program Problem3a;

    uses WinCrt;

    var

       i, n : integer;

    begin

    write('Введите целое число '); readln(n); writeln;

    writeln('Простые делители целого числа ', n);

{----------------------------------------------------------------------------------------}



      while n mod 2 = 0 do { Цикл для вывода делителей, равных 2 }

         begin

            write(2, ' ');

            n := n div 2

         end;

{----------------------------------------------------------------------------------------}

      i := 3;

      while i <= n do           { Цикл для нечетных делителей }

         if n mod

i = 0

             then

               begin                 

                  write(i, ' ');

                  n := n div i

               end

            else i := i + 2;

      writeln

    end.

Можно расширить область вводимых чисел, используя уже известный тип

longint:

Еще один пример, где используются цикл и условие.

Пример 4. Написать программу, в результате выполнения которой выяснится, входит ли цифра 2 в запись данного целого числа n.

Идея составления программы проста. Надо организовать цикл, в котором выделять цифры числа уже известным вам способом и каждую из них сравнивать с цифрой 2. Если

цифра числа оказывается равной двум, тогда надо счетчик, которым может быть некоторая числовая переменная, увеличивать на единицу, иначе,

цикл надо продолжать.

Когда цикл будет выполнен полностью, т. е. все цифры числа проверены и каждая из них будет сравнена с цифрой 2, надо снова использовать условный оператор и сравнить значение переменной - счетчика с нулем. Если значение переменной равно нулю, то это значит, что цифра 2 не входит в запись числа, иначе

- входит.

АЛГОРИТМ

1. Содержание. Переменные целого типа n, p, k: n - для вводимого числа; p - для цифр этого числа; k - счетчик, подсчитывающий количество цифр в числе, равных 2.

2. Ввод целого числа.

Счетчику k устанавливается первоначальное значение 0.

3. Цикл, пока n <> 0. В цикле, переменной p присваивать значение цифры числа.

Если

p = 2, тогда увеличивать k на единицу.

Вычесть из числа n последнюю цифру и разделить его на 10.

Продолжить и закончить цикл.

4. Если

k = 0, тогда выдать сообщение: "Цифра 2 не входит в запись числа", иначе, выдать сообщение: "Цифра 2 входит в запись числа".



5. Конец.  

Программа

Program

Problem4; { Входит ли цифра 2 в запись числа }

    uses WinCrt;

    var

       n, p, k : integer;

    begin

       write('Введите целое число '); readln(n);

       k := 0;

       while n <> 0 do

          begin

             p := n mod 10;

                if p = 2 then k := k + 1;

             n := n div 10

          end;           

           if

k = 0  then writeln('Цифра 2 не входит в запись этого числа')

                         else  writeln('Цифра 2 входит в запись этого числа')

     end.

Если вы внимательно разобрались в работе программы, то могли заметить, что во многих случаях в программе будет проделываться бесполезная работа.

Например, если нами введено число 31572. В программе сделано так, что отделяется по одной цифре справа и так продолжается до первой цифры слева.

Первой цифрой справа является 2. Казалось бы, раз в числе сразу первой цифрой найдена двойка, то можно выдать сообщение, что число содержит цифру 2 и на этом работу закончить. Однако в программе сделано не так. Цикл будет продолжаться до последней цифры числа и большая работа будет проделываться бесполезно.

Возникает необходимость в досрочном прерывании цикла. Как это сделать мы рассмотрим ниже.


Содержание раздела