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
- Použijte třídu XmlDocument pro práci s XML dokumentem uvedeným v příkladu výše.
- Do konzole vypište titulky, které začínají slovem VIDEO
- Z XML reprezentovaného v paměti DOM zrušte položky <item>...</item>, které neobsahují v titulku slovo VIDEO.
- Při mazání vypisujte do konzoly informaci, co se děje. K tomu využijte události u třídy XmlDocument.
- Uložte výsledek do XML na disk.
XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlContent);
Úloha 2 - XmlTextReader a XmlTextWriter
- Použijte třídu XmlTextReader pro přečtení obsahu XML dokumentu uvedeným v příkladu výše.
- Při čtení do konzole vypište titulky, které začínají slovem VIDEO.
- Z XML reprezentovaného v paměti DOM zrušte elementy, které neobsahují slovo VIDEO.
- 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.
Ú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:
- 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.