cvičení Přemysl Čech (slajdy částečně převzaté od Filipa Zavorala)
Docházka ◦ aktivní účast, znalost předchozí látky ◦ 3 nepřítomnosti OK, déledobější domluvit předem
DÚ ◦ uprostřed semestru jedna větší domácí úloha
Zápočtový program ◦ do konce listopadu schválené zadání ◦ do konce dubna první pokus o odevzdání hotové verze ◦ do konce LS komplet hotovo vč. dokumentace
Zápočtový test ◦ během zimního zkouškového období v labu ◦ 3 termíny (3. termín během LS)
void fnc( int x) { .... } int main() { fnc( 7); return 0; }
deklarace knihovních funkcí
rozbalení prostoru jmen std předávání parametrů odkazem konstantní reference ! přístup k prvkům vectoru Solution Explorer / Project Properties / Config Properties Debugging / Command Arguments vektor pro komfortnější zpracování
#include #include <string> #include
using namespace std; int delkaretezce( const string& s) { ... } void zpracuj( const vector<string>& a) { ... a[i] ... } int main( int argc, char ** argv) { vector<string> arg( argv, argv+argc);
class Pocitadlo { public: Pocitadlo( void); ~Pocitadlo(); int pocet_pismen( void); private: int pocet_; bool ve_slove_; }; #include #include #include "pocitadlo.hpp" int Pocitadlo::pocet_pismen( void) { char c; ... while( cin.get(c)) { if( ve_slove_) { if( isspace( c)) { ... }
deklarace třídy - .hpp konstruktor (defaultní), destruktor deklarace veřejných metod - rozhraní privátní data a metody - implementace
include deklarace definice metod - .cpp další typy, inicializace čtení po znacích typ znaku - asalpha, isdigit, isupper, ...
class Trida { int fce( int x); };
:: kvalifikátor nalevo vždy typ
int Trida::fce( int x) { ... } { }
Trida objekt; objekt.fce( 1);
Trida objekt = new Trida();
. operátor přístupu k položce objektu nalevo vždy proměnná
class Trida trida.h { std::string getResult () { return r; } std::string slozitaFce( int x); int jinaFce( int x) { int y = -1; for( i = 0; i < 10; ++i) .... } }; #include "trida.h"
trida.cpp
string Trida::slozitaFce( int x) { int y; for( i = 0; i < 10; ++i) { .... } } ale: šablony! nutná definice při kompilaci ⇒ vše v headeru
inline metoda s = ob.r místo volání rozvinutí s = ob.r #include "trida.h" {
}
Trida ob; string s; s = ob.getResult(); s = ob.slozitaFce( 1); int z = jinaFce( 2);
předání parametrů a volání push 1 s = call ob.slozitaFce add esp, 8
push 2 y = -1 i=0 loop: if( i >= 10) goto ... ... ++i goto loop
Spočtěte ◦ počet znaků, řádek, slov, vět ◦ počet a součet čísel
Upřesnění zadání ◦ zdroj dat: cin, obecný istream ◦ co to je slovo, věta ◦ různá funkčnost vs. neopakovatelný vstup
Postup ◦ 1. funkční návrh ◦ 2. objektový návrh, rozhraní ! - encapsulace ◦ 3. implementace
Spočtěte ◦ počet znaků, řádek, slov, vět, počet a součet čísel ◦ číslo: posloupnost číslic obklopená mezerovými znaky ◦ slovo: posloupnost nemezerových znaků, která není číslo ◦ mezerové znaky (white spaces): ' ', '\t', '\n', '\r' ◦ řádky jen ty, kde je (alespoň) slovo nebo číslo poslední řádka nemusí být ukončená '\n'
◦ každá započítaná věta obsahuje alespoň 1 slovo '...' ani '31.12.2013' nejsou tři věty
◦ spočítat ze std vstupu nebo ze všech souborů uvedených na příkazové řádce ◦ objektově a modulárně hezky všichni poslat! kdo nestihne na cvičení, dodělat doma
jakýkoliv vstupní stream (cin, soubor, řetězec, ...) include
celočíselně indexováno, vždy od 0 všechny prvky umístěny v paměti souvisle za sebou při přidání možná změna lokace, neplatnost iterátorů! odvozené: queue, stack
vector vi; list<string> ls; array<MyClass> am;
deque [dek] - fronta s přidáváním a odebíráním z obou stran ◦ double-ended queue ◦ prvky nemusí být umístěny v paměti souvisle ◦ lze přidávat i doleva
list - obousměrně vázaný seznam ◦ vždy zachovává umístění prvků ◦ nepodporuje přímou indexaci