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

2.3. Plnění pole

Podstata podprogramu PlnitPole, ve formě procedury, je plnění vektoru celými čísly v rozsahu intervalu definovaného dolní a horní mezí. Pro tyto účely jsou přijímány následující parametry:

  • n - aktuální rozměr vektoru (počet prvků)
  • minHodnota - dolní mez prvků vektoru
  • maxHodnota-  horní mez prvků vektoru
  • pole - vektor, který má být naplněn
Na začátku procedury je uživatel informován o možnostech různého způsobu plnění vektoru. Způsob plnění je specifikován pomocí celočíselných indexů představujících následující způsoby plnění:

  • 0 - Náhodně - náhodnými čísly - volání procedury NahodnePole
  • 1 - Jednotlivě - jednotlivě zadanými hodnotami uživatelem - volání procedury NulovatPole (naplnění vektoru nulami) a následné volání PlnitJednotlive
  • 2 - Nulovat - plnění vektoru nulami - volání procedury NulovatPole 
Načtená hodnota způsobu plnění vektoru je následně uložena do proměnné zpusobPlneni. V podprogramu je specifikována pojistka proti možné chybě programu, kdy by uživatel zadal neplatný index vyjadřující způsob plnění vektoru. Tato pojistka je reprezentována cyklem s podmínkou na konci, kde v těle cyklu je již zmiňovaný výpis a načtení hodnoty od uživatele do proměnné zpusobPlneni. 

Po načtení indexu plnění vektoru jsou na základě rozhodovacích bloků v kaskádovém uspořádání volány jednotlivé podprogramy (procedury) s odlišnými způsoby plnění - viz Obrázek 1.

Podprogram PlnitPole - procedura pro plnění vektoru na základě zvoleného indexu typu plnění

Obrázek 1: Podprogram PlnitPole - procedura pro plnění vektoru na základě zvoleného indexu typu plnění

První procedurou, která je volána když zpusobPlneni == 0, je procedura NahodnePole - viz Obrázek 2. Tato procedura na základě hodnot ve formálních parametrech plní náhodnými čísly jednotlivé prvky vektoru. Přístup k jednotlivým prvkům vektoru je zajištěn pomocí cyklu s krokem, jehož řídící proměnná i je využívána jako index jednotlivých prvků. Náhodné číslo, ukládané do proměnné rnd, je generováno na základě rovnoměrného rozdělení pomocí funkce Random. Tato funkce generuje hodnoty v polouzavřeném intervalu od 0 (včetně) do horní meze (bez této meze), kterou přijímá pouze jako jeden parametr. Proto je zapotřebí v podprogramu definovat další proměnnou, do které uložíme délku intervalu přípustných hodnot (tj. od dolní do horní meze) zvýšenou o 1, abychom u náhodných čísel dosáhli také horní meze. 

Náhodné číslo je generováno následujícím způsobem: minHodnota + Random(delkaIntervalu). Takto vygenerované náhodné celé číslo je přiřazeno do proměnné rnd. Následně je tato hodnota přiřazena do aktuálně procházeného prvku s indexem i. 

Je důležité upozornit, že ve Flowgorithm nelze navrátit pole. Naštěstí je s polem zacházeno jako s referenčním typem, proto pokud je pole formálním parametrem podprogramu, projeví se všechny modifikace prováděné na poli v rámci podprogramu i vně podprogramu po jeho ukončení. Proto podprogramy pro plnění pole byly deklarovány jako procedury.

Podprogram NahodnePole - procedura pro plnění vektoru náhodnými čísly v uzavřeném intervalu dolní a horní meze

Obrázek 2: Podprogram NahodnePole - procedura pro plnění vektoru náhodnými čísly v uzavřeném intervalu dolní a horní meze

Další možností plnění vektoru čísly, pokud uživatel zadal hodnotu indexu plnění 1, je plnění jednotlivých prvků na základě hodnot zadaných uživatelem pomocí procedury PlnitJednotlive. Před plněním vektoru uživatelem specifikovanými hodnotami však nejprve musíme zavolat proceduru NulovatPole, která přiřazuje 0 všem prvkům vektoru. V C# představuje pole referenční typ, tzn., že prvky pole jsou inicializovány počáteční hodnotou v závislosti na příslušném datovém typu všech prvků vektoru (např. u datového typu int je to 0). Ve Flowgorithm však takové pravidlo nastaveno není. Proto jsme před plněním jednotlivých prvků vektoru pomocí procedury zavolali proceduru NulovatPole, abychom pole předvyplnili nulami a dali uživateli možnost změnit jen některé prvky a nemusel plnit všechny prvky vektoru. 

Procedura NulovatPole přijímá pouze dva parametry určující počet prvků vektoru a pole samotné. V této proceduře jsou prvky procházeny pomocí cyklu s krokem, kde každému i-tému prvku je přiřazena hodnota 0, tj. příkaz pole[i] = 0 - viz Obrázek 3.

Podprogram NulovatPole - procedura pro plnění vektoru nulami

Obrázek 3: Podprogram NulovatPole - procedura pro plnění vektoru nulami

Procedura PlnitJednotlive přijímá stejné parametry jako předchozí procedura NahodnePole, tj. celkový počet prvků, minimální a maximální přípustná hodnota prvku a vektor, který byl v předchozí proceduře naplněn nulami - viz Obrázek 4. Pro tuto proceduru jsou deklarovány následující proměnné:

  • index - index prvku, který má být naplněn
  • hodnota - hodnota prvku, který má být naplněn
  • plnit - celé číslo, které reprezentuje informaci, zda má být zadán (naplněn) další prvek (0 ... Ano, 1 ... Ne)

Pomocí prvního cyklu s podmínkou na konci je zajištěno zadání validní hodnoty pořadí prvku uloženého v proměnné index. Uživatel je v každé iteraci informován, jaké hodnoty mohou být zadány. Pokud byl zadán index, který nenáleží uzavřenému intervalu <0, n-1>, je pomocí těla cyklu zadávání opakováno do té doby, dokud nebude zadáno validní pořadí. 

Pomocí dalšího cyklu s podmínkou na konci je realizováno zadání validní hodnoty ukládané do prvku. Tato hodnota je uložena do proměnné hodnota. Ve výzvě k zadání hodnoty prvku je uvedena jak dolní, tak i horní mez, abychom redukovali chybovost uživatele při zadávání. Pokud by i přesto došlo k zadání nevalidní hodnoty prvku (hodnota je mimo uzavřený interval <minHodnota, maxHodnota> ), je vypsána informace o provedené chybě a celý cyklus načítání hodnoty je znovu opakován.  

Po načtení validní hodnoty je tato hodnota uložena do prvku vektoru se zadaným indexem, tj. pole[index] = hodnota. Po každém uložení hodnoty je uživateli vypsána informace o tom, jak vypadá modifikované pole (výpis prvků vektoru je prováděn jak do řádky, tak do sloupce). 

Další cyklus s podmínkou na konci je určen pro získání informace, zda uživatel chce plnit další prvky vektoru (celočíselná hodnota 1), nebo zda již chce s plněním skončit (hodnota 0). Tato hodnota je načtena do proměnné plnit. Pokud uživatel zadal nevalidní hodnotu, je o této chybě informován ve výpisu a celý proces zadávání této hodnoty je opakován. 

Všechny předchozí vyjmenované cykly jsou začleněny do cyklu s podmínkou na konci, v jehož řídící podmínce je testováno, zda má proběhnout další načtení prvku (pokud je hodnota v proměnné plnit rovna hodnotě 1), tj. opětovné zadání pořadí prvku a hodnoty v něm uložené. 

Podprogram PlnitJednotlive - procedura pro plnění uživatelem zadanými hodnotami

Obrázek 4: Podprogram PlnitJednotlive - procedura pro plnění uživatelem zadanými hodnotami