[ЗМІСТ] [Далі] [Назад] [Початок
розділу]
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;
printf(“ max= %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.
[ЗМІСТ] [Далі] [Назад] [Початок
розділу]