Jednorozměrné pole - konzole
Requisitos de finalización
4. Výsledný kód
Následující zdrojový kód je kompletací předešlých kódů programu JednorozmernePole, který je umístěn v souboru Program.cs - viz Kód 1.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JednorozmernePole { class Program { static void Main(string[] args) { /* Deklarace: 'pocetPrvku' ... rozměr vektoru (počet prvků ve vektoru); 'Max' ... konstantní hodnota * maximální velikosti vektoru; 'minHodnota' ... přípustná minimální hodnota (dolní mez) prvků vektoru; * 'maxHodnota' ... přípustná maximální hodnota (horní mez) prvků vektoru */ // Maximální rozměr vektoru const int Max = 10; // Dolní mez, které může nabýt prvek vektoru int minHodnota = 1; // Horní mez, které může nabýt prvek vektoru int maxHodnota = 100; // Rozměr vektoru je roven maximální možné délce int pocetPrvku = Max; // Zavolání metody s celočíselným návratem pro změnu velikosti vektoru pocetPrvku = RozmerPole(pocetPrvku, Max); // Deklarace vektoru se zadaným rozměrem (počtem prvků) int[] pole = new int[pocetPrvku]; // Zavolání metody s celočíselný návratem pro změnu dolní meze, které mohou nabývat prvky vektoru minHodnota = DolniMez(minHodnota, maxHodnota); // Zavolání metody s celočíselným návratem pro změnu horní meze, které mohou nabývat prvky vektoru maxHodnota = HorniMez(minHodnota, maxHodnota); /* Zavolání metody pro plnění vektoru (náhodnými čísly, jednotlivě zadanými hodnotami, * plnění vektoru nulami) */ PlnitPole(pocetPrvku, minHodnota, maxHodnota, pole); // Výpis prvků vektoru v řádku, kde jednotlivé prvky jsou odděleny čárkami Console.WriteLine("Výpis pole (do řádku): " + PoleJakoText(pocetPrvku, pole)); // Výpis prvků vektoru do sloupce, kde každý prvek je na nové řádce Console.WriteLine("Výpis pole (do sloupce): "); Console.Write(ZobrazitPole(pocetPrvku, pole)); // Výpis hodnoty minima vektoru, včetně jeho indexu Console.WriteLine("Minimum v poli: " + MinimumVPoli(pocetPrvku, pole) + " (index prvku: " + IndexPrvku(MinimumVPoli(pocetPrvku, pole), pole) + ")"); // Výpis hodnoty maxima vektoru, včetně jeho indexu Console.WriteLine("Maximum v poli: " + MaximumVPoli(pocetPrvku, pole) + " (index prvku: " + IndexPrvku(MaximumVPoli(pocetPrvku, pole), pole) + ")"); // Výpis průměru všech prvků vektoru Console.WriteLine("Průměr prvků pole: " + PrumerPole(pocetPrvku, pole)); // Vzestupné řazení prvků podle metody Bubble Sort SeraditPole(pocetPrvku, pole); // Výpis seřazeného vektoru do řádku Console.WriteLine("Seřazené pole (výpis do řádku): " + PoleJakoText(pocetPrvku, pole)); // Výpis seřazeného vektoru do sloupce Console.WriteLine("Seřazené pole (výpis do sloupce): "); Console.Write(ZobrazitPole(pocetPrvku, pole)); // Čekání na stisk klávesy -> ukončení programu Console.ReadKey(); } #region Nastavení atributů pole /// <summary> /// Metoda s celočíselným návratem - navrací velikost pole (počet prvků vektoru) /// </summary> /// <param name="n"> aktuální velikost vektoru (počet prvků) </param> /// <param name="max"> maximální rozměr vektoru </param> /// <returns> Velikost vektoru </returns> static int RozmerPole(int n, int max) { /* Deklarace: 'zmena' ... informace (celé číslo), zda má být provedena změna rozměru * pole; 'novaHodnota' ... nový rozměr vektoru */ int zmena, novaHodnota; // Vypsání stávajícího rozměru vektoru Console.WriteLine("Počet prvků: {0}", n); do { // Výzva ke změně rozměru vektoru Console.Write("Změnit počet prvků vektoru (0...Ne, 1...Ano): "); // Načtení hodnoty, zda má dojít ke změně int.TryParse(Console.ReadLine(), out zmena); // Pokud načtená hodnota nebyla validní, cyklus zadání je znovu opakován } while ((zmena < 0) || (zmena > 1)); // Pokud byl zadán index pro změnu ... if (zmena == 1) { // Výzva k zadání rozměru vektoru Console.Write("Zadejte počet prvků vektoru (1 - {0}): ", max); // Načtení rozměru vektoru int.TryParse(Console.ReadLine(), out novaHodnota); // Pokud nová hodnota je větší než maximum, nebo menší než 1 ... if ((novaHodnota > max) || (novaHodnota < 1)) { // Přiřazení maximálního rozměru vektoru do lokální proměnné určující počet prvků vektoru novaHodnota = max; } // Pokud nový rozměr vektoru není stejný jako stávající počet prvků vektoru ... if (novaHodnota != n) { // Uložení nového rozměru pole do proměnné n = novaHodnota; } // Výpis nového zadaného rozměru vektoru Console.WriteLine("Rozměr pole: {0}", n); } // Návrat metody return n; } /// <summary> /// Metoda s celočíselným návratem - návrat dolní meze pro všechny prvky vektoru /// </summary> /// <param name="minHodnota"> dolní mez prvků vektoru </param> /// <param name="maxHodnota"> horní mez prvků vektoru </param> /// <returns> Dolní mez pro všechny prvky vektoru </returns> public static int DolniMez(int minHodnota, int maxHodnota) { /* Deklarace: 'novaHodnota' ... nová dolní mez prvků vektoru; 'zmena' ... celočíselná * informace, zda má být provedena změna dolní meze prvků ('0'...Ne, '1'...Ano) */ int novaHodnota, zmena; // Výpis stávající hodnoty dolní meze Console.WriteLine("Dolní mez prvků vektoru: {0}", minHodnota); do { // Výzva ke změně dolní meze Console.Write("Změnit dolní mez prvků vektoru (0...Ne, 1...Ano): "); // Načtení hodnoty do proměnné 'zmena' (informace, zda má dojít ke změně) int.TryParse(Console.ReadLine(), out zmena); // Pokud načtená hodnota není validní, cyklus zadání probíhá znovu } while (zmena < 0 || zmena > 1); // Test, zda má proběhnout změna dolní meze prvků vektoru if (zmena == 1) { // Výzva k zadání nové dolní meze prvků vektoru Console.Write("Zadejte dolní mez prvků vektoru: "); // Načtení nové dolní meze prvků vektoru int.TryParse(Console.ReadLine(), out novaHodnota); // Pokud nová hodnota dolní meze je větší než horní mez ... if (novaHodnota > maxHodnota) { // Přiřazení horní meze do lokální proměnné určující dolní mez (horní a dolní mez budou stejné) novaHodnota = maxHodnota; } // Pokud nová dolní mez vektoru není stejná jako stávající dolní mez prvků vektoru ... if (novaHodnota != minHodnota) { // Přepsání stávající dolní meze prvků pole novou hodnotou minHodnota = novaHodnota; } // Výpis nové dolní meze pro prvky vektoru Console.WriteLine("Dolní mez prvků vektoru: " + minHodnota); } // Návrat metody return minHodnota; } /// <summary> /// Metoda s celočíselným návratem - návrat horní meze pro všechny prvky vektoru /// </summary> /// <param name="minHodnota"> stávající horní mez prvků vektoru </param> /// <param name="maxHodnota"> horní mez prvků vektoru </param> /// <returns> Horní mez pro všechny prvky vektoru </returns> static int HorniMez(int minHodnota, int maxHodnota) { /* Deklarace: 'novaHodnota' ... nová horní mez prvků vektoru; 'zmena' ... celočíselná * informace, zda má být provedena změna horní meze prvků ('0'...Ne, '1'...Ano) */ int novaHodnota, zmena; // Výpis stávající hodnoty horní meze Console.WriteLine("Horní mez prvků vektoru: {0}", maxHodnota); do { // Výzva ke změně horní meze Console.Write("Změnit horní mez prvků vektoru (0...Ne, 1...Ano): "); // Načtení hodnoty do proměnné 'zmena' (informace, zda má dojít ke změně) int.TryParse(Console.ReadLine(), out zmena); } // Pokud načtená hodnota není validní, cyklus zadání probíhá znovu while ((zmena < 0) || (zmena > 1)); // Test, zda má proběhnout změna horní meze prvků vektoru if (zmena == 1) { // Výzva k zadání nové horní meze prvků vektoru Console.Write("Zadejte horní mez prvků vektoru: "); // Načtení nové horní meze prvků vektoru int.TryParse(Console.ReadLine(), out novaHodnota); // Pokud nová hodnota horní meze je menší než horní mez ... if (novaHodnota < minHodnota) { // Přiřazení dolní meze do lokální proměnné určující horní mez (horní a dolní mez budou stejné) novaHodnota = minHodnota; } // Pokud nová horní mez vektoru není stejná jako stávající horní mez prvků vektoru ... if (novaHodnota != maxHodnota) { // Přepsání stávající horní meze prvků pole novou hodnotou maxHodnota = novaHodnota; } // Výpis nové horní meze pro prvky vektoru Console.WriteLine("Horní mez prvků vektoru: " + maxHodnota); } // Návrat metody return maxHodnota; } #endregion #region Plnění pole /// <summary> /// Metoda bez návratu - výběr metody plnění vektoru /// </summary> /// <param name="n"> aktuální rozměr (počet prvků) vektoru </param> /// <param name="minHodnota"> dolní mez prvků vektoru </param> /// <param name="maxHodnota"> horní mez prvků vektoru </param> /// <param name="pole"> vektor, který má být naplněn </param> static void PlnitPole(int n, int minHodnota, int maxHodnota, int[] pole) { /* Deklarace: 'zpusobPlneni' ... způsob plnění vektoru('0'...Náhodně, '1'...Jednotlivě, * '2'...Nulovat) */ int zpusobPlneni; do { // Výzva k zadání způsobu plnění vektoru Console.Write("Zvolte způsob plnění vektoru (0...Náhodně, 1...Jednotlivě, 2...Nulovat): "); // Načtení způsobu plnění int.TryParse(Console.ReadLine(), out zpusobPlneni); } // Načtení způsobu plnění proběhne znovu, pokud nebyl zadán validní celočíselný kód způsobu plnění while ((zpusobPlneni != 0) && (zpusobPlneni != 1) && (zpusobPlneni != 2)); switch (zpusobPlneni) { // Plnění vektoru náhodnými čísly case 0: // Zavolání procedury pro plnění vektoru náhodnými čísly NahodnePole(n, minHodnota, maxHodnota, pole); break; // Plnění vektoru jednotlivými zadanými hodnotami uživatelem case 1: // Plnění vektoru jednotlivými uživatelem zadanými čísly PlnitJednotlive(n, minHodnota, maxHodnota, pole); break; case 2: // Všem prvkům vektoru přiřadíme hodnotu '0' NulovatPole(n, pole); break; } } /// <summary> /// Metoda bez návratu - plnění prvků pole hodnotou nula /// </summary> /// <param name="n"> počet prvků vektoru </param> /// <param name="pole"> vektor, který má být naplněn </param> static void NulovatPole(int n, int[] pole) { /* Pro všechny prvky od '0' (počátečního) do 'n-1'-tého (posledního) prvku; * 'i' ... index (pozice) prvku vektoru */ for (int i = 0; i < n; i++) { // Přiřazení nuly 'i'-tému (aktuálně procházenému) prvku pole[i] = 0; } } /// <summary> /// Metoda bez návratu - plnění vektoru náhodnými čísly /// </summary> /// <param name="n"> počet prvků vektoru </param> /// <param name="minHodnota"> dolní mez prvků vektoru </param> /// <param name="maxHodnota"> horní mez prvků vektoru </param> /// <param name="pole"> vektor, který má být naplněn </param> static void NahodnePole(int n, int minHodnota, int maxHodnota, int[] pole) { /* Deklarace: 'rnd' ... náhodné číslo (generované na základě rovnoměrného rozdělení); * 'i' ... index (pozice) prvku vektoru */ // Deklarace náhodného čísla (objektu) včetně inicializace Random rnd = new Random(); // Pro všechny prvky od '0' (počátečního) do 'n-1'-tého (posledního) prvku for (int i = 0; i < n; i++) { /* Vygenerování náhodného čísla uloženého do 'rnd' v rozsahu 'minHodnota' až 'maxHodnota' * Přiřazení náhodného čísla do 'i'-tého prvku */ pole[i] = rnd.Next(minHodnota, maxHodnota + 1); } } /// <summary> /// Metoda bez návratu - plnění jednotlivých prvků vektoru uživatelem /// </summary> /// <param name="n"> počet prvků </param> /// <param name="minHodnota"> stávající dolní mez prvků vektoru </param> /// <param name="maxHodnota"> stávající horní mez prvků vektoru </param> /// <param name="pole"> vektor, který má být naplněn </param> static void PlnitJednotlive(int n, int minHodnota, int maxHodnota, int[] pole) { /* Deklarace: 'index' ... index prvku, který má být naplněn; 'hodnota' ... hodnota * prvku, který má být naplněn; 'plnit' ... informace, zda má zadán (naplněn) * další prvek ('0'...Ano, '1'...Ne) */ int index, hodnota, plnit; // Cyklus s podmínkou na konci pro plnění prvků do { // Cyklus s podmínkou na konci pro načtení indexu plněného prvku do { // Výzva k zadání indexu prvku, včetně vypsání mezí Console.Write("Zadejte index prvku, který chcete naplnit (0 - {0}): ", pole.Length-1); // Načtení indexu int.TryParse(Console.ReadLine(), out index); // Test, zda načtený index je mimo meze ... if ((index < 0) || (index > n-1)) { // Výpis o chybě Console.WriteLine("Zadaná hodnota je mimo meze"); } } /* Podmínka cyklu, zda načtený index je mimo meze. Pokud ano, opakovaní * načtení indexu */ while ((index < 0) || (index > n-1)); // Cyklus s podmínkou na konci - validace zadané hodnoty zda je hodnota v rozsahu mezí do { // Výzva k zadání hodnoty prvku, včetně vypsání dolní a horní meze pro všechny prvky Console.Write("Zadejte hodnotu prvku ({0} - {1}): ", minHodnota.ToString(), maxHodnota.ToString()); // Načtení hodnoty int.TryParse(Console.ReadLine(), out hodnota); // Test, zda načtená hodnota prvku je mimo meze ... if ((hodnota < minHodnota) || (hodnota > maxHodnota)) { // Výpis o chybě Console.WriteLine("Zadaná hodnota je mimo meze"); } } /* Podmínka cyklu, zda načtená hodnota prvku je mimo meze. Pokud ano, opakovaní * načtení hodnoty */ while ((hodnota < minHodnota) || (hodnota > maxHodnota)); // Přiřazení hodnoty z lokální proměnné do prvku vektoru na pozici 'index' pole[index] = hodnota; // Zavolání metody pro zobrazení vektoru jako prvky v řádku oddělené čárkou Console.WriteLine(PoleJakoText(n, pole)); // Zavolání metody pro zobrazení vektoru jako prvky pod sebou Console.WriteLine(ZobrazitPole(n, pole)); // Cyklus s podmínkou na konci - validace informace o tom, zda dále plnit do { // Výzva, zda mají být plněny další prvky Console.Write("Chcete plnit další prvek (0...Ne, 1...Ano): "); // Načtení informace o dalším plnění int.TryParse(Console.ReadLine(), out plnit); // Test, zda načtená hodnota (informace o plnění) je mimo meze ... if ((plnit < 0) || (plnit > 1)) { // Výpis chyby Console.WriteLine("Zadaná hodnota je mimo meze"); } } /* Podmínka cyklu, zda načtená hodnota je mimo meze. Pokud ano, * opakovaní načtení hodnoty */ while ((plnit < 0) || (plnit > 1)); } /* Podmínka cyklu, zda má být provedeno další načtení prvku. Pokud ano (hodnota '1'), * opakovaní načtení hodnoty */ while (plnit == 1); } #endregion #region Zobrazení pole /// <summary> /// Výpis prvků vektoru do sloupce, kde každý prvek je na nové řádce /// </summary> /// <param name="n"> počet prvků vektoru </param> /// <param name="pole"> vypisovaný vektor </param> /// <returns> Text obsahující prvky ve sloupci </returns> static string ZobrazitPole(int n, int[] pole) { /* Deklarace: 'vystup' ... textový řetězec, kde jednotlivé prvky vektoru jsou * umístěny pod sebou; 'i' ... index prvku ve vektoru */ string vystup; // Inicializace - příprava textu pro výpis v konzole vystup = ""; // Pro všechny prvky od počátečního do koncového prvku ... for (int i = 0; i < n; i++) { /* Výpis prvku na novém řádku (návrat na počátek řádku ... znak na pozici '13' * nový řádek ... znak na pozici '10' v ASCII tabulce); * 0:D3 ... formátová specifikace, tj. 3 znaky (doplněno vedoucími nulami), * nula znamená bez desetinných míst */ vystup += string.Format("{0:D3}", pole[i]) + (char)13 + (char)10; /* Vložení nové řádky do výsledného textu pomocí řídící posloupnosti - * \r ... návrat na počátek řádku; \n ... přechod na nový řádek */ //vystup += string.Format("{0:D3}", pole[i]) + "\r\n"; // Vložení nové řádky do výsledného textu //vystup += string.Format("{0:D3}", pole[i]) + Environment.NewLine; } // Přiřazení výstupního textu návratu metody return vystup; } /// <summary> /// Výpis prvků vektoru v řádku, kde jednotlivé prvky jsou odděleny čárkami /// </summary> /// <param name="n"> aktuální velikost (počet prvků) vektoru </param> /// <param name="pole"> vektor, který má být vypsán </param> /// <returns> Text obsahující prvky v řádku </returns> static string PoleJakoText(int n, int[] pole) { /* Deklarace: 'vystup' ... výstupní textový řetězec obsahující prvky vektoru * oddělené čárkou; 'i' ... index prvku ve vektoru */ string vystup; // Inicializace - příprava textu pro výpis v konzole vystup = ""; // Vypsání počátečního prvku do textového řetězce vystup += string.Format("{0:D3}", pole[0]); // Pro všechny prvky od druhého prvku (včetně) do posledního ... for (int i = 1; i < n; i++) { // Výpis prvku do řádku odděleného čárkou vystup += string.Format(", {0:D3}", pole[i]); } // Přiřazení textu návratu metody return vystup; } #endregion #region Výpočty s polem /// <summary> /// Návrat hodnoty minima vektoru - nejmenší prvek /// </summary> /// <param name="n"> počet prvků vektoru </param> /// <param name="pole"> prohledávaný vektor </param> /// <returns> Minimum vektoru </returns> static int MinimumVPoli(int n, int[] pole) { // Deklarace: 'minimum' ... nalezená minimální hodnota ve vektoru; 'i' ... index (pozice) prvku vektoru int minimum; // Hodnotu prvního prvku prohlásíme minimem minimum = pole[0]; // Pro všechny prvky od '1' (druhého prvku) do 'n-1'-tého (posledního) prvku for (int i = 1; i < n; i++) { // Pokud je aktuálně procházený prvek menší než minimum ... if (pole[i] < minimum) { // Uložené aktuálního prvku do minima minimum = pole[i]; } } // Přiřazení minima návratu metody return minimum; } /// <summary> /// Návrat hodnoty maxima vektoru - největší prvek /// </summary> /// <param name="n"> počet prvků pole </param> /// <param name="pole"> prohledávaný vektor </param> /// <returns> Maximum vektoru </returns> public static int MaximumVPoli(int n, int[] pole) { // Deklarace: 'maximum' ... nalezená maximální hodnota ve vektoru; 'i' ... index (pozice) prvku vektoru int maximum; // První prvek prohlásíme maximem maximum = pole[0]; // Pro všechny prvky od '1' (druhého prvku) do 'n-1'-tého (posledního) prvku for (int i = 1; i < n; i++) { // Pokud je aktuálně procházený prvek větší než maximum ... if (pole[i] > maximum) { // Uložené hodnoty nalezeného prvku do maxima maximum = pole[i]; } } // Přiřazení maxima návratu metody return maximum; } /// <summary> /// Metoda s návratem - návrat indexu hledaného prvku vektoru /// </summary> /// <param name="prvek"> prvek, jehož index má být vyhledán </param> /// <param name="pole"> prohledávaný vektor </param> /// <returns> Návrat posledního indexu hledaného prvku (prvek nebyl nalezen návrat -1) </returns> static int IndexPrvku(int prvek, int[] pole) { // Deklarace: 'index' ... index nalezeného prvku ve vektoru; 'i' ... index (pozice) prvku vektoru int index; // Inicializace - žádný prvek nenalezen, tj. index = -1 index = -1; /* Pro všechny prvky od počátečního prvku do posledního (index zjištěn pomocí návratu funkce * rozměru pole) prvku */ for (int i = 0; i < pole.Length; i++) { // Pokud je aktuálně procházený prvek shodný s předaným prvkem ... if (pole[i] == prvek) { // Přiřazení indexu aktuálního prvku do indexu hledaného prvku index = i; } } // Přiřazení idnexu prvku do návratu metody return index; } /// <summary> /// Navrát aritmetického průměru prvků vektoru /// </summary> /// <param name="n"> počet prvků vektoru </param> /// <param name="pole"> prohledávaný vektor </param> /// <returns> Průměr vektoru </returns> static double PrumerPole(int n, int[] pole) { /* Deklarace: 'prumer' ... průměrná reálná hodnota ze všech prvků vektoru; * 'suma' ... suma hodnot všech prvků vektoru; 'i' ... index (pozice) * prvku vektoru */ double prumer; int suma; // Inicializace - suma prvků je 0 suma = 0; // Pro všechny prvky od '0' (počátečního) do 'n-1'-tého (posledního) prvku for (int i = 0; i < n; i++) { // Přičtení dalšího prvku vektoru do sumy suma += pole[i]; } // Výpočet průměru prumer = (double)suma / n; // Přiřazení vypočteného průměru návratu metody return prumer; } #endregion #region Úprava pole /// <summary> /// Metoda bez návratu - vzestupné řazení prvků pole /// </summary> /// <param name="n"> počet prvků </param> /// <param name="pole"> vektor, který má být setříděn vzestupně </param> static void SeraditPole(int n, int[] pole) { /* Deklarace: '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 (pozice) * prvku vektoru */ int pom; bool b; do { // Nedošlo k prohození sousedních prvků b = false; // Pro všechny prvky od počátečního do předposledního prvku for (int i = 0; i < n - 1; i++) { // Pokud je hodnota sousedícího prvku větší než hodnota aktuálně testovaného prvku if (pole[i] > pole[i + 1]) { // Ulož hodnotu aktuálního prvku do pomocné proměnné pom = pole[i]; // Ulož hodnotu sousedícího prvku do aktuálního prvku pole[i] = pole[i + 1]; // Ulož hodnotu z pomocné proměnné do sousedícího prvku pole[i + 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); } #endregion } }
Kód 1: Program JednorozmernePole - deklarace hlavní statické metody Main včetně deklarací dalších metod