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

 

2.3. Програмування розгалужених алгоритмів

 

      Нехай F - умова, R - інструкція. Визначимо через Pas(F), Pas(R) - запис умови F і інструкції R в мові  Паскаль, а через C(F), C(R) - запис в мові Сі.

 

      У мові Паскаль бульові константи Іст і Хиб позначаються відповідно true і false. Визначення бульової змінної q записується як

 

       var q: boolean.

    Відношення Rel мають стандартні позначення {=, <>,  <,  >,  <=,>=}. Бульова операція диз’юнкція записується як or, кон’юнкція - як and і заперечення - як not.

    Зауваження 2.3. Старшинство бульових операцій і відношень у мові Паскаль не зовсім звичайне: бульові операції мають більш високий пріоритет ніж відношення, тому, наприклад, вираз 0<х and х<1 буде розумітися як (0< (х and х))< 1, що не має змісту; тому необхідно застосовувати дужки

             (0<х) and (х<1).¦

 

      Розгалуження

 

       якщо F то Р інакше Q кр

записується як

 

       if Pas(F) then

          begin Pas(Р) end

       else

          begin Pas(Q) end.

 

      Якщо інструкції P, Q - це ланцюги інструкцій, то запис розгалуження далі не скорочується, в інших випадках – операторні дужки "begin-end" можна опустити.

      Таким же чином

 

       if Pas(F) then

          begin Pas(Р) end

 

записується захищена інструкція

 

       якщо F то Р кр.

Правило виключення операторних дужок - аналогічне.

      Скорочення для каскадного розгалуження не передбачене.

 

    Приклад 1P. Обчислення max(a, b, c) (задача 2.2).

    program MaxABC;

       var a, b, c, у: real;

    begin

       writeln('a, b, c=? '); readln(a, b, c);

       if а>b then у:= а

       else у:= b;

       if c>у then у:= c;

       writeln(' максимум з ( ', a,',  ', b,',  ', c,' ) = ', у)

    end.

 

      Приклад 2P. Дослідження системи двох алгебраїчних рівнянь (задача 2.4).

 

    program Two_Eq;

       var a1, a2, b1, b2, c1, c2, D, Dx, Dy: real;

           Comp, Def: boolean;

    begin

       writeln('A1, B1, C1=? '); readln(a1, b1, c1);

       writeln('A2, B2, C2=? '); readln(a2, b2, c2);

       D:= a1*b2-a2*b1;

       Dx:= c1*b2-c2*b1; Dy:= a1*c2-a2*c1;

       if D=0 then

          if (Dx=0) and (Dy=0) then begin

             Comp:= true; Def:= false

          end

          else Comp:= false

       else begin

          Comp:= true; Def:= true

       end;

       if Comp then begin

          write(' Система сумісна ');

          if Def then writeln(' і визначена')

          else writeln(', але не визначена')

       end

       else

          writeln(' Система не сумісна')

    end.

 

    Приклад 3P. Розв’язок квадратного рівняння (задача 2.7).

    program Kv_Ur;

       var a, b, c, х, у, d, z: real;

    begin

       writeln('a, b, c=? '); readln(a, b, c);

       if а=0 then

          if b=0 then

             if c=0 then writeln('Рішень нескінченна кількість')

             else write('Рішень немає')

          else begin

             х:= - c/b; write('Рішення одне = ', х)

          end

       else begin

          writeln('Два рішення:'); z:= 2*a; х:= - b/z;

          d:= b*b-2*z*c;

          if d>=0 then begin

             d:= sqrt(d)/z; у:= x-d; х:= х+d;

             writeln('1: ', у);

             write('2: ', х)

          end

          else begin

             d:= sqrt(- d)/z;

             writeln('1: ', х,' ', -d,' *I');

             write('2: ', х,' ', d,' *I')

          end

       end

    end.

 

      У мові Сі бульові константи не мають спеціальних імен, а кодуються цілими числами. Бульові змінні зовсім не передбачені. Значення будь-якого (навіть арифметичного) виразу вважається істинним, якщо воно не дорівнює 0.

      Для позначення бульових констант можна використати #define.

 

#define FALSE 0

#define TRUE 1

 

      Замість бульових змінних можна застосовувати, наприклад, цілі, присвоюючи їм згодом бульові значення. Наприклад:

 

      int b;

 

      b = FALSE;

      b = b && (x>0);.

      Відношення Rel записуються так: {==,  !=,  <,  >,  <=, >=} (“==” позначає “дорівнює”, а “!=” – “не дорівнює”). Бульові операції позначаються: || - диз’юнкція, && - кон’юнкція, ! - заперечення.

      У Сі реалізовано також умовний вираз IF(F,a,b), який записується F?a:b.

      Розгалуження

 

       якщо F то Р інакше Q кр

записується як

 

      if (C(F))

        {

         C(Р)

        }

      else

        {

         C(Q)

        }.

      У Сі фігурні дужки грають роль операторних дужок "begin-end" Паскаля. Дужки можна опускати, якщо, як і у Паскалі, C(P) або C(Q) –це один оператор мови Сі.

      Таким же чином

 

      if (C(F))

        {

         C(Р)

        }

 

записується захищена інструкція

 

       якщо F то Р кр.

Правило виключення операторних дужок - аналогічне.

      Скорочення для каскадного розгалуження, як і у Паскалі, не передбачене.

 

      Приклад 1C. Обчислення max(a, b, c) (задача 2.2).

#include <stdio.h>

 

/* MaxABC */

main()

{

 double a, b, c, у;

 

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

 if (а>b) у = а;

 else у = b;

 if (c>у) у = c;

 printf(“ max= %lf”, у);

}

Цю ж задачу можна розв’язати з використанням умовного виразу Сі

 

#include <stdio.h>

 

/* MaxABC2 */

main()

{

 double a, b, c, у;

 

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

 y = (а>b)?а:b;

 y = (c>у)?c:y;

 printfmax= %lf”, у);

}

 

      Приклад 2C. Дослідження системи двох алгебраїчних рівнянь (задача 2.4).

 

#include <stdio.h>

 

#define FALSE 0

#define TRUE 1

 

/* Two_Eq; */

main()

{

  double a1, a2, b1, b2, c1, c2, d, dx, dy;

  int comp, def;

 

  printf(“A1, B1, C1=? ”); scanf(“%lf %lf %lf”, &a1, &b1, &c1);

  printf(“A2, B2, C2=? ”); scanf(“%lf %lf %lf”, &a2, &b2, &c2);

  d = a1*b2-a2*b1;

  dx = c1*b2-c2*b1; dy = a1*c2-a2*c1;

  if (d==0)

    if (dx==0 && dy==0)

     {

      comp = TRUE; def = FALSE;

     }

    else comp = FALSE;

  else

   {

    comp = TRUE; def = TRUE;

   }

  if (comp)

   {

    printf(“ Система сумісна ”);

    if (def) printf(“ і визначена\n”);

    else printf(“, але не визначена\n”);

   }

  else printf(“ Система не сумісна\n”);

}

 

      Приклад 3C. Розв’язок квадратного рівняння (задача 2.7).

 

#include <stdio.h>

 

/* Kv_Ur */

main()

{

  double a, b, c, х, у, d, z;

 

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

  if (а==0)

    if (b==0)

      if (c==0) printf(“Рішень нескінченна кількість\n”);

      else printf(“Рішень немає\n”);

    else

     {

      х = - c/b; printf(“Рішення одне = %lf\n”, х);

     }

  else

   {

    printf(“Два рішення:\n”); z = 2*a; х = - b/z;

    d = b*b-2*z*c;

    if (d>=0)

     {

      d = sqrt(d)/z; у = x-d; х = х+d;

      printf(“1: %lf\n”, у);

      printf(“2: %lf\n”, х);

     }

    else

     {

      d = sqrt(- d)/z;

      printf(“1: %lf %lf *I\n”, х, -d);

      printf(“2: %lf %lf *I\n”, х, d);

     }

   }

}

 

Задачі і вправи

 

      Вправа 2.1. Обчислити значення х = f(у)-6.3, де у = z+2 і

 

                ¦ у2 - 0,3, у < 0,

                ¦

         f(у) = < 0,       0 <= у <= 1,

                ¦

                ¦ у2 + у,  у > 1.

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