Převod do soustav
2. PrevodDoSoustavWPF
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:
- BtnVypocti_Click
- BtnKonec_Click
private void BtnPrevod_Click(object sender, RoutedEventArgs e) { // Načtení zadaného čísla určeného ke konverzi int.TryParse(this.TxtCislo.Text, out int n); // Výpis konvertovaného čísla na formulář this.TxtVysledek.Text = Prevod(n); }
Kód 1: Deklarace metody pro převod čísla do zvolené soustavy (BtnPrevod_Click)
Do regionu Výpočty umístíme metodu, která bude převádět předané číslo v desítkové soustavě do zvolené soustavy na formuláři.
Do deklarované metody Prevod s textovým návratem bylo předáno načtené číslo z formuláře, které je určeno k převodu - viz Kód 2. Tento parametr je předán hodnotou, tzn. jeho hodnota je nakopírována do formálního parametru n ve volané metodě. Na začátku těla metody jsou deklarovány následující proměnné. U některých z těchto proměnných je v deklaraci zároveň provedena inicializace:
- p ... počet bitů, inicializace nulou
- c ... zbytek po celočíselném dělení
- d ... dělitel (základ soustavy), inicializace nulou
- s ... výstupní text (převedené číslo), inicializace prázdným textem
- i ... pozice bitu ve výstupním textu (inicializace bude provedena v cyklu s krokem)
Vzhledem k tomu, že kód těla metody je poměrně dlouhý, budeme postupně doplňovat jeho části, které jsme rozdělili do několika komentářů - viz Kód 2.
/// <summary> /// Převod čísla z desítkové soustavy do dvojkové, nebo šestnáctkové soustavy /// </summary> /// <param name="n"> převáděné číslo (desítková soustava) </param> /// <returns> textový řetězec převedeného čísla </returns> private string Prevod(int n) { /* Deklarace: 'p' ... počet bitů - inicializace; 'd' ... dělitel (základ soustavy) - inicializace; * 'c' ... zbytek po celočíselném dělení; 's' ... výstupní text (převedené číslo) - inicializace; * 'i' ... pozice bitu ve výstupním textu */ int p = 0; int d = 0; int c, i; string s = ""; /* Pokud nebyl zvolen typ soustavy (index položky je roven -1), nebo nebyl zvolen * počet bytů (text v ComboBox je prázdný... */ // Jinak... // Výstupní text je návratem metody return s; }
Kód 1: Základní struktura metody s textovým návratem pro převod čísla do zvolené soustavy na určitý počet bytů
Pod komentář /* Pokud nebyl zvolen typ soustavy ... umístíme kladnou větev (pokud je splněna podmínka) příkazu if. V podmínce rozhodování budeme testovat, zda je zvolen některý z typů soustavy. To provedeme pomocí testování hodnoty ve vlastnosti SelectedIndex v rozevíracím seznamu CmbSoustava (objekt typu ComboBox). Pokud nebyla zvolená žádná položka z rozevíracího seznamu, index zvolené položky je roven -1 (první položka seznamu je indexována hodnotou 0). V podmínce použijeme logický operátor nebo ||, pomocí níž testujeme zda došlo ke splnění první části podmínky (nezvolen typ soustavy), nebo druhé části v níž je testováno, zda nebyla zvolena hodnota počtu bytů, na které má být číslo zobrazeno. To provedeme pomocí porovnání hodnoty v rozevíracím seznamu s prázdnou textovou hodnotu (string.Empty) uložené ve vlastnosti Text.
Pokud je splněna podmínka, provede se další test, zda nebyl zvolen typ soustavy (nějaká položka ze seznamu). Pokud nebyl, tzn. je splněna podmínka, je otevřeno (příkaz Show) dialogové okno (objekt MessageBox) s ikonou informace (MessageBoxImage.Information) a s jedním tlačítkem OK (MessageBoxButton.OK). Po stisknutí tlačítka OK, je uživatel přepnut (příkaz Focus) na rozevírací seznam pro výběr typu soustavy (CmbSoustava).
Pokud nebyl zvolen typ soustavy, nebo počet bytů, je testována ve větvi nesplnění podmínky další podmínka, zda nebyl zvolen počet bytů. Pokud ano, je postupováno stejným způsobem, jako v předchozím případu - viz Kód 2.
/* Pokud nebyl zvolen typ soustavy (index položky je roven -1), nebo nebyl zvolen * počet bytů (text v ComboBox je prázdný... */ if (this.CmbSoustava.SelectedIndex == -1 || this.CmbBytu.Text == string.Empty) { // Pokud nebyl zvolen typ soustavy... if (this.CmbSoustava.SelectedIndex == -1) { // Výzva k výběru typu soustavy v dialogovém informačním okně MessageBox.Show("Vyberte soustavu", "Chybí nastavení", MessageBoxButton.OK, MessageBoxImage.Information); // Zacílení na ComboBox na formuláři this.CmbSoustava.Focus(); } // Jinak, pokud nebyl zvolen počet bytů... else if (this.CmbBytu.Text == string.Empty) { // Výzva k výběru počtu bytů v dialogovém informačním okně MessageBox.Show("Vyberte počet bytů", "Chybí nastavení", MessageBoxButton.OK, MessageBoxImage.Information); // Zacílení na ComboBox na formuláři this.CmbBytu.Focus(); } }
Kód 2: Pokud nebyl zvolen typ soustavy, nebo nebyl zvolen počet bytů - rozhodování a příslušné akce
Pod komentář // Jinak... umístíme následující zdrojový kód, který bude proveden, pokud uživatel zvolil typ soustavy a zvolil počet bytů, na které má být převedené číslo zobrazeno - viz Kód 3. Jedná se tedy o větev else, která je součástí rozhodovacího příkazu if. Kód znovu rozdělíme do několika sekcí popsaných komentáři.// Jinak... else { // Přepínač - pokud byla vybrána ze seznamu soustava, tj. index zvolené položky ze seznamu... // Cyklus s krokem – pro všechny bity (počet bitů uložen v proměnné 'p')... // Pokud je převáděné číslo větší než nula -> výstupní text = stávající výstupní text + "přetečení" }
Kód 3: Pokud byl zvolen typ soustavy, nebo byl zvolen počet bytů
Pod komentář // Přepínač - ... umístíme vícenásobné větvení (příkaz switch - někdy též nazýváno přepínač), které bude rozhodovat o tom, co se má provést, pokud uživatel vybral v rozevíracím seznamu CmbBytu daný typ soustavy (větev bude vybrána na základě indexu zvolené položky v tomto seznamu). Pokud uživatel zvolil dvojkovou soustavu (index vybrané položky CmbBytu je roven 0) je provedeno nastavení hodnoty počtu bitů v závislosti na zvoleném počtu bytů na formuláři. Dále musí být nastavena hodnota dělitele na hodnotu 2 (dvojková soustava). Každá větev vícenásobného větvení je uzavřena příkazem break. Stejným způsobem je provedena větev, pokud index zvolené položky v CmbBytu je roven 1, tzn. šestnáctková soustava (byte lze zobrazit na 2 pozice a dělitel je 16).
// Přepínač - pokud byla vybrána ze seznamu soustava, tj. index zvolené položky ze seznamu... switch (this.CmbSoustava.SelectedIndex) { // Je roven 0, tzn. je vybrána dvojková soustava... case 0: /* Nastavení hodnoty počtu bitů v závislosti na počtech bytů (1 byte = 8 bitů v binární soustavě) */ p = int.Parse(this.CmbBytu.Text) * 8; // Nastavení dělitele na hodnotu 2 d = 2; // Konec větve break; // Je roven 1, tzn. je vybrána šestnáctková (hexadecimální) soustava... case 1: /* Nastavení hodnoty počtu bitů v závislosti na počtech bytů (1 byte lze zobrazit na 2 pozice * v šestnáctkové soustavě) */ p = int.Parse(CmbBytu.Text) * 2; // Nastavení dělitele na hodnotu 2 d = 16; break; }
Kód 4: Vícenásobné větvení - přepínání v závislosti na zvoleném typu soustavy
Pod komentář // Cyklus s krokem - ... umístíme zdrojový kód pro výpočet jednotlivých pozic převáděného čísla pomocí cyklu s krokem. Princip je totožný s předchozím příkladem PrevodDoSoustav řešeným pro konzolovou aplikaci, proto jej není nutné znovu popisovat.
// Cyklus s krokem – pro všechny bity (počet bitů uložen v proměnné 'p')... for (i = 1; i <= p; i++) { // Nastavení zbytku = hodnota po celočíselném dělení konvertovaného čísla dělitelem c = n % d; /* Pokud se jedná o konverzi čísla na číslici, nebo čísla na písmeno (podle hodnoty v 'c'), * tj, pokud je zbytek menší než 10 -> dvojková soustava... */ if (c < 10) { /* Pokud je zbytek menší než 10 (dvojková soustava) jedná se o konverzi čísla na číslici (znak) * Výstupní text = vložení znaku před stávající text (znak je v ASCII na pozici, která * je rovna hodnotě zbytku + ordinální hodnota znaku '0') */ s = (char)(c + (int)'0') + s; } // Jinak... else /* Pokud je zbytek větší nebo roven 10 (šestnáctková soustava) jedná se o konverzi čísla * na písmeno (znak) - výstupní text = vložení znaku před stávající text * (znak je v ASCII na pozici, která je rovna hodnotě zbytku - 10 + * ordinální hodnota znaku 'A') */ s = (char)(c - 10 + (int)'A') + s; // Pokud je bit násobkem čtvrté pozice -> vložení mezery do výstupního textu před stávající text if (i % 4 == 0) s = " " + s; // Vstupní číslo = celočíselné dělení stávajícího převáděného čísla dělitelem n = n / d; } // Pokud je převáděné číslo větší než nula -> výstupní text = stávající výstupní text + "přetečení" if (n > 0) s = s + " přetečení";
Kód 5: Provedení výpočtu hodnot pro jednotlivé pozice (bity) výsledného převedeného čísla
Poslední metodou v regionu Události, kterou musíme upravit je metoda pro obsluhu události Click tlačítka Konec. Tato metoda nám zavře formulář - viz Kód 6.private void BtnKonec_Click(object sender, RoutedEventArgs e) { // Zavření formuláře this.Close(); }
Kód 6: Deklarace metody bez návratu pro zavření formuláře (BtnKonec_Click)