4. C#

4.2. Plnění pole

Jak již název podkapitoly napovídá, nyní je zapotřebí definovat těla metod, která budou vektor plnit čísly. Region Události obsahuje další region s názvem Plnění pole, který obsahuje následující metody: 

  • BtnNahodne_Click
  • BtnJednotlive_Click
  • BtnNulovat_Click

Abychom mohli vektor naplnit náhodnými čísly pomocí stisku tlačítka, je zapotřebí nejprve deklarovat metodu, která bude v těle metody obsluhy stisknutí tlačítka volána. Tuto metodu deklarujeme v regionu Plnění pole, který je součástí regionu Pomocné metody. 

Takovou základní metodou je soukromá (private) metoda bez návratu (void) s názvem NahodnePole - viz Kód 1. Tato metoda obsahuje 4 formální parametry. Prvním parametrem je počet prvků pole (parametry jsou v metodě ponechány zejména z didaktických důvodů, protože např. počet prvků vektoru lze získat pomocí vlastnosti Length, atd.). Dalšími parametry je dolní a horní mez intervalu přípustných hodnot prvků. Posledním formálním parametrem je vektor. Je nutné si uvědomit, že ač se vektor jeví předávaný hodnotou, ve skutečnosti je předáván pouze odkaz, protože vektor není hodnotový typ, ale referenční typ. Tento vektor je zpočátku naplněn 0. My však budeme chtít, aby vektor obsahoval náhodná čísla z intervalu přípustných hodnot. To zajistíme pomocí vytvoření instance generátoru náhodného čísla s názvem rnd, pomocí zavolání konstruktoru s využitím klíčového slova new. Pomocí cyklu s pevným krokem zajistíme procházení prvků vektoru. V tomto cyklu budeme každému prvku na pozici i přiřazovat náhodné číslo v intervalu dolní a horní meze, které jsou metodě Next předány jako parametry. Nezapomeňte, že metoda generuje náhodné číslo ve zleva uzavřeném intervalu (může generovat náhodné číslo rovné dolní mezi) a zprava otevřeném (nemůže generovat číslo rovné horní mezi). Proto je zapotřebí přičíst k horní mezi 1, aby mohlo být generováno náhodné číslo rovné horní mezi - jedná se o celá čísla, protože vektor obsahuje pouze celá čísla, tj. typ int. 

/// <summary>
/// Metoda pro plnění prvků vektoru náhodnými čísly
/// </summary>
/// <param name="n"> počet prvků pole </param>
/// <param name="minh"> minimální celočíselná hodnota prvku </param>
/// <param name="maxh"> maximální celočíselná hodnota prvku </param>
/// <param name="pole"> jednorozměrné pole </param>
private void NahodnePole(int n, int minh, int maxh, int[] pole)
{
    // Vytvoření instance generátoru náhodného čísla
    Random rnd = new Random();
 
    // Cyklus s pevným krokem - pro procházení prvků vektoru
    for (int i = 0; i < n; i++)
    {
        // Přiřazení náhodného čísla v rozmezí intervalu u prvku na pozici [i]
        pole[i] = rnd.Next(minh, maxh + 1);
    }
}

Kód 1: Deklarace metody pro plnění vektoru náhodnými čísly (NahodnePole)

Vzhledem k tomu, že již máme deklarovánu metodu pro plnění, přejděme do regionu Události a dále do regionu Plnění pole, ve kterém nalezneme metodu BtnNahodne_Click, jejíž tělo budeme plnit - viz Kód 2. Tato metoda obsluhy události stisknutí tlačítka BtnNahodne, zajistí plnění vektoru náhodnými čísly v intervalu přípustných hodnot, jehož dolní a horní mez je specifikována na formuláři. Tyto hodnoty byly v těle hlavní metody naplněny do datových složek třídy minHodnota a maxHodnota. Jak vidíme v následujícím kódu v těle metody je volána soukromá metoda bez návratu s názvem NahodnePole, kterou jsme deklarovali v předchozím kódu. Skutečné parametry volané metody jsou počet prvků vektoru a již zmiňované meze. Samotný vektor bude ve volané metodě změněn, ale vzhledem k referenčnímu typu nemusíme používat předávání parametru odkazem.

/// <summary>
/// Volání metody pro plnění vektoru náhodnými čísly
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnNahodne_Click(object sender, RoutedEventArgs e)
{
    // Zavolání metody bez návratu pro plnění vektoru náhodnými čísly
    this.NahodnePole(this.pocetPrvku, this.minHodnota, this.maxHodnota, this.pole);
}

Kód 2: Deklarace metody pro zavolání metody pro plnění pole náhodnými čísly (BtnNahodne_Click)

V regionu Plnění pole, který je součástí regionu Události, také nalezneme metodu BtnJednotlive_Click, jejíž tělo nyní budeme doplňovat - viz Kód 3. Tato metoda obsluhy události stisknutí tlačítka BtnJednotlive, zajistí ruční plnění vektoru, tzn., že jednotlivé prvky bude definovat uživatel na formuláři a po stisknutí tlačítka bude prvek na definované pozici přepsán hodnotou načtenou z objektu na formuláři. Jak vidíme v následujícím kódu těla metody je nejprve provedena konverze textu na celé číslo z objektu na formuláři určeného pro specifikaci indexu prvku (počáteční prvek je indexován 0). Načtenou hodnotu uložíme do lokální proměnné poradiPrvku. Dále je zapotřebí načíst hodnotu, která má být umístěna do prvku vektoru. Mohlo by se stát, že uživatel by stiskl tlačítko pro ruční plnění, aniž by vyplnil hodnoty indexu prvku, nebo hodnoty prvku. Proto v metodě provedeme načtení hodnot z obou těchto objektů na formuláři a sestavíme podmínky, které budou testovat, zda byly zadány validní hodnoty (mohli bychom také namísto tohoto druhu testování např. pouze testovat, zda objekty na formuláři nejsou prázdné, atd.). Pokud index prvku je mimo interval povolených hodnot (je menší než 0, nebo větší než počet prvků - 1), je zobrazeno dialogové okno s textem popisujícím chybu. U objektu dialogového okna můžeme specifikací parametrů metody Show definovat, jaká tlačítka mají být v okně zobrazena (v našem případě pouze tlačítko OK) a jaký obrázek má být zobrazen vedle vypsaného textu (v našem případě chyba, tj. kříž v červeném kruhu).  

Pokud byla podmínka splněna (byl zadán validní index prvku), je testována další podmínka. Podmínka obsahuje testování, zda byla zadána validní hodnota prvku, tj. zda náleží intervalu přípustných hodnot. Pokud ne, je znovu zobrazeno dialogové okno s chybovou hláškou. 

Pokud jsou zadané hodnoty validní, provedou se příkazy v poslední větvi else. V prvním příkazu této větve vidíme, že hodnota uložená v lokální proměnné hodnota, je uložena do prvku, který je na pozici index. Protože byl přepsán prvek vektoru novou hodnotou, je vhodné změněný vektor zobrazit uživateli. To zajistíme pomocí volání metody ZobrazitPoleJakoText, která zobrazí prvek v objektu typu TextBox na formuláři. Dále pomocí metody ZobrazitPoleVListView zobrazíme vektor v objektu typu ListView. Popis zdrojového kódu v C# obou těchto metod naleznete v kapitole Zobrazení pole. 

V bloku rozhodování je umístěna podmínka, že pokud je index prvku menší než celkový počet prvků - 1 (rozměr vektoru je uložen v datové složce pocetPrvku), bude provedena inkrementace (zvýšení o 1) u indexu. Tím uživateli odpadá povinnost vždy specifikovat index následujícího prvku (které je o 1 vyšší než předchozí), protože se tak stane po stisku tlačítka. Index prvku pak vypíšeme v objektu na formuláři. 

/// <summary>
/// Metoda pro ruční plnění jednotlivých prvků vektoru
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnJednotlive_Click(object sender, RoutedEventArgs e)
{
    /* Přiřazení indexu prvku z objektu na formuláři (konverze textu na celé 
     * číslo) do lokální proměnné */
    int.TryParse(this.TxtPrvekIndex.Text, out int index);
 
    // Přiřazení hodnoty prvku z objektu na formuláři do lokální proměnné
    int.TryParse(this.TxtHodnota.Text, out int hodnota);
 
    /* Přiřazení dolní meze intervalu hodnoty prvku z objektu na formuláři
     * do lokální proměnné */
    int.TryParse(this.TxtMinHodnota.Text, out int minh);
    
    /* Přiřazení horní meze intervalu hodnoty prvku z objektu na formuláři
     * do lokální proměnné */
    int.TryParse(this.TxtMaxHodnota.Text, out int maxh);
 
    /* Pokud index prvku je mimo interval hodnot, tj. je menší než 0, 
     * nebo je větší než rozměr vektoru - 1, pak... */
    if ((index < 0) || (index > this.pocetPrvku - 1))
    {
        // Zobrazení varovného dialogového okna
        MessageBox.Show("Zadaná hodnota indexu prvku je mimo meze", "Chyba v zadání",
            MessageBoxButton.OK, MessageBoxImage.Error);
    }
    /* Pokud hodnota prvku je větší než horní mez intervalu povolené hodnoty prvku, nebo
     * je menší než dolní mez intervalu hodnot prvku, pak... */
    else if ((hodnota > maxh) || (hodnota < minh))
    {
        // Zobrazení varovného dialogového okna
        MessageBox.Show("Zadaná hodnota prvku je mimo meze", "Chyba v zadání",
            MessageBoxButton.OK, MessageBoxImage.Error);
    }
    // Jinak...
    else
    {
        /* Přiřazení hodnoty z lokální proměnné do prvku vektoru 
         * na pozici [index] */
        this.pole[index] = hodnota;
        // Zavolání metody pro zobrazení vektoru v objektu (typu TextBox) na formuláři
        this.ZobrazitPoleJakoText(this.pocetPrvku, this.pole);
        // Zavolání metody pro zobrazení vektoru do objektu (typu ListView) na formuláři
        this.ZobrazitPoleVListView(this.pole);
        // Pokud index prvku je menší než celkový počet prvků - 1, pak...
        if (index < this.pocetPrvku - 1)
        {
            // Zvýšení indexu prvku o 1
            index++;
            // Přiřazení indexu prvku do objektu na formuláři
            this.TxtPrvekIndex.Text = index.ToString();
        }
    }
}

Kód 3: Deklarace metody pro ruční plnění pole definovanými hodnotami uživatelem (BntJednotlive_Click)

Nyní budeme deklarovat poslední metodu v regionu Plnění pole, umístněného v regionu Pomocné metody. Jedná se o soukromou metodu bez návratu s názvem NulovatPole - viz Kód 4. Tato metoda pomocí cyklu s krokem bude procházet všechny prvky předaného vektoru a zajistí přepsání stávající hodnoty prvku hodnotou 0. 

/// <summary>
/// Metoda pro nulování hodnot ve vektoru
/// </summary>
/// <param name="n"> počet prvků vektoru (předání parametru hodnotou - pouze vstup) </param>
/// <param name="pole"> jednorozměrné pole </param>
private void NulovatPole(int n, int[] pole)
{
    // Cyklus s pevným krokem - pro procházení prvků
    for (int i = 0; i < n; i++)
    {
        // Přiřazení nuly prvku na pozici [i]
        pole[i] = 0;
    }
}

Kód 4: Deklarace metody pro přepsaní hodnot prvků hodnotou 0 u předaného pole (NulovatPole)

Po deklaraci metody pro plnění vektoru hodnotou 0, se přemístíme do regionu Události a dále do regionu Plnění pole, ve kterém nalezneme metodu BtnNulovat_Click, jejíž tělo budeme plnit - viz Kód 5. Tato metoda obsluhy události stisknutí tlačítka BtnNulovat, zajistí plnění vektoru nulami. Jak vidíme, v následujícím kódu v těle metody je volána soukromá metoda bez návratu s názvem NulovatPole, kterou jsme deklarovali v předchozím kódu. Skutečné parametry volané metody jsou počet prvků vektoru a samotný vektor.

/// <summary>
/// Metoda pro zavolání metody pro nulování vektoru
/// </summary>
private void BtnNulovat_Click(object sender, RoutedEventArgs e)
{
    //Zavolání metody pro nulování vektoru
    this.NulovatPole(this.pocetPrvku, this.pole);
}

Kód 5: Deklarace metody pro zavolání metody pro nulování jednorozměrného pole (BntNulovat_Click)