Цели:

  1. Сформировать понятие о циклах;
  2. Научиться использовать счётный цикл FOR;
  3. Познакомиться с циклами WHILE и REPEAT;
  4. Получить навыки решения алгоритмов с повторениями.

В языке Pascal существует три различных оператора с помощью которых можно запрограммировать повторяющиеся фрагменты программы (три оператора цикла):

  • счетный (арифметический) цикл FOR;
  • цикл WHILE с предусловием;
  • цикл REPEAT...UNTIL c постусловием.

Счётный (арифметический) цикл FOR

Переменная внутри цикла изменяется автоматически от k до n (n>k) с шагом 1

Формат записи цикла:

for i:=k to n do

или

от n до k (n>k) с шагом -1

Формат записи цикла:

for i:=n downto k do

Если в цикле должны выполняться несколько операторов, то используем операторные скобки:

begin … end;

Цикл FOR удобно использовать тогда, когда точно известно количество повторений.

Рассмотрим несколько примеров:

|| Найти сумму всех натуральных чисел от 1 до n.


                program zadacha4_1;                                        // название программы
                var
                    i, n, s: integer;                                      // описание переменных
                Begin                                                      // начало
                    writeln('введите  натуральное n');                     // вывод сообщения
                    readln(n);                                             // ввод n
                    s:=0;                                                  // обнуляем переменную s
                    for i:=1 to n do                                       // запускаем арифметический цикл с параметром FOR для i от 1го до n делать
                        s:=s+i;                                            // находим сумму чисел от 1го до n
                    writeln('сумма от 1 до ',n,' = ',s);                   // выводим результат
                End.                                                       //конец
            

В данном цикле переменная i автоматически изменяется от 1 до n с шагом 1. Поэтому к переменной s прибавляется i вначале равная 1, потом 2, потом 3, и т.д. до n, соответственно переменная s принимает значении 1, 3, 6, 10, 15 ……

|| Задано натуральное n. Вычислить сумму ряда: S=1 - 1/2 + 1/3 - 1/4 + 1/5 + ....... + 1/n


                program zadacha4_2;                                        // название программы
                var                                                        // описание переменных
                    i, n, a: integer;
                    s: real;
                Begin                                                      // начало
                    writeln('Введите n');                                  // вывод сообщения
                    readln(n);                                             // ввод n
                    s:=1;                                                  // присваиваем переменной s значение 1
                    a:=1;                                                  // присваиваем переменной a значение 1
                    for i:=2 to n do                                       // запускаем арифметический цикл с параметром FOR для i от 2 до n делать
                        begin                                              // начало тела цикла
                            a:=(-1)*a;                                     // присваиваем переменной a значение (-1)*a
                            s:=s+a/i;                                      // присваиваем переменной s значение s+a/i (находим сумму ряда)
                        end;                                               // конец тела цикла
                    writeln('Сумма ряда S = ',s);                          // выводим результат
                End.                                                       //конец
            

|| Определить количество трёхзначных натуральных чисел, сумма цифр которых равна заданному числу N.


                program zadacha4_3;                                        // название программы
                var                                                        // описание переменных
                    с1, с2, с3, i, n, kol: integer;
                Begin                                                      // начало
                    writeln('Введите n');                                  // вывод сообщения
                    readln(n);                                             // ввод n
                    kol:=0;                                                // обнуляем переменную kol
                    for i:=100 to 999 do                                   // запускаем арифметический цикл с параметром FOR для i от 100 до 999 делать
                        begin                                              // начало тела цикла
                            c1:=i div 100;                                 // находим первую цифру трехзначного числа
                            c2:=(i div 10) mod 10;                         // находим вторую цифру трехзначного числа
                            c3:=i mod 100;                                 // находим третью цифру трехзначного числа
                            if c1+c2+c3=n then kol:=kol+1;                 // проверяем условие - если сумма цифр числа равна n, то увеличиваем переменную kol на 1
                          end;                                             // конец тела цикла
                    writeln('Количество таких чисел = ',kol);              // выводим результат
                End.                                                       //конец
            

цикл WHILE с предусловием и REPEAT с постусловием

Эти циклы удобно использовать тогда, когда заранее НЕизвестно число повторений.

Решим задачу zadacha4_1 используя циклы WHILE и REPEAT и попытаемся понять принцип работы этих циклов

|| Найти сумму всех натуральных чисел от 1 до n.

Цикл FOR

                program zadacha4_1a;                                       // название программы
                var
                    i, n, s: integer;                                      // описание переменных
                Begin                                                      // начало
                    writeln('введите  натуральное n');                     // вывод сообщения
                    readln(n);                                             // ввод n
                    s:=0;                                                  // обнуляем переменную s
                    for i:=1 to n do                                       // запускаем арифметический цикл с параметром FOR для i от 1го до n делать
                        s:=s+i;                                            // находим сумму чисел от 1го до n
                    writeln('сумма от 1 до ',n,' = ',s);                   // выводим результат
                End.                                                       //конец
            
Цикл WHILE

                program zadacha4_1b;                                       // название программы
                var
                    i, n, s: integer;                                      // описание переменных
                Begin                                                      // начало
                    writeln('введите натуральное n');                      // вывод сообщения
                    readln(n);                                             // ввод n
                    s:=0;                                                  // обнуляем переменную s
                    i:=1;                                                  // присваиваем переменной i значение 1, иначе не сработает условие i<=n, т.к. по умолчанию при объявлении переменной она равна 0
                    while i<=n do                                          // запускаем цикл WHILE с предусловием - пока i<=n делать
                        begin                                              // начало тела цикла
                            s:=s+i;                                        // присваиваем переменной s значение s+i - находим сумму чисел
                            i:=i+1;                                        // присваиваем переменной i значение i+1 - увеличиваем переменную i на 1
                        end;                                               // конец тела цикла
                    writeln('сумма от 1 до',n,'=',s);                      // выводим результат
                End.                                                       //конец
            

Цикл WHILE будет выполняться до тех пор, пока выполняется условие i<=n. Причем переменную i изменяем внутри цикла.

Цикл REPEAT

                program zadacha4_1c;                                       // название программы
                var
                    i, n, s: integer;                                      // описание переменных
                Begin                                                      // начало
                    writeln('введите  натуральное n');                     // вывод сообщения
                    readln(n);                                             // ввод n
                    s:=0;                                                  // обнуляем переменную s
                    i:=1;                                                  // присваиваем переменной i значение 1
                    repeat                                                 // повторять...
                        begin                                              // начало тела цикла
                            s:=s+i;                                        // присваиваем переменной s значение s+i - находим сумму чисел
                            i:=i+1;                                        // присваиваем переменной i значение i+1 - увеличиваем переменную i на 1
                        end;                                               // конец тела цикла
                    until i>n;                                             // повторять до тех пор, пока не выполниться условие i>n.
                    writeln('сумма от 1 до ',n,' = ',s);                   // выводим результат
                End.                                                       //конец
            

Цикл REPEAT . . . UNTIL будет выполняться до тех пор, пока не выполниться условие i>n.

Еще пару примеров:

|| Задано натуральное число n. Вычислить сумму цифр числа.


                program zadacha4_4;                                        // название программы
                var
                    n, sum, cif: integer;                                  // описание переменных
                Begin                                                      // начало
                    writeln('Введите n');                                  // вывод сообщения
                    readln(n);                                             // ввод n
                    sum:=0;                                                // обнуляем переменную sum
                    while n>0 do                                           // запускаем цикл WHILE с предусловием - пока n>0 делать
                        begin                                              // начало тела цикла
                            cif:=n mod 10;                                 // присваиваем переменной cif значение n mod 10 - находим цифры числа
                            sum:=sum+cif;                                  // присваиваем переменной sum значение sum+cif - находим суммы цифр числа
                            n:=n div 10;                                   // присваиваем переменной n значение n div 10 - уменьшаем число в 10 раз (уменьшаем разрядность) для того, чтобы найти другие цифры числа
                        end;                                               // конец тела цикла
                    writeln('Сумма цифр введённого числа = ',sum);         // выводим результат
                End.                                                       //конец
            

|| Найти минимальное натуральное число, которое при делении на 2 даёт в остатке 1, при делении на 3 даёт в остатке 2, при делении на 4 - в остатке 3, при делении на 5 - в остатке 4, при делении на 6 - в остатке 5, а при делении на 7 дают в остатке 6.


                program zadacha4_5;                                                                                                        // название программы
                var
                    i, kl: longint;                                                                                                        // описание переменных
                Begin                                                                                                                      // начало
                    kl:=0;                                                                                                                 // обнуляем переменную kl
                    i:=0;                                                                                                                  // обнуляем переменную i
                    while kl=0 do                                                                                                          // запускаем цикл WHILE с предусловием - пока kl=0 делать
                        begin                                                                                                              // начало тела цикла
                            i:=i+1;                                                                                                        // присваиваем переменной i значение i+1 - увеличиваем i на 1 чтобы найти минимальное число, которое при делении даст нужный остаток
                            if (i mod 2=1) and (i mod 3=2) and (i mod 4=3) and (i mod 5=4) and (i mod 6=5) and (i mod 7=6) then kl:=1;     // проверяем условие нахождения нужного остатка и если условие выполнится, то присваиваем переменной kl значение 1 для выхода из цикла
                        end;                                                                                                               // конец тела цикла
                    writeln(i);                                                                                                            // выводим результат
                End.                                                                                                                       //конец
            

Вопросы для повторения:

  1. Для чего предназначен оператор цикла?
  2. Какие циклы существуют в языке Pascal?
  3. Какой формат записи имеет оператор FOR?
  4. Как работает оператор FOR?
  5. В каких случаях применяется оператор FOR?
  6. Сколько раз будет выполнен цикл, и чему будет равна переменная S после выполнения:
    
                            s:=0;
                            n=6;
                            for i:=3 to n do
                                s:=s+i;
                        
  7. Как в теле цикла выполнить несколько операторов?
  8. Какой формат записи имеют циклы WHILE и REPEAT?
  9. В каких случаях удобно применять эти циклы?
  10. Чем отличается цикл WHILE от цикла REPEAT?
  11. Будет ли остановлено выполнение данного цикла? Почему?
    
                            s:=0;
                            i:=1;
                            while i<=4 do
                                s:=s+i;
                        

Задания для самостоятельной работы:

  1. Найти сумму всех нечётных трёхзначных чисел.
  2. Найти сумму положительных кратных 7 чисел, меньших 100.
  3. Найти все числа, которые делятся на N среди всех двухзначных чисел.
  4. Среди двузначных чисел найти те, сумма квадратов цифр, которых делится на 13.
  5. Найти все делители для заданного числа n.
  6. Дано натуральное число n. Вычислить n!.
  7. Среди четырёхзначных чисел выбрать те, у которых цифры образуют возрастающую последовательность (например: 1389, 4678).
  8. Написать программу поиска чисел <1000, которые при делении на 2 дают в остатке 1, при делении на 3 дают в остатке 2, при делении на 4 - в остатке 3, при делении на 5 - в остатке 4, при делении на 6 - в остатке 5 а при делении на 7 дают в остатке 6.
  9. Дано натуральное число n. Сколько чётных цифр в числе n?
  10. Дано натуральное число n. Поменять порядок цифр числа n на обратный.
  11. Для данного натурального числа m>1 найдите минимальное k, для которого уже выполняется равенство k!>m (например, если m=10, то k=4).