2 Algorytmy decyzyjne Algorytmy decyzyjne charakteryzują się tym, że w pewnym momencie w sytuacji problemowej następuje ich zatrzymanie i wybór właściwej drogi. Algorytmy rozgałęziające się dają ogromne możliwości podczas rozwiązywania zadań, w których muszą zachodzić lub zostać wykluczone określone warunki. Poniższe przykłady reprezentujące grupę algorytmów decyzyjnych obrazują sytuacje spotykane w życiu codziennym, jak również podczas rozwiązywania zadań matematycznych. W takich algorytmach można już całkowicie wykluczać sytuacje wadliwe, co najczęściej będzie się kończyć odpowiednią informacją i zatrzymaniem programu. Zadania wraz z rozwiązaniami prezentowane są w następującej kolejności: przepis na gotowanie zupy, odpowiedzialność za sprzedaż towaru z wadami, wyznaczanie większej z podanych dwóch liczb, wyznaczanie wartości bezwzględnej, dzielenie dwóch liczb rzeczywistych, obliczanie procentów, obliczanie pola powierzchni wycinka koła, wyznaczanie rozwiązania równania liniowego, wyznaczanie pierwiastków równania kwadratowego, obliczanie pola trójkąta wg wzoru Herona. Dwa ostatnie zadania wykraczają poza program nauczania w gimnazjum, ale nie powinny one stanowić problemu w zrozumieniu działania ich algorytmu.
Algorytm 2.1 Przepis na gotowanie zupy. Dane: Zupa w proszku Woda Sól Lista kroków: 1. Przygotować litr wody w garnku. 2. Odlać ½ szklanki z 1 litra wody i wsypać zawartość torebki. 3. Zagotować pozostałą wodę w garnku. 4. Do gotującej się wody wlać rozpuszczoną zupę w szklance i dosypać soli. 5. Gotować około 5 minut. 6. Jeżeli zupa jest słona to przelej ją do talerza, w przeciwnym razie dosyp ½ łyżeczki soli i przelej do talerza. 7. Zjedz zupę i zakończ algorytm. Przygotuj Przepis... Czy zupa jest słona? Gotowe danie Rys. 2.1.1
Algorytm 2.2 Odpowiedzialność za sprzedaż towaru z wadami (według prawa cywilnego: odpowiedzialność z tytułu rękojmii za wady)[6]. Lista kroków: 1. W momencie, w którym sprzedano Ci towar z wadami, powstaje odpowiedzialność sprzedawcy za wady. 2. Jeżeli kupujący powiadomił sprzedawcę w ciągu miesiąca o pojawieniu się wady, wówczas idź do punktu (5), w przeciwnym razie idź do (3). 3. Jeżeli sprzedawca podstępnie zataił wadę, idź do punktu (5), w przeciwnym razie idź do (4). 4. Wygasa odpowiedzialność sprzedawcy za wady zakończ algorytm. 5. Domagaj się przysługujących Ci uprawnień (wymiany towaru na towar wolny od wad lub naprawy towaru, obniżenia ceny i zwrotu nadpłaty itp.) zakończ algorytm. Zakupiony towar Czy towar jest wadliwy? Czy powiadomiłeś o tym sprzedawcę w ciągu miesiąca? Czy sprzedawca podstępnie zataił wadę? Odpowiedzialność za wady wygasa Domagaj się swoich praw Rys. 2.2.1
Algorytm 2.3 Wyznaczanie większej z podanych dwóch liczb x i y [8]. Dane: x, y Szukane: liczba większa CZYTAJ (x,y) x>y ( y jest większe od x ) ( x jest większe od y ) Rys. 2.3.1 Pseudokod: czytaj(x,y) jeżeli x>y wykonaj pisz( x jest większe od y ) inaczej pisz( y jest większe od x ) Pascal: Program algortym; var x,y:integer; read(x,y); if x>y then write( x jest większe od y ) else write( y jest większe od x ); END.
ELI 2.0: Rys. 2.3.2 Rys. 2.3.3
Algorytm 2.4 Wyznaczanie wartości bezwzględnej liczby x [5]. Dane: x Szukane: x CZYTAJ (x) x>=0 (-x) (x) Pseudokod: Rys. 2.4.1 Czytaj(x) jeżeli x>=0 wykonaj pisz(x)inaczej pisz(-x) Pascal: Program algortym; var x:integer; read(x); if x>=0 then write(x)else write(-x); END.
Algorytm 2.5 Dzielenie dwóch liczb rzeczywistych; Dane: x, y Szukane: iloraz Lista kroków: iloraz x y, gdzie y<>o. CZYTAJ (x,y) ( Nie można dzielić przez zero ) y=0 iloraz := x/y (iloraz) Pseudokod: Rys. 2.5.1 czytaj(x,y) jeżeli y=0 wykonaj pisz( Nie można dzielić przez zero ) inaczej iloraz=x/y pisz (iloraz) Pascal: Program algortym; var x,y:integer; iloraz:real; read(x,y); if y=0 then write( Nie można dzielić przez zero ) else begin iloraz:=x/y; write(iloraz); end; END.
Algorytm 2.6 x Obliczanie x % z liczby y; p 100 y Dane: x, y Szukane: p CZYTAJ (x,y) ( Nie można dzielić przez zero ) y=0 p := (x/y)*100 (p) Pseudokod: Rys. 2.6.1 czytaj(x,y) jeżeli y=0 wykonaj pisz( Nie można dzielić przez zero ) inaczej Pascal: p=x/y)*100 pisz (p) Program algortym; var x,y,p:real; read(x,y); if y=0 then write( Nie można dzielić przez zero ) else begin p:=(x/y)*100; write(p); end; END.
Algorytm 2.7 Obliczanie pola powierzchni wycinka koła Pwyc 360 S, gdzie 2 S r dla r>0. Pwyc Rys. 2.7.1 Dane: alfa, r Szukane: Pwyc CZYTAJ (alfa,r) r<=0 ( Zły promień ) pi := 3.14 S := pi*r*r Pwyc := (alfa/360)*s (Pwyc) Rys. 2.7.2
Pseudokod: czytaj(alfa,r) jeżeli r<=0 wykonaj pisz('zły promień')inaczej pi:=3.14; S:=pi*r*r; Pwyc=(alfa/360)*S; pisz(pwyc); Pascal: Program algortym; var alfa,r:integer; Pwyc,pi,s:real; read(alfa,r); if r<=0 then write('zły promień')else begin pi:=3.14; S:=pi*r*r; Pwyc:=(alfa/360)*S; write(pwyc); end; END.
Algorytm 2.8 Wyznaczanie rozwiązania równania liniowego ax b 0, gdy dane są liczby rzeczywiste a i b [7]. Dane: a, b Szukane: x CZYTAJ (a, b) a=0 x:=-b/a b=0 (X) ( Równanie nie ma rozwiązania ) ( Rozwiązaniem jest każda liczba rzeczywista x ) Rys. 2.8.1
Pseudokod: czytaj(a,b) jeżeli (a=0) i (b=0) wykonaj pisz ('Rozwiązaniem jest każde x') jeżeli (a=0) i nie(b=0) wykonaj pisz ('Równanie nie ma rozwiązania') jeżeli a<>0 wykonaj x=-b/a pisz (x) Pascal: Program algortym; var a,b:integer; x:real; read(a,b); if (a=0) and (b=0) then write ('Rozwiązaniem jest każde x'); if (a=0) and not (b=0) then write ('Równanie nie ma rozwiązania'); if a<>0 then begin x:=-b/a; write(x); end; END. ELI 2.0: Rys. 2.8.2
Algorytm 2.9 2 Wyznaczanie pierwiastków równania kwadratowego ax bx c 0, gdzie a<>0 [7, 9]. Dane: a, b, c Szukane: x1, x2 CZYTAJ (a,b,c ) a=0 (To nie jest równanie kwadratowe) delta:=b -4*a*c delta<0 (Równanie kwadratowe nie ma pierwiastków rzeczywistych) delta=0 x1:=-b/2a x2:=x1 x1:=(-b-sqr(delta))/2*a x2:=(-b+sqr(delta))/2*a (x1,x2 ) Rys. 2.9.1
Pseudokod: czytaj(a,b,c) jeżeli a=0 wykonaj pisz('to nie jest równanie kwadratowe') jeżeli a<>0 wykonaj delta=sqr(b)-4*a*c jeżeli delta<0 wykonaj pisz ('Równanie kwadratowe nie ma pierwiastków rzeczywistych') jeżeli delta=0 wykonaj jeżeli delta>0 wykonaj x1=(-b)/(2*a) x2=x1 x1=(-b-sqr(delta))/(2*a) x2=(-b+sqr(delta))/(2*a) pisz(x1,x2) Pascal: Program algortym; var a,b,c,delta,x1,x2:real; read(a,b,c); if a=0 then write('to nie jest równanie kwadratowe'); if a<>0 then begin delta:=sqr(b)-4*a*c; if delta<0 then write('równanie kwadratowe nie ma pierwiastków rzeczywistych'); if delta=0 then begin x1:=(-b)/(2*a);x2:=x1;end; if delta>0 then begin x1:=(-b-sqr(delta))/(2*a); x2:=(-b+sqr(delta))/(2*a);end; write(x1,x2); end; END. ELI 2.0: Rys. 2.9.2
Algorytm 2.10 Obliczanie pola trójkąta wg wzoru Herona S p( p a)( p b)( p c), gdzie a b c p. Aby istniał trójkąt o długości boków a, b, c muszą być spełnione 2 następujące warunki: a+b>c, b+c>a, c+a>b[5]. Dane: a, b, c Szukane: S CZYTAJ (a, b, c) a+b>c b+c>a c+a>b p:=(a+b+c)/2 ( Trójkąt nie istnieje ) S:=SQRT(p*(p-a)*(p-b)*(p-c)) (S) Rys. 2.10.1
Pseudokod: czytaj(a,b,c) p=a+b+c)/2 jeżeli nie(a+b>c)lub nie(b+c>a)lub nie(c+a>b) wykonaj pisz( Trójkąt nie istnieje ) inaczej P=(a+b+c)/2 S=SQRT(p*(p-a)*(p-b)*(p-c)) pisz(s) Pascal: Program algortym; var a,b,c,p,s:real; read(a,b,c); if not(a+b>c)or not(b+c>a)or not(c+a>b) then write('trójkąt nie istnieje')else begin p:=(a+b+c)/2; S:= sqrt (p*(p-a)*(p-b)*(p-c)); write(s); end; END.