4. NejvetsiZe3CiselWPF

4.5. Výsledný kód

XAML kód

Výsledný XAML kód formuláře (MainWindow.xaml) - viz Kód 1.

<Window x:Class="NejvetsiZe3CiselWPF.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:NejvetsiZe3CiselWPF"
        mc:Ignorable="d"
        Title="Porovnej" Height="350" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Label Content="A (první celé číslo):" Grid.Row="1" Margin="25,5,5,5"/>
        <TextBox Name="TxtA" Grid.Row="1" Grid.Column="1" Margin="5" Text="0" VerticalContentAlignment="Center" GotFocus="TxtA_GotFocus" LostFocus="TxtA_LostFocus"/>
 
        <Label Content="B (druhé celé číslo):" Grid.Row="2" Margin="25,5,5,5" />
        <TextBox Name="TxtB" Grid.Row="2" Grid.Column="1" Margin="5" Text="0" VerticalContentAlignment="Center" GotFocus="TxtB_GotFocus" LostFocus="TxtB_LostFocus"/>
 
        <Label Content="C (třetí celé číslo):" Grid.Row="3" Margin="25,5,5,5"/>
        <TextBox Name="TxtC" Grid.Row="3" Grid.Column="1" Margin="5" Text="0" VerticalContentAlignment="Center" GotFocus="TxtC_GotFocus" LostFocus="TxtC_LostFocus"/>
 
        <StackPanel Grid.Row="5" Grid.ColumnSpan="2">
            <WrapPanel HorizontalAlignment="Center">
                <Button Name="BtnPorovnej1"  Content="Porovnej varianta 1" Margin="5" Padding="5" Click="BtnPorovnej1_Click"/>
                <Button Name="BtnPorovnej2" Content="Porovnej varianta 2" Margin="5" Padding="5" Click="BtnPorovnej2_Click"/>
                <Button Name="BtnPorovnej3" Content="Porovnej varianta 3" Margin="5" Padding="5" Click="BtnPorovnej3_Click"/>
                <Button Name="BtnPorovnej4" Content="Porovnej varianta 4" Margin="5" Padding="5" Click="BtnPorovnej4_Click"/>
                <Button Name="BtnPorovnej5" Content="Porovnej varianta 5" Margin="5" Padding="5" Click="BtnPorovnej5_Click"/>
            </WrapPanel>
            <WrapPanel HorizontalAlignment="Right">
                <Button Name="BtnKonec" Content="Konec" Margin="5" Width="80" 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 NejvetsiZe3CiselWPF
{
    /// <summary>
    /// Statická třída obsahující deklaraci textové konstanty
    /// </summary>
    static class Constants
    {
        // Deklarace a inicializace datové složky třídy
        public const string ZadCislo = "Zadejte číslo";
    }
 
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        // Konstruktor třídy
        public MainWindow()
        {
            InitializeComponent();
            // Při spuštění aplikace je vypsán text v prvcích pro čísla
            TxtA.Text = Constants.ZadCislo;
            TxtB.Text = Constants.ZadCislo;
            TxtC.Text = Constants.ZadCislo;
        }
 
        /// <summary>
        /// Metoda s celočíselným návratem většího čísla ze dvou přijímaných čísel
        /// </summary>
        /// <param name="x"> první celé číslo předané hodnotou </param>
        /// <param name="y"> druhé celé číslo předané hodnotou </param>
        /// <returns> maximum ze dvou čísel </returns>
        private int VetsiRovno(int x, int y)
        {
            // Pokud je první předané číslo větší, nebo rovno druhému...
            if (x >= y)
 
                // Metoda navrací první číslo
                return x;
            // Jinak...
            else
                // Metoda navrací druhé číslo
                return y;
 
            // Jiný způsob řešení pomocí ternárního operátoru
            //return (a >= b ? a : b); 
        }
 
        #region Události
 
        // Vymazání počátečního textu v objektu pro první číslo
        private void TxtA_GotFocus(object sender, RoutedEventArgs e)
        {
            // Pokud je umístěn počáteční text "Zadejte číslo" v objektu pro první číslo 
            if (this.TxtA.Text == Constants.ZadCislo)
            {
                // Vymazání textu v objektu pro první číslo
                this.TxtA.Text = string.Empty;
            }
        }
 
        // Vymazání počátečního textu v objektu pro druhé číslo
        private void TxtB_GotFocus(object sender, RoutedEventArgs e)
        {
            if (this.TxtB.Text == Constants.ZadCislo)
            {
                this.TxtB.Text = string.Empty;
            }
        }
 
        // Vymazání počátečního textu v objektu pro třetí číslo
        private void TxtC_GotFocus(object sender, RoutedEventArgs e)
        {
            if (this.TxtC.Text == Constants.ZadCislo)
            {
                this.TxtC.Text = string.Empty;
            }
        }
 
        // Vyplnění počátečního textu v objektu pro první číslo při opuštění prázdného objektu
        private void TxtA_LostFocus(object sender, RoutedEventArgs e)
        {
            // Pokud objekt prvního čísla neobsahuje text, nebo nelze konvertovat text na číslo
            if ((this.TxtA.Text == string.Empty) || (int.TryParse(this.TxtA.Text, out int a) == false))
            {
                // Vyplnění objektu textem "Zadejte číslo"
                this.TxtA.Text = Constants.ZadCislo;
            }
        }
 
        // Vyplnění počátečního textu v objektu pro druhé číslo při opuštění prázdného objektu
        private void TxtB_LostFocus(object sender, RoutedEventArgs e)
        {
            // Pokud objekt prvního čísla neobsahuje text, nebo nelze konvertovat text na číslo
            if ((this.TxtB.Text == string.Empty) || (int.TryParse(this.TxtB.Text, out _) == false))
            {
                // Vyplnění objektu textem "Zadejte číslo"
                this.TxtB.Text = Constants.ZadCislo;
            }
        }
 
        // Vyplnění počátečního textu v objektu pro třetí číslo při opuštění prázdného objektu
        private void TxtC_LostFocus(object sender, RoutedEventArgs e)
        {
            // Pokud objekt prvního čísla neobsahuje text, nebo nelze konvertovat text na číslo
            if ((this.TxtC.Text == string.Empty) || (int.TryParse(this.TxtC.Text, out _) == false))
            {
                // Vyplnění objektu textem "Zadejte číslo"
                this.TxtC.Text = Constants.ZadCislo;
            }
        }
 
 
        // Metoda bez návratu pro porovnání 3 čísel - vnořené rozhodování
        private void BtnPorovnej1_Click(object sender, RoutedEventArgs e)
        {
            /* Deklarace lokálních proměnných: 'a' ... první celé číslo; 'b' ... druhé celé číslo;
             * 'c' ... třetí celé číslo */
            int a, b, c;
 
            // Konverze textu na číslo a uložení do proměnné 'a'
            int.TryParse(TxtA.Text, out a);
            int.TryParse(TxtB.Text, out b);
            int.TryParse(TxtC.Text, out c);
 
            // Porovnání prvního a druhé čísla
            if (a > b)
                // Vnořené rozhodování
                if (a > c)
                    // Výpis názvu maxima a hodnoty maxima do dialogového okna
                    MessageBox.Show("Největší je a = " + a);
                else
                    if (a == c)
                        MessageBox.Show("Největší je a = c = " + a);
                    else
                        MessageBox.Show("Největší je c = " + c);
            else
                if (a == b)
                    if (b > c)
                        MessageBox.Show("Největší je a = b = " + a);
                    else
                        if (b == c)
                            MessageBox.Show("Největší je a = b = c = " + a);
                        else
                            MessageBox.Show("Největší je c = " + c);
                else
                    if (b > c)
                        MessageBox.Show("Největší je b = " + b);
                    else
                        if (b == c)
                            MessageBox.Show("Největší je b = c = " + b);
                        else
                            MessageBox.Show("Největší je c = " + c);
        }
 
        // Metoda bez návratu pro porovnání 3 čísel - kaskádování (pomocí spojování podmínek)
        private void BtnPorovnej2_Click(object sender, RoutedEventArgs e)
        {
            // Deklarace lokálních proměnných: 'a', 'b', 'c' ... tři celá čísla
            int a, b, c;
 
            // Konverze textu na číslo a uložení do proměnné 'a'
            int.TryParse(TxtA.Text, out a);
            int.TryParse(TxtB.Text, out b);
            int.TryParse(TxtC.Text, out c);
 
            // Spojení dvou podmínek pomocí 'a zároveň'
            if (a > b && a > c)
                // Výpis názvu maxima a hodnoty maxima do dialogového okna
                MessageBox.Show("Největší je a = " + a);
            else 
                if (a > b && a == c)
                    MessageBox.Show("Největší je a = c = " + a);
                else 
                    if (a > b && a < c)
                        MessageBox.Show("Největší je c = " + c);
                    else 
                        if (a == b && a > c)
                            MessageBox.Show("Největší je a = b = " + a);
                        else 
                            if (a == b && a == c)
                                MessageBox.Show("Největší je a = b = c = " + a);
                            else 
                                if (a == b && a < c)
                                    MessageBox.Show("Největší je c = " + c);
                                else 
                                    if (a < b && b > c)
                                        MessageBox.Show("Největší je b = " + b);
                                    else 
                                        if (a < b && b == c)
                                            MessageBox.Show("Největší je b = c = " + b);
                                        else 
                                            if (a < b && b < c)
                                                MessageBox.Show("Největší je c = " + c);
                                            else
                                                MessageBox.Show("Někde je chyba!");
        }
 
        // Metoda bez návratu pro porovnání 3 čísel - volání metody s návratem
        private void BtnPorovnej3_Click(object sender, RoutedEventArgs e)
        {
            // Deklarace lokálních proměnných: 'a', 'b', 'c' ... tři celá čísla
            int a, b, c;
            /* Deklarace: 'max' ... hodnota největšího čísla (maxima); 
             * 's' ... text výsledného výpisu */
            int max;
            string s = "Největší je ";
 
            // Konverze textu na číslo a uložení do proměnné 'a'
            int.TryParse(TxtA.Text, out a);
            int.TryParse(TxtB.Text, out b);
            int.TryParse(TxtC.Text, out c);
 
            // Získání hodnoty maxima - první parametr je maximum z čísel 'a' a 'b'
            max = VetsiRovno(VetsiRovno(a, b), c);
 
            // Pokud je první číslo rovno maximum...
            if (a == max)
                // První číslo je maximem
                s += ("a = ");
            // Pokud je druhé číslo rovno maximum...
            if (b == max)
                // Druhé číslo je maximem
                s += ("b = ");
            // Pokud je třetí číslo rovno maximum...
            if (c == max)
                // Třetí číslo je maximem
                s += ("c = ");
            // Výpis názvu maxima a hodnoty maxima
            MessageBox.Show(s + max);
        }
 
        // Metoda bez návratu s výpisem maxima a zadaných hodnot - využití metody 'VetsiRovno'
        private void BtnPorovnej4_Click(object sender, RoutedEventArgs e)
        {
            // Deklarace lokálních proměnných: 'a', 'b', 'c' ... tři celá čísla
            int a, b, c;
 
            // Konverze textu na číslo a uložení do proměnné 'a'
            int.TryParse(TxtA.Text, out a);
            int.TryParse(TxtB.Text, out b);
            int.TryParse(TxtC.Text, out c);
 
            /* Pokud je návrat metody 'VetsiRovno' z prvních dvou porovnávaných čísel větší 
             * (nebo stejné) číslo než 3. číslo ... */
            if (VetsiRovno(a, b) >= c)
                // Výpis největší hodnoty z prvních dvou porovnávaných čísel
                MessageBox.Show("Největší (nebo rovné) je " + VetsiRovno(a, b) + " z čísel " + a + ", " + b + ", " + c);
            // Jinak... 
            else
                // Výpis největší hodnoty, tj. 3. čísla
                MessageBox.Show("Největší (nebo rovné) je " + c + " z čísel " + a + ", " + b + ", " + c);
        }
 
        // Metoda bez návratu s výpisem maxima a zadaných hodnot - dvojité volání metody 'VetsiRovno'
        private void BtnPorovnej5_Click(object sender, RoutedEventArgs e)
        {
            // Deklarace lokálních proměnných: 'a', 'b', 'c' ... tři celá čísla
            int a, b, c;
 
            // Konverze textu na číslo a uložení do proměnné 'a'
            int.TryParse(TxtA.Text, out a);
            int.TryParse(TxtB.Text, out b);
            int.TryParse(TxtC.Text, out c);
 
            /* Výpis největší hodnoty - využití dvojitého volání metody 'VetsiRovno' - první návrat metody 
             * obsahuje vyšší číslo z prvních dvou předaných čísel -> porovnání návratu metody se třetím 
             * předaným číslem -> získání maxima -> konverze hodnoty na číslice */
            MessageBox.Show(string.Format("Největší (nebo rovné) je {0} z čísel {1}, {2}, {3}", VetsiRovno(VetsiRovno(a, b), c), a, b, c));
        }
 
        //Metoda bez návratu pro zavření formuláře
        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 vytvořené aplikace pro porovnání tří zadaných čísel A, B a C na formuláři. Porovnání zadaných celých čísel je prováděno pomocí různých typů metod, které jsou spouštěny pomocí příslušných tlačítek. U metod jsou také použity různé typy formátování výpisu výsledku. Při stisku tlačítek 1. až 3. varianty je určeno maximum, včetně názvu proměnné, ve které největší hodnota uložena - viz Výstup programu 1 - Kód 1 a 2. 


Výstup programu 1 - Kód 1 a 2: Dialogové okno - výpis hodnota maxima včetně názvu proměnné, ve které je uloženo

V metodách pro obsluhu stisknutí tlačítek u 1. a 3. varianty je ve výpisu také implementována možnost rovnosti čísel - viz Výstup programu 2 - Kód 1 a 2.


Výstup programu 2 - Kód 1 a 2: Dialogové okno - výpis stejných nejvyšších hodnot včetně názvu proměnných, ve kterých jsou uloženy

Pokud byl do prvku pro zadání čísla zadán text, který nelze konvertovat na celé číslo, při opuštění tohoto prvku bude do prvku umístěn text "Zadejte číslo" - viz Výstup programu 3 - Kód 1 a 2.



Výstup programu 3 - Kód 1 a 2: Zadání nevalidní celočíselné hodnoty na formuláři

Pokud uživatel stiskne tlačítko pro 4. nebo 5. variantu, již neobdrží název proměnné, ve které je hodnota maxima uložena - viz Výstup programu 4 - Kód 1 a 2. 


Výstup programu 4 - Kód 1 a 2: Dialogové okno - výpis hodnota maxima 

Aplikaci lze ukončit pomocí tlačítka Konec, nebo pomocí zavíracího tlačítka umístěného v pravém rohu aplikace.