Dvourozměrné pole - WPF
4. C#
4.5. Minimum a maximum pole
Abychom mohli nalézt ve matici její nejmenší prvek, tj. minimum, musíme nejprve deklarovat metodu, která bude prohledávat a porovnávat prvky matice s dosud nejmenším nalezeným prvkem. Proto v regionu Operace s polem, která je součástí regionu Pomocné metody, budeme deklarovat metodu MinimumVPoli, která navrací celočíselnou hodnotu minima, a zároveň má tato metoda výstupní parametry (uvozený klíčovým slovem out), které představují index řádku a sloupce nalezeného minima - viz Kód 1.
V metodě je deklarována lokální proměnná minimum, do níž je uložena hodnota nejmenšího prvku matice. My však oproti hledání minima v jednorozměrném poli nyní využijeme jiný princip. Na začátku do proměnné minimum uložíme co nejvyšší hodnotu, tj. maximální hodnotu příslušného datového typu int. Je tedy zřejmé, že jakýkoliv prvek v matici může být stejný, nebo menší (což je vysoce pravděpodobné). Jako další krok provedeme inicializaci hodnotou -1 výstupních parametrů metody, které představují pozici minima v matici.
V metodě tradičně použijeme pro procházení prvků matice dva cykly s krokem. První pro procházení řádků, druhý pro procházení sloupců. Ve vnitřním cyklu je porovnán aktuální prvek s nejmenším dosud nalezeným prvkem, jehož hodnota je uložena v proměnné minimum. Podstata metody tkví v podmínce, že pokud aktuálně procházený prvek je menší než minimum, je hodnota tohoto prvku uložena do proměnné minimum. Zároveň musí být uložen index řádku a sloupce tohoto prvku matice.
Po ukončení průchodu všemi prvky matice je hodnota minima přiřazena výstupu metody.
/// <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; }
Kód 1: Deklarace metody s návratem pro hledání minima matice včetně jeho pozice (MinimumVPoli)
Stejnou podstatu používá metoda MaximumVPoli, která však porovnává všechny prvky s dosud nejvyšší nalezenou hodnotu v matici uloženou do proměnné s názvem maximum - viz Kód 2. V tomto případě však do proměnné maximum na začátku metody uložíme nejmenší možnou hodnotu datového typu int.
/// <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; }
Kód 2: Deklarace metody s návratem pro hledání maxima matice včetně jeho pozice (MaximumVPoli)
Přemístíme se zpět do regionu Události a jeho části Operace s polem. V tomto regionu upravíme metodu obsluhy události stisknutí tlačítka BtnMinimum - viz Kód 3. V rámci těla metody budeme deklarovat lokální proměnnou minimum, do které uložíme návrat volané metody MinimumVPoli, které bude obsahovat pět parametrů. První a druhý parametr je počet řádků a počet sloupců matice, které jsou uloženy v datové složce třídy. Jako třetí parametr předáme matici. Čtvrtý výstupní parametr uvozený klíčovým slovem out představuje index řádku nalezeného minima v matici. Pátý výstupní parametr obsahuje index sloupce nalezeného minima. Obdržené celočíselné hodnoty hodnoty nalezeného minima a jeho pozice (uzavřené do hranatých závorek a oddělené čárkou) konvertujeme na text pomocí metody Format třídy string. Pro výpis hodnot použijeme indexaci prvků ve složených závorkách.
/// <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); }
Kód 3: Deklarace metody pro zavolání metody pro hledání minima a jeho pozice - výpis na formuláři (BtnMinimum_Click)
Stejně jako u předchozí metody postupujeme v metodě BtnMaximum_Click umístěné ve stejném regionu - viz Kód 4.
/// <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); }
Kód 4: Deklarace metody pro zavolání metody pro hledání maxima a jeho pozice - výpis na formuláři (BtnMaximum_Click)