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

Оператор цикла fordowntodo


Существует другая форма оператора цикла for:

for <пар .цик.> := <нач. зн.> downto <кон. зн.> do

<оператор>.

Замена зарезервированного слова to на downto

означает, что шаг параметра цикла равен (-1).

Изменение значения параметра идет от большего значения к меньшему, т. е. <нач. знач.>

 <кон. знач.>.

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

Программа

Program Problem1a;

     uses WinCrt;

     var

        n, i, f : longint;

     begin



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

        f := 1;

        if n <> 0 then for i := n downto 1 do f := f*i;

       writeln('Факториал числа ', n, ' равен ', f)

     end.

Графическое изображение циклов for будет таким (см. рис. 22):

Рис. 22

Здесь: p - переменная цикла; n - ее начальное значение; k - ее конечное значение. Тело цикла составляет оператор или несколько операторов: s1; s2; ... sn;, которые нарисованы в прямоугольнике.

Задание 1

1. Выполните программу примера 1 на компьютерах.

2. Измените и дополните ее так, чтобы она вычисляла следующую сумму:

1! + 2! + 3! + ... + n!.

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

... to ... do ..., а также вложенных друг в друга циклов (циклов в циклах), совмещение циклов с параметром с другими циклами.

Пример 2. Квадрат любого натурального числа n равен сумме n первых нечетных чисел:

12  = 1

22  = 1 + 3

32  = 1 + 3 + 5

42  = 1 + 3 + 5 + 7

52  = 1 + 3 + 5 + 7 + 9

 . . . . . . . . . . . . . . . . . . .

Основываясь на этом свойстве, составить программу, позволяющую напечатать квадраты натуральных чисел от 1 до n.

Ясно, что цикл в программе надо организовать от 1 до n, в котором выполнять всего три оператора: находить сумму нечетных чисел (а их как раз столько, сколько раз будет выполняться цикл); выдавать полученную сумму на экран; "получать" следующее нечетное число.

Программа

Program Problem2;


     uses WinCrt;

     var

        i, n, s, k: integer;

     begin

        writeln(' Введите натуральное число, до которого надо');

        write('выводить квадраты чисел '); readln(n);

        writeln('Квадраты чисел следующие:');

        s  := 0; k  := 1;

           for i  :=  1 to n do

               begin

                  s :=  s + k;

                  writeln('Квадрат числа ', i, ' равен ', s);

                  k :=  k + 2

               end

     end.

Задание 2

1. Измените программу так, чтобы она выдавала на экран не таблицу квадратов чисел от 1 до n, а квадрат только одного числа n, введенного пользователем.

2. Измените и дополните программу так, чтобы она выдавала значение квадрата числа и те нечетные числа, сумме которых он равен.

3. Продолжая тему возведения натуральных чисел в степень,  без операций умножения, рассмотрим еще два интересных примера.   В первом из них нам придется совмещать, "вкладывать" друг в друга два цикла for, а во втором, циклы for и repeat.

Пример 3. Куб любого натурального числа n равен сумме n нечетных чисел, следующих по порядку за числами, сумма которых составляла куб предыдущего числа n - 1:

13  = 1

23  = 3 + 5

33  = 7 + 9 + 11

43  = 13 + 15 + 17 + 19

. . . . . . . . . . . . . . . . . . . . . .

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

Вот здесь уже нужны два цикла. Один - внешний, по количеству нечетных чисел, которое равно возводимому в куб числу, например, для 43 этот цикл должен выполняться 4 раза. В этом же цикле надо будет после подсчета суммы выводить ее значение на экран вместе с числом, которое возводится в куб.

Второй - внутренний, который будет суммировать нечетные числа и "вырабатывать" нужные нечетные числа для суммирования.





Программа

Program

Problem3; { Кубы натуральных чисел от 1 до n }

     uses WinCrt;

     var

         i, j, n, s, k : longint;

     begin

        writeln('Введите натуральное число, до которого надо');



        write('выводить кубы чисел '); readln(n);

        writeln('Кубы чисел следующие:');

        k := 1;

           for i := 1 to n do

              begin

                 s := 0;

                    for j := 1 to i do

                      begin

                         s := s + k; k := k + 2

                      end;

                 writeln('Куб числа ', i, ' равен ', s)

              end

     end.

Разберем работу этой программы

Переменные i и j нужны в качестве переменных первого - внешнего и второго - внутреннего циклов. Переменная k для нечетных чисел, а s для суммы чисел. Тип этих переменных установлен целый, но longint, так как могут быть достаточно большие целые числа, большие 32767.

Программа начинается с запроса для пользователя с помощью операторов writeln и write о вводе натурального числа, до которого надо выдавать таблицу кубов чисел. Затем с помощью оператора readln это значение вводится в память компьютера и присваивается переменной n.

Выводится надпись "Кубы чисел следующие". Она дана перед началом циклов по понятным причинам. В циклах ее дать нельзя, - она будет повторяться несколько раз. По окончании циклов тоже, тогда она будет написана внизу, после вывода самих чисел. Переменной k присваивается первое нечетное значение 1.

Начинается внешний цикл по количеству чисел, от 1 до n. В цикле несколько операторов, поэтому "открываются" операторные скобки: - begin ...

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

Внутренний цикл выполняется от 1 до i. Почему? В цикле вычисляется сумма и увеличивается нечетное k на 2, т. е. "вырабатывается" следующее нечетное число.

Заметьте!

Переменной k не присваивается перед началом каждого внутреннего цикла 1. Почему?

Следующим оператором writeln внутри внешнего цикла выдается информация на экран. Почему он размещен во внешнем цикле?



Пример 4. Из математики известно, что всякая натуральная степень числа n есть сумма n последовательных нечетных натуральных чисел. Составьте программу, которая для любой степени натурального числа n находила бы последовательность нечетных чисел, сумме которых равна эта степень.

Например, для 53 она выдавала бы последовательность чисел: 21, 23, 25, 27, 29.

План составления программы

1. Определим цель составления программы: надо показать, что действительно любую натуральную степень натурального числа можно представить в виде суммы последовательных нечетных чисел.

А если это так, тогда нам совершенно необходимо знать значение степени числа n с показателем k.

Это можно сделать с помощью простого цикла:

s := 1;

for i := 1 to k do s := s*n;

Значение степени будут накапливаться в переменной s, для этого ей устанавливается первоначальное значение 1.

В цикле, значение переменной s последовательно, k раз умножается на основание степени n. После выполнения цикла переменная s получит значение степени числа n с показателем k.

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

Для этого надо пробовать складывать нечетные числа вначале от 1 и далее (известно их количество - n);

1 + 3 + 5 + 7 + 9 ...,

а затем проверять полученный результат, сравнивая со значением степени s. Если равенство выполняется, тогда закончить цикл и вывести на экран полученные нечетные числа, если равенство не выполняется, тогда надо начинать суммирование со следующего нечетного числа - 3: 3 + 5 + 7 + 9 ... и т.д.

Этот процесс легче организовать с помощью цикла repeat. Переменной j, которая будет задавать начальные нечетные числа надо установить перед началом цикла первоначальное значение 1.

Общий вид такого цикла:

j := 1;

repeat

      . . . . . .

      j := j + 2

until  ...= s;

3. Осталось продумать, как подсчитывать суммы последовательных нечетных чисел. Мы уже сталкивались с этим вопросом и знаем, что для этого надо создать цикл от 1 до n, в котором в одну из переменных, скажем m, накапливать эту сумму, а вторая переменная должна "вырабатывать" следующее нечетное число.



Этот цикл можно записать так:

p := j; m := 0;

for i := 1 to n do

   begin

       m := m + p; p := p + 2

   end;

Обратите внимание! Переменная p, каждый цикл repeat, (внешний по отношению к данному), будет получать новое начальное значение нечетного числа, а переменная m - для суммы должна обнуляться перед каждым новым суммированием для другой последовательности нечетных чисел.

4. Наконец, когда последовательность нечетных чисел найдена, ее надо вывести на экран. Для этого надо устроить еще один цикл от 1 до n, в котором выдавать значения этих нечетных чисел. За первое нечетное число из последовательности надо взять значение j, но так как оно уже увеличилось на 2, то из j следует вычесть 2. Этот цикл будет:

                                                             j := j - 2;

            for i := 1 to n do

                                                                begin

                                                                   write(j, ' ');

                                                                   j := j + 2

                                                                end

 

Программа

Program Problem4;

     uses WinCrt;

     var

        n, i, k, j, m, s, p : longint;

     begin

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

       write('Введите натуральное число - показатель степени '); readln(k);

       s := 1; j := 1;

          for i := 1 to k do s := s*n;

            repeat

               p := j; m := 0;

               for i := 1 to n do

                  begin

                     m := m + p;

                      p := p + 2

                  end;

               j := j + 2

            until m=s;

           write('Степень с основанием ', n);

           writeln(' и показателем ', k, ' т. е. ', s);

           writeln('равна сумме следующих нечетных чисел');

            j := j - 2;

            for i:=1 to n do

               begin

                  write(j, ' ');

                  j := j + 2

               end

     end.

Чтобы лучше понять ее работу, возьмите степень 25 и проверьте как будут последовательно выполняться операторы программы.

Задание 3

1. Выполните эту программу на компьютерах.

2. Составьте программу, которая выясняет, может ли произведение а) трех; б) четырех последовательных натуральных чисел равняться некоторой степени некоторого натурального числа (квадрату, кубу, и т. д.)?






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