Faktoriál
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)