Převod do soustav
2. PrevodDoSoustavWPF
2.5. Výsledný kód
XAML kód
Výsledný XAML kód formuláře (MainWindow.xaml) - viz Kód 1.
<Window x:Class="PrevodDoSoustavWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:PrevodDoSoustavWPF" mc:Ignorable="d" Title="Převod čísla" Height="450" Width="500"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <!-- Vstupní data --> <GroupBox Header="Vstupní data" Margin="5"> <!-- Mřížka v sekci vstupní data --> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <!-- Typ soustavy, počet bytů --> <StackPanel Margin="5"> <!-- Typ soustavy --> <StackPanel Margin="5,10,5,5"> <Label Content="Soustava:" /> <ComboBox Name="CmbSoustava" Margin="15,5,5,5"> <ComboBoxItem Content="Dvojková"/> <ComboBoxItem Content="Šestnáctková"/> </ComboBox> </StackPanel> <!-- Počet bytů --> <StackPanel Margin="5,10,5,5"> <Label Content="Počet bytů" /> <ComboBox Name="CmbBytu" Margin="15,5,5,5"> <ComboBoxItem Content="1"/> <ComboBoxItem Content="2"/> <ComboBoxItem Content="4"/> <ComboBoxItem Content="8"/> </ComboBox> </StackPanel> </StackPanel> <!-- Převáděné číslo --> <StackPanel Grid.Column="1" Margin="5"> <StackPanel Margin="5,10,5,5"> <Label Content="Číslo:" /> <TextBox Name="TxtCislo" Text="?" Margin="15,5,5,5" FontSize="14" FontWeight="Bold"/> </StackPanel> </StackPanel> </Grid> </GroupBox> <!-- Výstupní data --> <GroupBox Header="Výstupní data" Grid.Row="1" Margin="5"> <StackPanel> <Label Content="Výsledek:" FontWeight="Bold" FontSize="14" /> <TextBox Name="TxtVysledek" Margin="20,5" Padding="5" Grid.Row="2" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="14" FontWeight="Bold" IsReadOnly="True" Background="AliceBlue"/> </StackPanel> </GroupBox> <!-- Tlačítka --> <StackPanel Grid.Row="2"> <WrapPanel HorizontalAlignment="Center"> <Button Name="BtnPrevod" Content="Převod" Margin="5" Width="100" Padding="5" Click="BtnPrevod_Click"/> </WrapPanel> <WrapPanel HorizontalAlignment="Right"> <Button Name="BtnKonec" Content="Konec" Margin="5" Width="100" Padding="5" Click="BtnKonec_Click"/> </WrapPanel> </StackPanel> </Grid> </Window>
Kód 1: Výsledný XAML kód vytvořeného formuláře
C# kód
Code Behind - C# kód pro veškeré události vyvolané uživatelem při manipulaci s aplikací (MainWindow.xaml.cs) - viz Kód 2.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace PrevodDoSoustavWPF { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } #region Výpočty /// <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ý... */ 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(); } } // Jinak... else { // 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; } // 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í"; } // Výstupní text je návratem metody return s; } #endregion #region Události 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); } private void BtnKonec_Click(object sender, RoutedEventArgs e) { // Zavření formuláře this.Close(); } #endregion } }
Kód 2: Výsledný C# kód vytvořeného formuláře a metod jeho prvků
Výstup programu
Na následujícím obrázku vidíme výstup naší aplikace pro převod zadaného čísla v dekadické soustavě a jeho následného převodu do zvolené soustavy a jeho výpisem na požadovaným počet bitů. Pro ilustraci jsme vybrali případ převodu čísla 90 do dvojkové soustavy, které má být zobrazeno na 1 B - viz Výstup programu 1 - Kód 1 a 2. Provedení konverze a výpis čísla je pomocí stisknutí tlačítka Převod umístěného v dolní středové části formuláře.

Výstup programu 1 - Kód 1 a 2: Ukázka výpisu převedeného čísla do binární soustavy (PrevodDoSoustavWPF)
Pokud bychom číslo 90 chtěli převést do šestnáctkové soustavy, výsledek převodu by vypadal následovně - viz Výstup programu 2 - Kód 1 a 2.
Výstup programu 2 - Kód 1 a 2: Ukázka výpisu převodu čísla do šestnáctkové soustavy (PrevodDoSoustavWPF)
Posledním testovaným případem konverze je přetečení. Jak již z kapitole věnované analýze příkladu víme, do 1 Byte je možné uložit hodnotu 0 ÷ 255. Zkusme tedy vypsat hodnotu 256 na 1 Byte, tj. na 8 pozicích ve dvojkové soustavě, nebo na 2 pozicích v šestnáctkové soustavě - viz Výstup programu 3 - Kód 1 a 2.

Výstup programu 3 - Kód 1: Ukázka výpisu přetečení při převodu čísla do dvojkové soustavy (PrevodDoSoustavWPF)
Ve výpisu vidíme samé nuly, protože by teprve na 9. pozici byla zapsána číslice (znak) '1'. Hodnota 256 je ve dvojkové soustavě zapsána jako (1 0000 0000)2 a v šestnáctkové soustavě (100)16. Potřebovali bychom tedy minimálně 9 pozic pro výpis tohoto čísla ve dvojkové soustavě, nebo 3 pozice pro výpis v šestnáctkové, tzn. 2 B.
Aplikaci lze ukončit pomocí tlačítka Konec, nebo pomocí zavíracího tlačítka umístěného v pravém rohu aplikace.