Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Cvičení k 17.-18. lekci OOP v C# .NET

C# .NET Objektově orientované programování Cvičení k 17.-18. lekci OOP v C# .NET American English version English version

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Následující 3 cvičení vám pomohou procvičit znalosti programování v C# .NET z minulých lekcí. Ve vlastním zájmu se je pokuste vyřešit sami. Pod článkem máte pro kontrolu řešení ke stažení. Ale pozor, jakmile se na něj podíváte bez vyřešení příkladů, ztrácí pro vás cvičení smysl a nic se nenaučíte :)

Pokud si opravdu nebudete vědět rady, podívejte se raději znovu do minulých tutoriálů a pokuste se na to přijít.

Jednoduchý příklad

Vytvořte třídu pro uživatele internetové seznamky. Uživatel má tyto vlastnosti:

  • Jmeno
  • Prijmeni
  • DatumNarozeni
  • Pohlavi - Enum s hodnotami Muz, Zena
  • BarvaOci - Enum s flagy Neuvedena, Modra, Zelena, Hneda, Cerna, Modrozelena, Hnedozelena. Poslední 2 hodnoty jsou kombinací předchozích.
  • BarvaVlasu - Enum s hodnotami Neuvedena, Blond, Hneda, Cerna, Zrzava.

U uživatele přetižte metodu Equals() tak, aby byli uživatelé porovnávání podle svých vlastností.

Vytvořte kolekci typu List následujících lidí:

  • "Karel" "Novák", Narozen 25.6.1958, Barva očí Zelená, Barva vlasů Blond
  • "Josef" "Nový", Narozen 19.3.1978, Barva očí Hnědá, Barva vlasů Hnědá
  • "Jan" "Marek", Narozen 28.4.1968, Barva očí Černá a Hnědá, Barva vlasů Neuvedena
  • "Karel" "Novák", Narozen 25.6.1958, Barva očí Zelená, Barva vlasů Blond
  • "Marie" "Nová", Narozena 15.8.1988, Barva očí Modrá, Barva vlasů Černá
  • "Věra" "Nováková", Narozena 2.10.1978, Barva očí Modrozelená, Barva vlasů Blond
  • "Simona" "Mladá", Narozena 8.1.1968, Barva očí Neuvedena, Barva vlasů Hnědá
  • "Michaela" "Marná", Narozena 6.12.1958, Barva očí Modrá, Barva vlasů Zrzavá

Na Listu zavolejte metodu Distinct(), která List profiltruje jen na unikátní prvky a tyto prvky vypište.

Ukázka obrazovky programu:

Konzolová aplikace
Karel Novák, 1958, oči: Zelena, vlasy: Blond
Josef Nový, 1978, oči: Hneda, vlasy: Hneda
Jan Marek, 1968, oči: 12, vlasy: Neuvedena
Marie Nová, 1988, oči: Modra, vlasy: Cerna
Věra Nováková, 1978, oči: Modrozelena, vlasy: Blond
Simona Mladá, 1968, oči: Neuvedena, vlasy: Hneda
Michaela Marná, 1958, oči: Modra, vlasy: Zrzava

    class Uzivatel
    {
    }

Středně pokročilý příklad

V tomto příkladu si vytvoříme vlastní kolekci List, fungující stejně jako je ta v .NET frameworku, kterou používáme. Vytvořte třídu MujList, která v sobě obsahuje privátní pole o velikosti 10 prvků a vlastnost Pocet, která udává kolik prvků z pole je zaplněných daty. Pole udělejte typu Object, což je předek všech objektů v C# a tím pádem do něj půjde uložit cokoli. Úplně nejlepší by bylo udělat list generický, ale s tím se setkáme až v kurzu Kolekce a LINQ.

Listu implementujte metodu Pridej(), která vloží daný prvek na další index v privátním poli a zvýší vlastnost Pocet. Pokud se již pole plně naplní, vytvoří se nové 2x větší, obsah původního pole se do něj zkopíruje a původní pole se zahodí. Mimochodem, takto opravdu vnitřně funguje kolekce List z .NET.

List pomocí pole v C# .NET

Na obrázku výše je ukázané vnitřní pole listu s 8mi prvky (poslední 2 indexy jsou nevyužité, ve vlastnosti Pocet je hodnota 8).

Nakonec třídě implementujte indexer, aby se k prvkům listu dalo přistupovat pomocí hranatých závorek a číselného indexu.

Do kolekce postupně přidejte tyto položky:

  • "První"
  • 2
  • 3
  • 4
  • takto přidávejte další čísla až do 100000

Následně změňte prvek na indexu 3 na hodnotu Čtvrtý. Prvních 100 položek pro kontrolu vypište.

Ukázka obrazovky programu:

Konzolová aplikace
První
2
3
Čtvrtý
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

    class MujList
    {
    }

Pokročilý příklad

Vytvořte třídu reprezentující větu, skládající se z několika slov. Jednotlivá slova věty jsou uložena v privátním poli. Věta bere v konstruktoru celou větu jako string, kterou rozsplituje na slova a uloží do privátního pole. Splitujte podle znaků ".,! :" (tečka, čárka, vykřičník, mezera, dvojtečka). Pole těchto znaků vložíte metodě Split() jako parametr. Jako druhý parametr metodě předejte hodnotu StringSplitOptions.RemoveEmptyEntries, čímž zamezíte tvorbě prázdných prvků v poli (když jsou 2 oddělovací znaky ve větě za sebou).

V aplikaci pracujte s následující větou: "Delegát v C# .NET funguje jako odkaz na metodu.".

Implementujte 2 metody: Mapuj() a Agreguj().

Metoda Mapuj() přebírá v parametru delegát na funkci, kterou aplikuje na všechna slova ve větě. Slova věty můžeme tedy všechna převést na velká písmena např. předáním této lambda funkce metodě Mapuj():

Veta veta = new Veta("Delegát v C# .NET funguje jako odkaz na metodu.");
veta.Mapuj(s => s.ToUpper());
Console.WriteLine(veta);

Výsledek:

DELEGÁT V C# NET FUNGUJE JAKO ODKAZ NA METODU.

Metoda Agreguj() funguje podobně, přijímá delegát na funkci, která bere jako parametry výsledek a slovo. Slovo následně připojí do výsledku daným způsobem (např. vysledek = vysledek + " " + slovo). Metoda Agreguj() takto sestaví výsledek pro všechna slova. Slova věty můžeme tedy všechna spojit do jednoho řetězce např. předáním této lambda funkce metodě Agreguj():

Veta veta = new Veta("Delegát v C# .NET funguje jako odkaz na metodu.");
Console.WriteLine(veta.Agreguj((a, b) => a + "-" + b));

Výsledek:

Delegát-v-C#-NET-funguje-jako-odkaz-na-metodu

Metody použijte následujícím způsobem:

  • Pomocí metody Mapuj() převeďte každé slovo delší než 5 znaků na velká písmena.
  • Pomocí metody Agreguj() vypište větu jako slova oddělená mezerou.
  • Pomocí metody Agreguj() vypište větu jako slova ozávorkovaná vždy z levého konce celé věty a pravého konce aktuálního slova.
  • Pomocí metody Agreguj() vypište větu tak, aby bylo každé další slovo delší než 4 znaky zkrácené na 3 první znaky a tečku (viz obrázek).

Ukázka obrazovky programu:

Konzolová aplikace
DELEGÁT v C# NET FUNGUJE jako odkaz na METODU.
Agregáty:
DELEGÁT v C# NET FUNGUJE jako odkaz na METODU
((((((((DELEGÁT) v) C#) NET) FUNGUJE) jako) odkaz) na) METODU
DELEGÁT v C# NET FUN. jako odk. na MET.

    class Veta
    {
    }

 

Stáhnout

Staženo 152x (119.18 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
6 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Miniatura
Následující článek
Události
Aktivity (8)

 

 

Komentáře

Avatar
Michal Gros
Redaktor
Avatar
Michal Gros :3.12.2015 21:08

Mám dotaz ? Je nutné pro případ použití metody Distinct() přepisovat i operátor == nebo !=
Nebo stačí dořešit věc jenom takto ?

public override bool Equals(object obj)
      {
          // varianta 1 kontrola typu objektu a hodnoty pomocí níže přetíženého operátoru
          return (obj as Zakaznik).GetHashCode() == this.GetHashCode();

      }
public override int GetHashCode()
        {
            return Jmeno.GetHashCode() ^ Prijmeni.GetHashCode() ^ DatumNarozeni.GetHashCode() ^ BarvaVlasu.GetHashCode() ^ BarvaOci.GetHashCode();
        }
Odpovědět 3.12.2015 21:08
Jestli jste dobří nahrnou na Vás spoustu práce. Jestli jste sakra dobří, tak se jí dokážete zbavit.
Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:24.4.2016 20:16

Ahoj, spojování hešů mi nechtělo fungovat tou stříškou, tak jsem to udělal takto a funguje to. Nevíte, čím to je?

public override int GetHashCode()
{
    return Oci.GetHashCode() + Vlasy.GetHashCode() + Pohlavi.GetHashCode();
}
 
Odpovědět 24.4.2016 20:16
Avatar
Marek
Člen
Avatar
Odpovídá na Michal Gros
Marek:4.7.2017 20:03

Přišlo mi logické, že kód funguje i bez přetížení operátorů == / !=, jak píšeš. Jen nerozumím, proč kód funguje i když vynechám klíčové slovo this

public override bool Equals(object obj)
        {
            return (obj as Uzivatel).GetHashCode() == GetHashCode();
        }
 
Odpovědět 4.7.2017 20:03
Avatar
Michal Gros
Redaktor
Avatar
Michal Gros :4.7.2017 20:10

No ohledně this jsem nějak zvyklí jej používat pro mě to zpřehledňuje čtení kódu.
this neříká nic jiného než se odkazuji na instanci dané třídy. Jestliže je metoda v dané třídě nechápu potom zase já proč by to nemělo fungovat :)

Odpovědět 4.7.2017 20:10
Jestli jste dobří nahrnou na Vás spoustu práce. Jestli jste sakra dobří, tak se jí dokážete zbavit.
Avatar
Marek
Člen
Avatar
Odpovídá na Michal Gros
Marek:4.7.2017 21:48

Protože v Equals porovnáváš instanci třídy (this) s objektem v parametru ? Jak jsem psal, chápu, že to funguje i bez this, ale vzhledem k tomu, že Equals chápu takto, tak mi to smysl nedává.

Každopádně děkuji za rychlou odpověď a vysvětlení :)

 
Odpovědět 4.7.2017 21:48
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.