[ЗМІСТ]      [Далі]       [Назад]      [Початок розділу]

 

3.5. Програмування циклів за умовою

 

      У мові Паскаль цикл з умовою повторення (Lw) записується так

 

       while Pas(F) do begin

          Pas(Р)

       end,

 

а цикл з умовою закінчення (Lu) -

 

       repeat

          Pas(Р)

       until Pas(F).

 

      Якщо інструкція Р є розгалуженням, або циклом, або не ланцюгом інструкцій, то операторні дужки "begin-end" дозволяється опускати. Вони обов'язкові, коли Р - ланцюг інструкцій.

      Розглянемо приклади.

      Приклад 4P. Для довільного а>1 знайти номер n такий, що n!>аn

 (задача 3.13).

 

    program FactPower;

       var N: word;

           А, X, Y: real;

    begin

       write(' А=? '); readln(А);

       N:= 0; X:= 1; Y:= 1;

       while X>=Y do begin

          N:= N+1; X:= X*А; Y:= Y*N

       end;

       writeln(' N = ', N,' Степінь = ', X,' Факторіал = ', Y)

    end.

 

      Зверніть увагу на типи змінних. Якщо змінній Y приписати тип word, а іншого способу зобразити натуральний тип ми поки що не знаємо, то її найбільшим значенням було б 65535, тобто вже 9!=362880 виявилося б недопустимим. Тому для Y і X вибрано дійсний тип.

 

      Приклад 5P. Обчислити 1/х за допомогою границі (задача 3.15).

    program Limit;

       var А, С, X, Eps: real;

           K: word;

    begin

       repeat

          write('х, eps=? '); readln(X, Eps)

       until (0<Х) and (X<2) and (Eps>0);

       K:= 0; А:= 1; С:= 1-X;

       while abs(С)>=Eps*Х do begin

          K:= K+1; А:= А*(1+С); С:= С*С

       end;

       writeln(' 1/Х = ', 1/Х,' А = ', А,' K = ', K)

    end.

 

      Приклад 6P. Сума десяткових цифр числа (задача 3.17).

    program Digit_Sum;

       var N, Р, А, S: integer;

    begin

       repeat

          write('n=? '); readln(N)

       until N>0;

       Р:= N; S:= 0;

       repeat

          А:= Р mod 10; write(':', А);

          S:= S+А; Р:= Р div 10

       until Р=0;

       writeln; writeln(' Сума = ', S)

    end.

 

      Приклад 7P. Розв’язок рівняння методом хорд (задача 3.18).

    program Span;

       var А, В, X, XX, Y, YB, Eps: real;

    begin

       repeat

          write('eps=? '); readln(Eps)

       until Eps>0;

       А:= 0; B:= 2; X:= А;

       YB:= ((B+4)*B+1)*В-6;

       repeat

          XX:= X; Y:= ((X+4)*X+1)*X-6;

          X:= X-Y*(B-X)/(YB-Y)

       until abs(X-XX)<Eps;

       writeln(' х = ', X,' xx = ', XX)

    end.

 

      Циклу з виходом у мові Паскаль немає. Взагалі, ситуація, коли алгоритм використовує структури керування і інші інструкції, не передбачені мовою програмування, типова. Відповідна задача - реалізація або кодування тієї або інший алгоритмічної конструкції в мові програмування - одна з центральних в програмуванні.

      Відносно циклу з виходом, то він кодується з допомогою циклу while Паскаля з тотожно-істинною умовою продовження та інструкції виходу з циклу break.

      Код циклу (Le) прийме вигляд

       while True do begin

          Pas(Р);

          if Pas(F) then break;

          Pas(Q)

       end;

 

      Приклад 8P. Сума і добуток (задача 3.19).

    program Sum_Prod;

       var a, S, Р: real;

    begin

       S:= 0; Р:= 1;

       while True do begin

          write(' а=? '); readln(a);

          if а=0.0 then break;

          S:= S+a; Р:= Р*а

       end;

       writeln(' Сума= ', S,' Добуток= ', Р)

    end.

 

      У мові Сі цикл з умовою повторення (Lw) записується так

 

      while (C(F))

            {

             C(Р)

            },

 

а цикл з умовою закінчення (Lu) -

 

      do

            {

             C(Р)

            }

      while (¬C(F));.

 

      Якщо інструкція Р є розгалуженням, або циклом, або не ланцюгом інструкцій, то операторні дужки "{-}" дозволяється опускати. Вони обов'язкові, коли Р - ланцюг інструкцій. Зверніть увагу на те, що при кодуванні циклу (Lu) замість умови F використовується її заперечення.

      Розглянемо приклади.

      Приклад 4C. Для довільного а>1 знайти номер n такий, що n!>аn (задача 3.13).

 

#include <stdio.h>

 

/* FactPower */

main()

{

  unsigned n;

  double a, x, y;

 

  printf(“ А=? ”); scanf(“%lf”, &a);

  n = 0; x = 1; y = 1;

  while (x>=y)

    {

     n++; x *= a; y *= n;

    }

  printf(“ N = %u Степінь = %lf Факторіал = %lf”,n ,x, y);

}

 

      Приклад 5C. Обчислити 1/х за допомогою границі (задача 3.15).

 

#include <stdio.h>

#include <math.h>

 

/* Limit */

main()

{

  double a, c, x, eps;

  unsigned k;

 

  do

    {

     printf(“х, eps=?”); scanf(“%lf %lf”, &x, &eps);

    }

  while (0>=x || x>=2 || eps<=0);

  k = 0; a = 1; c = 1-x;

  while (fabs(c)>=eps*x)

    {

     k++; a *= (1+c); c *= c;

    }

  printf(“ 1/Х = %lf А = %lf K = %u”, 1/x, a, k);

}

 

У останньому прикладі для обчислення модуля дійсного числа використовується функція fabs(c) з бібліотеки math.h, яка підключається за допомогою #include <math.h>.

 

      Приклад 6C. Сума десяткових цифр числа (задача 3.17).

 

#include <stdio.h>

 

/* Digit_Sum */

main()

{

  int n, p, a, s;

 

  do

    {

     printf(“n=? ”); scanf(“%d”, &n);

    }

  while (n<=0);

  p = n; s = 0;

  do

    {

     a = p % 10; printf(“:%d”, a);

     s += a; p /= 10;

    }

  while (p!=0);

  printf(“\n Сума = %d”, s);

}

 

      Приклад 7C. Розв’язок рівняння методом хорд (задача 3.18).

 

#include <stdio.h>

#include <math.h>

 

/* Span */

main()

{

  double a, b, x, xx, y, yb, eps;

 

  do

    {

     printf(“eps=? ”); scanf(“%lf”, &eps);

    }

  while (eps<=0);

  a = 0; b = 2; x = a;

  yb = ((b+4)*b+1)*b-6;

  do

    {

     xx = x; y = ((x+4)*x+1)*x-6;

     x = x-y*(b-x)/(yb-y);

    }

  while (fabs(x-xx)>=eps);

  printf(“ х = %lf xx = %lf”, x, xx);

}

 

      Циклу з виходом у мові Сі, як і у Паскалі, немає.Цикл з виходом у Сі кодується з допомогою циклу while з тотожно-істинною умовою продовження, наприклад (1), та інструкції виходу з циклу break.

      Код циклу (Le) прийме вигляд

      while (1)

            {

             C(Р);

             if (C(F)) break;

             C(Q)

            }

 

      Приклад 8С. Сума і добуток (задача 3.19).

 

#include <stdio.h>

 

/* Sum_Prod */

main()

{

  double a, s, p;

 

  s = 0; p = 1;

  while (1)

    {

     printf(“ а=? ”); scanf(“%lf”,&a);

     if (а==0.0) break;

     s += a; p *= а;

    }

  printf(“ Сума= %lf Добуток= %lf”, s, p);

}

[ЗМІСТ]      [Далі]       [Назад]      [Початок розділу]