Урок. Программирование циклических алгоритмов

  • docx
  • 26.12.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л3-0025394.docx

Урок. Программирование циклических алгоритмов.

Цель работы: закрепить практические навыки работы с системой Borland Pascal, научиться правильно использовать различные операторы циклов; научиться составлять программы решения задач с использованием циклических структур.

Общие сведения

Алгоритм называется циклическим, если он содержит многократное выполнение одних и тех же операторов при различных значениях промежуточных данных. Число повторений этих операторов может быть задано в явной (цикл с известным заранее числом повторений) или неявной (цикл с неизвестным заранее числом повторений) форме.

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

Цикл с параметром

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

                  For  i:= N1    To    NDo  "оператор";

либо

                  For  i:= N1  DownTo  N2  Do "оператор";

Здесь i - параметр цикла (переменная порядкового типа),

N1, N2 - начальное и конечное значения параметра цикла i.

N1, N2 могут быть константами, переменными или выражениями порядкового типа.

Напомним, что "оператор" может иметь вид: Begin "операторы" end;

В случае связки "To" цикл выполняется при условии N1 <= N2 и происходит с единичным возрастанием параметра цикла i от N1 до N2. В случае связки DownTo цикл выполняется при условии N1 >= N2 и происходит с единичным уменьшением параметра цикла i от N1 до N2.

В операторе цикла не разрешается присваивать параметру цикла какое-либо значение.

После окончания цикла значение параметра цикла "i" неопределенно.

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

Сумма членов последовательности величин

a1, a2, a3, . . . , an

называется конечной суммой

Sn = a1 + a2 + a3+ . . . + an

Для некоторых последовательностей известны формулы расчета конечных сумм, например:

при an = an-1 + d; Sn = (a1 + an)*n/2; - арифметическая прогрессия,

при an = an-1 * q; Sn= (a1 - an*q)/(1-q); - геометрическая прогрессия,

где d и q - постоянные числа.

Здесь N-ый член последовательности выражается через (N-1)-ый член. Такие зависимости называются реккурентными.

Конечная сумма последовательности может быть неизвестна, тогда для ее расчета применяется алгоритм суммирования членов последовательности в цикле от 1 до N. Приведем пример расчета конечной суммы последовательности: 12 + 32 + 52 +. . . + (2*N-1)2; Sn = N*(4*N2-1)/3;

PROGRAM SUM_K;                     { расчет конечной суммы }
var
  a, S, Sn, i, N : word;
Begin  
  write('Введите число членов суммы N=');
  readln(N);
  S:= 0;
  For i:= 1 to N do
    begin                          {  цикл суммирования }
      a := Sqr(2*i-1);
      S:= S+a
    end;
  Sn := N*(4*N*N-1) div 3;
  Writeln('Конечная сумма S=',  S:10:2);       
  Writeln('Расчет конечной суммы по формуле Sn=',  Sn:10:2);
  Writeln('Нажми Enter');
  ReadLn  
End.

В некоторых случаях "N"-ый член последовательности определяется через сумму предыдущих членов, например,

an= p*Sn-1,

тогда

Sn= Sn-1 + an = Sn-1*(1+р),

и конечную сумму можно рассчитать по формуле:

Sn = S0*(1+p)N,

где "S0" - начальная сумма.

Рассмотрим программу вычисления конечной суммы денежного вклада в банк через N месяцев при ежемесячной процентной ставке "pr" (5% cоответствует pr=5).

PROGRAM VKLAD;        { расчет конечной суммы вклада в банк }
var
  S, Sn, pr : Real;
  i, N      : Integer;
Begin
  Write('Введите начальную сумму вклада S=');
  readln(S);
  Write('Введите процент по вкладу pr=');
  readln(pr);
  Write('Введите количество месяцев вклада N=');
  readln(N);
  For i:= 1 to N do S:= S*(1+pr/100);     { цикл произведений }
  Writeln('Конечная сумма вклада S=',  S:10:2);
  { Оператор для расчета "Sn" напишите самостоятельно }
  Writeln('Расчет конечной суммы вклада по формуле Sn=', Sn:10:2);
  Writeln('Нажмите Enter');        
  readln 
End.

Часто применяются вложенные операторы цикла. Например, если необходимо провести все варианты расчета при изменении нескольких параметров в заданных диапазонах.

Составим программу расчета функции y = A*sin(x) - cos(x)/A; при изменении аргумента "x" в диапазоне от 0 до Pi с шагом Pi/100 и при изменении параметра "A" в диапазоне от 1 до 3 с шагом 0.5.

Program tabl;
var
  y, x, a, dx : real;
  i, j: integer;
Begin
  Writeln(' Расчет по формуле:  y=A*sin(x)-cos(x)/A; ');
  Writeln('--------------------------------------------------');
  Writeln('|   X   |  A=1.0 | A=1.5 | A=2.0 | A=2.5 | A=3.0 |');
  Writeln('--------------------------------------------------');
  dx := pi/100;
  for i:= 0 to 100 do
     begin    { внешний цикл изменения аргумента "X" }
       x:= dx*i;
       Write( x:8:4 );
       for j := 1 to 5 do
         begin{ вложеннный цикл изменения параметра "A" } 
           A := 0.5*(j+1);
           y := A*sin(x)-cos(x)/A;    Write(y:8:4) 
         end;
       Writeln;                                   {перевод курсора на новую строчку}
       if ((i+1) mod 20) = 0 then readln{задержка прокрутки экрана до нажатия Enter}
     end;
  readln;
End.

Операторы цикла с условием

В Турбо-Паскале применяются два оператора цикла с условием:

                      While  "условие"  DO  "оператор";  

- цикл с предусловием: проверка условия перед каждым выполнением "оператора",

                      Repeat  "операторы"  Until  "условие"; 

- цикл с постусловием: проверка условия после каждого выполнения "операторов".

Здесь "условие" - выражение логического типа (Boolean).

Схема выполнения операторов имеет вид:

Цикл WHILE

Цикл REPEAT

https://www.sites.google.com/site/126inform/_/rsrc/1468867217458/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/while.gif

https://www.sites.google.com/site/126inform/_/rsrc/1468867219614/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/repeat.gif

 

В цикле While "оператор" выполняется если условие верно (True), если условие ложно (False), то цикл заканчивается, т. е. цикл While повторяется пока выполняется условие. Цикл While начинается проверкой условия, поэтому, если начальное условие ложно, то "оператор" не выполняется ни разу. Для включения в тело цикла нескольких операторов применяется составной оператор: Begin "операторы" end.

Цикл Repeat повторяется, если условие ложно (False), и заканчивается, если условие верно (True), т. е. цикл Repeat повторяется до выполнения условия.

Цикл Repeat заканчивается проверкой условия, поэтому "операторы" выполняются не менее одного раза. В теле цикла может записываться более одного оператора.

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

Сумма членов бесконечной последовательности

a1, a2, a3, ... , an, ...

называется бесконечным рядом и записывается в виде:

a1 + a2 + a3 +... + an+...

Здесь an - общий член ряда.

Сумма конечного числа членов ряда называется частичной суммой и обозначается "Sn".

Если сумма членов бесконечного ряда имеет конечный предел "S", то ряд называется сходящимся. Для некоторых рядов получены формулы расчета суммы членов ряда. Например, сумма членов числового ряда:

1 + 1/32 + 1/52 + . . . + 1/(2*N-1) + ...

имеет предел S = Pi2/8 и общий член an = images/(2*N-1)2, где N = 1, 2, 3, ...

Для сходящегося ряда вычисляется последовательность частичных сумм с заданной погрешностью. Абсолютная погрешность расчетов определяется по формуле Eps=abs(S-Sn), либо Eps=abs(an), если значение S неизвестно. Относительная погрешность расчетов определяется по формуле Eps_o=abs((S-Sn)/S), либо Eps_o=abs(an/Sn).

Частичные суммы вычисляются по формуле: Sn = Sn-1 + an

Для знакопеременного ряда следует добавить k1=-1, а в цикле: k1:=-k1, an=k1*an. В некоторых случаях "N"-ый член ряда выражается через "N-1"-ый, например, для ряда:

1 + 1/2! + 1/4! + 1/6! + ... + 1/(2*N)! + ... ; N = 0, 1, 2, ...

общий член ряда вычисляется по формуле: an = an-1*k;

Параметр k = an/an-1 - коэффициент роста вычисляется предварительно (до написания программы).

Для данного ряда

an = 1/(2*N)! = 1/( 1*2*...*(2*N-2)*(2*N-1)*2*N)
an-1 = 1/(2*(N-1))! = 1/((2*N-2))! = 1/(1*2*...*(2*N-2))
k = an/an-1 = 1/((2*N-1)*2*N)

Здесь N! = 1*2*3*...*N; - вычисление факториала числа "N", причем 0! = 1.

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

  N  := 0;
  a  := 1;
  SN := 1;
  S  := (e+1)/e;
  e := 2.7182828;
  Repeat
    N := N+1;
    k := images/((2*N-1)*2*N);
    a := a*k;   
    SN := SN+a;
    Writeln('Частичная сумма Sn= ',  Sn:11:6);
  Until abs(S-Sn) < eps;              { eps - допустимая погрешность расчетов}
  Writeln('Сумма ряда S = ', SN:11:6);

Операторы ограничения и прерывания цикла

Данные операторы применяются внутри операторов цикла с параметром или условием. Операторы имеют вид:

     Continue;   -  ограничение цикла,
     Break;      -  прерывание цикла.   

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

  For i := 1 to 3 do
    begin      
      Write( 'Введите ПАРОЛЬ:' );    Readln(S); {S и Parol - переменные одного типа}
      If S = Parol  Then  Break                                 { прерывание цикла }
      else  If   i <> 3  Then Continue;                        { ограничение цикла }
      Writeln( 'Доступ к программе ЗАПРЕЩЕН' );
      Writeln( 'Нажмите Enter' );
      Readln;
      Halt                                                  { прерывание программы }
    end;                                                   { продолжение программы }

Примеры

Пример1: На промежутке от 1 до M найти все числа Армстронга. Натуральное число из n цифр называется числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу.

Этапы решения задачи:

  1. Математическая модель: xО[1;M], x=
  2. Составим блок схему программы:

 

https://www.sites.google.com/site/126inform/_/rsrc/1468867218831/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image032.gif

 

Распишем составные части блока"Находим все числа Армстронга на заданном промежутке и печатаем их"

https://www.sites.google.com/site/126inform/_/rsrc/1468867218544/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image034.gif


Опишем блок "Подсчитываем сколько цифр в числе i"

https://www.sites.google.com/site/126inform/_/rsrc/1468867217890/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image036.gif

Опишем блок "Проверяем, является ли i числом Армстронга"

https://www.sites.google.com/site/126inform/_/rsrc/1468867221886/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image038.gif

Дальнейшая детализация не требуется, запишем блок-схему целиком:

https://www.sites.google.com/site/126inform/_/rsrc/1468867221057/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image040.gif

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



PROGRAM Primer_1;

var i,k,s,p,n: Integer;

   BEGIN

     Write('Введите M ');

                 Readln(m);

               For i:=1 to M do

        begin

          s:=0; k:=i; n:=0;

          While k<>0 do

            begin k:=k DIV 10; n:=n+1 end;

              k:=i;

              While k<>0 do

              begin p:=k MOD 10; k:=k DIV 10;

                If p<>0 then s:=Trunc (s+Exp(n*Ln(p)))

              end;

              If s=f then WriteLn (f)

       end;

END.

 

Контрольные вопросы

  1. Как записывается и как работает оператор FOR?
  2. Для организации каких циклов применим оператор FOR?
  3. В чем отличие оператора WHILE от оператора REPEAT?
  4. Как программируются циклические алгоритмы с явно заданным числом повторений цикла?
  5. Как программируются циклические алгоритмы с заранее неизвестным числом повторений цикла?
  6. Напишите оператор цикла, который не выполняется ни разу.
  7. Напишите оператор цикла, который выполняется неограниченное число раз.
  8. Замените оператор "Repeat A Until B" равносильным фрагментом программы с оператором While.

Задачи

  1. Найти все двузначные числа, сумма цифр которых не меняется при умножении числа на 2,3,4,5,6,7,8,9.
  2. Найти все трехзначные числа, сумма цифр которых равна данному целому числу.
  3. Найти все трехзначные числа, средняя цифра которых равна сумме первой и третьей цифр.
  4. Найти все трехзначные числа, которые можно представить разностью между квадратом числа, образованного первыми двумя цифрами и квадратом третьей цифры.
  5. Найти все двузначные числа, сумма квадратов цифр которых делится на 17.
  6. Найти все трехзначные числа, представимые в виде сумм факториалов своих цифр.
  7. Найти двузначное число, обладающее тем свойством, что куб суммы его цифр равен квадрату самого числа.
  8. Найти двузначное число, равное утроенному произведению его цифр.
  9. В каких двузначных числах удвоенная сумма цифр равна их произведению?
  10. Можно ли заданное натуральное число М представить в виде суммы квадратов двух натуральных чисел? Написать программу решения этой задачи.


Вычисление выражений:
Дано натуральное n. Вычислить:

  1. https://www.sites.google.com/site/126inform/_/rsrc/1468867221323/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image044.gif ;
  2. https://www.sites.google.com/site/126inform/_/rsrc/1468867219057/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image046.gif ;

    Дано действительное число х, натуральное число n. Вычислить:
  3. x ( x - n )( x - 2 n )( x - 3 n )…( x - n2 );
  4. https://www.sites.google.com/site/126inform/_/rsrc/1468867219968/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image048.gif ;
  5. https://www.sites.google.com/site/126inform/_/rsrc/1468867220971/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image050.gif ;
    Дано натуральное n. Вычиcлить:
  6. https://sites.google.com/site/inform470/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/urok-3-programmirovanie-cikliceskih-algoritmov/image052.gif ;
  7. https://www.sites.google.com/site/126inform/_/rsrc/1468867221622/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image054.gif ;

Вычислить приближенно значение бесконечной суммы (справа от каждой суммы дается ее точное значение, с которым можно сравнить полученный ответ):

  1. https://www.sites.google.com/site/126inform/_/rsrc/1468867219869/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image056.gif=https://sites.google.com/site/inform470/home/9a/pascal/image058.gif ;
  2. https://www.sites.google.com/site/126inform/_/rsrc/1468867217511/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image060.gif=https://sites.google.com/site/inform470/home/9a/pascal/image062.gif ;
  3. https://www.sites.google.com/site/126inform/_/rsrc/1468867221721/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image064.gif=https://www.sites.google.com/site/126inform/_/rsrc/1468867221655/home/9a/pascal/urok-3-programmirovanie-cikliceskih-algoritmov/image066.gif ;

    Нужное приближение считается полученным, если вычислена сумма нескольких первых слагаемых, и очередное слагаемое оказалось по модулю меньше данного положительного числа e.
  4. Даны два целых числа A и B (A < B). Вывести все целые числа, расположенные между данными числами (не включая сами эти числа), в порядке их возрастания, а также количество N этих чисел.
  5. Даны два целых числа A и B (A < B). Вывести все целые числа, расположенные между данными числами (включая сами эти числа), в порядке их убывания, а также количество N этих чисел.
  6. Дано вещественное число A и целое число N (> 0). Вывести A в степени N: AN = A·A·...·A (числа A перемножаются N раз).
  7. Дано вещественное число A и целое число N (> 0). Вывести все целые степени числа A от 1 до N.
  8. Дано вещественное число A и целое число N (> 0). Вывести 1 + A + A2 + A3 + ... + AN.
  9. Дано вещественное число A и целое число N (> 0). Вывести 1 - A + A2 - A3 + ... + (-1)NAN.
  10. Дано целое число N (> 1). Вывести наименьшее целое K, при котором выполняется неравенство 3K > N, и само значение 3K.
  11. Дано целое число N (> 1). Вывести наибольшее целое K, при котором выполняется неравенство 3K < N, и само значение 3K.
  12. Дано вещественное число A (> 1). Вывести наименьшее из целых чисел N, для которых сумма 1 + 1/2 + ... + 1/N будет больше A, и саму эту сумму.
  13. Дано вещественное число A (> 1). Вывести наибольшее из целых чисел N, для которых сумма 1 + 1/2 + ... + 1/N будет меньше A, и саму эту сумму.
  14. Дано целое число N (> 0). Вывести произведение 1·2·...·N. Чтобы избежать целочисленного переполнения, вычислять это произведение с помощью вещественной переменной и выводить его как вещественное число.
  15. Дано целое число N (> 0). Если N - нечетное, то вывести произведение 1·3·...·N; если N - четное, то вывести произведение 2·4·...·N. Чтобы избежать целочисленного переполнения, вычислять это произведение с помощью вещественной переменной и выводить его как вещественное число.
  16. Дано целое число N (> 2) и две вещественные точки на числовой оси: A, B (A < B). Отрезок [A, B] разбит на равные отрезки длины H с концами в N точках вида A, A + H, A + 2H, A + 3H, ..., B. Вывести значение H и набор из N точек, образующий разбиение отрезка [A, B].
  17. Дано целое число N (> 2) и две вещественные точки на числовой оси: A, B (A < B). Функция F(X) задана формулой F(X) = 1 - sin(X). Вывести значения функции F в N равноотстоящих точках, образующих разбиение отрезка [A, B]: F(A), F(A + H), F(A + 2H), ..., F(B).
  18. Дано число D (> 0). Последовательность чисел AN определяется следующим образом: A1 = 2, AN = 2 + 1/AN-1, N = 2, 3, ... Найти первый из номеров K, для которых выполняется условие |AK - AK-1| < D, и вывести этот номер, а также числа AK-1 и AK.
  19. Дано число D (> 0). Последовательность чисел AN определяется следующим образом: A1 = 1, A2 = 2, AN = (AN-2+ AN-1)/2, N = 3, 4, ... Найти первый из номеров K, для которых выполняется условие |AK AK-1| < D, и вывести этот номер, а также числа AK-1 и AK.

Задачи повышенной сложности

    1. Определить, является ли заданное число совершенным , т.е. равным сумме всех своих (положительных) делителей, кроме самого этого числа (например, число 6 совершенно: 6=1+2+3).
    2. Дано натуральное k. Напечатать k-ю цифру последовательности 1234567891011121314..., в которой выписаны подряд все натуральные числа.
    3. Дано натуральное k. Напечатать k-ю цифру последовательности 149162536..., в которой выписаны подряд квадраты всех натуральных чисел.
    4. Дано натуральное k. Напечатать k-ю цифру последовательности 1123581321..., в которой выписаны подряд все числа Фибоначчи.