Programovací jazyky 2

Informace o předmětu, projektech, zápočtech a zkouškách naleznete na stránkách předmětu.

Rozvržení semestru

Modře jsou označeny týdny, kdy se budou konat realtime testy. Šedě jsou označeny týdny, kdy výuka odpadne z důvodů svátků nebo rektorského/děkanského volna.

1 2 3 4 5 6 7 8 9 10 11 12 13 14

Kliknutím na číslo týdne se dostanete na zadání cvičení pro daný týden.

Cvičení 11

Stahování pomocí třídy WebClient

string url = "http://feeds.bbci.co.uk/news/health/rss.xml";
string xmlContent = null;
using (WebClient wc = new WebClient())
{
  xmlContent = wc.DownloadString(url);
}

Úloha 1 - XmlDocument

  1. Použijte třídu XmlDocument pro práci s XML dokumentem uvedeným v příkladu výše.
  2. Do konzole vypište titulky, které začínají slovem VIDEO
  3. Z XML reprezentovaného v paměti DOM zrušte položky <item>...</item>, které neobsahují v titulku slovo VIDEO.
  4. Při mazání vypisujte do konzoly informaci, co se děje. K tomu využijte události u třídy XmlDocument.
  5. Uložte výsledek do XML na disk.

XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlContent);

Úloha 2 - XmlTextReader a XmlTextWriter

  1. Použijte třídu XmlTextReader pro přečtení obsahu XML dokumentu uvedeným v příkladu výše.
  2. Při čtení do konzole vypište titulky, které začínají slovem VIDEO.
  3. Z XML reprezentovaného v paměti DOM zrušte elementy, které neobsahují slovo VIDEO.
  4. Vytvořte na disku XML dokument, který bude obsahovat pouze takové položky <item>...</item>, které obsahují titulek se slovem VIDEO pomocí třídy XmlTextWriter.

using (XmlTextReader xmlReader = new XmlTextReader(url))
{
  ...
}

using (XmlTextWriter xmlWriter = new XmlTextWriter(@"D:\bbc2.xml", Encoding.UTF8)) {
  xmlWriter.Formatting = Formatting.Indented;
  xmlWriter.WriteStartDocument();
  xmlWriter.WriteStartElement("rss");
  ...
  xmlWriter.WriteEndElement();
  xmlWriter.WriteEndDocument();
}

Cvičení 10

Výuková ukázka ze cvičení na extension metody

Úloha 1 - Eventy a serializace

Upravte kód zásobníku z 3. cvičení tak aby při vložení nebo odebrání prvku generoval událost oznamující změnu dat. Součástí této události bude také řetězcová reprezentace vkládaného/odebíraného prvku.
  • Vytvořte posluchače událostí vždy pro zásobník s integry a zásobník se stringy:
    • Posluchač zajistí aktualizaci listBoxu s hodnotami zásobníku
    • Posluchač zajistí výpis elementu, který byl odebrán nebo vložen do textového pole (víceřádkového).
    • Posluchač zajistí označení prvků, které jsou součásti zásobníku.
  • Zajistěte aby delegát reprezentující událost byl generický a jako zdroj události předávejte objekt typu IMyStack<T>, vytvořte posluchače (genrickou metodu), která bude při změně vypisovat obsah obou zásobníku do jednoho listboxu. Upravte metodu tisk tak aby nevypisovala do konzole, ale vracela řetězec.

Úloha 2 - Enumerátor

  • Naimplementujte enumerátor pro třídy MyQueue (viz Cvičení 2) pomocí vložené třídy.
  • Naimplementujte enumerátor pro třídu MyStack (viz Cvičení 2) pomocí yield return.
  • V konzolové aplikaci vytvořte instanci třídy MyQueue a MyStack, a vypište všechny prvky pomocí: foreach(int item in stack)
    {
      Console.WriteLine(item);
    }

Úloha 3 - Dictionary

Implementujte třídu Translator, která bude překládat text z jednoho jazyka do druhého. Pro implementaci vhodně použijte třídu Dictionary.

Cvičení 9

Pro potřeby testování si vytvořte třídu Contact, kterou budete ukládat. Třída bude obsahovat, jméno, věk, email, datum narozeni, vahu a příznak, že daná osoba je vdaná/ženatá. U této třídy implementujte metodu ToString tak, aby šla snadno vypisovat na konzoli. Vytvořte si konzolovou aplikaci, která bude obsahovat pole těchto objektů a bude s nimi dále pracovat dle následujících bodů.

Úloha 0 - Design pattern Factory

Na základě uvedeného obrázku s popisem řešení pomocí vzoru Factory implementujte následující úkoly jako třídy implementující rozhraní IContactDao a IContactDbFactory.

Návrhový vzor Továrna (Factory)

Úloha 1 - Textový soubor

Pomocí tříd StreamReader a StreamWriter pracujte s textovým souborem.

  • Uložte kolekci kontaktů do textového souboru
  • Uložené kontakty načtěte a vypište do konzole

Úloha 2 - Binární soubor

Pomocí tříd BinaryReader a BinaryWriter pracujte s binárním souborem.
  • Uložte několik kontaktů do binárního souboru
  • Uložené kontakty načtěte a vypište do konzole

Úloha 3 - Xml serializace

  • Serializujte pole kontatků pomocí XML serializace
  • Deserializujte pole kontatků a vypište do konzole

Úloha 4 - Binární serializace

  • Serializujte pole kontatků pomocí binární serializace
  • Deserializujte pole kontatků a vypište do konzole

Úloha 5 - Eventy a serializace

  • Definujte novou třídu ContactListener a v ní metodu odpovídající delegátu EventHandler. Do třídy Contact definujte event pro změnu váhy StateChanged.
  • V testovací třídě připojte na tento event metodu objektu ContactListener, která není serialozovatelná zaregistrujte u kontaktu obsluhu, reagující na tuto událost a daný kontakt se pokuste serialozovat. Nefunkčnost binární serializace vyřešte přidáním metaatributu k eventě [field: NonSerialized]

Cvičení 8

Výuková ukázka ze cvičení

Úloha 1 - Práce s rozhraním IEnumerable a IEnumerator

Implementujte Enumerator pro procházení prvků uvnitř Fronty a Zásobníku. Třídy budou implementovat rozhraní IEnumerable.

  • Frontu implementujte na cvičení pomocí konstrukce yield return.
  • Zásobník implementujte doma pomocí vnitřní třídy, která implementuje rozhraní IEnumerator. Metoda bude tak vracet novou instanci této vnitřní třídy.

Úloha 2 - Práce s rozhraním IComparer

Vytvořte si pole celých čísel a třídu reprezentující porovnání celých čísel dle následujícího popisu. Zkuste si setřídit pole dle vytvořených komparátorů a vypiště výsledek.

  • Čísla jsou porovnána tak, že nejprve jsou umístěna sudá a pak až lichá čísla a v rámci skupin dle velikosti. (např. 2,4,6,8,1,3,5,7,9)
  • Čísla jsou porovnána opačně než je popsáno v předchozím bodě. (např. 9,7,3,5,1,8,6,4,2)
  • Čísla budou setřízena dle jednotkové dekadické cifry a v rámci skupin dle velikosti. (např. 1,11,21,3,4,14,54,...)
  • Čísla jsou porovnána opačně než je popsáno v předchozím bodě. (např. 54,14,4,3,21,11,1)

Úloha 3 - Kolekce

  • Implementujte generickou frontu pomocí třídy LinkedList
  • Implementujte třídu Prekladac, která bude překládat text z jednoho jazyka do druhého. Pro implementaci vhodně použijte třídu Dictionary.

Úloha 4 - Práce se soubory

  • Vytvořte třídu Contact, která bude definovat jméno, věk, email, vahu a příznak, že daná osoba žije.
  • Uložte několik kontaktů do textového souboru. Uložené kontakty načtěte a vypište do konzole.
  • Uložte několik kontaktů do binárního souboru. Uložené kontakty načtěte a vypište do konzole.

FileStream: https://msdn.microsoft.com/en-us/library/system.io.filestream.aspx
StreamWriter: https://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx
BinaryWriter: https://msdn.microsoft.com/en-us/library/system.io.binarywriter(v=vs.110).aspx

Cvičení 7

Návrhové vzory

Implementujte návrhový vzor Observer, jehož popis naleznete na obrázku níže:

Návrhový vzor Observer

  • Třída Subject bude abstraktní a bude z ní dědit třída Invoice
  • IObserver je rozhraní, které implementují třídy SMSGate a PaymentMonitor
  • Pro uložení Observerů použijte generickou kolekci List

Observer: http://www.oodesign.com/observer-pattern.html.

List: https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx.

Cvičení 6

Úloha 1 - Delegáti

Vytvořte předpis funkce - delegáta Operation, který bude mít dva parametry typu int a také bude int vracet (jednoduchá matematická operace).
Vytvořte třídu Calculator, která bude obsahovat jedinou metodu - Write, která vypíše výsledek operace nad dvěma dosazenými operandy. Tato metoda bude mít tři parametry:

  • První operand
  • Druhý operand
  • Operace nad těmito dvěma operandy (typu Operation)

Napište testovací aplikaci, která vytvoří instanci třídy Calculator a postupně bude volat metodu Write. Za účelem testu vytvořte alespoň dvě různé operace.

Úloha 2 - Události

  • Přidejte třídě Calculator vlastnosti X a Y a dále metodu SetXY, která tyto dvě vlastnosti nastaví.
  • Přidejte událost OnSetXY typu EventHandler, která bude vyvolaná v metodě SetXY. V testovací aplikaci přidejte události odběratele a zavolejte metodu SetXY.
  • Navrhněte vlastní třídu, která bude dědit z EventArgs, a použijte ji při vyvolání události OnSetXY.
  • Ve Windows Forms aplikaci zkuste tlačítku programově přiřadit vlastní metodu, která bude vyvolána po jeho stisku.

Více o delegátech na https://msdn.microsoft.com/en-us/library/ms173171.aspx
Více o událostech na https://msdn.microsoft.com/en-us/library/awbftdfh.aspx
Další příklad: https://msdn.microsoft.com/en-us/library/orm-9780596521066-01-17.aspx

Cvičení 4

Úloha 1 - Generické typy

  • Upravte kód rozhraní a implementací zásobníku tak, aby byl generický a umožňoval ukládat objekty různých typů.
  • Použijte tento generický zásobník jednou pro ukládání celých čísel a podruhé pro řetězce.

Úloha 2 - Indexery, Properties

Cílem bude naimplementovat Dynamické pole celých čísel tak aby nemusely být všechny prvky pole obsazené (nullable). Třída bude splňovat následující body:

  • Vytvoření pole s velikostí definovanou v konstruktoru - možnost zadat jako implicitní parametr funkce.
  • Vložení prvku na jakoukoliv pozici (pole se dokáže zvětšit bude-li to nutné) a čtení z jakékoliv pozice pomocí indexeru.
  • Pole bude možné vypsat do konzole tak, aby šlo rozlišit obsazená a neobsazená políčka. Přepište (override) metodu ToString()
  • Pole bude obsahovat vlastnost (read/write) pro zjištění a nastavení velikosti pole. Pokus o zmenšení vyvolá vyjímku.
  • Pole bude obsahovat metodu s výstupním (out) parametrem pro výpočet součtu pole.
  • Pole bude obsahovat metodu, která k parametru předanému odkazem přičte hodnotu prvku na pozici předané jakjo další parametr.
  • Pole bude udržovat informaci o svém stavu = Prázdné, Částečně zaplněné, Plné

Úloha 3 - Testovací aplikace

Dále vytvoříte program, otestuje Vaše pole. Bude umět:

  • pomocí 2 parametrů příkazové řádky vytvoří pole, a naplní ho hodnotami (náhodné, sekvenční, nuly)
  • vypíše pole do konzole a vypočítá součet prvků pole
  • bude nastavovat prvky na nul a vypisoval aktualni naplněnost pole

Cvičení 3

Úloha 1

Vytvořte class library, která bude mít v sobě třídu MyStack a MyQueue (pokud ji nemáte, tak dodělejte do dalšího cvičení) a rozhraní IMyStack a IMyQueue (s metodami Add, Remove, IsEmpty, IsFull). Rozšiřte obě rozhraní, které implementují tyto třídy o property int[] Items.

Úloha 2

Vytvořte projekt typu Windows aplikace, který bude referencovat assembly knihovny z úlohy 1. GUI aplikace bude obsahovat následující funkčnost.

  • Panel pro vizualizaci Zásobníku:
    • Popis (label) pro textbox na vložení čísla.
    • Textbox na vložení čísla.
    • Tlačítko pro přidání prvku do kolekce. Hodnota se vezme z textboxu.
    • Tlačítko pro odebrání prvku z kolekce.
    • ListBox zobrazující aktuální obsah Zásobníku. Bude zobrazovat vše, tj. i neplatné prvky.
  • Panel pro vizualizaci Fronty:
    • Popis (Label) pro textbox na vložení čísla.
    • Textbox na vložení čísla.
    • Tlačítko pro přidání prvku do kolekce. Hodnota se vezme z textboxu.
    • Tlačítko pro odebrání prvku z kolekce.
    • ListBox zobrazující aktuální obsah Fronty. Bude zobrazovat vše, tj. i neplatné prvky.
  • Zobrazování jen platných dat z obout ADT
    • Upravte vlastnost Prvky tak, aby vracela jen platné prvky objektů

Úloha 3

  • Aplikace obsahuje 2 tlačítka a panel do kterého se dá kreslit.
  • Čtverec (Tlačítko 1) se bude kreslit při události Mouse_Down a Kružnice (Tlačítko 2) při události Mouse_Up

Cvičení 2

Vytvořte konzolovou aplikaci, která bude obsahovat následující rozhraní a třídu, která toto rozhrani implementuje. A demonstrujte použití této třídy.

public interface IMyStack
{
    void Push(int i); // vlozi prvek na vrchol zasobniku
    int Pop(); // odebere prvek z vrcholu zasobniku a vrati jej
    int Top(); // vrati prvek z vrcholu zasobniku
    bool IsEmpty(); // zjisti, zda je zasobnik prazdny
    bool IsFull(); // zjisti, zda je zasobnik plny
}

Vytvořte třídu MyStack, implementující rozhraní IMyStack. Bude implementována pomocí pole intů s konstatní velikostí. Složitost operaci push a pop bude O(1). Přidejte do třídy MyStack další metody, které nejsou v rozhraní (minimálně metodu Print(), která vypíše prvky v zásobníku).

Kompilace z příkazové řádky

Kompilaci z příkazové řádky provádíme přes C# compiler (csc.exe) (přímo z Visual Studio Command Prompt nebo přes Command Line - csc.exe můžeme najít např. v adresáři C:\Windows\Microsoft.NET\Framework\v4.0.30319):

  • csc File.cs - zkompiluje File.cs a vytvoří File.exe
  • csc /target:library /out:My.dll File.cs - zkompiluje File.cs a vytvoří knihovnu My.dll
  • csc /out:Something.exe *.cs - zkompiluje všechny .cs v adresáři a vytvoří Something.exe

Více na https://msdn.microsoft.com/en-us/library/78f4aasd.aspx.