2. FaktorialWPF

2.4. C#

V souboru MainWindow.xaml.cs obsahující kód na pozadí (Code Behind) byla vygenerována základní struktura našeho programu v C#. Vedle konstruktoru MainWindow této třídy byly také vygenerovány soukromé (private) metody bez návratu:

  • BtnFor_Click
  • BtnWhile_Click
  • BtnDoWhile_Click
  • BtnRekurze_Click
  • BtnMazat
  • BtnKonec_Click

Tyto metody umístíme do regionu Události, abychom oddělili kódy pro obsluhu události Click jednotlivých tlačítek od regionu Výpočty, do kterého umístíme metodu s rekurzivním volání funkce pro výpočet faktoriálu.

Prvním typem cyklu, použitým při výpočtu faktoriálu, je cyklus s krokem, který je využit v metodě pro obsluhu události tlačítka BtnFor - viz Kód 1. Hodnota pro níž je vypočten faktoriál, je načtena přímo z formuláře. Řídící proměnná cyklu je deklarována a inicializována přímo v cyklu for. Výpis vypočteného faktoriálu (konvertovaného čísla na text ve formátu bez desetinných míst) je vypsán na formulář.

private void BtnFor_Click(object sender, RoutedEventArgs e)
{
    // Deklarace: 'f' ... hodnota faktoriálu - inicializace
    long f = 1;
 
    // Načtení čísla pro výpočet faktoriálu a jeho konverze na číslo
    int.TryParse(TxtCislo.Text, out int n);
 
    // Cyklus s krokem; deklarace: 'i' ... čítač (aktuální číslo v součinu)
    for (int i = 1; i <= n; i++)
    {
        // Výpočet faktoriálu
        f = f * i;
    }
 
    // Zformátovaný výpis vypočteného faktoriálu (konverze na text)
    this.TxtFaktorial.Text = f.ToString("N0");
}

Kód 1: Deklarace metody pro výpočet faktoriálu pomocí cyklu s krokem (BtnFor_Click)

Pro výpočet faktoriálu jsme v metodě pro obsluhu události stisknutí tlačítka BtnWhile využili cyklus s podmínkou na začátku - viz Kód 2. V této metodě jsou použity dvě lokální proměnné i a f. Proměnná i představuje čítač cyklu, ale zároveň představuje aktuální číslo v součinu. Tato proměnná je datového typu int, protože není zapotřebí velký rozsah zadávaných čísel vzhledem k horní mezi datového typu long vybraného pro proměnnou f, která představuje hodnotu vypočteného faktoriálu. Výraz f = f * i; bychom mohli zkrátit pomocí zápisu f *= i; . Dále jsme také zkrátili zápis inkrementace i = i + 1; na i++.

private void BtnWhile_Click(object sender, RoutedEventArgs e)
{
    /* Deklarace: 'i' ... čítač (aktuální číslo v součinu) - inicializace; 
     * 'f' ... hodnota faktoriálu - inicializace */
    int i = 1;
    long f = 1;
 
    // Načtení čísla pro výpočet faktoriálu a jeho konverze na číslo
    int.TryParse(TxtCislo.Text, out int n);
 
    // Opakuj, pokud je čítač menší, nebo roven číslu pro výpočet faktoriálu
    while (i <= n)
    {
        // Výpočet faktoriálu
        f = f * i;
 
        // Inkrementace čítače
        i++;
    }
 
    // Zformátovaný výpis vypočteného faktoriálu (konverze na text)
    this.TxtFaktorial.Text = f.ToString("N0");
}

Kód 2: Deklarace metody pro výpočet faktoriálu pomocí cyklu s podmínkou na začátku (BtnWhile_Click)

Další volanou metodou pro výpočet faktoriálu pomocí cyklu s podmínkou na konci je metoda pro obsluhu události tlačítka BtnDoWhile - viz Kód 3.

private void BtnDoWhile_Click(object sender, RoutedEventArgs e)
{
    /* Deklarace: 'i' ... čítač (aktuální číslo v součinu) - inicializace; 
     * 'f' ... hodnota faktoriálu - inicializace */
    int i = 1;
    long f = 1;
 
    // Načtení čísla pro výpočet faktoriálu a jeho konverze na číslo
    int.TryParse(TxtCislo.Text, out int n);
 
    do
    {
        // Výpočet faktoriálu
        f = f * i;
 
        // Inkrementace čítače
        i++;
    }
    // Opakuj, dokud je čítač menší, nebo roven číslu pro výpočet faktoriálu
    while (i <= n);
 
    // Zformátovaný výpis vypočteného faktoriálu (konverze na text)
    this.TxtFaktorial.Text = f.ToString("N0");
}

Kód 3: Deklarace metody pro výpočet faktoriálu pomocí cyklu s podmínkou na konci (BtnDoWhile_Click)

Další metodou pro obsluhu události stisknutí tlačítka BtnRekurze je metoda, kdy je výpočet faktoriálu realizován pomocí volání rekurzivní metody FaktorialRekurze s návratem - viz Kód 4. Tuto metodu umístíme mimo region Události do regionu s názvem Výpočty. 

private void BtnRekurze_Click(object sender, RoutedEventArgs e)
{
    // Deklarace: 'f' ... hodnota faktoriálu
    long f;
 
    // Načtení čísla pro výpočet faktoriálu a jeho konverze na číslo
    int.TryParse(TxtCislo.Text, out int n);
 
    // Volání rekurzivní funkce - předání čísla pro výpočet faktoriálu
    f = FaktorialRekurze(n);
 
    // Zformátovaný výpis vypočteného faktoriálu (konverze na text)
    this.TxtFaktorial.Text = f.ToString("N0");
}

Kód 4: Deklarace metody pro výpočet faktoriálu pomocí rekurze (BtnRekurze_Click)

Soukromá metoda s celočíselným návratem využívá principu rekurze, kde metoda volá sama sebe (tím se postupně zanořuje sama do sebe) - viz Kód 5.

/// <summary>
/// Metoda s celočíselným návratem pro výpočet faktoriálu pomocí rekurze
/// </summary>
/// <param name="n"> číslo pro výpočet faktoriálu </param>
/// <returns> vypočtený faktoriál </returns>
private long FaktorialRekurze(int n)
{
    // Pokud je předaná hodnota v parametru rovna nule
    if (n == 0)
    {
        // Faktoriál je 1
        return 1;
    }
    else
    {
        // Rekurzivní volání metody(metoda volá sama sebe)
        return n * FaktorialRekurze(n - 1);
    }
}

Kód 6: Deklarace soukromé rekurzivní metody s celočíselným návratem (FaktorialRekurze)

Předposlední metodou, kterou budeme vytvářet, je metoda pro výmaz vypsané hodnoty faktoriálu na formuláři. Pro vymazání textu v objektu typu TextBox použijeme příkaz (Clear) - viz Kód 7.

private void BtnMazat_Click(object sender, RoutedEventArgs e)
{
    // Vymazání předchozího výpisu faktoriálu
    this.TxtFaktorial.Clear();
}

Kód 7: Deklarace metody pro výmaz vypočteného faktoriálu vypsaného na formuláři (BtnMazat_Click)

Poslední metodou, kterou musíme upravit je metoda pro obsluhu události Click tlačítka Konec. Tato metoda nám zavře formulář - viz Kód 8.

private void BtnKonec_Click(object sender, RoutedEventArgs e)
{
    // Zavření formuláře
    this.Close();
}

Kód 8: Deklarace metody bez návratu pro zavření formuláře (BtnKonec_Click)