Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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++,
    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);
        }
    }

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í:

Kolekcia v C # .NET a LINQ

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]
    // 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;


        }
    }
    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;
        }
    }

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
Hanojské veže - Kolekcia v C # .NET a LINQ

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!

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é 529x (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.

Predchádzajúci článok
Riešené úlohy k 10.-11. lekciu práca s kolekciami v C # .NET
Všetky články v sekcii
Kolekcia v C # .NET a LINQ
Preskočiť článok
(neodporúčame)
Riešené úlohy k 1.-4. lekciu práca s kolekciami v C # .NET
Článok pre vás napísal Radek Vymětalík
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
...
Aktivity