Dvourozměrné pole - WPF
Požadavky na absolvování
5. Výsledný kód
XAML kód
Výsledný XAML kód formuláře (MainWindow.xaml) - viz Kód 1.
<Window x:Class="DvourozmernePoleWPF.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:DvourozmernePoleWPF" mc:Ignorable="d" Title="Základní práce s maticí" Height="850" Width="850" MinHeight="800" MinWidth="800"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <!-- Nastavení matice --> <GroupBox Header="Nastavení matice"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Label Content="Matice" FontSize="18" FontWeight="Bold" HorizontalAlignment="Center" /> <Grid Grid.Row="1"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <!-- Rozměry matice --> <GroupBox Header="Rozměry matice"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Label Content="Počet řádků:" VerticalAlignment="Center"/> <TextBox Name="TxtPocetRadku" Grid.Column="1" Width="100" Margin="5" Padding="5" LostFocus="TxtPocetRadku_LostFocus"/> <Label Content="Počet sloupců:" Grid.Row="1" VerticalAlignment="Center"/> <TextBox Name="TxtPocetSloupcu" Grid.Row="1" Grid.Column="1" Width="100" Margin="5" Padding="5" LostFocus="TxtPocetSloupcu_LostFocus"/> </Grid> </GroupBox> <!-- Hodnoty - meze --> <GroupBox Header="Hodnoty - meze" Grid.Column="1"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Label Content="Minimum:" VerticalAlignment="Center"/> <TextBox Name="TxtMinHodnota" Grid.Column="1" Width="100" Margin="5" Padding="5" LostFocus="TxtMinHodnota_LostFocus"/> <Label Content="Maximum:" Grid.Row="1" VerticalAlignment="Center"/> <TextBox Name="TxtMaxHodnota" Grid.Row="1" Grid.Column="1" Width="100" Margin="5" Padding="5" LostFocus="TxtMaxHodnota_LostFocus"/> </Grid> </GroupBox> <!-- Prvek v matici --> <GroupBox Header="Prvek v matici" Grid.Column="3"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Label Content="Index řádku:" Grid.Row="0" Grid.Column="0"/> <TextBox Name="TxtPrvekIndexRadku" Grid.Row="0" Grid.Column="1" Width="100" Margin="5" Padding="5" LostFocus="TxtPrvekIndexRadku_LostFocus"/> <Label Content="Index sloupce:" Grid.Row = "1" Grid.Column="0"/> <TextBox Name="TxtPrvekIndexSloupce" Grid.Row="1" Grid.Column="1" Width="100" Margin="5" Padding="5" LostFocus="TxtPrvekIndexSloupce_LostFocus"/> <Label Content="Hodnota:" Grid.Row="0" Grid.Column="2"/> <TextBox Name="TxtHodnota" Grid.Row="0" Grid.Column="3" Width="100" Margin="5" Padding="5" LostFocus="TxtHodnota_LostFocus"/> </Grid> </GroupBox> </Grid> </Grid> </GroupBox> <!-- Zobrazení matice --> <GroupBox Header="Zobrazení matice" Grid.Row="1"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <!-- Matice --> <GroupBox Header="Mřížka" Margin="5" MinHeight="100"> <ListView Name="LstMatice" ScrollViewer.VerticalScrollBarVisibility="Auto"/> </GroupBox> <!-- Výsledek --> <GroupBox Header="Jako text (nebo výpis výsledku)" Grid.Column="2" Margin="5"> <TextBox Name="TxtVysledek" Margin="5" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible" IsReadOnly="True" Background="AliceBlue"/> </GroupBox> </Grid> </GroupBox> <!-- Tlačítka - sekce: Plnit, Výstup, Výpočet --> <StackPanel Grid.Row="4"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <!-- Plnit --> <StackPanel > <Label Content="Plnit:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/> <Button Name="BtnNahodne" Content="Náhodně" Margin="5" Padding="10,5" Click="BtnNahodne_Click"/> <Button Name="BtnJednotlive" Content="Jednotlivě" Margin="5" Padding="10,5" Click="BtnJednotlive_Click"/> <Button Name="BtnNulovat" Content="Nulovat" Margin="5" Padding="10,5" Click="BtnNulovat_Click"/> </StackPanel> <!-- Výstup --> <StackPanel Grid.Column="1"> <Label Content="Výstup:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/> <Button Name="BtnJakoText" Content="Jako text" Margin="5" Padding="10,5" Click="BtnJakoText_Click"/> <Button Name="BtnDoMrizky" Content="Do mřížky" Margin="5" Padding="10,5" Click="BtnDoMrizky_Click"/> </StackPanel> <!-- Výpočet --> <StackPanel Grid.Column="2"> <Label Content="Výpočet:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/> <Button Name="BtnMinimum" Content="Minimum" Margin="5" Padding="10,5" Click="BtnMinimum_Click"/> <Button Name="BtnMaximum" Content="Maximum" Margin="5" Padding="10,5" Click="BtnMaximum_Click"/> <Button Name="BtnPrumer" Content="Průměr" Margin="5" Padding="10,5" Click="BtnPrumer_Click"/> <Button Name="BtnSeradit" Content="Seřadit" Margin="5" Padding="10,5" Click="BtnSeradit_Click"/> <Button Name="BtnTranspoziceHlavni" Content="Transpozice - hlavní diagonála" Margin="5" Padding="10,5" Click="BtnTranspoziceHlavni_Click"/> <Button Name="BtnTranspoziceVedlejsi" Content="Transpozice - vedlejší diagonála" Margin="5" Padding="10,5" Click="BtnTranspoziceVedlejsi_Click"/> </StackPanel> </Grid> <!-- Konec --> <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 DvourozmernePoleWPF { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { #region Datové složky třídy (globální proměnné) /* Specifikace konstanty pro maximální vertikální (počet řádků) a horizontální * (počet sloupců) rozměr matice - inicializace */ const int Max = 10; // Aktuální rozměr pole - počet řádků private int pocetRadku; // Aktuální rozměr pole - počet sloupců private int pocetSloupcu; // Přípustná minimální hodnota (dolní mez) prvku - inicializace private int minHodnota = 1; // Přípustná maximální hodnota (horní mez) prvku - inicializace private int maxHodnota = 100; // Deklarace dvourozměrného pole - matice private int[,] pole; #endregion Datové složky třídy public MainWindow() { InitializeComponent(); //Inicializace atributů pole a prvků na formuláři Inicializace(); } #region Pomocné metody #region Nastavení atributů pole /// <summary> /// Inicializace atributů pole a prvků na formuláři /// </summary> private void Inicializace() { // Přiřazení maximálního počtu řádků matice do datové složky this.pocetRadku = Max; // Přiřazení maximálního počtu sloupců matice do datové složky this.pocetSloupcu = Max; // Vytvoření instance (objektu) matice s definovanými rozměry this.pole = new int[this.pocetRadku, this.pocetSloupcu]; // Přiřazení počtu řádků matice do objektu na formuláři this.TxtPocetRadku.Text = this.pocetRadku.ToString(); // Přiřazení počtu sloupců matice do objektu na formuláři this.TxtPocetSloupcu.Text = this.pocetSloupcu.ToString(); /* Přiřazení přípustné minimální hodnoty prvku v matici do objektu * na formuláři určujícího mezní hodnotu */ this.TxtMinHodnota.Text = this.minHodnota.ToString(); /* Přiřazení přípustné maximální hodnoty prvku v matici do objektu (pole) * na formuláři určujícího mezní hodnotu */ this.TxtMaxHodnota.Text = this.maxHodnota.ToString(); } #endregion Nastavení atributů pole #region Plnění pole /// <summary> /// Metoda pro plnění prvků matice náhodnými čísly /// </summary> /// <param name="n"> počet prvků pole </param> /// <param name="minh"> minimální celočíselná hodnota prvku </param> /// <param name="maxh"> maximální celočíselná hodnota prvku </param> /// <param name="pole"> matice </param> private void NahodnePole(int m, int n, int minh, int maxh, int[,] pole) { // Vytvoření instance generátoru náhodného čísla Random rnd = new Random(); // Cyklus s pevným krokem - pro procházení řádků matice for (int i = 0; i < m; i++) { // Cyklus s pevným krokem - pro procházení sloupců matice for (int j = 0; j < n; j++) { // Přiřazení náhodného čísla v rozmezí intervalu u prvku na pozici [i, j] pole[i, j] = rnd.Next(minh, maxh + 1); } } } /// <summary> /// Metoda pro nulování prvků v matici /// </summary> /// <param name="m"> počet řádků matice </param> /// <param name="n"> počet sloupců matice </param> /// <param name="pole"> matice </param> private void NulovatPole(int m, int n, int[,] pole) { // Cyklus s pevným krokem - pro procházení řádků matice for (int i = 0; i < m; i++) { // Cyklus s pevným krokem - pro procházení sloupců matice for (int j = 0; j < n; j++) { // Přiřazení nuly prvku na pozici [i, j] pole[i, j] = 0; } } } #endregion Plnění pole #region Zobrazení pole /// <summary> /// Prvky v sloupcích matice jsou převedeny na text a odděleny čárkou, kde každá řádka /// matice je umístěna na novém řádku v objektu /// </summary> /// <param name="m"> počet řádků matice </param> /// <param name="n"> počet sloupců matice </param> /// <param name="pole"> matice </param> /// <returns> výstupní textový řetezec s prvky matice </returns> private string PoleJakoText(int m, int n, int[,] pole) { /* Lokální proměnná: 'vystup' - výsledek převodu na text - inicializace * a vložení nového řádku */ string vystup = ""; // Procházení řádků matice for (int i = 0; i < m; i++) { // Procházení sloupců matice for (int j = 0; j < n; j++) { // Převod hodnoty prvku na text včetně připojení čárky vystup += string.Format("{0:D3}, ", pole[i, j]); } // Přidání odstavce na konci každého řádku (také možnost vložení "\n") vystup += Environment.NewLine; } // Návrat výsledného textového řetězce return vystup; } /// <summary> /// Zobrazení matice na formuláři jako text v objektu typu TextBox /// </summary> /// <param name="m"> počet řádků matice </param> /// <param name="n"> počet sloupců matice </param> /// <param name="pole"> matice </param> private void ZobrazitPoleJakoText(int m, int n, int[,] pole) { // Výpis matice v objektu typu TextBox na formuláři this.TxtVysledek.Text = this.PoleJakoText(m, n, pole); } /// <summary> /// Zobrazení prvků matice na formuláři v objektu typu ListView /// </summary> /// <param name="m"> počet řádků matice </param> /// <param name="n"> počet sloupců matice </param> /// <param name="pole"> matice </param> private void ZobrazitPoleVListView(int m, int n, int[,] pole) { // Lokální proměnná: 'radka' - řádka matice převedená na text string radka; // Vymazání předchozí obsahu (přidaných prvků) this.LstMatice.Items.Clear(); // Procházení řádků matice for (int i = 0; i < m; i++) { // Vymazání předchozího obsahu řádky (textového řetězce) radka = ""; // Procházení sloupců matice for (int j = 0; j < n; j++) { // Převod hodnoty prvku na text včetně připojení čárky radka += string.Format("{0:D3}, ", pole[i, j]); } // Přidání textového řetězce (řádky matice) do obsahu objektu this.LstMatice.Items.Add(radka); } } #endregion Zobrazení pole #region Operace s polem /// <summary> /// Metoda pro hledání nejmenšího prvku v matici /// </summary> /// <param name="m"> počet řádků matice </param> /// <param name="n"> počet sloupců matice </param> /// <param name="pole"> matice </param> /// <param name="indexRadkuMinima"> index řádku minima </param> /// <param name="indexSloupceMinima"> index sloupce minima </param> /// <returns> celočíselná hodnota minima </returns> private int MinimumVPoli(int m, int n, int[,] pole, out int indexRadkuMinima, out int indexSloupceMinima) { // Lokální proměnné: 'i' - index řádku; 'j' - index sloupce; 'minimum' - hodnota minima int minimum; // Přiřazení maximální možné hodnoty datového typu int minimum = int.MaxValue; // Přiřazení hodnoty 0 do indexu řádku a sloupce minima - nutná inicializace indexRadkuMinima = indexSloupceMinima = -1; // Procházení řádků matice for (int i = 0; i < m; i++) { // Procházení sloupců matice for (int j = 0; j < n; j++) { // Pokud je nalezen prvek v matici, jehož hodnota je menší než minimum... if (pole[i, j] < minimum) { // Uložení hodnoty nalezeného prvku do minima minimum = pole[i, j]; // Přiřazení indexu řádku aktuálního prvku do indexu řádku minima indexRadkuMinima = i; // Přiřazení indexu sloupce aktuálního prvku do indexu sloupce minima indexSloupceMinima = j; } } } // Přiřazení hodnoty nalezeného minima do výstupu metody return minimum; } /// <summary> /// Metoda pro hledání největšího prvku v matici /// </summary> /// <param name="m"> počet řádků matice </param> /// <param name="n"> počet sloupců matice </param> /// <param name="pole"> matice </param> /// <param name="indRadkuMaxima"> index řádku maxima </param> /// <param name="indexSloupceMaxima"> index sloupce maxima </param> /// <returns> celočíselná hodnota maxima </returns> private int MaximumVPoli(int m, int n, int[,] pole, out int indRadkuMaxima, out int indexSloupceMaxima) { // Lokální proměnné: 'i' - index řádku; 'j' - index sloupce; 'maximum' - hodnota maxima int maximum; // Přiřazení nejmenší možné hodnoty datového typu int maximum = (-int.MaxValue - 1); // Přiřazení hodnoty 0 do indexu řádku a sloupce maxima - nutná inicializace indRadkuMaxima = indexSloupceMaxima = -1; // Procházení řádků matice for (int i = 0; i < m; i++) { // Procházení sloupců matice for (int j = 0; j < n; j++) { // Pokud je nalezen prvek v matici, jehož hodnota je větší než maximum... if (pole[i, j] > maximum) { // Uložení hodnoty nalezeného prvku do minima maximum = pole[i, j]; // Přiřazení indexu řádku aktuálního prvku do indexu řádku maxima indRadkuMaxima = i; // Přiřazení indexu sloupce aktuálního prvku do indexu sloupce maxima indexSloupceMaxima = j; } } } // Přiřazení hodnoty nalezeného maxima do výstupu metody return maximum; } /// <summary> /// Metoda pro výpočet aritmetického průměru prvků v matici /// </summary> /// <param name="m"> počet řádků matice </param> /// <param name="n"> počet sloupců matice </param> /// <param name="pole"> matice </param> /// <returns> hodnota aritmetického průměru (reálné číslo) </returns> private double PrumerPole(int m, int n, int[,] pole) { /* Lokální proměnné: 'i' ... index řádku matice; 'j'... index sloupce matice; * 'suma' - suma prvků matice */ int suma; // Nastavení počáteční hodnoty u sumy suma = 0; // Procházení řádků matice for (int i = 0; i < m; i++) { // Procházení sloupců matice for (int j = 0; j < n; j++) { // Přičtení dalšího prvku matice do sumy suma += pole[i, j]; } } /* Výpočet průměru (suma/počet prvků) a přiřazení hodnoty do výstupu metody * nutné přetypovat sumu na double, aby nedošlo k celočíselnému dělení */ return (double)suma / (m * n); } /// <summary> /// Metoda pro vzestupné třídění prvků v matici /// </summary> /// <param name="m"> počet řádků matice </param> /// <param name="n"> počet sloupců matice </param> /// <param name="pole"> matice </param> private void SeraditPole(int m, int n, int[,] pole) { /* Lokální proměnné: 'pom' ... pomocná proměnná pro dočasné uložení prvku; 'b' ... logická proměnná * obsahující informaci, zda došlo k prohození některých sousedních prvků; 'i' ... index řádku * matice; 'j' ... index sloupce matice */ int pom; bool b; // Pro všechny řádky matice for (int i = 0; i < m; i++) { // Opakuj tak dlouho u každé řádky, dokud bude docházet k prohození prvků do { // Nedošlo k prohození sousedních prvků b = false; // Pro všechny sloupce matice for (int j = 0; j < n - 1; j++) { /* Pokud hodnota sousedícího prvku je větší než hodnota aktuálně testovaného * prvku, pak... */ if (pole[i, j] > pole[i, j + 1]) { // Ulož hodnotu aktuálního prvku do pomocné proměnné pom = pole[i, j]; // Ulož hodnotu sousedícího prvku do aktuálního prvku pole[i, j] = pole[i, j + 1]; // Ulož hodnotu z pomocné proměnné do sousedícího prvku pole[i, j + 1] = pom; // Došlo k prohození sousedních prvků b = true; } } } // Testování, zda došlo k prohození některých sousedních prvků while (b == true); } } /// <summary> /// Metoda pro transpozici prvků matice podle hlavní diagonály /// </summary> /// <param name="m"> počet řádků matice </param> /// <param name="n"> počet sloupců matice </param> /// <param name="pole"> matice </param> private void HlavniTranspozice(int m, int n, int[,] pole) { /* Deklarace: 'pom' ... pomocná proměnná pro přesun osově souměrných prvků matice podle * hlavní diagonály; 'i' ... index řádku matice; 'j' ... index sloupce matice */ int pom; // Pokud počet řádek není roven počtu sloupců (matice není symetrická), pak... if (m != n) { // Výpis varovného upozornění MessageBox.Show("Nelze transponovat obdélníkovou matici"); // Ukončení metody return; } // Jinak ... else { // Od počátečního až předposledního řádku matice for (int i = 0; i < m - 1; i++) { // Od i + 1-tého sloupce do posledního sloupce matice for (int j = i + 1; j < m; j++) { // Uložení aktuálního prvku matice na pozici [i,j] do pomocné proměnné pom = pole[i, j]; /* Přepsání aktuálního prvku matice na pozici [i,j] osově souměrným prvkem * podle hlavní diagonály, tj. na pozici [j,i] */ pole[i, j] = pole[j, i]; /* Přepsání osově souměrného prvku na pozici [j,i] prvkem uloženým * v pomocné proměnné */ pole[j, i] = pom; } } } } /// <summary> /// Metoda pro transpozici prvků matice podle vedlejší diagonály /// </summary> /// <param name="m"> počet řádků matice </param> /// <param name="n"> počet sloupců matice </param> /// <param name="pole"> matice </param> private void VedlejsiTranspozice(int m, int n, int[,] pole) { /* Deklarace: 'pom' ... pomocná proměnná pro přesun osově souměrných prvků matice podle * vedlejší diagonály; 'i' ... index řádku matice; 'j' ... index sloupce matice */ int pom; // Pokud počet řádek není roven počtu sloupců (matice není symetrická) ... if (m != n) { // Výpis varovného upozornění MessageBox.Show("Nelze transponovat obdélníkovou matici"); // Ukončení metody return; } // Jinak ... else { // Od počátečního až předposledního řádku matice for (int i = 0; i < m - 1; i++) { // Od i + 1-tého sloupce do posledního sloupce matice for (int j = 0; j < m - i; j++) { // Uložení aktuálního prvku matice na pozici [i,j] do pomocné proměnné pom = pole[i, j]; /* Přepsání aktuálního prvku matice na pozici [i,j] osově souměrným prvkem * podle vedlejší diagonály, tj. na pozici [m-j-1,m-i-1] */ pole[i, j] = pole[m - j - 1, m - i - 1]; /* Přepsání osově souměrného prvku na pozici [m-j-1, m-i-1] prvkem uloženým * v pomocné proměnné */ pole[m - j - 1, m - i - 1] = pom; } } } } #endregion Operace s polem #endregion Pomocné metody #region Události #region Nastavení atributů pole /// <summary> /// Validace počtu řádků matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtPocetRadku_LostFocus(object sender, RoutedEventArgs e) { // Lokální proměnná: 'novaHodnota' - nový počet řádků matice int novaHodnota; /* Přiřazení počtu řádků z objektu na formuláři do lokální proměnné * určující počet řádků matice */ int.TryParse(this.TxtPocetRadku.Text, out novaHodnota); /* Pokud počet řádků je větší než maximální počet řádků matice, nebo počet * řádků matice je menší než 1, pak... */ if ((novaHodnota > Max) || (novaHodnota < 1)) { // Zobrazení dialogového okna s textem a hodnotou max. počtu řádků matice MessageBox.Show(String.Format("Chyba rozměru matice, nastavení na max. počet řádků: {0}", Max)); /* Přiřazení maximálního rozměru matice do lokální proměnné určující * počet řádků matice */ novaHodnota = Max; // Přiřazení maximálního počtu řádků matice do objektu na formuláři this.TxtPocetRadku.Text = Max.ToString(); } // Pokud nový počet řádků matice není stejný jako stávající počet řádků matice, pak... if (novaHodnota != this.pocetRadku) { // Uložení nového počtu řádků matice do datové složky třídy this.pocetRadku = novaHodnota; // Vytvoření nové instance matice s novým počtem řádků this.pole = new int[this.pocetRadku, this.pocetSloupcu]; // Zavolání metody pro zobrazení matice do objektu TextBox na formuláři this.ZobrazitPoleJakoText(this.pocetRadku, this.pocetSloupcu, this.pole); // Zavolání metody pro zobrazení matice do objektu ListView na formuláři this.ZobrazitPoleVListView(this.pocetRadku, this.pocetSloupcu, this.pole); } } /// <summary> /// Validace počtu sloupců matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtPocetSloupcu_LostFocus(object sender, RoutedEventArgs e) { // Lokální proměnná: 'novaHodnota' - nový počet sloupců matice int novaHodnota; /* Přiřazení počtu sloupců z objektu na formuláři do lokální proměnné * určující počet sloupců matice */ int.TryParse(this.TxtPocetSloupcu.Text, out novaHodnota); /* Pokud počet sloupců je větší než maximální počet sloupců matice, nebo počet * řádků sloupců je menší než 1, pak... */ if ((novaHodnota > Max) || (novaHodnota < 1)) { // Zobrazení dialogového okna s textem a hodnotou max. počtu sloupců matice MessageBox.Show(String.Format("Chyba rozměru matice, nastavení na max. počet sloupců: {0}", Max)); /* Přiřazení maximálního rozměru matice do lokální proměnné určující * počet sloupců matice */ novaHodnota = Max; // Přiřazení maximálního počtu sloupců matice do objektu na formuláři this.TxtPocetSloupcu.Text = Max.ToString(); } // Pokud nový počet sloupců matice není stejný jako stávající počet sloupců matice, pak... if (novaHodnota != this.pocetSloupcu) { // Uložení nového počtu sloupců matice do datové složky třídy this.pocetSloupcu = novaHodnota; // Vytvoření nové instance matice s novým počtem sloupců this.pole = new int[this.pocetRadku, this.pocetSloupcu]; // Zavolání metody pro zobrazení matice do objektu TextBox na formuláři this.ZobrazitPoleJakoText(this.pocetRadku, this.pocetSloupcu, this.pole); // Zavolání metody pro zobrazení matice do objektu ListView na formuláři this.ZobrazitPoleVListView(this.pocetRadku, this.pocetSloupcu, this.pole); } } /// <summary> /// Validace dolní meze intervalu přípustných hodnot prvků matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtMinHodnota_LostFocus(object sender, RoutedEventArgs e) { /* Přiřazení dolní meze z objektu na formuláři do datové složky třídy určující * dolní mez intervalu přípustných hodnot */ int.TryParse(this.TxtMinHodnota.Text, out this.minHodnota); // Pokud nová dolní mez je větší než stávající horní mez, pak... if (this.minHodnota > this.maxHodnota) { // Zobrazení dialogového okna s chybou a nastavení dolní meze na horní mez MessageBox.Show(String.Format("Chyba hodnoty dolní meze - dolní mez nastavena na horní mez: {0}", this.maxHodnota)); // Dolní mez je nastavena na hodnotu horní meze this.minHodnota = this.maxHodnota; // Zobrazení hodnoty dolní meze na formuláři this.TxtMinHodnota.Text = minHodnota.ToString(); } } /// <summary> /// Validace horní meze intervalu přípustných hodnot prvků matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtMaxHodnota_LostFocus(object sender, RoutedEventArgs e) { /* Přiřazení horní meze z objektu na formuláři do datové složky třídy určující * horní mez intervalu hodnot, kterých mohou nabývat prvky v matici */ int.TryParse(this.TxtMaxHodnota.Text, out this.maxHodnota); // Pokud nová horní mez je menší než stávající dolní mez, pak... if (this.maxHodnota < this.minHodnota) { // Zobrazení dialogového okna s chybou a nastavení horní meze na dolní mez MessageBox.Show(String.Format("Chyba hodnoty horní meze - horní mez nastavena na dolní mez: {0}", this.minHodnota)); // Horní mez je nastavena na hodnotu dolní meze this.maxHodnota = this.minHodnota; // Zobrazení hodnoty horní meze na formuláři this.TxtMaxHodnota.Text = maxHodnota.ToString(); } } /// <summary> /// Validace indexu řádku prvku matice při ručním plnění /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtPrvekIndexRadku_LostFocus(object sender, RoutedEventArgs e) { // Lokální proměnná: 'index' - index řádku prvku matice int index; // Uložení indexu řádku prvku do lokální proměnné (konverze textu na celé číslo) int.TryParse(this.TxtPrvekIndexRadku.Text, out index); /* Pokud index řádku prvku je větší než počet řádků matice - 1, nebo index řádku prvku je * menší než 0, pak... */ if ((index > this.pocetRadku - 1) || (index < 0)) { // Zobrazení dialogového okna s chybou a nastavení indexu na počet řádků matice - 1 MessageBox.Show(String.Format("Chybný index řádku prvku. Index nastaven na horní mez: {0}", this.pocetRadku - 1)); // Přiřazení horní meze indexu do objektu na formuláři určujícího index řádku prvku matice this.TxtPrvekIndexRadku.Text = String.Format("{0}", this.pocetRadku - 1); } } /// <summary> /// Validace indexu sloupce prvku matice při ručním plnění /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtPrvekIndexSloupce_LostFocus(object sender, RoutedEventArgs e) { // Lokální proměnná: 'index' - index sloupce prvku matice int index; // Uložení indexu sloupce prvku do lokální proměnné (konverze textu na celé číslo) int.TryParse(this.TxtPrvekIndexSloupce.Text, out index); /* Pokud index sloupce prvku je větší než počet sloupců matice - 1, nebo index sloupce prvku je * menší než 0, pak... */ if ((index > this.pocetSloupcu - 1) || (index < 0)) { // Zobrazení dialogového okna s chybou a nastavení indexu na počet sloupců matice - 1 MessageBox.Show(String.Format("Chybný index sloupce prvku. Index nastaven na horní mez: {0}", this.pocetSloupcu - 1)); // Přiřazení horní meze indexu do objektu na formuláři určujícího index sloupce prvku matice this.TxtPrvekIndexSloupce.Text = String.Format("{0}", this.pocetSloupcu - 1); } } /// <summary> /// Validace hodnoty prvku matice při ručním plnění /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtHodnota_LostFocus(object sender, RoutedEventArgs e) { // Lokální proměnná: 't' - hodnota prvku int t; // Uložení hodnoty prvku do lokální proměnné (konverze textu na celé číslo) int.TryParse(this.TxtHodnota.Text, out t); /* Pokud hodnota prvku je větší než horní mez, nebo hodnota prvku je * menší než dolní mez intervalu hodnot v matici, pak... */ if ((t > this.maxHodnota) || (t < this.minHodnota)) { // Zobrazení dialogového okna s textem chyby a hodnotami mezí MessageBox.Show(String.Format("Hodnota prvku není v intervalu: {0} až {1}", this.minHodnota, this.maxHodnota)); // Vymázání obsahu objektu na formuláři s hodnotou prvku this.TxtHodnota.Clear(); } } #endregion Nastavení atributů pole #region Plnění pole /// <summary> /// Volání metody pro plnění matice náhodnými čísly /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnNahodne_Click(object sender, RoutedEventArgs e) { // Zavolání metody bez návratu pro plnění matice náhodnými čísly this.NahodnePole(this.pocetRadku, this.pocetSloupcu, this.minHodnota, this.maxHodnota, this.pole); } /// <summary> /// Metoda pro ruční plnění jednotlivých prvků matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnJednotlive_Click(object sender, RoutedEventArgs e) { /* Přiřazení indexu řádku prvku z objektu na formuláři (konverze textu na celé * číslo) do lokální proměnné */ int.TryParse(this.TxtPrvekIndexRadku.Text, out int indexRadku); /* Přiřazení indexu sloupce prvku z objektu na formuláři (konverze textu na celé * číslo) do lokální proměnné */ int.TryParse(this.TxtPrvekIndexSloupce.Text, out int indexSloupce); // Přiřazení hodnoty prvku z objektu na formuláři do lokální proměnné int.TryParse(this.TxtHodnota.Text, out int hodnota); /* Přiřazení dolní meze intervalu hodnoty prvku z objektu na formuláři * do lokální proměnné */ int.TryParse(this.TxtMinHodnota.Text, out int minh); /* Přiřazení horní meze intervalu hodnoty prvku z objektu na formuláři * do lokální proměnné */ int.TryParse(this.TxtMaxHodnota.Text, out int maxh); /* Pokud index řádku prvku je mimo interval hodnot, tj. je menší než 0, * nebo je větší než počet řádků - 1, pak... */ if ((indexRadku < 0) || (indexRadku > this.pocetRadku - 1)) { // Zobrazení varovného dialogového okna MessageBox.Show("Zadaná hodnota indexu řádku prvku je mimo meze", "Chyba v zadání", MessageBoxButton.OK, MessageBoxImage.Error); } /* Pokud index sloupce prvku je mimo interval hodnot, tj. je menší než 0, * nebo je větší než počet sloupců - 1, pak... */ else if ((indexSloupce < 0) || (indexSloupce > this.pocetSloupcu - 1)) { // Zobrazení varovného dialogového okna MessageBox.Show("Zadaná hodnota indexu sloupce prvku je mimo meze", "Chyba v zadání", MessageBoxButton.OK, MessageBoxImage.Error); } /* Pokud hodnota prvku je větší, než horní mez intervalu povolené hodnoty prvku, nebo * je menší než dolní mez intervalu hodnot prvku, pak... */ else if ((hodnota > maxh) || (hodnota < minh)) { // Zobrazení varovného dialogového okna MessageBox.Show("Zadaná hodnota prvku je mimo meze", "Chyba v zadání", MessageBoxButton.OK, MessageBoxImage.Error); } // Jinak... else { // Přiřazení hodnoty z lokální proměnné do prvku matice na pozici [indexRadku, indexSloupce] this.pole[indexRadku, indexSloupce] = hodnota; // Zavolání metody pro zobrazení matice v objektu (typu TextBox) na formuláři this.ZobrazitPoleJakoText(this.pocetRadku, pocetSloupcu, this.pole); // Zavolání metody pro zobrazení matice v objektu (typu ListView) na formuláři this.ZobrazitPoleVListView(this.pocetRadku, this.pocetSloupcu, this.pole); // Pokud index sloupce prvku je menší než celkový počet sloupců matice - 1, pak... if (indexSloupce < this.pocetSloupcu - 1) { // Zvýšení indexu sloupce prvku o 1 indexSloupce++; // Přiřazení indexu sloupce prvku do objektu na formuláři this.TxtPrvekIndexSloupce.Text = indexSloupce.ToString(); } // Pokud index řádku prvku je menší než celkový počet řádků matice - 1, pak... else if (indexRadku < this.pocetRadku - 1) { // Zvýšení indexu řádku prvku o 1 indexRadku++; // Přiřazení indexu řádku prvku do objektu na formuláři this.TxtPrvekIndexRadku.Text = indexRadku.ToString(); // Přiřazení 0 do indexu sloupce indexSloupce = 0; // Přiřazení indexu sloupce prvku do objektu na formuláři this.TxtPrvekIndexSloupce.Text = indexSloupce.ToString(); } } } /// <summary> /// Metoda pro zavolání metody pro nulování matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnNulovat_Click(object sender, RoutedEventArgs e) { //Zavolání metody pro nulování matice this.NulovatPole(this.pocetRadku, this.pocetSloupcu, this.pole); } #endregion Plnění pole #region Zobrazení pole /// <summary> /// Volání metody pro zobrazení matice jako text v objektu typu TextBox na formuláři /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnJakoText_Click(object sender, RoutedEventArgs e) { // Zavolání metody pro zobrazení matice jako text v objektu na formuláři this.ZobrazitPoleJakoText(this.pocetRadku, this.pocetSloupcu, this.pole); } /// <summary> /// Volání metody pro zobrazení prvků matice v objektu typu ListView na formuláři /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnDoMrizky_Click(object sender, RoutedEventArgs e) { // Zavolání metody pro zobrazení prvků matice do mřížky na formuláři this.ZobrazitPoleVListView(this.pocetRadku, this.pocetSloupcu, this.pole); } #endregion Zobrazení pole #region Operace s polem /// <summary> /// Volání metody pro určení minima a jeho pozice v matici /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnMinimum_Click(object sender, RoutedEventArgs e) { /* Lokální proměnné: 'minimum' - hodnota minima v matici; 'indexRadkuMinima' - * index řádku minima; 'indexSloupceMinima' - index sloupce minima */ int minimum; /* Přiřazení výstupu metody pro určení minima do lokální proměnné a výstupní parametry * určující index řádku ('indexRadkuMinima') a sloupce ('indexSloupceMinima') minima */ minimum = this.MinimumVPoli(this.pocetRadku, this.pocetSloupcu, this.pole, out int indexRadkuMinima, out int indexSloupceMinima); /* Zobrazení textu spolu s hodnotou minima a indexu řádku a sloupce minima * do objektu (TextBox) na formuláři */ this.TxtVysledek.Text = string.Format("Minimum = {0} (na pozici [{1}, {2}])", minimum, indexRadkuMinima, indexSloupceMinima); } /// <summary> /// Volání metody pro určení maxima a jeho pozice v matici /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnMaximum_Click(object sender, RoutedEventArgs e) { /* Lokální proměnné: 'maximum' - hodnota maxima v matici; 'indexRadkuMaxima' - * index řádku maxima; 'indexSloupceMaxima' - index sloupce maxima */ int maximum; /* Přiřazení výstupu metody pro určení maxima do lokální proměnné a výstupní parametry * určující index řádku ('indexRadkuMaxima') a sloupce ('indexSloupceMaxima') maxima */ maximum = this.MaximumVPoli(this.pocetRadku, this.pocetSloupcu, this.pole, out int indexRadkuMaxima, out int indexSloupceMaxima); /* Zobrazení textu spolu s hodnotou maxima a indexu řádku a sloupce maxima * do objektu (TextBox) na formuláři */ this.TxtVysledek.Text = string.Format("Maximum = {0} (na pozici [{1}, {2}])", maximum, indexRadkuMaxima, indexSloupceMaxima); } /// <summary> /// Volání metody pro výpočet aritmetického průměru z prvků matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnPrumer_Click(object sender, RoutedEventArgs e) { // Lokální proměnná: 'prumer' - průměr prvků v matici double prumer; // Přiřazení výstupu metody pro výpočet průměru z prvků pole do lokální proměnné prumer = this.PrumerPole(this.pocetRadku, this.pocetSloupcu, this.pole); /* Zobrazení textu 'Průměr = ' spolu s vypočteným průměrem (konverze reálného čísla * na text, zobrazného na 2 desetinná místa) do objektu (TextBox) na formuláři */ this.TxtVysledek.Text = string.Format("Průměr = {0:N2}", prumer); } /// <summary> /// Volání metody pro vzestupné třídění prvků v řádcích matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnSeradit_Click(object sender, RoutedEventArgs e) { // Zavolání metody pro vzestupné třídění prvků v matici this.SeraditPole(this.pocetRadku, this.pocetSloupcu, this.pole); // Zavolání metody pro zobrazení matice do objektu (TextBox) na formuláři this.ZobrazitPoleJakoText(this.pocetRadku, this.pocetSloupcu, this.pole); // Zavolání metody pro zobrazení matice v objektu (ListView) na formuláři this.ZobrazitPoleVListView(this.pocetRadku, this.pocetSloupcu, this.pole); } /// <summary> /// Volání metody pro transpozici prvků matice podle hlavní diagonály /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnTranspoziceHlavni_Click(object sender, RoutedEventArgs e) { // Zavolání metody pro transpozici prvků matice podle hlavní diagonály this.HlavniTranspozice(this.pocetRadku, this.pocetSloupcu, this.pole); // Zavolání metody pro zobrazení matice do objektu (TextBox) na formuláři this.ZobrazitPoleJakoText(this.pocetRadku, this.pocetSloupcu, this.pole); // Zavolání metody pro zobrazení matice v objektu (ListView) na formuláři this.ZobrazitPoleVListView(this.pocetRadku, this.pocetSloupcu, this.pole); } /// <summary> /// Volání metody pro transpozici prvků matice podle vedlejší diagonály /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnTranspoziceVedlejsi_Click(object sender, RoutedEventArgs e) { // Zavolání metody pro transpozici prvků matice podle vedlejsi diagonály this.VedlejsiTranspozice(this.pocetRadku, this.pocetSloupcu, this.pole); // Zavolání metody pro zobrazení matice do objektu (TextBox) na formuláři this.ZobrazitPoleJakoText(this.pocetRadku, this.pocetSloupcu, this.pole); // Zavolání metody pro zobrazení matice v objektu (ListView) na formuláři this.ZobrazitPoleVListView(this.pocetRadku, this.pocetSloupcu, this.pole); } #endregion Operace s polem /// <summary> /// Metoda pro zavření formuláře /// </summary> private void BtnKonec_Click(object sender, RoutedEventArgs e) { // Zavření formuláře this.Close(); } #endregion Události } }
Kód 2: Výsledný C# kód vytvořeného formuláře a metod jeho prvků