Cvičení z Objektově orientovaného programování


V první polovině zimního semestru 2017/2018 vedu dvě cvičení předmětu Objektově orientované programování [NMIN201]. Cvičení probíhají ve čtvrtek od 17.20 a pátek od 12.20 v učebně K11.

První polovinu semestru přednáší Jakub Gemrot. (viz Stránky přednášky) Druhou polovinu semestru přednáší i cvičí Tomáš Holan.

Podmínky pro zápočet

Přístupové údaje do Visual Studia v labu K11

Tato část stránky se zobrazuje pouze při přístupu z labu.

Co se událo?

Následující tabulka zachycuje možnosti vývojových prostředí. Je to samozřejmě jen drobný výběr, existuje celá řada jiných prostředí, které také můžete využít. Pokud byste našli nějaké, které by stálo za zmínku, klidně mi o něm napište.

Vývojové prostředí Jazyky Operační systém Výhody Nevýhody Poznámky
Visual Studio C, C++, C# Windows Stejné prostředí na všechny jazyky, stejné prostředí jako v labu, ve variantě Community je zdarma Pouze Windows, zabere hodně paměti (jak na disku, tak na RAM po spuštění) Po nainstalování je potřeba ještě stáhnout rozšíření pro C++. Doporučuji rovnou nainstalovat i rozšíření pro .NET, abyste byli připraveni na druhou část semestru. Nicméně o to víc disku vám to sežere...
Code::Blocks C, C++ Windows, Linux, OS X Zdarma, opensource, multiplatformní, menší než Visual Studio Neporadí si (aspoň v základu) s C# Code::Blocks ve skutečnosti použije překladač Gcc/G++ (viz níže). (Umí ale používat i jiné překladače.)
MonoDevelop C# Windows, Linux, OS X Zdarma, opensource, multiplatformní, menší než Visual Studio Neumí toho tolik, jako Visual Studio. Pouze C#, takže jej využijete až ve druhé polovině semestru. Pro Linuxové uživatele je Mono jediný (rozumný) způsob, jak psát C# aplikace. A MonoDevelop je na to nejpoužitelnější vývojové prostředí (IDE).
Pouze překladač Gcc/G++ C, C++ Windows, Linux, OS X Zdarma, opensource, multiplatformní, zabere nejméně místa Je potřeba se nebát příkazové řádky Pokud byste nechtěli používat žádné speciální vývojové prostředí, existuje i takováto cesta. Píši o ní, protože je to moje nejoblíbenější varianta. Zároveň ale upozorňuji, že většině lidí možná vyhovovat nebude. Pro C# pak existuje překladač mcs.
Zaklínadla pro dnešní den
Úložky na cvičení
  1. Napište program, který přečte dvě čísla ze vstupu a vypíše jejich součet.
  2. Program vylepšete: načtěte číslo, operaci a druhé číslo. Proveďte operaci podle toho, co přijde na vstupu.
    Příklad vstupu 4-3
    Příklad výstupu 1
  3. Napište program, který bude zadávat jednoduché početní příklady a uživatel má za úkol je vypočítat. Detaily nechám na vás. Začněte třeba s jedním příkladem a s jedinou operací. Přidejte například náhodný výběr operace, nebo počítejte chyby a na závěr vypiště statistiku. (Může se vám hodit generátor náhodných čísel.)
1. Domácí úkol (8 bodů) (do 12. 10. 2017 / 13. 10. 2017 – 8.00 ráno před dalším cvičením)

Odevzdávací systém zatím nefunguje. Výsledek prvního úkolu mi pošlete e-mailem (had+oop --at-- kam). Další úkoly již (doufejme) budou zadané v ReCodExu.

Zprovozněte si vývojové prostředí a hlavně překladač jazyka C. Dále si zde ze stránek stáhněte zdrojový kód Program spusťte a e-mailem mi pošlete výsledek (tj. co program vypsal do konzole). Máte-li s vývojovým prostředím problém a nevíte si s ním rady, ozvěte si mi také.

Aktualizace: Ve Visual Studiu 2017 se údajně trochu změnil průvodce na vytvoření projektu. Měla by zde být možnost rovnou vybrat "Empty Project" místo "Win32 Console Application", případně "Desktopový průvodce", ve kterém se pak dá vypnout "SDL checks" a "Prcompiled header".

  1. Napište funkci, která načte jedno celé číslo ze std. vstupu jen pomocí getchar().
  2. Upravte ji tak, abyste uměli detekovat, že se číslo nepodařílo načíst
  3. Zkuste si napsat binární vyhledávání v poli. (rekurzivně)
  4. Napište pomocí pole frontu. Pořiďte si dvě funkce push() a pop(), které budou pracovat s tímto polem. Zatím mějte klidně všechno globálně.
  5. Pro fajnšmekry: Zkuste si pomocí metody Monte Carlo spočítat hodnotu pi. (Generujte náhodné body ve čtverci 1x1 a měřte, zda jste se trefili do kružnice.)

  1. Vyzkoušejte si spojový seznam. Můžete vyjít z kódu z přednášky. Ještě se na přednášce neprobralo dynamické alokování paměti a struktury.

Doděláme příklady z minula:

  1. Zkuste si napsat binární vyhledávání v poli. (rekurzivně)
  2. Napište pomocí pole frontu. Pořiďte si dvě funkce push() a pop(), které budou pracovat s tímto polem. Zatím mějte klidně všechno globálně.
  3. Pro fajnšmekry: Zkuste si pomocí metody Monte Carlo spočítat hodnotu pi. (Generujte náhodné body ve čtverci 1x1 a měřte, zda jste se trefili do kružnice.)

  1. Spojový seznam
struct prvek {
	int hodnota;
	...
};

struct prvek * vloz_na_zacatek(struct prvek * seznam, int hodnota) { ... }
struct prvek * odeber_ze_zacatku(struct prvek * seznam) { ... }
int hodnota_prvniho_prvku(struct prvek * seznam) { ... }

// příklad volání:

struct prvek * seznam = NULL;

seznam = vloz_na_zacatek(seznam, 4);
int h = hodnota_prvniho_prvku(seznam);
seznam = odeber_ze_zacatku(seznam);

// varianta pro pokročilé:

push(&seznam, 4);
int h = pop(&seznam);

Byla jednou jedna vesnice, ve které se lidé měli rádi a o Vánocích se s chutí obdarovávali. Roku 1 každý vesničan vyrobil jeden dárek a o Vánocích ho dal svému oblíbenci. Druhý rok vesničané zjistili, že dárky, které dostali, se jim moc nehodí, takže je poslali dál: o Vánocích každý svému oblíbenci (témuž jako loni) předal všechny dárky, které loni dostal. Kdo loni nedostal žádný dárek, zahořkl a nikoho neobdaroval. Třetí rok si opět všichni dárky předali.

Tak to šlo rok za rokem, až někdo dostal dárek, kterým před časem sám někoho obdaroval. Tehdy se samozřejmě urazil, dárek uložil na půdu a už ho dál nepředával.

Víte-li, kolik má vesnice obyvatel a kdo je čím oblíbencem, spočítejte, po kolika letech skončí všechny dárky na půdách.

Vstupní soubor darky.in obsahuje dva řádky. Na prvním z nich je jediné celé číslo N : počet vesničanů (1 ≤ N ≤ 100000). Na druhém se nachází N čísel oddělených mezerami, i -té z nich říká, kdo je oblíbencem i -tého vesničana. (Vesničany číslujeme od 1 do N.)

Výstupní souubor darky.out nechť obsahuje jediné celé číslo: počet let, po nichž budou všechny dárky uloženy na půdách.

Příklad 1:

**darky.in**
7
3 5 4 2 1 7 6

**darky.out**
5

Příklad 2:

**darky.in**
6
5 3 4 2 3 2

**darky.out**
5

7. – 9. cvičení: cvičí Tomáš Holan

Domaci ukol

Napište program implementující „telefonní seznam“. Místo údajů o jednotlivých lidech v něm budeme evidovat pouze čísla (kladná celá). Program se bude ovládat ze standardního vstupu.

Na vstupní řádce vždycky bude kód operace a případně číslo, které bude parametrem operace. Operace budou tyto:

1 – vlož číslo do seznamu
2 – smaž číslo ze seznamu
4 – setřiď seznam (sestupně)
5 – vypiš
6 – konec

Za operacemi 1 a 2 bude nasledovat mezerou oddělené číslo, které se má vložit resp. vymazat.

Tedy například řádek „1 5“ bude znamenat „přidej do seznamu číslo 5“. Řádek „2 4“ znamená „smaž ze seznamu číslo 4“.

Při výpisu uvádějte každé číslo na zvláštní řádek. Pokud chceme mazat ze seznamu číslo, které v něm není, operaci ignorujte. (Ne aby program spadl!)

Příklad vstupu:
1 100
1 300
1 200
4
5
6
Příklad výstupu:
300
200
100

Můžete předpokládat, že operace 4 (setřiď seznam) je vždy volána před operací 5 (vypiš) všude tam, kde by různé implementace seznamu mohly dávat různé výsledky.

Poznámky:

Konzultace

Pokud něčemu nerozumíte a chtěli byste to se mnou probrat, můžeme se potkat. Ideální čas je asi hned po konci cvičení, ovšem můžeme se domluvit i na jindy. Ale pondělí až středa jsem na Malostranském náměstí, takže byste museli za mnou.

Kontakt

V případě potřeby mi můžete napsat e-mail, ideálně na adresu: had+oop [at] kam.mff... (dál si to domyslíte; nápověda: koukněte na adresu této stránky)