3. NejvetsiZe3Cisel

3.1. Analýza a návrh řešení

Podle zadání příkladu máme načíst tři celá čísla, která budeme porovnávat pomocí pěti různých podprogramů, které budou vypisovat hodnotu maxima a jednotlivé výpisy podprogramů mají být od sebe odděleny - viz Obrázek 1. 

Hlavní program NejvetsiZe3Cisel pro porovnání tří zadaných čísel včetně rovnosti

Obrázek 1: Hlavní program NejvetsiZe3Cisel pro porovnání tří zadaných čísel včetně rovnosti

Pokud bychom analyticky řešili problém porovnání tří celých čísel, nejprve si porovnáme první dva členy mezi sebou a vítěze tohoto porovnání porovnáme se zbývajícím číslem:

pokud a > b potom 
     pokud a > c potom
          "a je největší";
     jinak
          "c je největší"; 
jinak pokud b > c potom "b je největší"; jinak "c je největší";  
Toto řešení však nezahrnuje případy rovnosti všech tří čísel. Pokud uvažujeme 3 relační operátory "Větší/Rovno/Menší", pak již vzniká celkem 9 možných případů v závislosti na relačních operátorech (>, = , <) - viz Tabulka 1.

1.     porovnání

2.     porovnání

Výsledek

A > B

A > C

A

 

A = C

A, C

 

A < C

C

A = B

A > C

A, B

 

A = C

A, B, C

 

A < C

C

A < B

B > C

B

 

B = C

B, C

 

B < C

C

Tabulka 1: Největší ze tří

Tuto tabulku lze implementovat různými způsoby např.:

  • Vnořený rozhodováním - viz Obrázek 2
  • Kaskádováním - viz Obrázek 3

Podprogram (funkce) VetsiRovnoVerze1 - vnořené rozhodování

Obrázek 2: Podprogram VetsiRovnoVerze1 - vnořené rozhodování

Další možností implementace porovnání tří celých čísel podle předchozí tabulky je využití kaskády podmínek, kde jsou jednotlivé části podmínky v rozhodovacím bloku spojeny pomocí logického operátoru a zároveň (logický součin) - viz Obrázek 3.

Podprogram VetsiRovnoVerze2 - kaskádování

Obrázek 3: Podprogram VetsiRovnoVerze2 - kaskádování

Při  4 proměnných je už 27 možností porovnání z čehož plyne, že v tomto případě již předchozí způsoby nejsou efektivní. Vhodnější cesta je deklarace podprogramu VetsiRovno (funkce) pro porovnání dvou čísel, který bude navracet větší z nich. Této funkci předáme dva celočíselné parametry, které představují porovnávané hodnoty - viz Obrázek 4.  Pokud si budou hodnoty rovny, vybereme jako větší první parametr. 


Obrázek 4: Podprogram (funkce) VetsiRovno

Tento podprogram bude volán v následující verzi podprogramu VetsiRovnoVerze3 - viz Obrázek 5. Podprogram VetsiRovnoVerze3 přijímá 3 parametry, ze kterých pomocí dvojitého volání funkce VetsiRovno získá největší - maximum - ze všech tří předaných čísel.  


Obrázek 5: Podprogram VetsiRovnoVerze3 - porovnání s maximem

Principem aplikovaného přístupu je, že prvním voláním funkce VetsiRovno(a, b) získáme návrat v podobě většího čísla z těchto dvou čísel - viz Obrázek 6. 

Princip dvojitého volání metody VetsiRovno

Obrázek 6: Princip dvojitého volání metody VetsiRovno - 3 parametry

Dalším voláním této funkce, tj. VetsiRovno(VetsiRovno(a, b), c) je této funkci předán jako první vstup právě ono větší číslo získané z předchozího volání (tj. větší z a a b). Toto číslo je pak porovnáno v metodě se třetím číslem c. Toto maximum je pak v metodě VetsiRovnoVerze3 porovnáno na rovnost pomocí tří podmínek s jednotlivým čísly. Výhodou tohoto přístupu je, že řeší i případ, že jsou si všechna tři čísla rovna. 

Pokud se podíváme na další obrázek zjistíme, že tento princip lze využít i u většího počtu porovnávaných proměnných např. u 4 proměnných a, b, c, d - viz Obrázek 7.

Princip volání metody VetsiRovno - 4 parametry

Obrázek 7: Princip volání metody VetsiRovno - 4 parametry

Další podprogram je modifikací předchozí verze podprogramu. Zde však porovnáme, pomocí podmínky, návrat funkce VetsiRovno, které byly předány  první dvě čísla. Tento výstup ve formě většího čísla porovnáme se zbývajícím třetím číslem - viz Obrázek 8. V tomto a dalším podprogramu již nevypisujeme název proměnné, ve které je maximum uloženo. Vypíšeme pouze seznam zadaných čísel. 

Podprogram VetsiRovnoVerze4 - porovnání návratu funkce VetsiRovno se třetím číslem

Obrázek 8: Podprogram VetsiRovnoVerze4 - porovnání návratu funkce VetsiRovno se třetím číslem

Posledním podprogram je VetsiRovnoVerze5 - viz Obrázek 9. Tento podprogram obsahuje pouze jeden výpis, ve kterém je využito dvojité volání podprogramu VetsiRovno, které do výpisu navrátí maximum ze tří čísel - stejná podstata jako u VetsiRovnoVerze3. Vidíme, že program lze velice zkrátit v závislosti na specifikaci požadovaného výsledku. Ve výpisu použijeme vypsání hodnot všech tří předaných čísel.

Podprogram VetsiRovnoVerze5 - použití dvojitého volání funkce VetsiRovno přímo ve výpisu

Obrázek 9: Podprogram VetsiRovnoVerze5 - použití dvojitého volání funkce VetsiRovno přímo ve výpisu