Jednorozměrné pole - konzole

Site: Moodle ZČU
Course: KPV/TI Technická informatika ve strojírenství - cvičení
Book: Jednorozměrné pole - konzole
Printed by: Nepřihlášený host
Date: Sunday, 8 November 2026, 4:33 PM

1. JednorozmernePole

Úkolem je vytvořit aplikaci, která by dovedla pro jednorozměrné pole, tj. vektor, obsahující celá čísla:

  • Naplnit vektor automaticky nulami
  • Naplnit vektor automaticky náhodnými hodnotami v zadaném rozsahu
  • Naplnit vektor jednotlivě zadávanými hodnotami pro zadaný index
  • Zobrazit vektor jako text oddělený čárkami (prvky budou umístěny v řádku)
  • Zobrazit vektor do sloupce (prvky budou umístěny pod sebou)
  • Nalézt minimum z hodnot vektoru
  • Nalézt maximum z hodnot vektoru
  • Vypočítat průměr z hodnot vektoru
  • Seřadit vektor vzestupně podle velikosti prvků
Účel příkladu
  • Práce s jednorozměrným polem (vektorem)
Typ aplikace
  • Konzolová aplikace
Popis úkolu 
  • Základní operace s jednorozměrným polem 
Funkčnosti
  • V hlavním programu může uživatel pomocí zavolaného podprogramu (funkce) RozmerPole změnit rozměr (počet prvků) vektoru
  • V hlavním programu může uživatel pomocí zavolaného podprogramu (funkce) DolniMez změnit dolní mez, od které se budou pohybovat hodnoty prvků vektoru
  • V hlavním programu může uživatel pomocí zavolaného podprogramu (funkce) HorniMez změnit horní mez, do které se budou pohybovat hodnoty prvků vektoru
  • Z hlavního programu bude volán podprogram (procedura) PlnitPole, ve kterém uživatel volí způsob plnění vektoru:
    • 0 ... Náhodně - náhodnými čísly
    • 1 ... Jednotlivě - jednotlivě zadanými hodnotami uživatelem
    • 2 ... Nulovat - plnění vektoru nulami
  • V hlavním programu bude volán podprogram (funkce) PoleJakoText, pomocí kterého se prvky vektoru vypíší do řádku jako text, kde jednotlivé prvky budou od sebe odděleny čárkami
  • V hlavním programu bude volán podprogram (funkce) ZobrazitPole, pomocí kterého se prvky vektoru vypíší do sloupce jako text, kde jednotlivé prvky jsou umístěny pod sebou a každý na samostatném řádku
  • V hlavním programu bude volán podprogram (funkce) MinimumVPoli, pomocí kterého je vyhledáno minimum z hodnot ve vektoru. Ve výpisu také bude uveden index minima ve vektoru. Pro vyhledání pořadí použijte podprogram (funkci) IndexPrvku, který navrátí celočíselný index vyhledaného minima
  • V hlavním programu bude volán podprogram (funkce) MaximumVPoli, pomocí kterého je vyhledáno maximum z hodnot ve vektoru. Ve výpisu také bude uveden index maxima ve vektoru. Pro vyhledání pořadí použijte podprogram (funkci) IndexPrvku, který navrátí celočíselný index vyhledaného maxima
  • V hlavním programu bude volán podprogram (funkce) PrumerPole, pomocí kterého je vypočten aritmetický průměr z hodnot vektoru
  • V hlavním programu bude volán podprogram SeraditPole, pomocí kterého jsou prvky vektoru seřazeny vzestupně podle jejich hodnoty. Seřazený vektor bude vypsán pomocí obou podprogramů určených pro výpis vektoru
  • Po výpisu bude aplikace ukončena po stisku klávesy
Výstup programu


Výstup programu: Ukázka výpisu vektoru v hlavní metodě programu JednorozmernePole

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

Pole je datová struktura skládající se z prvků stejného datového typu. K těmto prvkům přistupujeme pomocí indexů, kde k počátečnímu prvku (v pořadí prvního prvku vektoru) přistupujeme pomocí indexu 0, k dalšímu prvku je přístup s indexem o 1 vyšší než předchozí, atd. - viz Obrázek 1. 


Obrázek 1: Jednorozměrné pole - princip

Velikost jednorozměrného pole (v našem případě n) je určena počtem prvků, do kterých lze ukládat hodnoty. Pro přístup k hodnotě uložené v prvku, nebo k uložení hodnoty do prvku (přiřazení hodnoty) využíváme název jednorozměrného pole s indexem uzavřeným v hranatých závorkách, např. pomocí příkazu pole[2] = 3 uložíme v jednorozměrném poli s názvem pole hodnotu 3 ve třetím prvku od začátku (index tohoto prvku je o 1 méně, tedy 2). Jak vidíme na příkladu, velikost pole je n = 4, tzn. pole obsahuje 4 prvky - viz Obrázek 2. Ve Flowgorithm lze využít pro návrat velikosti jednorozměrného pole funkci Size, jejímž parametrem je pole, pro které chceme zjistit velikost.

Příklad naplnění 3. prvku (index = 2) hodnotou 3

Obrázek 2: Příklad naplnění 3. prvku jednorozměrného pole (index = 2) hodnotou 3 

Pokud bychom chtěli číst hodnotu uloženou v prvku, stačí uvést název pole s hranatou závorkou obsahující index prvku, jehož hodnotu chceme načíst. 

V závislosti na dimenzi pole (počet os v prostoru) budeme využívat určitý počet indexů pro přístup k prvku. U jednorozměrného pole - vektoru, potřebujeme pro přístup k prvku jeden index, u dvourozměrného pole - matice - dva indexy, které jsou odděleny čárkou,  pro třírozměrné pole tři indexy, atd. 

V hlavním programu našeho algoritmu JednorozmernePole nejprve deklarujeme základní atributy jednorozměrného pole:

  • pocetPrvku - rozměr vektoru (počet prvků ve vektoru)
  • Max - maximální přípustná velikost vektoru (konstanta)
  • minHodnota - přípustná minimální hodnota (dolní mez) prvků vektoru
  • maxHodnota - přípustná maximální hodnota (horní mez) prvků vektoru

Po provedení inicializace všech vyjmenovaných atributů vektoru dáme uživateli možnost nastavit velikost pole pomocí funkce RozmerPole. Tato funkce navrací počet prvků, který bude vektor obsahovat. Funkce přijímá dva parametry - stávající počet prvků vektoru uložený v proměnné pocetPrvku, jejíž hodnotu inicializujeme celočíselnou maximální přípustnou hranicí velikosti pole, tj. Max. Tato hranice je druhým parametrem této funkce.

Pro deklaraci jednorozměrného pole je zapotřebí specifikovat datový typ prvků, které bude vektor obsahovat. Dále je zapotřebí definovat velikost pole. Pro specifikaci dolní meze, tj. minimální hodnoty, které může prvek nabýt, určíme pomocí funkce DolniMez. Naproti tomu horní mez určíme pomocí volání funkce HorniMez. 

Uživatel má možnost zvolit způsob plnění vektoru pomocí procedury PlnitPole. K dispozici má tři možnosti:

  • 0 - Náhodně - náhodnými čísly - volání 
  • 1 - Jednotlivě - jednotlivě zadanými hodnotami uživatelem
  • 2 - Nulovat - plnění vektoru nulami
Po naplnění vektoru jsou prvky vypsány pomocí dvou funkcí:

  • PoleJakoText - slouží pro výpis hodnot prvků vektoru do řádku, kde jednotlivé prvky jsou od sebe odděleny čárkami
  • ZobrazitPole - výpis prvků vektoru do sloupce, kde každý prvek je na nové řádce. Jednorozměrný vektor můžeme chápat i jako jeden sloupec, kde k jednotlivým prvkům znovu přistupujeme pomocí indexu - viz Obrázek 3.  

Jednorozměrné pole - otočené

Obrázek 3: Jednorozměrné pole - otočené

Další volanou funkcí z hlavního programu je MinimumVPoli. Tato funkce vyhledá nejmenší hodnotu ze všech hodnot uložených ve vektoru. Ve výpisu je také využita funkce IndexPrvku, která vyhledá prvek ve vektoru a navrátí jeho index. Tato funkce přijímá dva parametry - prvek, který má být vyhledán a vektor, ve kterém budeme prvek hledat. V tomto případě hledáme index prvku obsahující minimum, proto jako parametr funkce IndexPrvku využijeme návratu funkce MinimumVPoli, která nám poskytne nejmenší prvek vektoru. Stejný přístup využijeme při hledání největšího prvku vektoru pomocí funkce MaximumVPoli.

Uživateli je také v hlavním programu vypsána vypočtená hodnota aritmetického průměru ze všech hodnot ve vektoru. Pro výpočet je volána funkce PrumerPole. 

Jednou z posledních operací prováděných s vektorem je jeho vzestupné setřídění prvků pomocí podprogramu SeraditPole. Tato procedura využívá princip algoritmu bublinkového řazení - anglicky "Bubble Sort". V závěru programu je seřazený vektor vypsán jak do řádky, tak i do sloupce - viz Obrázek 4.

Hlavní program JednorozmernePole pro plnění, zobrazení a aritmetických operací prováděných s jednorozměrným pole

Obrázek 4: Hlavní program JednorozmernePole pro plnění, zobrazení a aritmetických operací prováděných s jednorozměrným pole

Pojďme si nyní v dalších podkapitolách popsat podprogramy, které budeme v našem algoritmu JednorozmernePole využívat.  

2.1. Dolní a horní mez prvků

Dalšími dvěma volanými podprogramy jsou funkce DolniMez a HorniMez. Pomocí těchto funkcí může uživatel nastavit dolní a horní mez prvků vektoru, tj. minimální a maximální hodnotu, které mohou prvky vektoru nabývat - viz Obrázek 1.

Naplněné jednorozměrné pole - dolní a horní mez prvků vektoru

Obrázek 1: Naplněné jednorozměrné pole - dolní a horní mez prvků vektoru

Funkce DolniMez a HorniMez využívají dva formální parametry:

  • minHodnota - představuje hodnotu stávající dolní meze prvků vektoru
  • maxHodnota - představuje hodnotu stávající horní meze prvků vektoru
U obou funkcí je uplatněn stejný přístup jako v předchozí funkci RozmerPole (pro určení počtu prvků vektoru). U funkce DolniMez je uživatel dotazován, zda chce změnit stávající dolní mez a pokud ano, je proveden výpis výzvy k zadání dolní meze. Tato nová načtená hodnota dolní meze je uložena do proměnné novaHodnota. Nově načtená hodnota dolní meze uložená v proměnné novaHodnota však musí ošetřena, aby nepřekročila stanovenou horní mez uloženou v parametru maxHodnota. Jedná se zejména o kontrolu při plnění jednotlivých prvků vektoru celočíselnými hodnotami ve specifikovaném intervalu. Pokud nová hodnota překročí horní mez, je do proměnné novaHodnota přiřazena hodnota horní meze. Jako další je testována podmínka, zda nová hodnota je jiná než stávající hodnota dolní meze. Pokud ano, je stávající dolní mez uložená v parametru minHodnota přepsána novou hodnotou uložené v proměnné novaHodnota. Je vhodné, aby uživatel byl informován o stávajících hodnotách, proto ještě před přiřazením návratu funkce je vypsána hodnota dolní meze prvků vektoru - viz Obrázek 2. 

Podprogram DolniMez - funkce pro specifikaci dolní meze intervalu hodnot

Obrázek 2: Podprogram DolniMez - funkce pro specifikaci dolní meze intervalu hodnot

Ve funkci HorniMez použijeme obdobný postup, který jsme použili při definování dolní meze s tím rozdílem, že budeme specifikovat horní mez intervalu hodnot, kterých mohou nabývat prvky vektoru - viz Obrázek 3. 

Podprogram HorniMez - funkce pro specifikaci horní meze intervalu hodnot

Obrázek 3: Podprogram HorniMez - funkce pro specifikaci horní meze intervalu hodnot

2.2. Rozměr pole

Prvním podprogramem je RozmerPole - viz Obrázek 1. Tato funkce navrací rozměr pole, na jehož základě je následně generován vektor. Funkce přijímá stávající počet prvků, který je uložen do formálního parametru n. Dalším formálním parametrem je konstanta Max. Ve Flowgorithm nelze deklarovat konstantu, proto jsme pojmenovali konstantu velkým písmenem, abychom ji rozeznali od jiné proměnné, nebo parametru. Ve funkci jsou deklarovány následující proměnné:

  • zmena - celočíselná hodnota představující informaci, zda má být provedena změna rozměru pole na základě uživatelem definované hodnoty
  • novaHodnota - uživatelem zadaná hodnota představující nový rozměr vektoru

Po vypsání stávajícího počtu prvků vektoru je pomocí cyklu s podmínkou na konci realizováno čtení celého čísla představujícího informaci, zda chce uživatel provést změnu stávající hodnoty velikosti vektoru. Hodnota 0 uložená do proměnné zmena představuje volbu uživatele, že nechce změnit stávající počet prvků vektoru. Pokud chce uživatel měnit hodnotu velikosti pole zadá v konzoli hodnotu 1. Při zadávání hodnoty se mohlo stát, že uživatel omylem uvedl nevalidní (neplatnou) hodnotu, tj. hodnota je mimo povolený rozsah, nebo neodpovídá požadovanému datovému typu. V tomto případě hodnota uložená v proměnné zmena splní test v řídící podmínce cyklu, tj. jedna z částí řídící podmínky je vyhodnocena jako True a díky operátoru logického součtu || (zatímco platí první část podmínky nebo druhá část řídící podmínky), je celý proces zadávání hodnoty opakován. 

Pokud uživatel zadal hodnotu 1, má být provedena změna počtu prvků na novou hodnotu uloženou do proměnné novaHodnota. Před načtením je ve výpisu uvedena dolní (1) a horní mez (Max) intervalu, ve kterém se nová hodnota musí pohybovat. Pokud načtená hodnota neodpovídá intervalu, je do proměnné novaHodnota uložena maximální přípustná velikost vektoru uložená v konstantě Max. Pokud nová hodnota neodpovídá stávající hodnotě počtu prvků vektoru n, je do proměnné n přiřazena nově načtená hodnota. Tato proměnná n je následně přiřazena návratu funkce - viz Obrázek 1. 

Podprogram RozmerPole - funkce určení rozměru jednorozměrného pole

Obrázek 1: Podprogram RozmerPole - funkce pro určení rozměru jednorozměrného pole

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

2.4. Výpis pole

V předchozí proceduře PlnitJednotlive jsme volali funkce s textovými návraty obsahující vypsané hodnoty jednotlivých prvků vektoru. Pojďme si tyto funkce popsat. První funkci s názvem PoleJakoText využíváme pro výpis prvků do řádku, kde jednotlivé prvky jsou od sebe odděleny čárkami (kvůli lepší čitelnosti). Funkce přijímá dva parametry, kde první parametr představuje velikost pole a druhý představuje pole, které chceme vypsat. Funkce využívá následující lokální proměnné:

  • i - index prvku ve vektoru
  • vystup - výstupní textový řetězec obsahující prvky vektoru oddělené čárkou

Po nezbytné deklaraci proměnných a inicializaci výstupního textového řetězce vystup pomocí počátečního prvku vektoru (index 0) pomocí konverzní funkce ToString, je v následujícím cyklu s krokem (probíhá v pořadí od druhého prvku a do konečného prvku) do výstupního textového řetězce, před každý vypsaný prvek, přidána čárka kvůli vizuálnímu oddělení jednotlivých hodnot (proto jsme první prvek vypsali samostatně a ne v cyklu). Po průchodu všemi prvky tento výstupní textový řetězec přiřadíme návratu funkce PoleJakoText - viz Obrázek 1.  

Podprogram PoleJakoText - funkce pro navrácení textového řetězce obsahujícího hodnoty všech prvků vypsaných do řádku a oddělených čárkami

Obrázek 1: Podprogram PoleJakoText - funkce pro navrácení textového řetězce obsahujícího hodnoty všech prvků vypsaných do řádku a oddělených čárkami

Dalším podprogramem pro výpis prvků vektoru je funkce ZobrazitPole - viz Obrázek 2. Tato funkce navrací textový řetězec, kde jednotlivé prvky jsou uspořádány do sloupce, tzn. každý prvek je umístěn na samostatné řádce. Funkce přijímá dva parametry - první parametr představuje počet prvků vypisovaného vektoru, druhý parametr představuje pole, které má být vypsáno. Na rozdíl od předchozí funkce pro výpis jsou jednotlivé prvky procházeny od počátečního do koncového prvku (nepotřebujeme za prvky umísťovat čárky). Po výpisu hodnoty aktuálního prvku jsme v textovém řetězci za účelem vizuálního oddělení jednotlivých prvků použili vložení nového řádku pomocí vložení znaku z ASCII tabulky (řídící znak na pozici 13 v ASCII tabulce byl vložen pomocí funkce ToChar, která přijímá pozici znaku a navrací znak na určené pozici. Jedná se posunutí kurzoru na začátek řádku - anglicky "Carriage Return"). Výstupní text obsahující jednotlivé prvky umístěné pod sebou, je přiřazen návratu funkce ZobrazitPole.

 Podprogram ZobrazitPole - funkce pro navrácení textového řetězce obsahujícího hodnoty všech prvků vypsaných pod sebou do sloupce

Obrázek 2: Podprogram ZobrazitPole - funkce pro navrácení textového řetězce obsahujícího hodnoty všech prvků vypsaných pod sebou do sloupce

2.5. Minimum a maximum pole

Velmi často potřebujeme ze zaznamenaných hodnot v jednorozměrném poli nalézt nejmenší, nebo největší hodnotu, tj. minimum, nebo maximum. Mějme např. vektor s názvem pole a v něm chceme nalézt minimum a maximum - viz Obrázek 1. 

Minimum a maximum jednorozměrného pole

Obrázek 1: Minimum a maximum jednorozměrného pole

Abychom nalezli minimum, je zapotřebí nejprve přiřadit minimu počáteční hodnotu. V našem algoritmu minimu přiřadíme hodnotu prvního prvku. Dále tuto hodnotu porovnáváme s každým dalším prvkem vektoru až porovnáme minimum s posledním prvkem vektoru. Toto porovnání tedy proběhne n-1-krát - viz Obrázek 2. Samozřejmě je také možné procházet prvky opačným směrem, tj. od posledního prvku směrem k počátečnímu prvku a porovnávat tyto prvky s minimem, nebo maximem. 

Hledání minima jednorozměrného pole

Obrázek 2: Hledání minima jednorozměrného pole

Zkusme si popsat podprogram MinimumVPoli ve formě funkce, která navrací minimum vektoru - viz Obrázek 3. Tato funkce přijímá dva parametry - první definuje velikost vektoru a do druhého parametru je uložen vektor, ve kterém hledáme nejmenší hodnotu. Ve funkci deklarujeme následující lokální proměnné:

  •  minimum - nalezená minimální hodnota ve vektoru
  • i - index (pozice) prvku vektoru

Jako první krok je zapotřebí přiřadit proměnné minimum hodnotu počátečního prvku. Následně pro procházení dalších prvků využijeme cyklu s krokem, který bude procházet jednotlivé prvky v pořadí od druhého do posledního prvku. Uvnitř cyklu je provedeno porovnání hodnoty aktuálního prvku s dosud nalezeným minimem. Pokud je nalezen prvek, jehož hodnota je menší než minimum, je tato hodnota prohlášena novým minimem, tj. hodnota prvku je přiřazena do proměnné minimum. Návratu funkce je přiřazeno nalezené minimum ze všech prvků.

Podprogram MinimumVPoli - funkce pro navrácení minima jednorozměrného pole

Obrázek 3: Podprogram MinimumVPoli - funkce pro navrácení minima jednorozměrného pole

Obdobným postupem bychom procházeli jednotlivé prvky vektoru, pokud bychom hledali maximum. Zásadní rozdíl je v tom, že bychom porovnávali, zda je aktuálně procházený prvek větší, než dosud nalezené maximum. Pokud ano, přiřadíme tuto hodnotu do maxima - viz Obrázek 4.

Podprogram MaximumVPoli - funkce pro navrácení maxima jednorozměrného pole

Obrázek 4: Podprogram MaximumVPoli - funkce pro navrácení maxima jednorozměrného pole

Dalším možným přístupem při hledání minima je před prohledáváním vektoru si uložit maximální možnou hodnotu do minima (tím je zajištěno, že při procházení jednotlivých prvků, bude jejich hodnota menší, nebo rovna hodnotě uložené v minimu). Pokud bude hodnota aktuálního prvku menší než dosud nalezené minimum, přiřadíme minimu hodnotu aktuálního prvku. Toto porovnání proběhne n-krát (porovnání všech prvků vektoru s minimem).

Hledání minima jednorozměrného pole - jiný postup

Obrázek 5: Hledání minima jednorozměrného pole - jiný postup

Vzhledem k tomu, že ještě potřebujeme nalézt index hledaného minima, či maxima ve vektoru, je zapotřebí definovat funkci, které předáme prvek, který má být ve vektoru vyhledán spolu s vektorem. Tato funkce, kterou pojmenujeme IndexPrvku, nám navrátí index hledaného prvku - viz Obrázek 6. Funkce bude volána v hlavním programu ve výpisu s nalezenou hodnotou minima a maxima vektoru.

Podprogram IndexPrvku - funkce pro navrácení indexu hledaného prvku v poli

Obrázek 6: Podprogram IndexPrvku - funkce pro navrácení indexu hledaného prvku v poli

2.6. Průměr pole

Další aritmetickou operací prováděnou nad prvky jednorozměrného pole, je výpočet aritmetického průměru ze všech prvků pole. Na následujícím obrázku vidíme, že se jedná o součet hodnot všech prvků pole podělený jeho velikostí, tj. celkovým počtem prvků v poli - viz Obrázek 1.

Průměr prvků jednorozměrného pole

Obrázek 1: Průměr prvků jednorozměrného pole

Pro výpočet průměru prvků vektoru v našem algoritmu použijeme volání podprogramu PrumerPole - viz Obrázek 2. Tato funkce navrací hodnotu vypočteného průměru. Funkce pro výpočet potřebuje dva parametry ve formě velikosti pole a druhý parametr je vektor obsahující jednotlivé prvky. Ve funkci jsou deklarovány následující lokální proměnné:

  • prumer - průměrná reálná hodnota ze všech prvků vektoru
  • suma - suma hodnot všech prvků vektoru
  • i - index (pozice) prvku vektoru

Prvním příkazem provedeným ve funkci je inicializace proměnné suma na hodnotu 0. Pro procházení jednotlivých prvků vektoru je určen cyklus s krokem. V těle cyklu je prováděno přičtení jednotlivých prvků k hodnotě z předchozí iterace uložené v proměnné suma. Po opuštění cyklu jsou všechny prvky sečteny a stačí jen v ypočítat podíl této sumy a velikosti vektoru (počet prvků). Hodnota podílu je uložena do proměnné prumer, která je následně přiřazena jako návrat funkce PrumerPole ve formě reálného čísla.

Podprogram PrumerPole - funkce pro výpočet aritmetického průměru prvků pole

Obrázek 2: Podprogram PrumerPole - funkce pro výpočet aritmetického průměru prvků pole  

2.7. Seřazení prvků pole

Algoritmů řazení prvků vektoru existuje celá řada (cca přes 10 + modifikace). Nejjednodušší známý algoritmus je bublinkové řazení (anglicky "Bubble Sort"). Algoritmus funguje na principu průchodů. V každém průchodu je prozkoumán celý vektor od začátku do konce. Vždy jsou porovnávány dva prvky. U vzestupného řazení prvků vektoru je testována podmínka, když je první z prvků větší než druhý, dojde k prohození prvků. Po každém průchodu se dostaneme do určité fáze seřazení. Vektor je seřazen, když v posledním průchodu nedošlo k žádnému prohození - viz Obrázek 1. 


Obrázek 1: Bublinkové řazení prvků jednorozměrného pole

 

Před popisem vývojového diagramu algoritmu bublinkového řazení je třeba ukázat, jak prohodit dva prvky. Prohození dvou prvků nemůže být prováděno přímo. Ukažme si příklad, kdy potřebujeme prohodit v pořadí druhý prvek (index 1) se třetím prvkem vektoru (index 2) - viz Obrázek 2. 

Prohození dvou prvků vektoru

Obrázek 2: Prohození dvou prvků vektoru

Pokud bychom přímo napsali příkaz pole[1] = pole[2], znamená to, že bychom do prvku s indexem 1 (v pořadí druhého prvku) přiřadili obsah prvku s indexem 2 (v pořadí třetího prvku). Tím by se obsah prvku s indexem 1 úplně ztratil, tj. hodnota 4  se přepíše na hodnotu 3 a budeme mít dvě hodnoty 3. Je zapotřebí deklarovat si pomocnou proměnnou, kam jedno z čísel "schováme", vybereme např. prvek s indexem 1 a přiřadíme ho do pomocné proměnné - viz Obrázek 3.


Obrázek 3: Prohození dvou prvků - pomocná proměnná - kopírování hodnoty do pomocné proměnné

Pak již můžeme číslo 4 v prvku s indexem 1 "zapomenout". Proto do prvku s indexem 1 uložíme hodnotu 3 z prvku s indexem 2 - viz Obrázek 4.

Prohození dvou prvků - kopírování hodnoty mezi prvky

Obrázek 4: Prohození dvou prvků - kopírování hodnoty mezi prvky 

Do prvku s indexem 2 již můžeme uložit číslo 4, které je nyní uloženo v pomocné proměnné - viz Obrázek 5. Tím došlo k úspěšnému prohození obou prvků.

Prohození dvou prvků - kopírování hodnoty z pomocné proměnné do prvku

Obrázek 5: Prohození dvou prvků - kopírování hodnoty z pomocné proměnné do prvku 

Podívejme se nyní na vývojový diagram procedury SeraditPole - viz Obrázek 6. Procedura přijímá dva parametry - v prvním parametru je uložena velikost vektoru, druhý obsahuje samotný vektor, který má být setříděn vzestupně. Procedura obsahuje následující lokální proměnné:

  • pom - pomocná proměnná pro dočasné uložení prvku
  • i - index (pozice) prvku vektoru
  • b - logická proměnná obsahující informaci, zda došlo k prohození některých sousedních prvků (tj. zda je již vektor seřazen - pokud b == false)

Uvnitř procedury jsou umístěny dva cykly. Vnější cyklus s podmínkou na konci se stará o kontrolu, zda je již vektor kompletně seřazen. Před proběhnutím vnitřního vnořeného cyklus s krokem, pomocí kterého procházíme jednotlivé prvky a porovnáváme vždy dva prvky z řady, je zapotřebí provést nastavení proměnné b na hodnotu false, tj. b = false. Tím je řečeno, že ještě před proběhnutím porovnání dvojic prvků neproběhlo žádné prohození dvou sousedních prvků.

Uvnitř těla cyklu s krokem je potřeba vždy porovnávat dva prvky. U řídící proměnné cyklu je tedy potřeba se zastavit (jako horní mez intervalu hodnot indexu i) na předposledním prvku, kdy porovnáme předposlední a poslední prvek (pokud bychom nechali řídící proměnnou cyklu nastavit na velikost vektoru, porovnávali bychom uvnitř těla cyklu poslední prvek s dalším prvkem, který však neexistuje). Pokud je při vzestupném řazení aktuálně procházený prvek větší než následující prvek (s indexem o 1 větší), je zapotřebí tyto prvky prohodit na základě principu, který jsme již probírali v předchozím textu. V opačném případě není zapotřebí prvky prohazovat. Pokud došlo alespoň k jednomu vzájemnému prohození prvků, je do proměnné b přiřazena hodnota true a díky tomu bude ve vnějším cyklu provedena další iterace. V případě, že úvodní předpoklad (b == true) stále platí i na konci průchodu prvky, dojde k ukončení algoritmu.

Podprogram SeraditPole - procedura pro seřazení prvků pole vzestupně

Obrázek 6: Podprogram SeraditPole - procedura pro seřazení prvků pole vzestupně podle jejich hodnoty

3. C#

V hlavní metodě programu JednorozmernePole jsou nejprve deklarovány potřebné proměnné pro určení vlastností jednorozměrného pole - vektoru:

  • pocetPrvku - rozměr vektoru (počet prvků ve vektoru)
  • Max - konstanta maximální velikosti vektoru
  • minHodnota - přípustná minimální hodnota (dolní mez) prvků vektoru
  • maxHodnota - přípustná maximální hodnota (horní mez) prvků vektoru

Po inicializaci všech proměnných je volána metoda RozmerPole s celočíselným návratem, aby uživatel mohl změnit velikost vektoru, tj. počet prvků, které chce do vektoru umístit. Tato metoda přijímá dva parametry - počet prvků vektoru a maximální přípustnou velikost vektoru. 

Jelikož jsou potřebné atributy pole již naplněny, lze deklarovat vlastní celočíselný vektor. U deklarace je zapotřebí nejprve specifikovat datový typ všech prvků umísťovaných do vektoru. Za hranatými závorkami, které definují, že se jedná o pole, je definován název jednorozměrného pole. Vzhledem k tomu, že proměnná představuje objekt (instance třídy), je zapotřebí zavolat konstruktor (použití klíčového slova new), uvést datový typ pole (prvků pole) a ve hranaté závorce definovat velikost vytvářeného vektoru. 

Uživateli umožníme změnu dolní meze, které mohou nabývat prvky vektoru, pomocí volání metody s celočíselný návratem DolniMez. Dolní mez je uložena do proměnné minHodnota. Dále lze nastavit i horní mez prvků vektoru, pomocí metody HorniMez, jejíž návrat je uložen do proměnné maxHodnota.

Pro naplnění prvků vektoru je použita metoda bez návratu PlnitPole. Prvky mohou být plněny třemi způsoby - náhodně, jednotlivě, nebo vektor bude obsahovat pouze nuly. Pro všechny typy plnění je zapotřebí definovat počet prvků, které mají být naplněny. První dva typy plnění ještě potřebují informace o dolní a horní mezi, aby byly prvky ve vektoru validní. Pole je předáno do metod hodnotou. Je však důležité upozornit, že pole je referenční typ, tzn. že jakákoliv změna provedená na vektoru se odrazí i vně volané metody (bez nutnosti použití předání pole do metody jako parametru předaného odkazem, tj. pomocí klíčového slova ref). 

Po naplnění vektoru je uživateli vypsán vektor ve formě prvků umístěných v řádku (pomocí volání metody PoleJakoText) a zároveň prvků umístěných jednotlivě pod sebou (pomocí volání metody ZobrazitPole). Po výpisu prvků naplněného pole je pomocí metody MinimumVPoli, navrácena a vypsána hodnota minima vektoru včetně indexu prvku, kde minimum bylo nalezeno. Pro celočíselný návrat pořadí hledaného prvku ve vektoru je využita metoda IndexPrvku. Metoda přijímá dva parametry - první parametr představuje hledaný prvek (tento prvek je navrácená hodnota minima pomocí metody MinimumVPoli) a další parametr představuje pole, ve kterém bude prvek hledán. Stejný přístup je uplatněn i při hledání maxima vektoru. 

Výpočet aritmetického průměru z prvků vektoru je realizován pomocí metody s reálným návratem PrumerPole. Toto desetinné číslo reprezentující průměr, je uživateli vypsáno v následující řádce pod výpisem maxima.

Poslední operací prováděnou s vektorem je jeho vzestupné řazení podle hodnot v prvcích. Pro řazení vektoru je volána metoda bez návratu s názvem SeraditPole. Po seřazení prvků vektoru je seřazený vektor vypsán jak do řádku, tak i do sloupce - viz Kód 1.

static void Main(string[] args)
{
    /* Deklarace: 'pocetPrvku' ... rozměr vektoru (počet prvků ve vektoru); 'Max' ... konstantní hodnota 
     * maximální velikosti vektoru; 'minHodnota' ... přípustná minimální hodnota (dolní mez) prvků vektoru; 
     * 'maxHodnota' ... přípustná maximální hodnota (horní mez) prvků vektoru */
 
    // Maximální rozměr vektoru
    const int Max = 10;
 
    // Dolní mez, které může nabýt prvek vektoru
    int minHodnota = 1;
 
    // Horní mez, které může nabýt prvek vektoru
    int maxHodnota = 100;
 
    // Rozměr vektoru je roven maximální možné délce
    int pocetPrvku = Max;
 
    // Zavolání metody s celočíselným návratem pro změnu velikosti vektoru
    pocetPrvku = RozmerPole(pocetPrvku, Max);
 
    // Deklarace vektoru se zadaným rozměrem (počtem prvků)
    int[] pole = new int[pocetPrvku];
 
    // Zavolání metody s celočíselný návratem pro změnu dolní meze, které mohou nabývat prvky vektoru
    minHodnota = DolniMez(minHodnota, maxHodnota);
 
    // Zavolání metody s celočíselným návratem pro změnu horní meze, které mohou nabývat prvky vektoru
    maxHodnota = HorniMez(minHodnota, maxHodnota);
 
    /* Zavolání metody pro plnění vektoru (náhodnými čísly, jednotlivě zadanými hodnotami, 
     * plnění vektoru nulami) */
    PlnitPole(pocetPrvku, minHodnota, maxHodnota, pole);
 
    // Výpis prvků vektoru v řádku, kde jednotlivé prvky jsou odděleny čárkami
    Console.WriteLine("Výpis pole (do řádku): " + PoleJakoText(pocetPrvku, pole));
 
    // Výpis prvků vektoru do sloupce, kde každý prvek je na nové řádce
    Console.WriteLine("Výpis pole (do sloupce): ");
    Console.Write(ZobrazitPole(pocetPrvku, pole));
 
    // Výpis hodnoty minima vektoru, včetně jeho indexu
    Console.WriteLine("Minimum v poli: " + MinimumVPoli(pocetPrvku, pole) + " (index prvku: " + IndexPrvku(MinimumVPoli(pocetPrvku, pole), pole) + ")");
 
    // Výpis hodnoty maxima vektoru, včetně jeho indexu
    Console.WriteLine("Maximum v poli: " + MaximumVPoli(pocetPrvku, pole) + " (index prvku: " + IndexPrvku(MaximumVPoli(pocetPrvku, pole), pole) + ")");
 
    // Výpis průměru všech prvků vektoru
    Console.WriteLine("Průměr prvků pole: " + PrumerPole(pocetPrvku, pole));
 
    // Vzestupné řazení prvků podle metody Bubble Sort
    SeraditPole(pocetPrvku, pole);
 
    // Výpis seřazeného vektoru do řádku
    Console.WriteLine("Seřazené pole (výpis do řádku): " + PoleJakoText(pocetPrvku, pole));
 
    // Výpis seřazeného vektoru do sloupce
    Console.WriteLine("Seřazené pole (výpis do sloupce): ");
    Console.Write(ZobrazitPole(pocetPrvku, pole));
 
    // Čekání na stisk klávesy -> ukončení programu
    Console.ReadKey();
}

 Kód 1: Program JednorozmernePole - deklarace hlavní statické metody Main 

V následujících podkapitolách budou popsány jednotlivé volané metody.

3.1. Rozměr pole

První statickou volanou metodou v hlavním programu je metoda RozmerPole. Vzhledem k tomu, že zdrojový kód programu obsahuje větší množství jednotlivých metod, je vhodné metody rozdělit do jednotlivých sekcí - regionů. Tyto sekce lze sbalit kliknutím na tlačítko − umístěné napravo od čísel řádek zdrojového kódu (tím se schovají jednotlivé metody umístěné v této sekci). Sekci lze zpětně rozbalit kliknutím na tlačítko +. Počáteční značka regionu je psána s mřížkou, tj.  #region. Za ní uvedeme název regionu - viz Kód 1.

#region Nastavení atributů pole

Kód 1: Počáteční značku regionu

Koncová značku bloku regionu je #endregion - viz Kód 2.

#endregion

Kód 2: Koncová značku regionu

Dále je vhodné umístit nad jednotlivé deklarace metod značky pro dokumentaci :

  • Metody
  • Formálních parametrů metody 
  • Návratu metody 

Tyto popisky se budou zobrazovat v malém okně při volání metody a programátorovi pomohou rychle se orientovat v podstatě volané metody. Pro umístění značky do zdrojového kódu stačí vepsat nad metodu tři lomítka za sebou a Visual Studio nám automaticky doplní značky k dokumentaci ve formě XML prvků přidaných ke zdrojovému kódu. První vygenerovanou značkou je dokumentace k metodě, kde mezi počáteční značkou /// <summary> a konečnou značkou </summary> uvedeme za trojité lomítko poznámku o podstatě metody. Pokud je popis víceřádkový, stačí mezi počáteční a koncovou značku umístit kurzor a stisknout klávesu Enter. Visual Studio do značky přidá další řádku s trojitým lomítkem, kam lze umístit další popis.

/// <summary>
/// Metoda s celočíselným návratem - navrací velikost pole (počet prvků vektoru)
/// </summary>

Kód 1: Dokumentace k metodě

Další poznámkou uváděnou v kódu ve formě XML značky ve zdrojovém kódu je popisek podstaty formálního parametru metody - viz Kód 2. Tento popisek je v našem případu uváděn mezi značkou parametru s názvem n, tj. /// <param name="n"> a konečnou značkou </param>. 

/// <param name="n"> aktuální velikost vektoru (počet prvků) </param>

Kód 2: Dokumentace k parametru

Poslední značkou uvedenou nad deklarací metody RozmerPole je značka popisku výstupu (návratu) metody (neplatí pro metody bez návratu). Popisek výstupu metody je umístěn mezi značky /// <returns> a </returns> - viz Kód 3. 

/// <returns> Velikost vektoru </returns>

Kód 2: Dokumentace k výstupu metody

Podstata algoritmu byla nastíněna v kapitole Analýza a návrh řešení, není proto nutné detailně popisovat podstatu zdrojového kódu. 

Metoda RozmerPole obsahuje dva formální celočíselné parametry:

  • n - aktuální velikost vektoru (počet prvků) 
  • max - maximální rozměr vektoru

Metoda navrací velikost vektoru, podle níž bude generován objekt - vektor. Pro metodu jsou deklarovány následující celočíselné lokální proměnné:

  • zmena - informace (celé číslo), zda má být provedena změna rozměru pole
  • novaHodnota - nový rozměr vektoru

Uživateli je nejprve vypsána stávající velikost vektoru (počet jeho prvků, které může po naplnění obsahovat). První cyklus s podmínkou na konci je určen pro načtení celočíselné informace (0...Ne, 1...Ano), zda chce uživatel změnit stávající rozměr (ten byl nastaven v hlavním programu na maximální možný. Hodnota této konstanty z hlavního programu je v metodě uložena ve formálním parametru max). Načtení hodnoty je provedeno pomocí metody TryParse s výstupním parametrem zmena. V řídící podmínce cyklu je testováno, zda byla zadána validní hodnota této proměnné. Pokud ne, celé tělo cyklu je opakováno.

Další cyklus s podmínkou na konci je určen pro načtení nové hodnoty velikosti vektoru. Pokud nová hodnota není validní, je jí přiřazena maximální přípustná velikost vektoru uložena v parametru max. Pokud nová hodnota byla validní a není stejná jako stávající velikost vektoru, je tato hodnota uložena do formálního parametru n, který je následně přiřazen výstupu funkce RozmerPole - viz Kód 3. 

/// <summary>
/// Metoda s celočíselným návratem - navrací velikost pole (počet prvků vektoru)
/// </summary>
/// <param name="n"> aktuální velikost vektoru (počet prvků) </param>
/// <param name="max"> maximální rozměr vektoru </param>
/// <returns> Velikost vektoru </returns>
static int RozmerPole(int n, int max)
{
    /* Deklarace: 'zmena' ... informace (celé číslo), zda má být provedena změna rozměru 
     * pole; 'novaHodnota' ... nový rozměr vektoru */
    int zmena, novaHodnota;
 
    // Vypsání stávajícího rozměru vektoru
    Console.WriteLine("Počet prvků: {0}", n);
    do
    {
        // Výzva ke změně rozměru vektoru
        Console.Write("Změnit počet prvků vektoru (0...Ne, 1...Ano): ");
 
        // Načtení hodnoty, zda má dojít ke změně
        int.TryParse(Console.ReadLine(), out zmena);
 
        // Pokud načtená hodnota nebyla validní, cyklus zadání je znovu opakován
    }
    while ((zmena < 0) || (zmena > 1));
 
    // Pokud byl zadán index pro změnu ...
    if (zmena == 1)
    {
        // Výzva k zadání rozměru vektoru
        Console.Write("Zadejte počet prvků vektoru (1 - {0}): ", max);
 
        // Načtení rozměru vektoru
        int.TryParse(Console.ReadLine(), out novaHodnota);
 
        // Pokud nová hodnota je větší než maximum, nebo menší než 1 ...
        if ((novaHodnota > max) || (novaHodnota < 1))
        {
            // Přiřazení maximálního rozměru vektoru do lokální proměnné určující počet prvků vektoru
            novaHodnota = max;
        }
 
        // Pokud nový rozměr vektoru není stejný jako stávající počet prvků vektoru ...
        if (novaHodnota != n)
        {
            // Uložení nového rozměru pole do proměnné
            n = novaHodnota;
        }
 
        // Výpis nového zadaného rozměru vektoru
        Console.WriteLine("Rozměr pole: {0}", n);
    }
 
    // Návrat metody
    return n;
}

Kód 3: Deklarace statické metody s celočíselným návratem s názvem RozmerPole

3.2. Dolní a horní mez prvků

Následující zdrojový kód obsahuje deklaraci metody s celočíselným návratem DolniMez - viz Kód 1. Tato metoda umožňuje uživateli nastavit dolní mez pro hodnoty prvků celočíselného vektoru. Uživatel může změnu odmítnout a stávající dolní mez nastavená v hlavní statické metodě Main tak zůstane platná. Detailní popis podstaty metody byl proveden již v rámci analýzy ve stejnojmenné podkapitole a proto jej není nutné znovu uvádět.

/// <summary>
/// Metoda s celočíselným návratem - návrat dolní meze pro všechny prvky vektoru
/// </summary>
/// <param name="minHodnota"> dolní mez prvků vektoru </param>
/// <param name="maxHodnota"> horní mez prvků vektoru </param>
/// <returns> Dolní mez pro všechny prvky vektoru </returns>
public static int DolniMez(int minHodnota, int maxHodnota)
{
    /* Deklarace: 'novaHodnota' ... nová dolní mez prvků vektoru; 'zmena' ... celočíselná 
     * informace, zda má být provedena změna dolní meze prvků ('0'...Ne, '1'...Ano) */
    int novaHodnota, zmena;
 
    // Výpis stávající hodnoty dolní meze
    Console.WriteLine("Dolní mez prvků vektoru: {0}", minHodnota);
    do
    {
        // Výzva ke změně dolní meze
        Console.Write("Změnit dolní mez prvků vektoru (0...Ne, 1...Ano): ");
 
        // Načtení hodnoty do proměnné 'zmena' (informace, zda má dojít ke změně)
        int.TryParse(Console.ReadLine(), out zmena);
 
        // Pokud načtená hodnota není validní, cyklus zadání probíhá znovu
    }
    while (zmena < 0 || zmena > 1);
 
    // Test, zda má proběhnout změna dolní meze prvků vektoru
    if (zmena == 1)
    {
        // Výzva k zadání nové dolní meze prvků vektoru
        Console.Write("Zadejte dolní mez prvků vektoru: ");
 
        // Načtení nové dolní meze prvků vektoru
        int.TryParse(Console.ReadLine(), out novaHodnota);
 
        // Pokud nová hodnota dolní meze je větší než horní mez ...
        if (novaHodnota > maxHodnota)
        {
            // Přiřazení horní meze do lokální proměnné určující dolní mez (horní a dolní mez budou stejné)
            novaHodnota = maxHodnota;
        }
 
        // Pokud nová dolní mez vektoru není stejná jako stávající dolní mez prvků vektoru ...
        if (novaHodnota != minHodnota)
        {
            // Přepsání stávající dolní meze prvků pole novou hodnotou
            minHodnota = novaHodnota;
        }
 
        // Výpis nové dolní meze pro prvky vektoru
        Console.WriteLine("Dolní mez prvků vektoru: {0}", minHodnota);
    }
 
    // Návrat metody
    return minHodnota;
}

Kód 1: Deklarace statické metody s celočíselným návratem s názvem DolniMez

Další zdrojový kód obsahuje deklaraci metody s celočíselným návratem HorniMez - viz Kód 2. Tato metoda umožňuje uživateli nastavit horní mez pro hodnoty prvků celočíselného vektoru. Princip metody je téměř totožný s předcházející metodou DolniMez.

/// <summary>
/// Metoda s celočíselným návratem - návrat horní meze pro všechny prvky vektoru
/// </summary>
/// <param name="minHodnota"> stávající horní mez prvků vektoru </param>
/// <param name="maxHodnota"> horní mez prvků vektoru </param>
/// <returns> Horní mez pro všechny prvky vektoru </returns>
static int HorniMez(int minHodnota, int maxHodnota)
{
    /* Deklarace: 'novaHodnota' ... nová horní mez prvků vektoru; 'zmena' ... celočíselná 
     * informace, zda má být provedena změna horní meze prvků ('0'...Ne, '1'...Ano) */
    int novaHodnota, zmena;
 
    // Výpis stávající hodnoty horní meze
    Console.WriteLine("Horní mez prvků vektoru: {0}", maxHodnota);
    do
    {
        // Výzva ke změně horní meze
        Console.Write("Změnit horní mez prvků vektoru (0...Ne, 1...Ano): ");
 
        // Načtení hodnoty do proměnné 'zmena' (informace, zda má dojít ke změně)
        int.TryParse(Console.ReadLine(), out zmena);
    }
    // Pokud načtená hodnota není validní, cyklus zadání probíhá znovu
    while ((zmena < 0) || (zmena > 1));
 
    // Test, zda má proběhnout změna horní meze prvků vektoru
    if (zmena == 1)
    {
        // Výzva k zadání nové horní meze prvků vektoru
        Console.Write("Zadejte horní mez prvků vektoru: ");
 
        // Načtení nové horní meze prvků vektoru
        int.TryParse(Console.ReadLine(), out novaHodnota);
 
        // Pokud nová hodnota horní meze je menší než dolní mez ...
        if (novaHodnota < minHodnota)
        {
            // Přiřazení dolní meze do lokální proměnné určující horní mez (horní a dolní mez budou stejné)
            novaHodnota = minHodnota;
        }
 
        // Pokud nová horní mez vektoru není stejná jako stávající horní mez prvků vektoru ...
        if (novaHodnota != maxHodnota)
        {
            // Přepsání stávající horní meze prvků pole novou hodnotou
            maxHodnota = novaHodnota;
        }
 
        // Výpis nové horní meze pro prvky vektoru
        Console.WriteLine("Horní mez prvků vektoru: {0}", maxHodnota);
    }
 
    // Návrat metody
    return maxHodnota;
}

Kód 2: Deklarace statické metody s celočíselným návratem s názvem HorniMez

3.3. Plnění pole

Následující zdrojový kód obsahuje deklaraci metody bez návratu PlnitPole - viz Kód 1. Tato metoda umožňuje uživateli zvolit typ plnění celočíselného vektoru. Oproti kaskádovému členění rozhodování ve vývojovém diagramu je ve zdrojovém kódu metody použito vícenásobné větvení pomocí příkazu switch. Pokud je hodnota uložená v proměnné zpusobPlneni rovna: 

  • 0 - vektor pole je plněn náhodnými čísly pomocí metody bez návratu NahodnePole
  • 1 - vektor pole je plněn celočíselnými hodnotami specifikovanými uživatelem. Uživatel zároveň definuje, kterému prvku vektoru patří tato jím zadaná hodnota. Plnění je prováděno pomocí metody bez návratu s názvem PlnitJednotlive. Oproti vývojovém diagramu ve Flowgorithm již není zapotřebí volat metodu NulovatPole, protože v C# pole představuje referenční datový typ, tzn. pokud není nastavena hodnota prvku pole, prvek je inicializován počáteční hodnotou v závislosti na příslušném datovém typu (např. u datového typu int je to 0)
  • 2 - vektor pole je plněn nulami pomocí metody bez návratu NulovatPole

/// <summary>
/// Metoda bez návratu - výběr metody plnění vektoru
/// </summary>
/// <param name="n"> aktuální rozměr (počet prvků) vektoru </param>
/// <param name="minHodnota"> dolní mez prvků vektoru </param>
/// <param name="maxHodnota"> horní mez prvků vektoru </param>
/// <param name="pole"> vektor, který má být naplněn </param>
static void PlnitPole(int n, int minHodnota, int maxHodnota, int[] pole)
{
    /* Deklarace: 'zpusobPlneni' ... způsob plnění vektoru('0'...Náhodně, '1'...Jednotlivě, 
     * '2'...Nulovat) */
    int zpusobPlneni;
 
    do
    {
        // Výzva k zadání způsobu plnění vektoru
        Console.Write("Zvolte způsob plnění vektoru (0...Náhodně, 1...Jednotlivě, 2...Nulovat): ");
 
        // Načtení způsobu plnění
        int.TryParse(Console.ReadLine(), out zpusobPlneni);
    }
 
    // Načtení způsobu plnění proběhne znovu, pokud nebyl zadán validní celočíselný kód způsobu plnění
    while ((zpusobPlneni != 0) && (zpusobPlneni != 1) && (zpusobPlneni != 2));
 
    switch (zpusobPlneni) 
    {
        // Plnění vektoru náhodnými čísly
        case 0:
            // Zavolání metody pro plnění vektoru náhodnými čísly
            NahodnePole(n, minHodnota, maxHodnota, pole);
            break;
 
        // Plnění vektoru jednotlivými zadanými hodnotami uživatelem
        case 1:
            // Plnění vektoru jednotlivými uživatelem zadanými čísly
            PlnitJednotlive(n, minHodnota, maxHodnota, pole);
            break;
 
        case 2:
            // Všem prvkům vektoru přiřadíme hodnotu '0'
            NulovatPole(n, pole);
            break;
    }
}

Kód 1: Deklarace statické metody bez návratu s názvem PlnitJednotlive

Detailní popisy podstaty následujících metod byly provedeny již v rámci analýzy ve stejnojmenné podkapitole a proto jej není nutné znovu uvádět. Uvedeme si pouze rozdíly oproti vývojovému diagramu jednotlivých podprogramů.

Následující zdrojový kód obsahuje deklaraci metody bez návratu NahodnePole, která je volána z metody PlnitPole, pokud uživatel zadal do proměnné zpusobPlneni hodnotu 0 - viz Kód 2. V metodě je generováno náhodné číslo na základě rovnoměrného rozdělení, tj. objekt rnd odvozený od třídy Random (instance třídy Random). Abychom mohli vytvořit objekt rnd, je zapotřebí zavolat konstruktor objektu pomocí klíčového slova new. Pro generování náhodného čísla využijeme metodu Next přidruženou k objektu rnd (přístup k metodám je pomocí tečkové notace). Tato metoda je k dispozici ve třech přetížených verzích: 

  • Next() -  metoda bez parametru navrací náhodné číslo v celém rozsahu datového typu int
  • Next(maxHodnota) - metoda navrací nezáporná čísla menší než hodnota v parametru maxHodnota, např. rnd.Next(100); vrátí číslo od 0 do 99
  • Next(minHodnota, maxHodnota) - metoda vrátí náhodné číslo náležící zleva uzavřenému intervalu <minHodnota, maxHodnota) ... dolní mez intervalu patří a horní mez již ne. Pokud potřebujeme pomocí objektu rnd generovat náhodné číslo např. od 1 do 100, uvedeme příkaz rnd.Next(1, 101);

V C# není při generování náhodného čísla zapotřebí definovat délku intervalu delkaIntervalu = maxHodnota - minHodnota + 1, kterou jsme využívali ve vývojových diagramech. Ve zdrojovém kódu jsme využili při generování náhodného čísla volání metody Next se dvěma parametry. Návrat této metody ve formě náhodného celého čísla přiřadíme i-tému aktuálnímu prvku pole, tj. pole[i] = rnd.Next(minHodnota, maxHodnota + 1);

V tomto i v dalších cyklech určených k procházení prvků vektoru je nahrazena podmínka dosažení horní meze u řídící proměnné, kterou jsme používali ve vývojových diagramech ve formě i <= n - 1 za jinak formulovanou, ale principiálně stejnou podmínku i < n (použití v metodách ZobrazitPole, PoleJakoText, MinimumVPoli, atd). Inkrementace řídící proměnné i je prováděna pomocí operátoru ++, tj. i++, namísto zdlouhavého zápisu příkazu i = i +1;

/// <summary>
/// Metoda bez návratu - plnění vektoru náhodnými čísly
/// </summary>
/// <param name="n"> počet prvků vektoru </param>
/// <param name="minHodnota"> dolní mez prvků vektoru </param>
/// <param name="maxHodnota"> horní mez prvků vektoru </param>
/// <param name="pole"> vektor, který má být naplněn </param>
static void NahodnePole(int n, int minHodnota, int maxHodnota, int[] pole)
{
    /* Deklarace: 'rnd' ... náhodné číslo (generované na základě rovnoměrného rozdělení); 
     * 'i' ... index (pozice) prvku vektoru */
 
    // Deklarace náhodného čísla (objektu) včetně inicializace
    Random rnd = new Random();
 
    // Pro všechny prvky od '0' (počátečního) do 'n-1'-tého (posledního) prvku
    for (int i = 0; i < n; i++)
    {
        /* Vygenerování náhodného čísla uloženého do 'rnd' v rozsahu 'minHodnota' až 'maxHodnota'
         * Přiřazení náhodného čísla do 'i'-tého prvku */
        pole[i] = rnd.Next(minHodnota, maxHodnota + 1);
    }
}

Kód 2: Deklarace statické metody bez návratu s názvem NahodnePole

Další možností plnění pole, je pomocí uvedení pořadí prvku a specifikace jeho hodnoty. Pro tuto metodu plnění je volána metoda bez návratu PlnitJednotlive. Je důležité upozornit, že uživatel zadává index prvku (index pozice začíná od 0) - viz Kód 3.

/// <summary>
/// Metoda bez návratu - plnění jednotlivých prvků vektoru uživatelem
/// </summary>
/// <param name="n"> počet prvků </param>
/// <param name="minHodnota"> stávající dolní mez prvků vektoru </param>
/// <param name="maxHodnota"> stávající horní mez prvků vektoru </param>
/// <param name="pole"> vektor, který má být naplněn </param>
static void PlnitJednotlive(int n, int minHodnota, int maxHodnota, int[] pole)
{
    /* Deklarace: 'index' ... index prvku, který má být naplněn; 'hodnota' ... hodnota 
     * prvku, který má být naplněn; 'plnit' ... informace, zda má zadán (naplněn) 
     * další prvek ('0'...Ano, '1'...Ne) */
    int index, hodnota, plnit;
 
    // Cyklus s podmínkou na konci pro plnění prvků
    do
    {
        // Cyklus s podmínkou na konci pro načtení indexu plněného prvku 
        do
        {
            // Výzva k zadání indexu prvku, včetně vypsání mezí
            Console.Write("Zadejte pořadové číslo prvku, který chcete naplnit (0 - {0}): ", 
                pole.Length-1);
 
            // Načtení indexu
            int.TryParse(Console.ReadLine(), out index);
 
            // Test, zda načtený index je mimo meze ...
            if ((index < 0) || (index > n-1))
            {
                // Výpis o chybě
                Console.WriteLine("Zadaná hodnota je mimo meze");
            }
        }
        /* Podmínka cyklu, zda načtený index je mimo meze. Pokud ano, opakovaní 
         * načtení indexu */
        while ((index < 0) || (index > n-1));
 
        // Cyklus s podmínkou na konci - validace zadané hodnoty zda je hodnota v rozsahu mezí 
        do
        {
            // Výzva k zadání hodnoty prvku, včetně vypsání dolní a horní meze pro všechny prvky
            Console.Write("Zadejte hodnotu prvku ({0} - {1}): ", minHodnota.ToString(), 
                maxHodnota.ToString());
 
            // Načtení hodnoty
            int.TryParse(Console.ReadLine(), out hodnota);
 
            // Test, zda načtená hodnota prvku je mimo meze ...
            if ((hodnota < minHodnota) || (hodnota > maxHodnota))
            {
                // Výpis o chybě
                Console.WriteLine("Zadaná hodnota je mimo meze");
            }
        }
        /* Podmínka cyklu, zda načtená hodnota prvku je mimo meze. Pokud ano, opakovaní 
         * načtení hodnoty */
        while ((hodnota < minHodnota) || (hodnota > maxHodnota));
 
        // Přiřazení hodnoty z lokální proměnné do prvku vektoru na pozici 'index'
        pole[index] = hodnota;
 
        // Zavolání metody pro zobrazení vektoru jako prvky v řádku oddělené čárkou
        Console.WriteLine(PoleJakoText(n, pole));
 
        // Zavolání metody pro zobrazení vektoru jako prvky pod sebou
        Console.WriteLine(ZobrazitPole(n, pole));
 
        // Cyklus s podmínkou na konci - validace informace o tom, zda dále plnit
        do
        {
            // Výzva, zda mají být plněny další prvky
            Console.Write("Chcete plnit další prvek (0...Ne, 1...Ano): ");
 
            // Načtení informace o dalším plnění
            int.TryParse(Console.ReadLine(), out plnit);
 
            // Test, zda načtená hodnota (informace o plnění) je mimo meze ...
            if ((plnit < 0) || (plnit > 1))
            {
                // Výpis chyby
                Console.WriteLine("Zadaná hodnota je mimo meze");
            }
        }
 
        /* Podmínka cyklu, zda načtená hodnota je mimo meze. Pokud ano, 
         * opakovaní načtení hodnoty */
        while ((plnit < 0) || (plnit > 1));
    }
 
    /* Podmínka cyklu, zda má být provedeno další načtení prvku. Pokud ano (hodnota '1'), 
     * opakovaní načtení hodnoty */
    while (plnit == 1);
}

Kód 3: Deklarace statické metody bez návratu s názvem PlnitJednotlive

Poslední možností, jak plnit pole, je do něj umístit samé nuly. Následující metodě NulovatPole proto pouze postačí jednoduchý cyklus s krokem, kde každému prvku pole je přiřazena hodnota 0 - viz Kód 4. 

/// <summary>
/// Metoda bez návratu - plnění prvků pole hodnotou nula
/// </summary>
/// <param name="n"> počet prvků vektoru </param>
/// <param name="pole"> vektor, který má být naplněn </param>
static void NulovatPole(int n, int[] pole)
{
    /* Pro všechny prvky od '0' (počátečního) do 'n-1'-tého (posledního) prvku;
     * 'i' ... index (pozice) prvku vektoru */
    for (int i = 0; i < n; i++)
    {
        // Přiřazení nuly 'i'-tému (aktuálně procházenému) prvku
        pole[i] = 0;
    }
}

Kód 4: Deklarace statické metody bez návratu s názvem NulovatPole

3.4. Výpis pole

Pro výpis naplněného pole jsou v programu použity dvě metody. První metoda PoleJakoText, navrací textový řetězec obsahující jednotlivé prvky oddělené čárkou, kde jednotlivé prvky jsou vypsány do řádky. Abychom zachovali stejný počet číslic vypsaných mezi čárky, použili jsme u výpisu hodnoty prvku namísto jednoduché konverze i-tého prvku, tj. pole[i].ToString(); formátovou specifikaci (anglicky "Format Specifier") třídy (datového typu) string, tj. string.Format(", {0:D3}", pole[i]); , kde:

  • 0 ... hodnota 0 definuje pořadí proměnné v seznamu proměnných uvedených za čárkou
  • D3 ... formát definuje, že textový řetězec reprezentující číslo (D znamená číselný formát Decimal, tedy desetinné číslo. Lze také uvádět malé písmeno d), má být doplněn vedoucími nulami, tak aby délka textového řetězce byla rovna 3, tj. počet vypsaných číslic 

Namísto zdlouhavého příkazu pro připojení textového řetězce do stávajícího řetězce např. vystup = vystup + pole[0].ToString(); jsme použili operátor += včetně formátové specifikace, tzn. vystup += string.Format("{0:D3}", pole[0]); - viz Kód 1.

/// <summary>
/// Výpis prvků vektoru v řádku, kde jednotlivé prvky jsou odděleny čárkami
/// </summary>
/// <param name="n"> aktuální velikost (počet prvků) vektoru </param>
/// <param name="pole"> vektor, který má být vypsán </param>
/// <returns> Text obsahující prvky v řádku </returns>
static string PoleJakoText(int n, int[] pole)
{
    /* Deklarace: 'vystup' ... výstupní textový řetězec obsahující prvky vektoru 
     * oddělené čárkou; 'i' ... index prvku ve vektoru */
    string vystup;
 
    // Inicializace - příprava textu  pro výpis v konzole
    vystup = "";
 
    // Vypsání počátečního prvku do textového řetězce
    vystup += string.Format("{0:D3}", pole[0]);
 
    // Pro všechny prvky od druhého prvku (včetně) do posledního ...
    for (int i = 1; i < n; i++)
    {
        // Výpis prvku do řádku odděleného čárkou
        vystup += string.Format(", {0:D3}", pole[i]);
    }
 
    // Přiřazení textu návratu metody
    return vystup;
}

Kód 1: Deklarace statické metody s textovým návratem s názvem PoleJakoText

Další metodou pro výpis prvků, tentokrát však do sloupce, je metoda s textovým návratem s názvem ZobrazitPole - viz Kód 2. Abychom docílili toho, že každý prvek pole bude umístěn na samostatnou řádku, použili jsme ve vývojovém diagramu vložení řídícího znaku do textového řetězce (anglicky "Carriage Return" - reprezentoval řídící znak na pozici 13 v ASCII tabulce). Tento znak navrací kurzor na začátek řádky a díky tomu bylo další číslo vypsáno na novém řádku. V C# je zapotřebí vložit ještě další znak reprezentující přechod na nový řádek (anglicky "Line Feed" - tento řídící znak je umístěn na pozici 10 v ASCII tabulce). Díky vložení těchto dvou řídících znaků do textu je zajištěno vypsání prvku na nové řádce.

/// <summary>
/// Výpis prvků vektoru do sloupce, kde každý prvek je na nové řádce
/// </summary>
/// <param name="n"> počet prvků vektoru </param>
/// <param name="pole"> vypisovaný vektor </param>
/// <returns> Text obsahující prvky ve sloupci </returns>
static string ZobrazitPole(int n, int[] pole)
{
    /* Deklarace: 'vystup' ... textový řetězec, kde jednotlivé prvky vektoru jsou 
     * umístěny pod sebou; 'i' ... index prvku ve vektoru */
    string vystup;
 
    // Inicializace - příprava textu  pro výpis v konzole
    vystup = "";
 
    // Pro všechny prvky od počátečního do koncového prvku ...
    for (int i = 0; i < n; i++)
    {
        /* Výpis prvku na novém řádku (návrat na počátek řádku ... znak na pozici '13' 
         * nový řádek ... znak na pozici '10' v ASCII tabulce); 
         * 0:D3 ... formátová specifikace, tj. 3 znaky (doplněno vedoucími nulami),
         * nula znamená index proměnné uvedené za čárkou */
        vystup += string.Format("{0:D3}", pole[i]) + (char)13 + (char)10;
    }
 
    // Přiřazení výstupního textu návratu metody
    return vystup;
}

Kód 2: Deklarace statické metody s textovým návratem s názvem ZobrazitPole

Existují ještě další možnosti vložení nového řádku, např. pomocí řídící posloupnosti, kde: 

  • \r ... řídící posloupnost pro návrat na počátek řádku
  • \n ... řídící posloupnost pro přechod na nový řádek

V podstatě jde o stejný přístup jako v metodě ZobrazitPole, ale je využito jiného zápisu - viz Kód 3.

// Vložení nové řádky do výsledného textu pomocí řídící posloupnosti
vystup += string.Format("{0:D3}", pole[i]) + "\r\n";

Kód 3: Použití řídící posloupnosti pro vloženého nového řádku

Dalším možným způsobem vložení řádky je využití metody NewLine implementované ve třídě Environment - viz Kód 4.

// Vložení nové řádky do výsledného textu
vystup += string.Format("{0:D3}", pole[i]) + Environment.NewLine;

Kód 4: Použití metody NewLine třídy Environment pro vloženého nového řádku

3.5. Minimum a maximum pole

Pro vyhledání nejmenšího prvku v poli je použita metoda MinimumVPoli s celočíselným návratem nalezeného minima. Počátečním krokem metody je prohlášení prvního prvku minimem. Dále jsou procházeny další prvky, které jsou porovnány s nejmenším dosud nalezeným prvkem, jehož hodnota je uložena v proměnné minimum. Podstata metody tkví v podmínce, že pokud aktuálně procházený prvek je menší než minimum, je hodnota tohoto prvku uložena do proměnné minimum. Po ukončení průchodu všemi prvky vektoru je hodnota minima přiřazena výstupu metody - viz Kód 1.

/// <summary>
/// Návrat hodnoty minima vektoru - nejmenší prvek
/// </summary>
/// <param name="n"> počet prvků vektoru </param>
/// <param name="pole"> prohledávaný vektor </param>
/// <returns> Minimum vektoru </returns>
static int MinimumVPoli(int n, int[] pole)
{
    // Deklarace: 'minimum' ... nalezená minimální hodnota ve vektoru; 'i' ... index (pozice) prvku vektoru
    int minimum;
 
    // Hodnotu prvního prvku prohlásíme minimem
    minimum = pole[0];
 
    // Pro všechny prvky od '1' (druhého prvku) do 'n-1'-tého (posledního) prvku
    for (int i = 1; i < n; i++)
    {
        // Pokud je aktuálně procházený prvek menší než minimum ...
        if (pole[i] < minimum)
        {
            // Uložené aktuálního prvku do minima
            minimum = pole[i];
        }
    }
 
    // Přiřazení minima návratu metody
    return minimum;
}

Kód 1: Deklarace statické metody s celočíselným návratem s názvem MinimumVPoli

Stejnou podstatu používá metoda MaximumVPoli, která však porovnává všechny prvky s dosud nejvyšší nalezenou hodnotu ve vektoru uloženou do proměnné s názvem maximum - viz Kód 2.

/// <summary>
/// Návrat hodnoty maxima vektoru - největší prvek
/// </summary>
/// <param name="n"> počet prvků pole </param>
/// <param name="pole"> prohledávaný vektor </param>
/// <returns> Maximum vektoru </returns>
public static int MaximumVPoli(int n, int[] pole)
{
    // Deklarace: 'maximum' ... nalezená maximální hodnota ve vektoru; 'i' ... index (pozice) prvku vektoru
    int maximum;
 
    // První prvek prohlásíme maximem
    maximum = pole[0];
 
    // Pro všechny prvky od '1' (druhého prvku) do 'n-1'-tého (posledního) prvku
    for (int i = 1; i < n; i++)
    {
        // Pokud je aktuálně procházený prvek větší než maximum ...
        if (pole[i] > maximum)
        {
            // Uložené hodnoty nalezeného prvku do maxima
            maximum = pole[i];
        }
    }
 
    // Přiřazení maxima návratu metody
    return maximum;
}

Kód 2: Deklarace statické metody s celočíselným návratem s názvem MaximumVPoli

Vzhledem k tomu, že má být uživateli vypsáno pořadí nalezeného minima a maxima, je zapotřebí deklarovat další metodu IndexPrvku, která navrací index hledaného prvku, který byl metodě předán jako parametr - viz Kód 3. V cyklu s krokem implementovaným v těle metody je použita v řídící podmínce hodnota horní meze vyjádřená jako pole.Length. Tato metoda přidružená k poli navrací velikost pole (počet prvků pole). Základním kamenem metody je podmínka, v níž je porovnána hodnota aktuálně procházeného prvku s hodnotou hledaného prvku na rovnost. Pokud nastane rovnost, je zaznamenáná do lokální proměnné index. Je také vhodné upozornit, že proměnná index bude v sobě mít uloženou hodnotu posledního výskytu hledané hodnoty. Pokud bychom chtěli hledat pouze první výskyt hledaného prvku, museli bychom za příkaz přiřazení indexu aktuálně procházeného prvku i do proměnné index umístit příkaz break, který by ukončil cyklus pro procházení jednotlivých prvků vektoru. Hodnota uložená v proměnné index je návratem metody IndexPrvku.  

/// <summary>
/// Metoda s návratem - návrat indexu hledaného prvku vektoru
/// </summary>
/// <param name="prvek"> prvek, jehož index má být vyhledán </param>
/// <param name="pole"> prohledávaný vektor </param>
/// <returns> Návrat posledního indexu hledaného prvku (prvek nebyl nalezen návrat -1) </returns>
static int IndexPrvku(int prvek, int[] pole)
{
    // Deklarace: 'index' ... index nalezeného prvku ve vektoru; 'i' ... index (pozice) prvku vektoru
    int index;
 
    // Inicializace - žádný prvek nenalezen, tj. index = -1
    index = -1;
 
    /* Pro všechny prvky od počátečního prvku do posledního (index zjištěn pomocí návratu funkce 
     * rozměru pole) prvku */
    for (int i = 0; i < pole.Length; i++)
    {
        // Pokud je aktuálně procházený prvek shodný s předaným prvkem ...
        if (pole[i] == prvek)
        {
            // Přiřazení indexu aktuálního prvku do indexu hledaného prvku 
            index = i;
        }
    }
    // Přiřazení idnexu prvku do návratu metody
    return index;
}

Kód 3: Deklarace statické metody s celočíselným návratem s názvem PoradiPrvku

Asi si říkáte, že tuto metodu jsme nemuseli vůbec používat. Na rozdíl od Flowgorithm, totiž metoda v C# umožňuje návrat více hodnot. Stačilo tedy přímo v metodě MinimumVPoli uložit pořadí do nějaké deklarované celočíselné proměnné v případě, že bylo nalezeno nové minimum. Pořadí bychom pak mohli deklarovat jako výstupní parametr metody MinimumVPoli. To samé platí i pro metodu MaximumVPoli.


3.6. Průměr pole

Pro výpočet aritmetického průměru ze všech prvků v poli je použita metoda PrumerPole. Tato metoda navrací reálné číslo reprezentující vypočtený průměr. Počátečním krokem metody je inicializace lokální celočíselné proměnné suma, která nám slouží pro uložení součtu všech dosud procházených prvků. Po ukončení průchodu všemi prvky vektoru je tato suma přetypována na reálné číslo (na typ double), abychom mohli provést podíl sumy a počtu prvků vektoru uloženým ve formálním parametru n, jehož výsledek je desetinné číslo (jinak bychom prováděli celočíselné dělení). Výsledek této operace je přiřazen výstupu metody - viz Kód 1.

/// <summary>
/// Navrát aritmetického průměru prvků vektoru
/// </summary>
/// <param name="n"> počet prvků vektoru </param>
/// <param name="pole"> prohledávaný vektor </param>
/// <returns> Průměr vektoru </returns>
static double PrumerPole(int n, int[] pole)
{
    /* Deklarace: 'prumer' ... průměrná reálná hodnota ze všech prvků vektoru; 
     * 'suma' ... suma hodnot všech prvků vektoru; 'i' ... index (pozice) 
     * prvku vektoru */
    double prumer;
    int suma;
 
    // Inicializace - suma prvků je 0
    suma = 0;
 
    // Pro všechny prvky od '0' (počátečního) do 'n-1'-tého (posledního) prvku
    for (int i = 0; i < n; i++)
    {
        // Přičtení dalšího prvku vektoru do sumy
        suma += pole[i];
    }
 
    // Výpočet průměru
    prumer = (double)suma / n;
 
    // Přiřazení vypočteného průměru návratu metody
    return prumer;
}

Kód 1: Deklarace statické metody s reálným návratem s názvem PrumerPole

3.7. Seřazení prvků pole

Pro seřazení prvků pole vzestupně je v hlavním programu volána metoda bez návratu s názvem SeraditPole. Tato metoda využívá třídění Bubble Sort, kde jsou porovnány jednotlivé dvojice sousedních prvků. Pokud je aktuálně procházený prvek větší než následující prvek, jsou tyto prvky vzájemně prohozeny. Pokud došlo alespoň k jednomu prohození sousedních prvků, celý vnitřní cyklus s krokem pro procházení od prvního do předposledního prvku je znovu opakován. Pokud nedošlo k prohození ani v jedné porovnávané dvojici sousedních prvků, není již vnější cyklus s podmínkou na konci prováděn. Následující zdrojový kód obsahuje deklarace metody SeraditPole - viz Kód 1.

/// <summary>
/// Metoda bez návratu - vzestupné řazení prvků pole
/// </summary>
/// <param name="n"> počet prvků </param>
/// <param name="pole"> vektor, který má být setříděn vzestupně </param>
static void SeraditPole(int n, int[] pole)
{
    /* Deklarace: 'pom' ... pomocná proměnná pro dočasné uložení prvku; 'b' ... logická proměnná 
     * obsahující informaci, zda došlo k prohození některých sousedních prvků; 'i' ... index (pozice) 
     * prvku vektoru */
    int pom;
    bool b;
 
    do
    {
        // Nedošlo k prohození sousedních prvků
        b = false;
 
        // Pro všechny prvky od počátečního do předposledního prvku
        for (int i = 0; i < n - 1; i++)
        {
            // Pokud je hodnota sousedícího prvku větší než hodnota aktuálně testovaného prvku
            if (pole[i] > pole[i + 1])
            {
                // Ulož hodnotu aktuálního prvku do pomocné proměnné
                pom = pole[i];
 
                // Ulož hodnotu sousedícího prvku do aktuálního prvku
                pole[i] = pole[i + 1];
 
                // Ulož hodnotu z pomocné proměnné do sousedícího prvku
                pole[i + 1] = pom;
 
                // Došlo k prohození sousedních prvků
                b = true;
            }
        }
        
    }
 
    // Testování, zda došlo k prohození některých sousedních prvků
    while (b == true);
}

Kód 1: Deklarace statické metody bez návratu s názvem SeraditPole

4. Výsledný kód

Následující zdrojový kód je kompletací předešlých kódů programu JednorozmernePole, který je umístěn v souboru Program.cs - viz Kód 1.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace JednorozmernePole
{
    class Program
    {
        static void Main(string[] args)
        {
            /* Deklarace: 'pocetPrvku' ... rozměr vektoru (počet prvků ve vektoru); 'Max' ... konstantní hodnota 
             * maximální velikosti vektoru; 'minHodnota' ... přípustná minimální hodnota (dolní mez) prvků vektoru; 
             * 'maxHodnota' ... přípustná maximální hodnota (horní mez) prvků vektoru */
 
            // Maximální rozměr vektoru
            const int Max = 10;
 
            // Dolní mez, které může nabýt prvek vektoru
            int minHodnota = 1;
 
            // Horní mez, které může nabýt prvek vektoru
            int maxHodnota = 100;
 
            // Rozměr vektoru je roven maximální možné délce
            int pocetPrvku = Max;
 
            // Zavolání metody s celočíselným návratem pro změnu velikosti vektoru
            pocetPrvku = RozmerPole(pocetPrvku, Max);
 
            // Deklarace vektoru se zadaným rozměrem (počtem prvků)
            int[] pole = new int[pocetPrvku];
 
            // Zavolání metody s celočíselný návratem pro změnu dolní meze, které mohou nabývat prvky vektoru
            minHodnota = DolniMez(minHodnota, maxHodnota);
 
            // Zavolání metody s celočíselným návratem pro změnu horní meze, které mohou nabývat prvky vektoru
            maxHodnota = HorniMez(minHodnota, maxHodnota);
 
            /* Zavolání metody pro plnění vektoru (náhodnými čísly, jednotlivě zadanými hodnotami, 
             * plnění vektoru nulami) */
            PlnitPole(pocetPrvku, minHodnota, maxHodnota, pole);
 
            // Výpis prvků vektoru v řádku, kde jednotlivé prvky jsou odděleny čárkami
            Console.WriteLine("Výpis pole (do řádku): " + PoleJakoText(pocetPrvku, pole));
 
            // Výpis prvků vektoru do sloupce, kde každý prvek je na nové řádce
            Console.WriteLine("Výpis pole (do sloupce): ");
            Console.Write(ZobrazitPole(pocetPrvku, pole));
 
            // Výpis hodnoty minima vektoru, včetně jeho indexu
            Console.WriteLine("Minimum v poli: " + MinimumVPoli(pocetPrvku, pole) + 
                " (index prvku: " + IndexPrvku(MinimumVPoli(pocetPrvku, pole), pole) + ")");
 
            // Výpis hodnoty maxima vektoru, včetně jeho indexu
            Console.WriteLine("Maximum v poli: " + MaximumVPoli(pocetPrvku, pole) + 
                " (index prvku: " + IndexPrvku(MaximumVPoli(pocetPrvku, pole), pole) + ")");
 
            // Výpis průměru všech prvků vektoru
            Console.WriteLine("Průměr prvků pole: " + PrumerPole(pocetPrvku, pole));
 
            // Vzestupné řazení prvků podle metody Bubble Sort
            SeraditPole(pocetPrvku, pole);
 
            // Výpis seřazeného vektoru do řádku
            Console.WriteLine("Seřazené pole (výpis do řádku): " + PoleJakoText(pocetPrvku, pole));
 
            // Výpis seřazeného vektoru do sloupce
            Console.WriteLine("Seřazené pole (výpis do sloupce): ");
            Console.Write(ZobrazitPole(pocetPrvku, pole));
 
            // Čekání na stisk klávesy -> ukončení programu
            Console.ReadKey();
        }
 
        #region Nastavení atributů pole
 
        /// <summary>
        /// Metoda s celočíselným návratem - navrací velikost pole (počet prvků vektoru)
        /// </summary>
        /// <param name="n"> aktuální velikost vektoru (počet prvků) </param>
        /// <param name="max"> maximální rozměr vektoru </param>
        /// <returns> Velikost vektoru </returns>
        static int RozmerPole(int n, int max)
        {
            /* Deklarace: 'zmena' ... informace (celé číslo), zda má být provedena změna rozměru 
             * pole; 'novaHodnota' ... nový rozměr vektoru */
            int zmena, novaHodnota;
 
            // Vypsání stávajícího rozměru vektoru
            Console.WriteLine("Počet prvků: {0}", n);
            do
            {
                // Výzva ke změně rozměru vektoru
                Console.Write("Změnit počet prvků vektoru (0...Ne, 1...Ano): ");
 
                // Načtení hodnoty, zda má dojít ke změně
                int.TryParse(Console.ReadLine(), out zmena);
 
                // Pokud načtená hodnota nebyla validní, cyklus zadání je znovu opakován
            }
            while ((zmena < 0) || (zmena > 1));
 
            // Pokud byl zadán index pro změnu ...
            if (zmena == 1)
            {
                // Výzva k zadání rozměru vektoru
                Console.Write("Zadejte počet prvků vektoru (1 - {0}): ", max);
 
                // Načtení rozměru vektoru
                int.TryParse(Console.ReadLine(), out novaHodnota);
 
                // Pokud nová hodnota je větší než maximum, nebo menší než 1 ...
                if ((novaHodnota > max) || (novaHodnota < 1))
                {
                    // Přiřazení maximálního rozměru vektoru do lokální proměnné určující počet prvků vektoru
                    novaHodnota = max;
                }
 
                // Pokud nový rozměr vektoru není stejný jako stávající počet prvků vektoru ...
                if (novaHodnota != n)
                {
                    // Uložení nového rozměru pole do proměnné
                    n = novaHodnota;
                }
 
                // Výpis nového zadaného rozměru vektoru
                Console.WriteLine("Rozměr pole: {0}", n);
            }
 
            // Návrat metody
            return n;
        }
 
        /// <summary>
        /// Metoda s celočíselným návratem - návrat dolní meze pro všechny prvky vektoru
        /// </summary>
        /// <param name="minHodnota"> dolní mez prvků vektoru </param>
        /// <param name="maxHodnota"> horní mez prvků vektoru </param>
        /// <returns> Dolní mez pro všechny prvky vektoru </returns>
        public static int DolniMez(int minHodnota, int maxHodnota)
        {
            /* Deklarace: 'novaHodnota' ... nová dolní mez prvků vektoru; 'zmena' ... celočíselná 
             * informace, zda má být provedena změna dolní meze prvků ('0'...Ne, '1'...Ano) */
            int novaHodnota, zmena;
 
            // Výpis stávající hodnoty dolní meze
            Console.WriteLine("Dolní mez prvků vektoru: {0}", minHodnota);
            do
            {
                // Výzva ke změně dolní meze
                Console.Write("Změnit dolní mez prvků vektoru (0...Ne, 1...Ano): ");
 
                // Načtení hodnoty do proměnné 'zmena' (informace, zda má dojít ke změně)
                int.TryParse(Console.ReadLine(), out zmena);
 
                // Pokud načtená hodnota není validní, cyklus zadání probíhá znovu
            }
            while (zmena < 0 || zmena > 1);
 
            // Test, zda má proběhnout změna dolní meze prvků vektoru
            if (zmena == 1)
            {
                // Výzva k zadání nové dolní meze prvků vektoru
                Console.Write("Zadejte dolní mez prvků vektoru: ");
 
                // Načtení nové dolní meze prvků vektoru
                int.TryParse(Console.ReadLine(), out novaHodnota);
 
                // Pokud nová hodnota dolní meze je větší než horní mez ...
                if (novaHodnota > maxHodnota)
                {
                    // Přiřazení horní meze do lokální proměnné určující dolní mez (horní a dolní mez budou stejné)
                    novaHodnota = maxHodnota;
                }
 
                // Pokud nová dolní mez vektoru není stejná jako stávající dolní mez prvků vektoru ...
                if (novaHodnota != minHodnota)
                {
                    // Přepsání stávající dolní meze prvků pole novou hodnotou
                    minHodnota = novaHodnota;
                }
 
                // Výpis nové dolní meze pro prvky vektoru
                Console.WriteLine("Dolní mez prvků vektoru: " + minHodnota);
            }
 
            // Návrat metody
            return minHodnota;
        }
 
        /// <summary>
        /// Metoda s celočíselným návratem - návrat horní meze pro všechny prvky vektoru
        /// </summary>
        /// <param name="minHodnota"> stávající horní mez prvků vektoru </param>
        /// <param name="maxHodnota"> horní mez prvků vektoru </param>
        /// <returns> Horní mez pro všechny prvky vektoru </returns>
        static int HorniMez(int minHodnota, int maxHodnota)
        {
            /* Deklarace: 'novaHodnota' ... nová horní mez prvků vektoru; 'zmena' ... celočíselná 
             * informace, zda má být provedena změna horní meze prvků ('0'...Ne, '1'...Ano) */
            int novaHodnota, zmena;
 
            // Výpis stávající hodnoty horní meze
            Console.WriteLine("Horní mez prvků vektoru: {0}", maxHodnota);
            do
            {
                // Výzva ke změně horní meze
                Console.Write("Změnit horní mez prvků vektoru (0...Ne, 1...Ano): ");
 
                // Načtení hodnoty do proměnné 'zmena' (informace, zda má dojít ke změně)
                int.TryParse(Console.ReadLine(), out zmena);
            }
            // Pokud načtená hodnota není validní, cyklus zadání probíhá znovu
            while ((zmena < 0) || (zmena > 1));
 
            // Test, zda má proběhnout změna horní meze prvků vektoru
            if (zmena == 1)
            {
                // Výzva k zadání nové horní meze prvků vektoru
                Console.Write("Zadejte horní mez prvků vektoru: ");
 
                // Načtení nové horní meze prvků vektoru
                int.TryParse(Console.ReadLine(), out novaHodnota);
 
                // Pokud nová hodnota horní meze je menší než horní mez ...
                if (novaHodnota < minHodnota)
                {
                    // Přiřazení dolní meze do lokální proměnné určující horní mez (horní a dolní mez budou stejné)
                    novaHodnota = minHodnota;
                }
 
                // Pokud nová horní mez vektoru není stejná jako stávající horní mez prvků vektoru ...
                if (novaHodnota != maxHodnota)
                {
                    // Přepsání stávající horní meze prvků pole novou hodnotou
                    maxHodnota = novaHodnota;
                }
 
                // Výpis nové horní meze pro prvky vektoru
                Console.WriteLine("Horní mez prvků vektoru: " + maxHodnota);
            }
 
            // Návrat metody
            return maxHodnota;
        }
        #endregion
        
        #region Plnění pole
 
        /// <summary>
        /// Metoda bez návratu - výběr metody plnění vektoru
        /// </summary>
        /// <param name="n"> aktuální rozměr (počet prvků) vektoru </param>
        /// <param name="minHodnota"> dolní mez prvků vektoru </param>
        /// <param name="maxHodnota"> horní mez prvků vektoru </param>
        /// <param name="pole"> vektor, který má být naplněn </param>
        static void PlnitPole(int n, int minHodnota, int maxHodnota, int[] pole)
        {
            /* Deklarace: 'zpusobPlneni' ... způsob plnění vektoru('0'...Náhodně, '1'...Jednotlivě, 
             * '2'...Nulovat) */
            int zpusobPlneni;
 
            do
            {
                // Výzva k zadání způsobu plnění vektoru
                Console.Write("Zvolte způsob plnění vektoru (0...Náhodně, 1...Jednotlivě, 2...Nulovat): ");
 
                // Načtení způsobu plnění
                int.TryParse(Console.ReadLine(), out zpusobPlneni);
            }
 
            // Načtení způsobu plnění proběhne znovu, pokud nebyl zadán validní celočíselný kód způsobu plnění
            while ((zpusobPlneni != 0) && (zpusobPlneni != 1) && (zpusobPlneni != 2));
 
            switch (zpusobPlneni) 
            {
                // Plnění vektoru náhodnými čísly
                case 0:
                    // Zavolání procedury pro plnění vektoru náhodnými čísly
                    NahodnePole(n, minHodnota, maxHodnota, pole);
                    break;
 
                // Plnění vektoru jednotlivými zadanými hodnotami uživatelem
                case 1:
                    // Plnění vektoru jednotlivými uživatelem zadanými čísly
                    PlnitJednotlive(n, minHodnota, maxHodnota, pole);
                    break;
 
                case 2:
                    // Všem prvkům vektoru přiřadíme hodnotu '0'
                    NulovatPole(n, pole);
                    break;
            }
        }
 
 
        /// <summary>
        /// Metoda bez návratu - plnění prvků pole hodnotou nula
        /// </summary>
        /// <param name="n"> počet prvků vektoru </param>
        /// <param name="pole"> vektor, který má být naplněn </param>
        static void NulovatPole(int n, int[] pole)
        {
            /* Pro všechny prvky od '0' (počátečního) do 'n-1'-tého (posledního) prvku;
             * 'i' ... index (pozice) prvku vektoru */
            for (int i = 0; i < n; i++)
            {
                // Přiřazení nuly 'i'-tému (aktuálně procházenému) prvku
                pole[i] = 0;
            }
        }
 
        /// <summary>
        /// Metoda bez návratu - plnění vektoru náhodnými čísly
        /// </summary>
        /// <param name="n"> počet prvků vektoru </param>
        /// <param name="minHodnota"> dolní mez prvků vektoru </param>
        /// <param name="maxHodnota"> horní mez prvků vektoru </param>
        /// <param name="pole"> vektor, který má být naplněn </param>
        static void NahodnePole(int n, int minHodnota, int maxHodnota, int[] pole)
        {
            /* Deklarace: 'rnd' ... náhodné číslo (generované na základě rovnoměrného rozdělení); 
             * 'i' ... index (pozice) prvku vektoru */
 
            // Deklarace náhodného čísla (objektu) včetně inicializace
            Random rnd = new Random();
 
            // Pro všechny prvky od '0' (počátečního) do 'n-1'-tého (posledního) prvku
            for (int i = 0; i < n; i++)
            {
                /* Vygenerování náhodného čísla uloženého do 'rnd' v rozsahu 'minHodnota' až 'maxHodnota'
                 * Přiřazení náhodného čísla do 'i'-tého prvku */
                pole[i] = rnd.Next(minHodnota, maxHodnota + 1);
            }
        }
 
        /// <summary>
        /// Metoda bez návratu - plnění jednotlivých prvků vektoru uživatelem
        /// </summary>
        /// <param name="n"> počet prvků </param>
        /// <param name="minHodnota"> stávající dolní mez prvků vektoru </param>
        /// <param name="maxHodnota"> stávající horní mez prvků vektoru </param>
        /// <param name="pole"> vektor, který má být naplněn </param>
        static void PlnitJednotlive(int n, int minHodnota, int maxHodnota, int[] pole)
        {
            /* Deklarace: 'index' ... index prvku, který má být naplněn; 'hodnota' ... hodnota 
             * prvku, který má být naplněn; 'plnit' ... informace, zda má zadán (naplněn) 
             * další prvek ('0'...Ano, '1'...Ne) */
            int index, hodnota, plnit;
 
            // Cyklus s podmínkou na konci pro plnění prvků
            do
            {
                // Cyklus s podmínkou na konci pro načtení indexu plněného prvku 
                do
                {
                    // Výzva k zadání indexu prvku, včetně vypsání mezí
                    Console.Write("Zadejte index prvku, který chcete naplnit (0 - {0}): ", 
                        pole.Length-1);
 
                    // Načtení indexu
                    int.TryParse(Console.ReadLine(), out index);
 
                    // Test, zda načtený index je mimo meze ...
                    if ((index < 0) || (index > n-1))
                    {
                        // Výpis o chybě
                        Console.WriteLine("Zadaná hodnota je mimo meze");
                    }
                }
                /* Podmínka cyklu, zda načtený index je mimo meze. Pokud ano, opakovaní 
                 * načtení indexu */
                while ((index < 0) || (index > n-1));
 
                // Cyklus s podmínkou na konci - validace zadané hodnoty zda je hodnota v rozsahu mezí 
                do
                {
                    // Výzva k zadání hodnoty prvku, včetně vypsání dolní a horní meze pro všechny prvky
                    Console.Write("Zadejte hodnotu prvku ({0} - {1}): ", minHodnota.ToString(), 
                        maxHodnota.ToString());
 
                    // Načtení hodnoty
                    int.TryParse(Console.ReadLine(), out hodnota);
 
                    // Test, zda načtená hodnota prvku je mimo meze ...
                    if ((hodnota < minHodnota) || (hodnota > maxHodnota))
                    {
                        // Výpis o chybě
                        Console.WriteLine("Zadaná hodnota je mimo meze");
                    }
                }
                /* Podmínka cyklu, zda načtená hodnota prvku je mimo meze. Pokud ano, opakovaní 
                 * načtení hodnoty */
                while ((hodnota < minHodnota) || (hodnota > maxHodnota));
 
                // Přiřazení hodnoty z lokální proměnné do prvku vektoru na pozici 'index'
                pole[index] = hodnota;
 
                // Zavolání metody pro zobrazení vektoru jako prvky v řádku oddělené čárkou
                Console.WriteLine(PoleJakoText(n, pole));
 
                // Zavolání metody pro zobrazení vektoru jako prvky pod sebou
                Console.WriteLine(ZobrazitPole(n, pole));
 
                // Cyklus s podmínkou na konci - validace informace o tom, zda dále plnit
                do
                {
                    // Výzva, zda mají být plněny další prvky
                    Console.Write("Chcete plnit další prvek (0...Ne, 1...Ano): ");
 
                    // Načtení informace o dalším plnění
                    int.TryParse(Console.ReadLine(), out plnit);
 
                    // Test, zda načtená hodnota (informace o plnění) je mimo meze ...
                    if ((plnit < 0) || (plnit > 1))
                    {
                        // Výpis chyby
                        Console.WriteLine("Zadaná hodnota je mimo meze");
                    }
                }
 
                /* Podmínka cyklu, zda načtená hodnota je mimo meze. Pokud ano, 
                 * opakovaní načtení hodnoty */
                while ((plnit < 0) || (plnit > 1));
            }
 
            /* Podmínka cyklu, zda má být provedeno další načtení prvku. Pokud ano (hodnota '1'), 
             * opakovaní načtení hodnoty */
            while (plnit == 1);
        }
 
        #endregion
 
        #region Zobrazení pole
 
        /// <summary>
        /// Výpis prvků vektoru do sloupce, kde každý prvek je na nové řádce
        /// </summary>
        /// <param name="n"> počet prvků vektoru </param>
        /// <param name="pole"> vypisovaný vektor </param>
        /// <returns> Text obsahující prvky ve sloupci </returns>
        static string ZobrazitPole(int n, int[] pole)
        {
            /* Deklarace: 'vystup' ... textový řetězec, kde jednotlivé prvky vektoru jsou 
             * umístěny pod sebou; 'i' ... index prvku ve vektoru */
            string vystup;
 
            // Inicializace - příprava textu  pro výpis v konzole
            vystup = "";
 
            // Pro všechny prvky od počátečního do koncového prvku ...
            for (int i = 0; i < n; i++)
            {
                /* Výpis prvku na novém řádku (návrat na počátek řádku ... znak na pozici '13' 
                 * nový řádek ... znak na pozici '10' v ASCII tabulce); 
                 * 0:D3 ... formátová specifikace, tj. 3 znaky (doplněno vedoucími nulami),
                 * nula znamená bez desetinných míst */
                vystup += string.Format("{0:D3}", pole[i]) + (char)13 + (char)10;
 
                /* Vložení nové řádky do výsledného textu pomocí řídící posloupnosti -
                 * \r ... návrat na počátek řádku; \n ... přechod na nový řádek */
                //vystup += string.Format("{0:D3}", pole[i]) + "\r\n";
 
                // Vložení nové řádky do výsledného textu
                //vystup += string.Format("{0:D3}", pole[i]) + Environment.NewLine;
            }
 
            // Přiřazení výstupního textu návratu metody
            return vystup;
        }
 
        /// <summary>
        /// Výpis prvků vektoru v řádku, kde jednotlivé prvky jsou odděleny čárkami
        /// </summary>
        /// <param name="n"> aktuální velikost (počet prvků) vektoru </param>
        /// <param name="pole"> vektor, který má být vypsán </param>
        /// <returns> Text obsahující prvky v řádku </returns>
        static string PoleJakoText(int n, int[] pole)
        {
            /* Deklarace: 'vystup' ... výstupní textový řetězec obsahující prvky vektoru 
             * oddělené čárkou; 'i' ... index prvku ve vektoru */
            string vystup;
 
            // Inicializace - příprava textu  pro výpis v konzole
            vystup = "";
 
            // Vypsání počátečního prvku do textového řetězce
            vystup += string.Format("{0:D3}", pole[0]);
 
            // Pro všechny prvky od druhého prvku (včetně) do posledního ...
            for (int i = 1; i < n; i++)
            {
                // Výpis prvku do řádku odděleného čárkou
                vystup += string.Format(", {0:D3}", pole[i]);
            }
 
            // Přiřazení textu návratu metody
            return vystup;
        }
 
        #endregion
 
        #region Výpočty s polem
 
        /// <summary>
        /// Návrat hodnoty minima vektoru - nejmenší prvek
        /// </summary>
        /// <param name="n"> počet prvků vektoru </param>
        /// <param name="pole"> prohledávaný vektor </param>
        /// <returns> Minimum vektoru </returns>
        static int MinimumVPoli(int n, int[] pole)
        {
            // Deklarace: 'minimum' ... nalezená minimální hodnota ve vektoru; 'i' ... index (pozice) prvku vektoru
            int minimum;
 
            // Hodnotu prvního prvku prohlásíme minimem
            minimum = pole[0];
 
            // Pro všechny prvky od '1' (druhého prvku) do 'n-1'-tého (posledního) prvku
            for (int i = 1; i < n; i++)
            {
                // Pokud je aktuálně procházený prvek menší než minimum ...
                if (pole[i] < minimum)
                {
                    // Uložené aktuálního prvku do minima
                    minimum = pole[i];
                }
            }
 
            // Přiřazení minima návratu metody
            return minimum;
        }
 
        /// <summary>
        /// Návrat hodnoty maxima vektoru - největší prvek
        /// </summary>
        /// <param name="n"> počet prvků pole </param>
        /// <param name="pole"> prohledávaný vektor </param>
        /// <returns> Maximum vektoru </returns>
        public static int MaximumVPoli(int n, int[] pole)
        {
            // Deklarace: 'maximum' ... nalezená maximální hodnota ve vektoru; 'i' ... index (pozice) prvku vektoru
            int maximum;
 
            // První prvek prohlásíme maximem
            maximum = pole[0];
 
            // Pro všechny prvky od '1' (druhého prvku) do 'n-1'-tého (posledního) prvku
            for (int i = 1; i < n; i++)
            {
                // Pokud je aktuálně procházený prvek větší než maximum ...
                if (pole[i] > maximum)
                {
                    // Uložené hodnoty nalezeného prvku do maxima
                    maximum = pole[i];
                }
            }
 
            // Přiřazení maxima návratu metody
            return maximum;
        }
 
        /// <summary>
        /// Metoda s návratem - návrat indexu hledaného prvku vektoru
        /// </summary>
        /// <param name="prvek"> prvek, jehož index má být vyhledán </param>
        /// <param name="pole"> prohledávaný vektor </param>
        /// <returns> Návrat posledního indexu hledaného prvku (prvek nebyl nalezen návrat -1) </returns>
        static int IndexPrvku(int prvek, int[] pole)
        {
            // Deklarace: 'index' ... index nalezeného prvku ve vektoru; 'i' ... index (pozice) prvku vektoru
            int index;
 
            // Inicializace - žádný prvek nenalezen, tj. index = -1
            index = -1;
 
            /* Pro všechny prvky od počátečního prvku do posledního (index zjištěn pomocí návratu funkce 
             * rozměru pole) prvku */
            for (int i = 0; i < pole.Length; i++)
            {
                // Pokud je aktuálně procházený prvek shodný s předaným prvkem ...
                if (pole[i] == prvek)
                {
                    // Přiřazení indexu aktuálního prvku do indexu hledaného prvku 
                    index = i;
                }
            }
            // Přiřazení idnexu prvku do návratu metody
            return index;
        }
 
        /// <summary>
        /// Navrát aritmetického průměru prvků vektoru
        /// </summary>
        /// <param name="n"> počet prvků vektoru </param>
        /// <param name="pole"> prohledávaný vektor </param>
        /// <returns> Průměr vektoru </returns>
        static double PrumerPole(int n, int[] pole)
        {
            /* Deklarace: 'prumer' ... průměrná reálná hodnota ze všech prvků vektoru; 
             * 'suma' ... suma hodnot všech prvků vektoru; 'i' ... index (pozice) 
             * prvku vektoru */
            double prumer;
            int suma;
 
            // Inicializace - suma prvků je 0
            suma = 0;
 
            // Pro všechny prvky od '0' (počátečního) do 'n-1'-tého (posledního) prvku
            for (int i = 0; i < n; i++)
            {
                // Přičtení dalšího prvku vektoru do sumy
                suma += pole[i];
            }
 
            // Výpočet průměru
            prumer = (double)suma / n;
 
            // Přiřazení vypočteného průměru návratu metody
            return prumer;
        }
 
        #endregion
 
        #region Úprava pole
 
        /// <summary>
        /// Metoda bez návratu - vzestupné řazení prvků pole
        /// </summary>
        /// <param name="n"> počet prvků </param>
        /// <param name="pole"> vektor, který má být setříděn vzestupně </param>
        static void SeraditPole(int n, int[] pole)
        {
            /* Deklarace: 'pom' ... pomocná proměnná pro dočasné uložení prvku; 'b' ... logická proměnná 
             * obsahující informaci, zda došlo k prohození některých sousedních prvků; 'i' ... index (pozice) 
             * prvku vektoru */
            int pom;
            bool b;
 
            do
            {
                // Nedošlo k prohození sousedních prvků
                b = false;
 
                // Pro všechny prvky od počátečního do předposledního prvku
                for (int i = 0; i < n - 1; i++)
                {
                    // Pokud je hodnota sousedícího prvku větší než hodnota aktuálně testovaného prvku
                    if (pole[i] > pole[i + 1])
                    {
                        // Ulož hodnotu aktuálního prvku do pomocné proměnné
                        pom = pole[i];
 
                        // Ulož hodnotu sousedícího prvku do aktuálního prvku
                        pole[i] = pole[i + 1];
 
                        // Ulož hodnotu z pomocné proměnné do sousedícího prvku
                        pole[i + 1] = pom;
 
                        // Došlo k prohození sousedních prvků
                        b = true;
                    }
                }
                
            }
 
            // Testování, zda došlo k prohození některých sousedních prvků
            while (b == true);
        }
 
        #endregion
    }
}

Kód 1: Program JednorozmernePole - deklarace hlavní statické metody Main včetně deklarací dalších metod

5. Výstup programu

Na následujících výstupech týkajících se programu JednorozmernePole (viz kapitola 3 Program - Kód 1: Program JednorozmernePole) budou zobrazeny jednotlivé výstupy konzolové aplikace pro různá nastavení atributů vektoru a případy plnění jednorozměrného pole.  

Rozměr pole

V následujícím výstupu programu JednorozmernePole vidíme změnu velikosti (rozměru) jednorozměrného pole (vektoru) - viz Výstup programu 1.  

Změna velikosti pole na 5 prvků

Výstup programu 1 - Kód 1 (viz kapitola 3 Program JednorozmernePole): Změna velikosti pole na 5 prvků

Pokud uživatel stiskl klávesu Enter, bez zadání hodnoty číselného indexu operace, která má být provedena, je provedena operace s indexem 0. Jak je to možné? Pro načítání a konverzi zadané hodnoty jsme použili příkaz int.TryParse(Console.ReadLine(), out zmena); . Jak vidíme, v příkazu je použit výstupní parametr zmena. Pokud uživatelem nebyla zadána žádná hodnota, která by mohla být konvertována, výstupní parametr nabyl přednastavené hodnoty pro příslušný datový typ, v tomto případě pro int je to 0 - viz Výstup programu 2. Vzhledem k tomu, že v parametru zmena je uložena hodnota 0 (pokud by měla být provedena změna velikosti vektoru, musela by se hodnota ve zmena rovnat hodnotě 1), již není proveden žádný z příkazů uvnitř následujícího rozhodovacího bloku v metodě RozmerPole. Díky tomu již nebyla znovu vypsána stávající velikost vektoru (která nebyla změněna) a jsou prováděny další instrukce v kódu.

Nezadání hodnoty indexu operace

Výstup programu 2 - Kód 1 (viz kapitola 3 Program JednorozmernePole): Nezadání hodnoty indexu operace

Dolní a horní mez prvků

V následujícím výřezu výstupu programu vidíme změnu dolní meze specifikované pro všechny prvky jednorozměrného pole - viz Výstup programu 3.  

Změna dolní meze prvků pole

Výstup programu 3 - Kód 1 (viz kapitola 3 Program JednorozmernePole): Změna dolní meze prvků pole

V následujícím výřezu výstupu programu vidíme změnu horní meze specifikované pro všechny prvky jednorozměrného pole - viz Výstup programu 4.  

Změna horní meze prvků pole

Výstup programu 4 - Kód 1 (viz kapitola 3 Program JednorozmernePole): Změna horní meze prvků pole

Plnění pole

Vzhledem k možnosti plnění pole různými způsoby, jsou v následujících odstavcích zobrazeny různé výřezy výstupů programu týkající se plnění vektorů na základě zvoleného indexu plnění. Pole jsou vypsány jak do řádku (metoda PoleJakoText), tak i do sloupce (metoda ZobrazitPole).

Náhodná čísla

V následujícím výřezu výstupu programu vidíme variantu plnění pole o velikosti 10 prvků náhodnými celými čísly - viz Výstup programu 5.  Dolní mez prvků pole je nastavena na hodnotu 1 a horní mez na hodnotu 100.


Výstup programu 5 - Kód 1 (viz kapitola 3 Program JednorozmernePole): Plnění pole náhodnými čísly

Plnění jednotlivých prvků pole

Další možností plnění pole je plnění prvku s určitým indexem pomocí hodnoty zadané uživatelem - viz Výstup programu 6. Před plněním jednotlivých prvků již není nutnost plnit všechny nenaplněné prvky nulami (tak jak tomu bylo zapotřebí ve vývojovému diagramu ve Flowgorithm). Jednotlivé prvky jsou inicializovány počáteční hodnotou v závislosti na příslušném datovém typu (např. pro datový typ int je přednastavená hodnota 0). Na výřezu výstupu programu vidíme postupné plnění celočíselného pole o 3 prvcích, kde po každém naplnění prvku je pole vypsáno. Plnění je ukončeno zadáním celočíselného indexu pro ukončení plnění.


Výstup programu 6 - Kód 1 (viz kapitola 3 Program JednorozmernePole): Plnění jednotlivých prvků pole

Plnění nulami

Třetí možností plnění pole je všem prvkům přiřadit hodnotu 0. Následující výřez výstupu programu znázorňuje výpis pole o velikosti 10 prvků, kde jsou všechny prvky naplněny nulami - viz Výstup programu 7. 

Plnění všech prvků nulami

Výstup programu 7 - Kód 1 (viz kapitola 3 Program JednorozmernePole): Plnění všech prvků nulami

Minimum a maximum pole

Následující výřez výstupu programu konzolové aplikace ilustruje nalezení minima a maxima v poli o 10 prvcích. Ve výpisu je uvedeno i pořadí těchto dvou nalezených prvků. Pole bylo plněno náhodnými čísly v rozmezí celočíselných hodnot [1, 100] - viz Výstup programu 8.


Výstup programu 8 - Kód 1 (viz kapitola 3 Program JednorozmernePole): Nalezené minimum a maximum v poli včetně jejich indexů ve vektoru

Průměr pole

Následující výřez výstupu programu konzolové aplikace ilustruje výpočet aritmetického průměru pole o 10 prvcích. Tyto prvky byly plněny náhodnými čísly v rozmezí celočíselných hodnot [1, 100] - viz Výstup programu 9.


Výstup programu 9 - Kód 1 (viz kapitola 3 Program JednorozmernePole): Výpočet aritmetického průměru ze všech prvků pole

Seřazení prvků pole

Poslední výřez výstupu programu ilustruje seřazení prvků pole podle jejich hodnot ve vzestupném pořadí. Pole o 10 prvcích bylo naplněno náhodnými čísly v rozmezí celočíselných hodnot [1, 100] - viz Výstup programu 10. 


Výstup programu 10 - Kód 1 (viz kapitola 3 Program JednorozmernePole): Seřazení všech prvků pole vzestupně