Riešené úlohy k 5.-6. lekciu práca s kolekciami v C # .NET
V predchádzajúcom cvičení, Riešené úlohy k 10.-11. lekciu práca s kolekciami v C # .NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
Nasledujúce 3 cvičenie vám pomôžu precvičiť znalosti programovania v C# .NET z minulých lekcií. Vo vlastnom záujme sa je pokúste vyriešiť sami. Pod článkom máte pre kontrolu riešenie k stiahnutiu. Ale pozor, akonáhle sa na neho pozriete bez vyriešenia príkladov, stráca pre vás cvičenie zmysel a nič sa nenaučíte.:)
Ak si naozaj nebudete vedieť rady, pozrite sa radšej znova do minulých tutoriálov a pokúste sa na to prísť.
Jednoduchý príklad
Vytvorte program, ktorý si nechá zadať mená troch programátorov a programovacie jazyky, ktoré ovládajú. Tieto jazyky sa budú ukladať do množín. Následne vypíšte:
- Zjednotenie množín, teda všetky jazyky, ktoré daní programátori vedia
- Prienik množín, teda spoločné jazyky, ktoré daní programátori vedia
- Rozdiely množín, teda jazyky, ktoré vedia iba daný programátor
V prípade, že nechcete, aby sa pri volaní metód pre operácie s množinami modifikovali priamo množiny jazykov programátorov, tak je treba si vytvoriť novú inštanciu danej množiny a operácie vykonávať na nej:
vyslednaMnozina = new HashSet<string>(programator.ProgramovaciJazyky);
Pre vyskúšanie programu môžete použiť tieto programátorov:
- Karol, vie jazyky C #, Swift, Kotlin
- Lucia, vie jazyky JavaScript, PHP, C#
- Milan, vie jazyky C, C ++, C#
V riešení použite predpripravený kód s dátami, ktorý je k dispozícii v editore nižšie.
Ukážka obrazovky programu:
Konzolová aplikácia
Zadajte 1. programátora
Meno: Karel
Programovacie jazyky (oddeľujte čiarkou a medzerou): C#, Swift, Kotlin
Zadajte 2. programátora
Meno: Lucie
Programovacie jazyky (oddeľujte čiarkou a medzerou): JavaScript, PHP, C#
Zadajte 3. programátora
Meno: Milan
Programovacie jazyky (oddeľujte čiarkou a medzerou): C, C++, C#
Všetky jazyky: C#, Swift, Kotlin, JavaScript, PHP, C, C++,
Spoločné jazyky: C#,
Jazyky, ktoré vedia len Karel: Swift, Kotlin,
Jazyky, ktoré vedia len Lucia: JavaScript, PHP,
Jazyky, ktoré vedia len Milan: C, C++,
{CSHARP_CONSOLE} {/CSHARP_CONSOLE}
{CSHARP_OOP} class Programator { public string Jmeno { get; private set; } public HashSet<string> ProgramovaciJazyky { get; private set; } public Programator(string jmeno, string[] jazyky) { Jmeno = jmeno; ProgramovaciJazyky = new HashSet<string>(jazyky); } } {/CSHARP_OOP}
Stredne pokročilý príklad
Vytvorte program na hľadanie cesty v prostredí medzi prekážkami. Využite k tomu algoritmus šíreniu do šírky (Vlna), ktorý je detailne rozpísaný v samostatnom článku.
Priamo v programe nastavte, aby hľadal cestu v rovnakom
prostredí a medzi rovnakými body, ktoré sú
uvedené v tomto článku, tzn. z bodu [4;7]
do bodu
[8;9]
v nasledujúcom prostredí:
Prostredie aj body sú už predpripravené v editore nižšie.
Potom, čo program nájde cestu, vypíšte všetky body tejto cesty v poradí od počiatočného bodu ku koncovému.
Ukážka obrazovky programu:
Konzolová aplikácia
[4;7] [3;7] [2;7] [2;6] [2;5] [2;4] [1;4] [1;3] [1;2] [2;2] [2;1] [3;1] [4;1] [5;1] [6;1] [7;1] [7;2] [8;2] [8;3] [9;3] [10;3] [10;4] [10;5] [10;6] [9;6] [9;7] [8;7] [7;7] [7;8] [7;9] [8;9]
{CSHARP_OOP} // Prostředí, ve kterém hledáme cestu (1 = překážka, 0 = volná plocha) static int[,] prostredi = new int[12, 12] { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1 }, { 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1 }, { 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1 }, { 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1 }, { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1 }, { 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1 }, { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1 }, { 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1 }, { 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 }, { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, }; // Zde se budou ukládat všechny procházené body static Bod[,] body = new Bod[prostredi.GetLength(0), prostredi.GetLength(1)]; static Bod pocatecniBod = new Bod(4, 7, 0); static Bod cilovyBod = new Bod(8, 9, int.MaxValue); class Program { static void Main(string[] args) { // Každý bod má ve výchozím stavu maximální možnou hodnotu, // aby se pak dala jednodušeji porovnávat při hledání výsledné cesty for (int y = 0; y < body.GetLength(1); y++) for (int x = 0; x < body.GetLength(0); x++) body[x, y] = new Bod(x, y, int.MaxValue); body[pocatecniBod.X, pocatecniBod.Y] = pocatecniBod; } } {/CSHARP_OOP}
{CSHARP_OOP} struct Bod { public int X { get; private set; } public int Y { get; private set; } public int Hodnota { get; set; } public Bod(int x, int y, int hodnota) { X = x; Y = y; Hodnota = hodnota; } } {/CSHARP_OOP}
Pokročilý príklad
Vytvorte program, ktorý simuluje matematický hlavolam Hanojské veže.
Hanojskej veže
Hanojské veže sú hlavolam, ktorý sa skladá z troch veží (kolíkov). Na začiatku je na jednej z nich nasadených niekoľko kotúčov rôznych polomerov, zoradených od najväčšieho (naspodku) po najmenšiu (hore). Úlohou je premiestniť všetky kotúče na druhú vežu, tretí slúži na dočasné odkladanie kotúčov. Pri premiestňovaní kotúčov sa musia dodržať nasledujúce pravidlá:
- V jednom ťahu môže premiestniť iba jeden kotúč
- Vždy sa berie vrchný kotúč z niektorej veže a pokladá sa na vrchol iné veže
- Nesmie sa položiť väčší kotúč na menšie
Implementácia
Každá veža bude v programe predstavovaná zásobníkom, a
to kvôli tomu, že sa vždy odoberá posledný pridaný prvok (kotúč).
Použite päť kotúčov, ktoré na začiatku umiestnite na
prvú vežu. V riešení pod článkom sú kotúče v kóde
predstavované celými číslami (najmenších je 1
a najväčší
5
).
Pri každom ťahu vyzvite používateľa, aby zadal veža, ktorej kotúč sa má preniesť, a veža, na ktorú sa má preniesť:
Konzolová aplikácia
1 2 3
██████
████████
██████████ ████ ██
Presunúť kotúč z veže: 3
Presunúť kotúč na vežu: 2
Zabezpečte dodržiavanie všetkých pravidiel pre presunutie kotúče.
Pre vykreslenie kotúčov použite plný obdĺžnik "█"
(napíšete ho ako Alt + 2 1 9,
alebo si ho skopírujte z textu do vášho kódu). Každý kotúč je potom
reťazec týchto obdĺžnikov. Najmenší kotúč je zložený z dvoch
obdĺžnikov, aby vyzeral ako štvorec, znaky v konzole sú totiž omnoho
vyššie ako širší. Druhý najmenší kotúč je o dva obdĺžniky širšie,
tretí o štyri atď.
Nepoužívajte metódu SetCursorPosition()
ani
vlastnosti CursorLeft
a CursorTop
triedy
Console
pre presun kurzora na potrebnú pozíciu. Systém pre
kontrolu odovzdaných úloh s nimi totiž nevie pracovať. Namiesto nich možno
použiť napr. Metódy PadLeft()
alebo PadRight()
priamo na inštanciu reťazca.
Keď sa užívateľovi povedie presunúť všetky kotúče na druhú, alebo tretiu vežu, vypíšte, že vyhral:
Konzolová aplikácia
1 2 3
██
████
██████
████████
██████████
Vyhral si!
{CSHARP_CONSOLE}
{/CSHARP_CONSOLE}
V nasledujúcom cvičení, Riešené úlohy k 1.-4. lekciu práca s kolekciami v C # .NET, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 547x (89.6 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#
Na absolvovanie tohto cvičenia prosím splň 2 ľubovoľné príklady tým, že ich úspešne odovzdáš na otestovanie.