155IN3G Informatika 3
Anotace
Úvodní kurz programování v jazyce C++ seznamuje studenty se základními prvky jazyka, strukturou programu a typy dat. Předmět postupuje od elementárních pojmů jako jsou deklarace proměnných, konstanty, inicializace proměnných, výrazy, příkazy, funkce a ukazatele. Výuka probíhá v prostředí operačního systému GNU/Linux.
Důraz je kladen na objektové vlastnosti jazyka a používání vybraných nástrojů standardní C++ knihovny, jako jsou například kontejnery vector a map, a jejich využití při dynamické alokaci paměti, které je nezbytné např. pro programování jednoduchých geodetických úloh a řešení úloh vyrovnávacího počtu.
Třídy, jako nástroj pro definování uživatelských typů, jsou nejprve demonstrovány na jednoduchých příkladech, ve kterých je organizace paměti zajištěna např. standardními kontejnery. Po úvodním výkladu pojmů dědičnost a polymorfismus následuje seznámení s mechanismem výjimek a jejich ošetření. Ke třídám, dědičnosti a polymorfismu se studenti znovu vrací při výkladu dynamické alokace paměti.
Tento úvodní kurz si neklade za cíl vyčerpávajícím způsobem probrat v plné šíři všechny rysy jazyka C++ (např. problematika šablon je pouze naznačena), jeho cílem je ale seznámit studenty dostatečně podrobně s C++, tak aby mohli aktivně programovat a byli připraveni pro následné studium objektového programování.
- Doporučená literatura
- Čepek, A.: Úvod do C++, Vydavatelství ČVUT v Praze, 2004
Přednášky
Přednášející: prof. Ing. Aleš Čepek, CSc.
- První seznámení s platformou Qt Creator, základní pojmy C++
- Programování cyklů
- Funkce, první seznámení
- Knihovna matvec
- Gaussova eliminace rozšířené soustavy
- Zpracování vstupní dávky souřadnic
- Vstupní/výstupní proudy
- Ukazatele a dynamická alokace paměti
- Ukazatel na funkci (2)
- Výjimky
- Kontejnery a iterátory
- Dědičnost a polymorfismus
Přednášky ve formátu PDF (http://geo.fsv.cvut.cz/~gin/c++bc/).
Cvičení
Cvičení navazují na látku probíranou na přednáškách.
První seznámení s SDK Qt Creator
Založení projektu:
- -> File
- -> New File or Project ...
- -> Výběr typu projektu (Qt Widget Projekt -> Qt Gui A
- -> jméno projektu a výběr adresáře (umístění projektu)
- -> Target Setup (Desktop ... závisí na aplikaci, zda je více možností)
- -> Class Information (význam si objasníme později)
- -> Project Managemant (správa projektu)
Qt Creator vygeneruje kostru aplikace, základní widgety lze spravovat v grafickém editoru. Překlad a spuštění aplikace: funkce Run CTRL+R
![](/images/4/42/Qt-MainWindow-0.png)
Doplněny widgety typu QLabel, QLineEdit a QPushButton
![](/images/7/7f/Qt-MainWindow-1.png)
Základní pojmy
- program hello world, seznámení s prostředím Qt Creator (konzolové aplikace)
- vybrané základní datové typy (int, double, bool, void)
- základní aritmetické operace +, -, *, / a %
- operátor přiřazení a operátory +=, -=, *= ...
- blok {}, platnost a viditelnost objektů (proměnných)
- standardní vstup a výstup pro základní číselné typy
- odvozené typy ukazatel a reference (první zmínka)
Programování cyklů
- první seznámení s kontejnerem vector
- relační operátory <, >, <=, >=, !=
- příkazy for, while, do, continue a break
- příklady programování jednoduchých cyklů
Funkce, první seznámení
- napište a otestuje jednoduché funkce jako (více viz sbírka příkladů C++ Bc.).
Knihovna matvec
- maticová knihovna matvec
- součet dvou vektorů, součet dvou matic
- součin matice a vektoru
- součin dvou matic
Příklad práce s maticemi a vektory
Gaussova eliminace rozšířené soustavy
Řesení soustavy lineárních rovnic Gaussovou eliminací
- vstup rozšířená matice soutavy (absolutní členy tvoří N+1 sloupec; na cvičení se omezíme na případ s jedinou pravou stranou)
- převod na horní trojuhelníkovou soutavou (pomocí elementárních úprav: výměna dvou řádků, přenásobení řádku nenulovývm koeficientem, přičtení k-násobku jiného řádku)
- řešení horní trojúhelníkové soustavy (zpětná substituce)
Zpracování vstupní dávky souřadnic
Napište program, který načte a zpracuje soubor souřadnic v následujícím formátu (viz zadádí C++ Bc. 19):
- soubor může obsahovat komentáře (#)
- může obsahovat prázdné řádky
- na řádku se uvádí číslo bodu a souřadnice xy, z nebo xyz
# jednoduchy seznam souradnic # --------------------------- 1001 234.53 345.22 # x y 1002 355.24 456.46 555.12 # x y z 1003 423.12 # z # ------ konec dat ------
Vstupní/výstupní proudy
Napište funkci std::istream& komentář(std::istream& inp) podle zadání C++ Bc. 18.
Funkce komentář() vrací referenci na vstupní proud a může být proto použita např. v podmínce while(...) pro čtení vstupních dat.
Poznámka: funkce komentář() je po formální stránce manipulátor bez parametrů (více viz skripta).
Ukazatele a dynamická alokace paměti
- Ukazatel na funkci
- napište funkci, která metodou půlení hledá řešení soustavy , kde je spojitá funkce, která na zadaném inrevalu nabývá hodnot s různými znaménky (viz též metoda tětiv z příkladu 29).
- Napište funkce, které realizují jednoduché funkce s maticemi:
- alokování paměti pro matici
- načtení matice ze souboru
- výpis matice
- uvolněné alokované paměti
Ukazatel na funkci (2)
Napište funkci pro numerický výpočet určitého integrálu Simpsonovou metodou (příklad 30).
Použijte deklaraci typedef pro typ ukazatel na funkci typu double s jedním argumentem typu double.
typedef double (*Funkce)(double); double simpson(Funkce f, double a, double b, int m); // deklarace funkce
Poznámka: deklaraci typedef můžeme použít pro zjednodušení práce s libovolným typem, nevytváří nový typ ale pouze náhradní jméno.
Výjimky
- try blok
- vyvolání výjimky
- zpracování výjimek
Kontejnery a iterátory
- napište program, který po řádcích čte zadaný text a vytváří slovník, ve kterém je pro každé slovo uveden seznam řádků na kterých se dané slovo vyskytuje.
Dědičnost a polymorfismus
Navrhněte jednoduchou soustavu tříd demonstrujících využití polymorfismu. Např. Osoba -> (Student | Učitel) s virtuální metodou info() o dané osobě, demonstrovano na seznamu osob.
Rozpis cvičení
- Zimní semestr 2010/2011
- Zimní semestr 2008/2009
- Zimní semestr 2007/2008
- Zimní semestr 2006/2007
- Letní semestr 2005/2006
- Zimní semestr 2005/2006
- Zimní semestr 2004/2005
Skripta, příklady, tutoriály
- Skripta
- Úvod do C++, nakladatelství ČVUT
- Příklady
- Příklady C++ pro bakaláře
- Návody, tutoriály
- Qt Creator
- Maticová C++ knihovna matvec
- Tvorba programů v prostředí OS GNU/Linux
- GNU Emacs
- Code::Blocks
- Dev-C++
Externí odkazy
Program make
- GNU Emacs jako implicitní volbu pro překlad nabízí program make -k (parametr -k znamená pokračovat i po případných chybách)
- Typickým způsobem jak přeložit a sestavit program je definovat všechny potřebné kroky a závislosti v souboru Makefile a přenechat řízení překladu a sestavení na programu make
- Daný program/programy, resp. projekt, přitom umisťujeme do samostatného adresáře (např. přednášky a cvičení)
Následující jednoúčelový soubor Makefile umožňuje automatický překlad, sestavení a spuštění všech C++ souborů v daném adresáři (předpokládáme, že každý soubor obsahuje jeden kompletní program)
FILES=$(shell ls *.cpp | sed s/\\.cpp$$//g ) all : $(FILES) % : %.cpp Makefile $(CXX) $(CXXFLAGS) -I.. -o $@ $< touch data.txt ./$@ < data.txt
Zkouška
- Zkouška v počítačové učebně probíhá v prostředí SDK Qt pod OS Linux, konto "zkouska" (přihlášení obdobně jako na konto "student"). Z tohoto pravidla se npřipouštějí výjimky, důvodem jsou opakované dřívejší pokusy o podvody u zkoušky.
- Zkouška má obecně tři části, první a druhá část vždy v počítačové učebně. V první části (45 minut) je zadána jedna úloha a podle výsledku zkouška pokračuje (pokud má student zájem o případné zlepšení známky). Od akademického roku 2009-2010 nejsou zadávány úlohy ze sbírky.
- Do druhé části postupují kandidáti na známky D nebo lepší, není garantováno. Druhá část zkoušky trvá opět 45 minut. Zadání je individuální, obvykle ale společné pro celou skupinu.
- U zkoušky mohou studenti používat skripta, jeden list formátu A4 s poznámkami a jeden list formátu A4 na pracovní poznámky během zkoušky.
- třetí část zkoušky probíhá individuálně a rozřazuje přihlašené studenty do kategorií B a A.
Každý student si může donést jeden list formátu A4 s poznámkami (nesmí ale obsahovat kód ze sbírky příkladů) a může používat jeden čistý list A4 na poznámky. Nutno předložit ke schválení před zahájením zkoušky.
Při zkoušce nesmí studenti používat žádné další pomůcky, jedinou výjimkou jsou text skripta (nesmí pochopitelně obsahovat vepsané či vložené kódy příkladů ze sbírky) a veškeré informace z online dokumentace operačního systému. Skripta musí zůstat u počítače ke kontrole před vyhodnocením daného kola.
Studenti jmenovitě nesmí používat externí media, ani kalkulačky, mobily, organizátory a pod. Veškeré tašky a osobní věci musí být uloženy v prostoru u tabule (B870). Během 45 minut v jednotlivých fázích zkoušky nesmí studenti opouštět učebnu.
Při zkoušce mohou studenti komunikovat pouze s vyučujícími. Komunikace s jinými studenty nebo s kýmkoliv mimo učebnu (jakoukoliv formou) je považována za pokus o podvod.
Pokusy o podvod budou nahlášeny disciplinární komisi fakulty s návrhem na ukončení studia.
Zimní semestr 2010/2011
- Napište funkci, která v dané matici zamění i-tý a j-tý řádek anebo m-tý a n-tý sloupec
- Napište funkci, která počítá součin vektoru a symetrické matice, která je uložena v jednorozměrném poli po řádcích (horní trojúhelník). Výpočet ověřte porovnáním s výpočtem A*b s využitím knihovny matvec.
- Napište funkci, která "normalizuje rastrová data." Rastrová data jsou dána maticí s reálnými hodnotami. Přepočítejte je tak, aby minimální hodnota byla převedena na nulu, maximálni na 100 (tj. přepočtěte data na relativní udaje v procentech). Ověřte/demonstrujte výsledky funkce na základě náhodně generovaných dat (rozměry matice a náhodné hodnoty minima a maxima, generované hodnoty prvků matice generujte s rovnoměrným rozdělením).
- C++ Bc. 12 : napište funkci plocha, která počítá plochu polygonu a použijte ji v programu, který čte vstupní data se standardního proudu (např. ze souboru a pod.). Pozn.: byli přihlášeni pouze 3 studenti.
- Napište funkci, která počítá rozklad přirozeného čísla na součet Fibonacciho čísel; tj. posloupnost 1, 2, 3, 5, 8, 13, 21, .... F(n) = F(n-1) + F(n-2). Např. 19 = 13 + 5 + 1.
- napište funkci pro výpočet Pearsonova korelačního koeficientu. Ověřte na simulovaných datech. Pozn.: byli prihlaseni pouze 2 studenti
- Napište funkci, která pro zadaný soubor bodů (x_i, y_i)</cmath> počítá koeficienty lineární regrese ax + b = y. Ověřte na simulovaných vstupních datech.
- Napište funkci, která počítá rozklad přirozeného čísla na souči prvočísel. Funkci ověřte v programu, který pro zadané vstupní hodnoty volá danou funkci a vypisuje rozklad ve formátu čislo = základ^mocnina * ... , např. 240 = 2^4 * 3^1 * 5^1.
- Úloha o koze (zjednodušená verze) Na kruhové oplocené zahradě se pase koza uvazaná na provaze, jehož délka je rovna poloměru parcely a který je uvázán na kůlu na obvodu parcely. Kolik procent plochy parcely koza spase?
- Napište funkci, která pro vektory x a y a matici M vypočíta hodnot bilineární formy x'My. Ve funkci nepoužívejte žádné pomocné objekty (vektory), ale pouze jednoduche proměnné. Výsledek ověřte porovnáním s výpočtem v matvecu.
- Přehled klasifikace V textovém souboru jsou zapisovány tyto údaje: příjmení a jméno studenta, kód předmětu, počet kreditů a klasifikace, např.
Rambousek Pavel 153DASY 5 A Sedláček Pavel 101KOGG 5 C Bartošová Eva 152TEG1 6 B ....
Vypočítejte vážený studijní průměr pro všechny studenty ze seznamu
1.91 Bartošková Jana 1.71 Bartošová Eva 1.62 Herman Jakub 1.55 Herman Pavel ....
Nejjednodušší cestou je použít standardní kontejner map s uživatelskou strukturou pro společné ukládání souctu kredity*znamka a kredity.
Alternativně napište funkci, která vrací index studenta v seznamu studentů, pokud student v seznamu neni uveden, přidá jej funkce na konec a vrátí index. Prototyp funkce je
int student(std::string student, std::vector<std::string>& seznam);
kde string student = prijmeni + ' ' + jmeno
. Pro trojici index, kredity, znamka lze vážené průmery vypočítat například ze tří pracovních vektorů (do kterých jsou ukládána načítaná data).
- Hammingova čísla jsou čísla, která jsou dělitelná pouze prvočísly 2, 3 a 5, jinak řečeno je lze zapsat ve tvaru 2^i x 3^j x 5^k, kde i,j,k >= 0. Hammingova čísla tvoří posloupnost 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36, ...
Napište program, který vypočte n-té Hammingovo číslo, pro n=150.
- Napište funkci pro vyhlazení rastrových dat, uložených v (celočíselné) matici s hodnotami 0 až 127. Funkce pro každý pixel (prvek matice) vypočte novou hodnotu jako vážený aritmetický průměr daného pixelu s váhou p a všech sousedních pixelů s váhou 1, kde váha p je dána počtem sousedů.
Například pro vstupní matici M dimenze 4x5 s prvky
11 12 13 14 15 15 15 16 17 18 21 22 23 24 25 ==> 21 22 23 24 25 31 32 33 34 35 31 32 33 34 35 41 42 43 44 45 38 39 40 41 41
je vyhlazená hodnot prvku n_11 (tři sousedi) rovna
n_11 = ( 3 x 11 + 12 + 21 + 22 ) / 6 = 15 (zaokrouhleno 14.667)
podobně
n_45 = ( 3 x 45 + 34 + 35 + 44 ) / 6 = 41 (zaokrouhleno 41.333)
pro prvek m_22 (osm sousedů)
n_22 = (8 x 22 + 11+12+13 + 21+23 + 31+32+33) / 16 = 22
Oveřte pro uvedený příklad a pro náhodně generované matice náhodného řádu m x n.
Zimní semestr 2008/2009
Přednášky:
Protože mě již unavovalo neustále hlídat některé studenty, aby neopisovali řešené příklady ze sbírky (odmítám připustit, aby vysokoškolská výuka degenerovala na úroveň střední školy; mám na mysli mizerné střední školy), začal jsem pro každou zkoušku dávat individuální zadání, která nebyla použita a která se nebudou v budoucnu opakovat. AČ
Zimní semestr 2007/2008
Na září (16.9.) jsem vypsal termín, na který se mohou přihlásit studenti, kteří nemají zkoušku, ale byl jim explicitně udělen zápočet (všichni ostatní mají v KOSu uvedeno N, tj. zápočet neudělen). Implicitně byly zápočty udělovány studentům, kteří úspěšně složili zkoušku.
Možnost zápisu na zářijový termín je omezena pouze pro studenty, kteří sice neuspěli, ale jejich znalosti byly takříkajíc na hraně a kterým jsem chtěl poskytnout ještě jeden pokus. Především jde o studenty druhého ročníku, kteří snad napoprve zkoušku podcenili. Termín proto byl stanoven tak, aby nekolidoval s letním výcvikovým kurze, který se koná od 31.8 do 7.9.
Pokud se nemůžete na zkoušku přes KOS přihlásit, znamená to, že vám nebyl udělen zápočet a zářijový opravný termín se vás již netýka.
Zimní semestr je uzavřen.
Zimní semestr 2006/2007
- protože má předmět zapsáno 224 studentů, nastavil jsem kapacitu terminů na 21, což je počet počítačů v B870. Obvykle jsem nechával 1-2 mista rezervu pro případ výpadku hardwaru. Letos tedy "jedeme na doraz", doufejme, že technika neselže.
- první termíny zatím nejsou otevřeny (mají kapacitu 0), kapacita bude nastavena na plný počet dodatečně.
- jak bude postupovat zkouškové období, budu postupně odebírat atribut "opravný" termín, tak aby se případně mohli hlásit i studenti, kteří ještě na zkoušce nebyli. Záměr je umožnit studentům, kteří neuspěli přihlásit se na některý z opravných termínu (je jich řádově třetina, jak určují fakultní předpisy)