2. PrvocislaWPF

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, které umístíme do oblasti Události:

  • BtnVypis_Click
  • BtnKonec_Click
Do regionu Výpočty umístíme metodu, která bude testovat, zda dané číslo je prvočíslo.

Načtení počtu prvočísel v řadě je provedeno pomocí vlastnosti Text objektu TxtN na formuláři. Pokud nelze provést konverzi, nebo platí druhá podmínka, že číslo bylo záporné (negace obou podmínek spojených pomocí logického operátoru a zároveň), je zobrazeno varovné dialogové okno s výzvou pro zadání validní hodnoty počtu čísel v řadě a je opuštěna obsluha události Click tlačítka BtnVypis. Hodnota z formuláře je pomocí výstupního parametru metody TryParse uložena do celočíselné proměnné pocetCisel - viz Kód 1. Inicializace proměnných počtu nalezených čísel n, byla provedena přímo v deklarace (počet je na začátku nulový). Dále musí být inicializována hodnota v proměnné i (čítač), do které budeme ukládat testované číslo, které může být prvočíslem, nebo nikoliv. 

Před prováděním testu v cyklu while (zda již byl vypsán požadovaný počet prvočísel) je provedeno vypnutí funkčnosti kurzoru myši, tzn. během provádění cyklu nelze klikat myší na tlačítka proto, dříve než cyklus proběhne (vlastnost OverrideCursor). Funkčnost kurzoru bude zapnuta až po proběhnutí cyklu a výpisu výsledné řady prvočísel na formulář. 

Testování, zda je aktuální číslo prvočíslem, probíhá pomocí volání metody s logickým návratem Prvocislo. Této metodě je předáno aktuální testované číslo uložené ve skutečném parametru i. Pokud návrat metody je true, je testované číslo prvočíslem a musí být zvýšen počet nalezených prvočísel o hodnotu 1 (inkrementace n++;). Toto číslo musí také být konvertováno na číslici a následně zapsáno do řady již nalezených čísel, která jsou zapsána v proměnné vystup. Jednotlivé číslice jsou od sebe odděleny čárkou, proto se uvnitř těla cyklu nalézá ještě další podmínka testující, zda se nenacházíme u posledního prvočísla v řadě, u kterého se již žádná čárka připojovat nebude. Na konci iterace je zvýšeno testované číslo o hodnotu 1 (inkrementace i++;)

private void BtnVypis_Click(object sender, RoutedEventArgs e)
{
    /* Deklarace: 'pocetCisel' ... počet prvočísel, která mají být vypsána; 
     * 'n' ... počet nalezených prvočísel - inicializace; 'i' ... testované číslo 
     * na prvočíslo (čítač) - inicializace; 'vystup' ... textová proměnná, do které 
     * budeme ukládat výsledek - inicializace */
    int pocetCisel;
    int n = 0;
    int i = 2;
    string vystup = "";
 
    if (!((Int32.TryParse(this.TxtN.Text, out pocetCisel)) && (pocetCisel > 0)))
    {
        // Zobrazení varovného dialogového okna
        MessageBox.Show("Zadejte platnou kladnou celočíselnou hodnotu pro počet čísel.", "Varování", 
            MessageBoxButton.OK, MessageBoxImage.Warning);
        return;
    }
 
    // Vypnutí funkčnosti kurzoru (nelze klikat)
    Mouse.OverrideCursor = Cursors.Wait;
 
    // Vymazání předchozí vypsané řady
    this.TxtPrvocisla.Text = "";
 
    // Cyklus - pokud platí, že je nalezeno méně než specifikovaný počet prvočísel
    while (n < pocetCisel)
    {
        // Pokud návrat zavolané funkce testu na prvočíslo u testovaného čísla je pravda
        if (Prvocislo(i))
        {
            // Zvýšeni hodnoty poctu nalezených prvočísel o 1
            n++;
 
            // Připojení číslice (testovaného čísla konvertovaného na text) k předchozím
            vystup += i.ToString();
 
            // Pokud není vypsán požadovaný počet prvočísel
            if (n < pocetCisel)
            {
                // Připoj za číslo čárku
                vystup += ", ";
            }
        }
 
        // Nové testované číslo, které je o 1 vyšší než předchozí
        i++;
    }

Kód 1: Deklarace metody pro výpis řady prvočísel o definované délce (BtnVypis_Click)

V regionu Výpočtu nalezneme deklaraci metody Prvocislo s logickým návratem (datový typ bool) vidíme, že ještě před testováním formálního parametru n předaného hodnotou je provedena inicializace u obou proměnných - na začátku prohlásíme testované číslo prvočíslem a prvním dělitelem je číslo 2 - viz Kód 2. V cyklu while je provedeno testování na dělení beze zbytku, které bylo popsáno již v předchozí kapitole. Pokud bylo číslo dělitelné beze zbytku alespoň nějakým dělitelem, toto číslo není prvočíslem (b = false;).

// Metoda s návratem - návrat, zda je předané číslo prvočíslo (true), nebo nikoliv (false)
private bool Prvocislo(int n)
{
    /* Deklarace (inicializace): 'b' ... informace, zda je testované (předané) číslo 
     * prvočíslem (true - je prvočíslem); 'i' ... dělitel (čítač) */
    bool b = true;
    int i = 2;
 
    // Cyklus - dokud platí, že testované číslo je prvočíslo a čítač je menší než testované číslo
    while (b == true && i < n)
    {
        // Pokud testované číslo je dělitelné beze zbytku
        if (n % i == 0)
        {
            // Testované číslo není prvočíslo
            b = false;
        }
 
        // Inkrementace
        i++;
    }
 
    // Výstupem metody je informace, která je uložena v logické proměnné
    return b;
}

Kód 2: Deklarace soukromé metody s logickým návratem pro testování, zda je předané číslo prvočíslem (Prvocislo)

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 3.

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

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