Programování v C++ Objektové programování

Rozměr: px
Začít zobrazení ze stránky:

Download "Programování v C++ Objektové programování"

Transkript

1 Programování v C++ Objektové programování Ing. Drahomír Stanke Zlepšování podmínek pro využívání ICT ve výuce a rozvoj výuky angličtiny na SPŠei Ostrava č.projektu CZ.1.07/1.1.07/ Ostrava 2011

2 Obor: Informační technologie Předmět: Programování Ročník: 3 Autor: Ing. Drahomír Stanke Ing. Drahomír Stanke Střední průmyslová škola elektrotechniky a informatiky, Ostrava, příspěvková organizace

3 OBSAH Úvod Základní rozdíly mezi C a C Názvy základních souborů Nový datový typ bool Deklarace proměnných Implicitní hodnoty parametrů funkcí Procvičování práce s funkcemi s implicitními hodnotami parametrů Předávání parametrů funkcí referencí Procvičování předávání parametrů funkcím pomocí reference Dynamická alokace paměti Procvičování dynamické alokace pomocí operátorů new a delete Jmenné prostory Inline funkce Přetěžování funkcí Procvičování přetěžování funkcí Přetěžování operátorů Operátory vstupů a výstupů << >> Práce se streamy Manipulátory Pomocné funkce Příklady použití Přetěžování operátorů << a >> Procvičování přetěžování operátorů Práce se soubory Nastavení režimu práce se souborem Práce s pointerem v souboru Stavy streamu Souhrné příklady pro práci se soubory Procvičování práce s textovými soubory Procvičování práce s binárními soubory Objektové programování - úvod Deklarace třídy Přístup ke členům třídy Metody třídy Rozlišení pomocí :: Ukazatel this...63

4 20.3 Přístupové metody Modifikátor const Konstruktory a destruktor Konstruktory Destruktor Copy konstruktor Objekt jako členská proměnná jiné třídy Statické dat. členy a metody třídy Paměťová třída static Statické datové členy tříd Statické metody Pole objektů Statická alokace pole objektů Dynamická alokace pole objektů Dědičnost a zapouzdření Procvičování práce se třídami Virtuální metody třídy, polymorfizmus, Virtuální funkce Pole objektů příbuzných tříd Tabulka virtuálních metod V-tabulka Čistě virtuální metody, abstraktní třídy, rozhraní Přetěžování operátorů metodou třídy Přetěžování operátorů pomocí funkcí Přetěžování operátorů pomocí friend funkcí Přetěžování operátorů metodami třídy Přetěžování některých speciálních operátorů třídy Výjimky Klíčové slovo finally Přetěžování operátorů tříd prakticky Třída pro práci s textovými řetězci Třída pro práci s časem Třída pro práci se soubory Procvičování práce s třídami Ukládání objektů do souborů - serializace Použitá literatura

5 Vysvětlivky k používaným symbolům Obsah hodiny popisuje náplň hodiny Cíl hodiny specifikace dovedností a znalostí, které si studující osvojí během hodiny Klíčová slova nové pojmy, specifické termíny či cizí slova, jejichž význam je v textu vysvětlen Definice definování a vysvětlení nového pojmu či jevu Příklad objasnění nebo konkretizování problematiky na příkladu ze života, z praxe, ze společenské reality apod. Shrnutí shrnutí probrané látky, shrnutí kapitoly Kontrolní otázky a úkoly prověřují, do jaké míry studující text a problematiku pochopil, zapamatoval si podstatné a důležité informace a zda je dokáže aplikovat při řešení problémů Otázky k zamyšlení - úkoly rozšiřující úroveň základních znalostí Literatura literatura a zdroje pro doplnění a rozšíření poznatků kapitoly

6 6 Úvod Objektové programování se stává charakteristickým rysem takřka všech dnešních vyšších programovacích jazyků. Používá se dnes při psaní normálních programů, ale také např. i při tvorbě interaktivních internetových stránek v jazyku php. Pomalu, ale jistě se existence objektových vlastností stává věci cti autorů všech programových vývojových prostředků. Dnes se s objektovým programováním setkáme nejen ve vývoji programů pro PC, ale také při vývoji mobilních aplikací nebo např. aplikací pro jednočipové mikroprocesory. Tato učebnice si dává za cíl seznámit čtenáře se základy objektového programování. Protože jsme se v minulých ročnících učili jazyk C, zákonitě se budeme seznamovat s objektovým programováním za pomoci pokračovatele tohoto jazyka, kterým je jazyk C++. Autor předesílá, že v této učebnici se pouze seznámíme s objektovým programováním. Naučit se jeho plnohodnotnému používání je u každého dlouhou cestou, která spočívá nejen v získání znalostí programování (v našem případě jazyka C++), ale i ve studiu teorie objektového programování a hlavně v dlouhodobé praxi. To ovšem neznamená, že bychom měli naše studium hned ze začátku vzdávat. Tento první kontakt se vám bude hodit při následném seznamování s vývojovým prostředím Turbo C++ firmy Borland v dalších hodinách na naší škole a jistě i při dalším studiu na vysoké škole. Nebudete tam nuceni se seznamovat s úplně novou věcí, ale budete si pouze dále prohlubovat znalosti o něčem, na co už prvotní názor budete mít vytvořen. Proto vzhůru do studia!

7 7 1 Základní rozdíly mezi C a C++ Obsah hodiny Zjistíme jaké jsou názvy základních souborů v jazyku C++, naučíme se nový datový typ bool, zvykneme si na nový způsob deklarování proměnných. Cíl hodiny Po této hodině budete schopni: pracovat s datovým typem bool pružněji si deklarovat proměnné až v těch místech, kde je opravdu potřebujeme Klíčová slova Logický datový typ, bool 1.1 Názvy základních souborů Zdrojové soubory v jazyku C++ mají příponu cpp. U hlavičkových souborů se většinou používá přípona h stejně jako v jazyku C. Můžeme se ale setkat i s jinými příponami. Např. firma Borland ve svém produktu Turbo C++ často používá hpp. 1.2 Nový datový typ bool V jazyku C++ byl zaveden nový datový typ bool. Jedná se o logický datový typ, který může nabývat hodnot true a false. Ve skutečnosti se za těmito klíčovými slovy schovávají celočíselné hodnoty 1 a 0. Slovní označení je ale čitelnější.

8 8 Příklad void main() bool polomer = true; // deklarace proměnné a její inicializace float obsah,x = 20; if(polomer) // lze psát i takto: if(polomer == true) obsah=m_pi*x*x; // výpočet pro x představující poloměr else obsah=m_pi*x*x/4; // výpočet pro x představující průměr Příklad void main() bool sudý; int cislo; printf("zadejte cele cislo: "); scanf("%d", &cislo); sudy = (cislo%2 == 0); if(cislo) printf("cislo %d je sude", cislo); else printf("cislo %d je liche", cislo); 1.3 Deklarace proměnných Zatímco v jazyku C je nutné deklarace uvádět vždy na začátku bloku, v C++ je můžeme umístit kdekoliv, kde zrovna potřebujeme. Jejich platnost pak končí koncem bloku, ve kterém jsou deklarovány. Pokud tedy za tímto blokem deklarujeme proměnnou se stejným názvem, jedná se již o novou proměnnou a její obsah už s obsahem minulé proměnné nemá nic společného. Příklad a) Deklarace v jazyku C void main() int i, kon=20, suma; for(i=1,suma=0;i<kon;i++) suma += i; printf("%d", suma); getch();

9 9 b) Deklarace v jazyku C++ void main() int kon=20, suma; for(int i=1,suma=0;i<kon;i++) suma += i; // i existuje pouze uvnitř bloku příkazu cyklu // za blokem cyklu už proměnnou nelze používat printf("%d", suma); getch(); Shrnutí kapitoly Kapitola pojednala o logickém datovém typu bool a novém způsobu deklarací proměnných v jazyku C++.

10 10 2 Implicitní hodnoty parametrů funkcí Obsah hodiny Řekneme si, co to jsou implicitní hodnoty parametrů funkce. Cíl hodiny Po této hodině budete schopni: navrhovat funkce, u kterých při jejich volání nemusíme uvádět hodnoty všech parametrů. Klíčová slova Implicitní, explicitní Zatímco v jazyku C jsme museli při volání funkce vždy uvádět hodnoty všech parametrů, v jazyku C++ můžeme parametrům přiřadit implicitní (výchozí, přednastavené) hodnoty. Pokud u funkce používáme zvlášť její deklaraci a zvlášť definici, uvádíme implicitní hodnoty pouze v deklaraci! Pokud používáme pouze definici (správně bychom neměli), pak implicitní hodnoty uvedeme v definici. Pokud následně při volání funkce chceme za příslušný parametr zadat onu implicitní hodnotu, tak parametr prostě vůbec neuvedeme. Kdybychom ovšem takto zacházeli s parametry uvedenými v závorce na začátku, došlo by ke špatnému chápání těchto parametrů kompilátorem, který by pak vlastně následující parametr použil jako první z deklarace. Abychom tomuto předešli, tak parametry, které budou mít implicitní hodnoty, musíme umístit až na konec za parametry bez implicitních hodnot, tedy za parametry zadávané explicitně.

11 11 Příklad float obsah(float x, bool polomer=true); void main() float s, x=20; s=obsah(x); printf("%f\n", s); s=obsah(x, false); printf("%f\n",s); getch() // výpočet pro x chápané jako poloměr // výpočet pro x chápané jako průměr // parametr polomer zadán explicitně float obsah(float x, bool polomer) if(polomer) return M_PI*x*x; else return M_PI*x*x/4; Příklad s chybou float obsah(bool polomer=true, float x); void main() float s, x=20; s=obsah(x); // chyba! x by se chápalo jako parm. polomer printf("%f\n", s); s=obsah(false, x); printf("%f\n",s); getch() float obsah(bool polomer, float x) if(polomer) return M_PI*x*x; else return M_PI*x*x/4; Shrnutí kapitoly Kapitola pojednala o implicitních hodnotách parametrů funkcí.

12 12 Otázky k zamyšlení Najděte v tomto zdrojovém kódu chyby int soucetcisel(bool liche, int zac, int kon); void main() int z, k, s; printf("zacatek intervalu: "); scanf("%d", &z); printf("konec intervalu: "); scanf("%d", &k); soucetcisel(z,k); int soucetcisel(bool liche=true, int zac=0, int kon) for(int i=zac; i<kon; i++) int suma; if(liche) if(i%2) suma += i; else suma += i; return suma;

13 13 3 Procvičování práce s funkcemi s implicitními hodnotami parametrů Obsah hodiny Řešení příkladu pro práci s funkcemi obsahujícími implicitní hodnoty parametrů. 1) Navrhněte funkci, která vrátí náhodné číslo v zadaném intervalu int NahodneCislo(int zac,int kon); Parametrům zac a kon nastavte implicitní (výchozí) hodnoty 0 a Funkci vyzkoušejte ve funkci main pro všechny možné kombinace zadávaných parametrů. V souboru programu navrhněte zvlášť deklaraci a zvlášť definici vaší funkce. 2) Navrhněte funkci pro výpis tabulky hodnot funkcí sin a cos. Parametry: počáteční úhel koncový úhel krok - implicitní hodnota je 1 stupeň šířka sloupců - implicitně 10 znaků počet desetinných míst - implicitně 2 Hotovou funkci pak použijte ve funkci main, ve které si nejdříve z klávesnice načtete potřebné údaje. V souboru programu navrhněte zvlášť deklaraci a zvlášť definici vaší funkce.

14 14 4 Předávání parametrů funkcí referencí Obsah hodiny Naučíme se třetí způsob předávání parametrů funkce. Cíl hodiny Po této hodině budete schopni: používat všechny tři způsoby předávání parametrů. Klíčová slova Předávání parametrů hodnotou, odkazem, referenci. V jazyku C jsme se naučili dva způsoby předávání parametrů funkce hodnotou a odkazem. Jazyk C++ zavádí ještě předávání referencí. Pro přehlednost a pochopení souvislostí si vyjmenujme všechny tři možnosti: Předávání hodnotou jsme používali tehdy, když jsme potřebovali poslat nějaký údaj pouze do funkce, a uvnitř funkce jsme ho nechtěli měnit. Např. u této funkce jsou parametry předávány hodnotou: float přepona(float a, float b); Říkali jsme si, že funkce v tomto případě vlastně pracuje s kopii zasílané hodnoty a pokud hodnotu parametru uvnitř funkce změníme, tak vlastně měníme pouze onu kopii. Obsahu proměnné, jejíž hodnotu pomocí parametru do funkce posíláme, se to nedotkne. Díky tomu ale můžeme do funkce předávat nejen samostatnou proměnnou, ale i výraz složený z více proměnných. Např. jestliže voláme funkci Pokus takto: Pokus(x+y+3), tak před vlastním voláním funkce dojde nejdříve k vyhodnocení výrazu x+y+3 a teprve výsledná hodnota se předá dovnitř funkce. Předávání odkazem jsme používali tehdy, jestliže jsme potřebovali obsah proměnné ve funkci nejen vyčítat, ale třeba také měnit. Tehdy jsme předávali funkci ne obsah proměnné, ale pomoci pointeru její adresu. Příkladem může být funkce pro záměnu obsahů dvou proměnných:

15 15 void zamen(float *a, float *b); Pokud funkce znala adresu proměnné, tak ji mohla nejen vyčítat, ale také měnit. V tom případě ovšem volání funkce např. takto: zamen(&x+&y+3, &z); pravděpodobně nemá smysl, protože se snažíme funkci zaslat adresu, kterou získáme jako součet adres proměnných x a y zvětšený ještě o hodnotu 3. Co ale na takto nesmyslně získané adrese opravdu leží nevíme. Předávání referencí - používá se zde operátor & jako označení reference. Referenci lze chápat jako alias, to je náhradní jméno proměnné. Deklarace naší funkce by pak mohla vypadat např. takto: void zamen(float &a, float &b); Volat pak tuto funkci budeme např. takto: zamen(x, y). Na rozdíl od předávání hodnotou toto volání bude znamenat to, že naší proměnné x přiřadíme náhradní název a a s tímto náhradním názvem s proměnnou uvnitř funkce pracujeme. Nejedná se zde tedy o žádnou kopii obsahu proměnné, ale pracujeme přímo s proměnnou x, ale pod jiným označením. Můžeme tedy x ve funkci nejen vyčítat, ale i měnit. Samozřejmě ovšem nemůžeme funkci volat např. takto: zamen(x+y, z), protože by nebylo jasné jakou proměnnou náhradní název a vlastně představuje. Předávání parametrů pomocí odkazů na pointer i referencí bude stejně rychlé. Jedná se jen o jinou formu zápisu. Doporučení pro předávání parametrů funkcím: Pokud předáváme rozsáhlé datové typy a nechceme měnit jejich hodnotu, pak předáváme referencí na konstantní výraz: void fce(const ZAK &z); Uvnitř funkce může pak být parametr použit pouze pro čtení. Pokud předáváme malé proměnné a neměníme je, pak předáváme hodnotou: void fce(int x); Pokud budou parametry měněny, předáváme pomocí odkazu void fce(zak *z).

16 16 Příklad a) Parametr předávaný hodnotou float obsah(float polomer) // definice funkce float pom = M_PI*polomer*polomer; polomer *= 2; // mění se pouze kopie, // původní proměnná zůstává stejná return pom; float r=55, s; s=obsah(r); // proměnné. r nelze uvnitř funkce obsah měnit b) Parametr předávaný odkazem pomocí pointeru float obsah(float *polomer) float pom =* polomer; float pom1 = M_PI*pom*pom; *polomer *= 2; return pom1; float r=55,s; s=obsah(&r); // z r se vypočítá s // a r se pak zvětší dvakrát c) Parametr předávaný odkazem referencí float obsah(float &polomer) float pom = polomer; float pom1 = M_PI*pom*pom; polomer *= 2; returm pom11; // polomer bude náhradní název float r=55,s; s=obsah(r); // z r se vypočítá s a pak se r zvětší dvakrát Referenci můžeme používat nejen při předávání parametrů funkce int a; int &b = a; // b je jiný název pro a. // Proměnné a i b jsou tedy // jedna a tatáž proměnná, ne její kopie!!! a=200; printf("%d",b); // vypíše se hodnota 200 Shrnutí kapitoly Kapitola pojednala o předávání parametrů funkci pomocí reference.

17 17 5 Procvičování předávání parametrů funkcím pomocí reference Obsah hodiny Řešení příkladů pro práci s funkcemi jejichž parametry jsou předávány referencí 1) Navrhněte funkci pro vykreslení plného obdélníku složeného ze znaků na obrazovce. Funkce bude mít tyto parametry: znak plny šířka výška - výplňkový znak, implicitní hodnota budiž 0xdb - logická proměnná určující zda se bude vykreslovat obdélník plný nebo jen obvod - implicitně true - počet znaků na řádku - počet řádků Parametry šířka a výška předávejte referencí. Použijte deklaraci i definici funkce. Navrženou funkci vyzkoušejte ve funkci main. 2) Navrhněte funkci pro řešení kvadratické rovnice. Funkce bude vracet kořeny rovnice a počet řešení. Při řešení využijte parametrů předávaných referencí. Použijte deklaraci i definici funkce. Navrženou funkci vyzkoušejte ve funkci main.

18 18 6 Dynamická alokace paměti Obsah hodiny Naučíme se používat pro alokaci paměti nový a lepší způsob pomocí operátorů new a delete. Cíl hodiny Po této hodině budete schopni: provádět dynamickou alokaci paměti jak pomocí funkcí malloc a free známými už z jazyka C, tak nově operátory new a delete Klíčová slova malloc, free, new, delete V jazyku C jsme se naučili dynamicky alokovat místo v paměti pomocí funkcí malloc a free. Tyto funkce existují v jazyku C++ samozřejmě nadále. Byla však zavedena nová možnost alokace pomocí operátorů new a delete. Ve svém programu můžeme současně používat obě možnosti. Nesmíme tyto možnosti míchat (každá dvojice využívá jiný způsob práce s heap pamětí - hromadou). Jestliže tedy např. nějaké místo v paměti alokujeme pomocí funkce malloc, tak ho musíme uvolnit pomocí funkce free, ne pomocí operátoru delete. Mohli bychom si vyrobit velmi těžko odhalitelné chyby v běhu programu. Zatímco při používání funkce malloc musíme v C++ přetypovávat návratovou hodnotu (C++ je přísnější při hlídaní souhlasnosti datových typů než jazyk C), při používání operátoru new toto dělat nemusíme. Příklad: int *p = (int *)malloc(sizeof(int)); free(p); // typické pro C

19 19 int *p1 = new int; delete *p1; // typické pro C++ Při alokování pomocí operátoru new si ovšem musíme dávat pozor při odalokovávání polí. Např. alokování pole deseti hodnot typu int provedeme pomocí operátoru new takto: int *p = new int[10]; Odalokování pak musíme provést takto: delete []p; p=null; Pokud bychom neuvedli před pointer p hranaté závorky, uvolnila by se pouze první hodnota pole. Zbývající buňky by v paměti zůstaly a blokovaly by zbytečně místo. Nijak bychom se už na ně nemohli odvolat. Vyrobili bychom si zákeřnou chybu, které se v programátorském slangu říká memory leaks. Každý programátor se této chyby obává, protože se v programu velmi nesnadno hledá. Následníci jazyka C++ se proto pokusili učinit uvolňování paměti automatické, nezávislé na programátorovi. Toto řešení je výhodné pro programátora, má však i některé nevýhody. Dealokaci lze provést jen jednou! Druhé použití operátoru delete pro uvolnění paměti, která již byla uvolněna, vede k chybě. Aby tato chyba při mylném druhém použití delete nenastala, ihned po uvolnění přiřadíme pointeru hodnotu NULL. Použití delete s pointerem naplněným hodnotou NULL sice už nic nedělá, ale také nevyvolá chybu. Příklad typedef struct float x,y,z; float cena; VYROBEK; void main() VYROBEK *vyrobky1 = (VYROBEK *)malloc(10*sizeof(vyrobek)); if(vyrobky1==null)... // ošetření chyby alokace... // používání dyn. alokovaného pole free(vyrobky1); vyrobky=null; // alokace pole pro 10 výrobků VYROBEK *vyrobky2 = new VYROBEK[10]; if(vyrobky2==null)... // ošetření chyby alokace

20 20... // používání dyn. alokovaného pole delete []vyrobky2; // pro odalokov. pole nutno použít []! vyrobky=null; Shrnutí kapitoly Po zvládnutí této kapitoly bychom měli umět používat operátory new a delete.

21 21 7 Procvičování dynamické alokace pomocí operátorů new a delete Obsah hodiny Řešení příkladů pro práci s operátory new a delete 1) Navrhněte funkci, která dle zadaného počtu hodnot pomoci operátoru new dynamicky alokuje jednorozměrné pole celých čísel. Parametry funkce: počet hodnot hodnota, kterou budou prvky naplněny - implicitně 0 log. hodnota, zda se má plnit nebo ne - implicitně ano Návratová hodnota: Pointer na začátek alokovaného pole Navrhněte funkci pro naplnění pole celých čísel z klávesnice Parametry funkce: pointer na začátek pole počet prvků pole minimální hodnota prvku, implicitně maximální hodnota prvku, implicitně Návratová hodnota: Pointer na začátek pole Navrhněte funkci pro vyhledání minimální a maximální hodnoty v poli celých čísel Parametry funkce: pointer na začátek pole počet prvků pole minimum - reference na proměn. pro uložení minima maximum - reference na prom. pro uložení maxima pocetminim - předáváno pomocí odkazu pointerem pocetmaxim - predáváno pomocí odkazu pointerem Všechny funkce vyzkoušejte ve funkci main. V ní si pomoci operátoru new alokujte potřebné pole. Na konci nezapomeňte alokovanou pamět opět uvolnit! Při návrhu co nejvíce používejte nové vlastnosti jazyka C++, tedy deklaraci proměnných až na místě použití, alokace a dealokace operátory new a delete.

22 22 2) Dodělejte program pro práci s údaji o žácích třídy typedef unsigned char uchar; typedef unsigned int uint; typedef enum ZENA,MUZ POHLAVI; // datový typ POHLAVI typedef struct uchar den; uchar mesic; uint rok; DATUM; // nový datový typ DATUM typedef struct uint vyska; float vaha; POHLAVI pohlavi; PARAMETRY; // nový datový typ PARAMETRY typedef struct char jmeno[50]; DATUM narozeni; PARAMETRY parametry; uint id; bool cizinec; ZAK; // nový datový typ ZAK ZAK *ZalozeniTridy(uint pocet); // alokace pole pro třídu void UvolneniTridy(ZAK *p); // odalokování třídy void ZadaniZaka(ZAK &p); // naplnění údajů o žákovi void ZadaniTridy(ZAK trida[], int poc); void VypisZaka(ZAK z); // výpis žáka void VypisTridy(ZAK trida[], int poc); void VypisStarsich(ZAK p[],int pocet,int vek); ZAK *Nejstarsi(ZAK *p,int pocet); // nalezení nejstaršího void main() ZAK *trida; uint pocetzaku; uint i; Úlohu se pokuste řešit jako projekt. Funkce pro práci s datovým typem ZAK dejte do samostatného souboru.

23 23 8 Jmenné prostory Obsah hodiny Naučíme se jak v rámci projektu v jeho různých místech používat stejné názvy proměnných a funkcí a přesto si zachovat přehled o tom co kde znamenají. Cíl hodiny Po této hodině budete schopni: používat jmenné prostory vytvářet jmenné prostory Klíčová slova namespace, using, :: Při psaní větších projektů, obzvláště jestliže na nich pracuje více lidí, se může stát, že nám začne vynechávat fantazie při vymýšlení identifikátorů a na více místech použijeme stejné názvy různých např. datových typů. To může pak vést k různým podivným chybám. Aby k tomuto nedocházelo, můžeme kusy programu zavírat do tzv. jmenných prostorů. Jmenný prostor je oblast, ve které nesmí dojít ke konfliktu jmen. Jestliže pak v různých prostorech náhodou použijeme stejný název, můžeme pomocí uvedení názvu jmenného prostoru rozlišit o kterou např. proměnnou nám vlastně jde. Podrobnější informace můžeme získat v tomto článku [1]. Příklad float vypocet(float r) // funkce z implicitního prostoru return 100*r; namespace petr // začátek prostoru s názvem petr float vypocet(float r) return 2*M_PI*r;

24 24 namespace pavel // začátek prostoru s názvem pavel float vypocet(float r) return M_PI*r*r; void main() float x=10; printf("vypocet dle implicitní funkce: %f\n", vypocet(x)); printf("vypocet dle implicitní funkce: %f\n", ::vypocet(x)); printf("vypocet dle Petra: %f\n", petr::vypocet(x)); printf("vypocet dle Pavla: %f\n", pavel::vypocet(x)); getch(); Abychom nemuseli stále uvádět název prostoru, lze použít klíčové slovo using: using namespace pavel; printf("vypocet dle Pavla: %f\n", vypocet(x)); Řádků s klíčovým slovem using můžeme za sebou uvést i více a tím si určit, s kterými jmennými prostory budeme v následujícím zdrojovém kódu pracovat. Při odvolávání na proměnné a funkce z těchto prostorů pak už nemusíme uvádět jejich názvy. Pokud ovšem v některém případě dojde k nejednoznačnosti (oba prostory využívají stejný název), musíme explicitně uvést s kterým prostorem zrovna pracujeme. Při odvolávání se na proměnné z implicitního prostoru můžeme čtyřtečku uvést nebo také ne. Záleží jen na nás. Podle normy jazyka C++ existuje standardní prostor jmen std. V tomto prostoru jmen je definováno mnoho identifikátorů ze standardní knihovny jazyka C++. Literatuta [1]

25 25 9 Inline funkce Obsah hodiny Naučíme se používat inline funkce jako náhradu maker. Cíl hodiny Po této hodině budete schopni: pracovat s makry i s inline funkcemi a vybrat si, co je v daném okamžiku výhodnější. Klíčová slova inline funkce, makra Klíčové slovo inline v definici funkce způsobí zkopírování těla funkce na každé místo, kde je tato funkce volána. Pokud bude funkce volána 20x, bude se po překladu ve výsledném object modulu nacházet 20 kopií těla této funkce. Inline funkce je tedy obdobou makra. Makra byla záležitosti preprocesoru, inline funkce zpracovává až kompilátor. Zatímco při překladu volání klasické funkce umístí kompilátor na místo volání řadu instrukcí pro uložení předávaných parametrů nejčastěji do stacku, pak instrukci volání podprogramu a pak ještě instrukce pro vybrání návratové hodnoty ze stacku, u inline funkcí se toto neděje. Kompilátor na místo, kde se nachází volání inline funkce, umístí přímo přeložené tělo funkce. Tudíž všechny instrukce pro předávání parametrů, volání podprogramu a převzetí návratové hodnoty odpadnou. Odpadnou pak samozřejmě i instrukce uvnitř funkce pro převzetí parametrů, pro uložení návratové hodnoty do stacku i instrukce návratu z podprogramu. Program je pak logicky rychlejší. Použití inline funkcí je podobné makrům definovaným pomocí příkazu #define. Na rozdíl od maker ale inline funkce umožňují lepší kontrolu a když už dojde k chybě, pak chybová hlášení jsou daleko názornější a přesnější..

26 26 Příklad #define MAXIMUM(A,B) ((A)>(B)? (A) : (B)) inline int maximum(int a, int b) if(a>b) return a; return b; // makro // inline funkce U inline funkce v našem příkladu nelze na místě parametrů uvést něco, co není typu int nebo co nelze na int automaticky přetypovat. Nelze zde jako parametr uvést např. název proměnné typu struktura údajů o žákovi. U makra můžeme na místě parametrů uvést cokoliv a při překladu pak často dostáváme těžko odhalitelné chyby, protože kompilátor se v chybovém hlášení najednou odkazuje na řádky, které díky tomu, že rozvoj makra probíhá na pozadí, nevidíme. Z jiného úhlu pohledu můžeme tuto vlastnost inline funkcí považovat i za jakousi malou nevýhodu. Pro každou kombinaci parametrů je totiž nutno funkci přetížit. Např. pro porovnávání věku žáků musíme definovat novou funkci maximum: inline int max(tzak a, tzak b) if(a.vek > b.vek) return a.vek; return b.vek; // inline funkce Pozor!!! Jestliže budeme inline funkci používat ve více souborech našeho projektu, je třeba do hlavičkového souboru uvádět ne její deklaraci, ale přímo definici, aby mohlo být její tělo vkládáno do všech souborů, které ji používají už v době překladu. Ne, jak se děje u normálních funkcí, ho zahrnout do výsledného spustitelného souboru až v době linkování. Kontrolní otázky a úkoly 1) Jaký je rozdíl mezi inline funkcí a makrem? 2) Kdo provádí kontrolu předávaných parametrů, makro nebo inline funkce?

27 27 10 Přetěžování funkcí Obsah hodiny V této kapitole se seznámíme s přetěžováním funkcí. Cíl hodiny Po této hodině budete schopni: pomocí přetěžováni navrhnout funkce, které pod stejným názvem provádějí nějakou činnost, ale pokaždé pro jiné parametry Klíčová slova Přetěžování funkcí Kompilátor jazyka C++ nerozlišuje funkce pouze podle názvu, ale také podle počtu a typu parametrů. Dvě různé funkce mohou mít stejné jméno, ale lišit se počtem nebo typem parametrů. Jestliže navrhneme více funkcí se stejným názvem, ale lišící se počtem a typem parametrů, mluvíme o přetěžování funkce. Tuto vlastnost můžeme s výhodou využít v takových případech, kdy např. pro každý datový typ vstupního údaje musíme výpočet provádět trochu jinak nebo musíme výstupní hodnotu počítat různě podle různého zadání a počtu vstupních údajů. Např. pokud počítáme obsah obdélníka a kruhu, tak výsledná hodnota je vždy stejného typu, ale pro obdélník potřebujeme dva parametry (strany x a y) a pro kruh pouze jeden (poloměr). Vždy však počítáme obsah a proto by bylo vhodné, aby se obě funkce jmenovaly stejně. Příklad float Obsah(float x, float y); float Obsah(float r); // pro obdélník // pro kruh void main() printf("obsah obdélníka o stranách %f a %f je %f", 3,5,Obsah(3,5)); printf("obsah kruhu o polomeru %f je %f",4,obsah(4));

28 28 float Obsah(float x, float y) return x*y; float Obsah(float r) return 2*M_PI*r; Díky mechanizmu přetěžování se vždy zavolá správná funkce. Shrnutí kapitoly Naučili jsme se navrhovat skupiny funkcí, které provádějí stejnou činnost a tudíž mají stejné názvy, ale pokaždé tuto činnost provádějí s jinými parametry. Kontrolní otázky a úkoly V našem programu jsme deklarovali dvě funkce: int Vypocet(float a, float b); float Vypocet(float a, float b); Je to správně?

29 29 11 Procvičování přetěžování funkcí Obsah hodiny Řešení příkladů pro práci s přetíženými funkcemi 1) Navrhněte skupinu funkcí pro výpočty obsahů plošných obrazců jako je čtverec, obdélník, kruh, trojúhelník atd. Pokuste se dávat funkcím pokud možno co nejčastěji stejný název Obsah a funkce rozlišovat pomocí počtu a typů parametrů. 2) Navrhněte funkce pro řešení lineární a kvadratické rovnice. Obě funkce pojmenujte Rovnice. I přesto, že obě funkce budou mít stejný název, nedojde k jejich záměně.

30 30 12 Přetěžování operátorů Obsah hodiny Naučíme se definovat chování standardních operátorů pro naše nové datové typy. Cíl hodiny Po této hodině budete schopni: definovat, co znamená např. sečtení datových struktur předefinováním operátorů udělat program čitelnější Klíčová slova přetěžování operátorů V jazyku C++ lze na rozdíl od většiny jiných jazyků předefinovat chování standardních operátorů pro nové datové typy. Můžeme si určit např. co znamená sečtení našich datových typů, co jejich rozdíl apod. Toto předefinování nazýváme přetěžování operátorů. Lze např. upravit chování operátoru sčítání tak, aby bylo možné sčítat nové datové typy mezi sebou nebo se stávajícími typy. Podobně můžeme takto přetížit i relační operátory pro porovnávání našich datových typů. Program pak bude snáze čitelný a méně rozsáhlý. Doposud jsme např. pro porovnávání struktur Datum mohli navrhnout funkci MenšíNez a v programu ji pak např. použít takto: if(mensinez(datum1,datum2)) Určitě ale bude čitelnější, když přetížíme (nastavíme nové chování) operátoru < a budeme pak moci psát toto: if(datum1 < datum2) Názorným příkladem datového typu, u kterého bude výhodné používat přetížené operátory, může být struktura reprezentující zlomek. Zde potřebujeme změnit chování operátorů +, -, *, =, ==, <, >=, ++ atd.

31 31 Pravidla pro přetěžování operátorů pro práci s novými datovými typy : Jen malou skupinu operátorů nelze přetížit: = - operátor přiřazení * - operátor dereference. - tečka - operátor přímého přístupu ke členům struktury -> - přístupový operátor ke členům struktury přes pointer [ ] - operátor indexování? : - podmiňovácí operátor - ternární operátor sizeof - operátor určující velikost v bytech :: - čtyřtečka - operátor rozlišení rozsahu (namespace) #, ## - příznaky pro preprocesor Všechny ostatní lze přetížit. Tedy např. operátory: +, -, *, /, %, <, >, <=, >=, ==,!=, +=, -=, *=, /=, %= Nelze vymýšlet nové operátory. Nemůžeme měnit počet operandů, které operátor používá (měnit jeho aritu). Nelze měnit prioritu operátorů. Nelze změnit chování operátorů pro standardní typy. Nemůžeme tedy změnit např. chování operátoru + pro typ integer. Operátory přetěžujeme tak, že navrhneme funkci, jejíž název začíná slovem operator následovaným operátorem, který přetěžujeme. Tedy např. operator+, operator++, operator<= a podobně. Parametry a návratová hodnota takovéto funkce budou určeny tím, co operátor dělá. Vzory deklarací přetížení operátorů (T je náš datový typ): t1 + t2 : T operator+ (const T &t1, const T &t2); i + t1 : T operator+ (const int i, const T &t1); t1 + i : T operator+ (const T &t1, const int i); t1 += t2 : T& operator+= (T &t1, const T &t2); t1 += i : T& operator+= (T &t1, const int i); -t1 : T operator- (const T &t1); // preinkrementace ++ t1 : T& operator++ (T &t1); // postinkrementace t1 ++ : T operator++ (T &t1, int i); t1 <= t2 : bool operator<= (const T &t1, const T &t2); t1!= i : bool operator!= (const T &t1, const int i); Operátor reference & u paramtrů typu T používáme proto, protože předpokládáme, že datový typ T bude rozsáhlejší a tudíž jeho předávání do funkce je rychlejší pomocí reference než hodnotou. Použitím kvalifikátoru const zamezíme změně předávaných parametrů uvnitř navrhované funkce a získáme tím při návrhu jistotu, že neděláme chybu. V případě modifikace budeme kompilátorem upozornění na chybu.

32 32 U parametrů, které se nemění, používejte kvalifikátor const vždy! Zamezíte tím případnému neočekávanému chování přetížených operátorů ve složitějších výrazech. Např. deklarujeme-li operator+ takto: Zlomek operator+ (Zlomek &z1, Zlomek &z2); nepodaří se nám přeložit výraz Zlomek z = a+b+c; Nelze tedy v tomto případě u sčítání použít asociativní zákon, což je chyba. Operátor reference & v návratové hodnotě použijeme v těch případech, kdy se předávaný parametr mění a funkce vrací stejnou proměnnou, která ji byla v parametrech předána, jen upravenou. U parametru pak samozřejmě nesmíme uvést const. Používejte referenci, ne odkaz pomocí pointeru! Zvláštností je přetížení operátoru postinkrementace. Deklarace přetížení pro preinkrementaci a postinkrementaci by vlastně měla vypadat stejně. V tomto případě by ovšem nebylo možné pro každou z operací navrhnout samostatnou funkci, protože by je nebylo možno odlišit. Aby se tedy funkce daly rozlišit, compilátor pro postinkrementaci očekává funkci s dvěma parametry s tím, že druhý parametr typu int se nikde nepoužívá (dummy parametr). Slouží pouze pro odlišení deklarace přetížení operátoru postinkrementace od deklarace přetížení operátoru preinkrementace. Chcete-li mít při návrhu deklarace vaší funkce pro přetížení nějakého operátoru jistotu, najděte si analogický vzor v nahoře uvedené tabulce. Příklad: #include <stdio.h> #include <conio.h> #include <math.h> // pomocná funkce - největší společný dělitel int NejSpolDelitel(int x1, int x2); typedef struct int citatel; int jmenovatel; Zlomek; // deklarace funkcí pro přetížení operátorù Zlomek operator+ (const Zlomek &z1, const Zlomek &z2); Zlomek operator+ (const int i, const Zlomek &z2); Zlomek operator+ (const Zlomek &z1, const int i); Zlomek& operator+= (Zlomek &z1, const Zlomek &z2); Zlomek& operator+= (Zlomek &z1, const int i); Zlomek operator- (const Zlomek &z1);

33 33 Zlomek& operator++ (Zlomek &z1); // preinkrementace Zlomek operator++ (Zlomek &z1, int i); // postinkrementace // druhý parametr požaduje kompilator u postinkrementace // pouze pro rozlišení funkcí pre a postinkrementace bool operator< (const Zlomek &z1, const Zlomek &z2); void main() Zlomek a=5,2; // proměnné hned inicializujeme Zlomek b=3,4; Zlomek c=4,8; Zlomek d=a+b+c; // využití přetížení operátoru + Zlomek e=3+d; Zlomek f=a+3+e; a += b; // využití přetížení operátoru += a += 2; bool xxx=a<b; // využití přetížení operátoru < Zlomek p=++a + b; // využití přetížení operátoru // preinkrementace p=a++ + b; // využití přetížení operátoru // postinkrementace Zlomek operator+ (const Zlomek &z1, const Zlomek &z2) int nsd=nejspoldelitel(z1.jmenovatel, z2.jmenovatel); int cislo1=z1.jmenovatel/nsd; int cislo2=z2.jmenovatel/nsd; Zlomek pom=z1.citatel*cislo2+z2.citatel*cislo1, z1.jmenovatel*cislo2; return pom; Zlomek operator+ (const int i, const Zlomek &z2) Zlomek pom=i*z2.jmenovatel+z2.citatel, z2.jmenovatel; return pom; Zlomek operator+ (const Zlomek &z1, const int i) Zlomek pom=z1.citatel+z1.jmenovatel*i, z1.jmenovatel; return pom; Zlomek& operator+= (Zlomek &z1, const Zlomek &z2) int nsd=nejspoldelitel(z1.jmenovatel, z2.jmenovatel); int cislo1=z1.jmenovatel/nsd; int cislo2=z2.jmenovatel/nsd; z1.citatel=z1.citatel*cislo2+z2.citatel*cislo1; z1.jmenovatel=z1.jmenovatel*cislo2; return z1; Zlomek& operator+= (Zlomek &z1, const int i) z1.citatel=z1.citatel+z1.jmenovatel*i; return z1;

34 34 Zlomek operator- (const Zlomek &z1) Zlomek pom=-z1.citatel,z1.jmenovatel; return pom; bool operator< (const Zlomek &z1, const Zlomek &z2) Zlomek z1upraveny=z1.citatel*z2.jmenovatel, z1.jmenovatel*z2.jmenovatel; Zlomek z2upraveny=z2.citatel*z1.jmenovatel, z1.jmenovatel*z2.jmenovatel; return z1upraveny.citatel<z2upraveny.citatel; // preinkrementace - nejdříve zvětším a pak použiji Zlomek& operator++ (Zlomek &z1) z1.citatel += z1.jmenovatel; return z1; // postinkrementace - nejdříve použiji a pak zvětším Zlomek operator++ (Zlomek &z1,int i) Zlomek pom=z1; // schovám si kopii zlomku // zvětším zlomek o 1, mohu předává se refencí z1.citatel=z1.citatel+z1.jmenovatel; return pom; // vrátím ještě neupravenou kopii pro použití // pomocná funkce - největší společný dělitel int NejSpolDelitel(int x1, int x2) int pom; x1=abs(x1); x2=abs(x2); while(x2>0) pom=x1 % x2; x1=x2; x2=pom; return x1; Výraz Zlomek d=a+b; lze chápat jako volání funkce operator+ s parametry a a b. Podobně výraz a+2 lze chápat jako volání funkce "operator+" s parametremy a a 2. Druhy parametr je jiného typu nez Zlomek, takže musíme "operator+" přetížit i pro druhý parametr typu int. Stejně musíme navrhnout přetížení pro výraz 2+a. Zde bude zase první parametr typu int a druhý typu Zlomek. Shrnutí kapitoly Naučili jsme se definovat chování operátorů i pro operandy, které nepatří mezi klasické datové typy. Můžeme si tedy už definovat co znamená např. sečtení dvou proměnných typu struktura. Doposavad jsme toto museli řešit speciálními funkcemi.

35 35 Kontrolní otázky a úkoly 1) Které operátory nemůžeme přetěžovat? 2) Můžeme si vymyslet své operátory? 3) Jak se přetěžují operátory preinkrementace a postinkrementace? Otázky k zamyšlení 1) Proč operátor *= vrací referenci a operátor * ne? 2) Kolik operátorů potřebujeme přetížit pro operaci sečtení datového typu Zlomek s celým číslem?

36 36 13 Operátory vstupů a výstupů << >> Obsah hodiny V jazyce C jsme se naučili psát na obrazovku pomocí funkce printc a číst z klávesnice pomocí scanf. Nyní si ukážeme, jak lze v jazyku C++ nahradit tyto funkce jinými, často výhodnějšími, prostředky. Cíl hodiny Po této hodině budete schopni: psát na obrazovku a číst z klávesnice pomocí nových operátorů formátovat výstupní text přesně dle potřeby Klíčová slova insertion operátor, extraction operátor, stream, manipulátory, iostream.h 13.1 Práce se streamy V jazyku C jsou vstupy a výstupy realizovány funkcemi deklarovanými v hlavičkovém souboru stdio. Jsou to hlavně funkce printf a scanf. Tyto prostředky můžeme v C++ samozřejmě používat i nadále. V C++ se ale vstupy a výstupy často provádějí pomocí operátorů << a >>. Tyto operátory a další prostředky s nimi související jsou deklarovány v hlavičkových souborech iostream, fstream, sstream a iomanip. Pro operátory << a >> se používají tyto názvy: << vkládací (insertion) operátor >> vyjímací (extraction) operátor Operátory << a >> bychom měli již znát v jiné souvislosti z jazyka C jako operátory bitových posunů vlevo a vpravo. V jazyku C++ byl jejich význam rozšířen. Která funkce operátorů se konkrétně zrovna použije, o tom kompilátor rozhodne ze souvislosti a dle parametrů (přetěžování operátorů).

37 37 Funkce jak ze souboru stdio.h tak ze souboru iostream.h a dalších pracují s tzv. datovými proudy - streamy. Již při výuce jazyka C jsme si říkali, že stream je zevšeobecnění činností, které souvisejí se vstupy a výstupy dat. Pomocí téže funkce můžeme např. číst z klávesnice, ale také ze sériového kanálu, z úseku paměti nebo např. ze souboru. Pro vstupy a výstupy na consolu jsou v programu vždy otevřeny streamy s názvy stdin (standard input) a stdout (standard output). Nemusíme je tedy deklarovat, ani otevírat nebo zavírat Příklad : void main() int pocet; printf("napis cislo: "); // výstup na stdout scanf("%d",&pocet); // vstup z stdin printf("\nnapsal jsi toto cislo: %d\n",pocet); lze napsat i pomocí funkcí, které jsme používali pro práci se soubory: void main() int pocet; fprintf(stdout,"napis cislo: "); fscanf(stdin,"%d",&pocet); fprintf(stdout,"\nnapsal jsi toto cislo: %d\n",pocet); Tyto typy vstupů a výstupů ovšem nekontrolují správnost datových typů. Např. příkaz printf("%d", "Ahoj svete"); se přeloží bez chyby. Teprve při spuštění programu zjistíme, že volání funkce printf nefunguje správně. Místo nápisu Ahoj svete obdržíme číslo Při použití operátorů << a >> se toto nemůže stát. Podle datového typu se použije vždy správná operace. Je to způsobeno tím, že uvnitř knihovny iostream jsou tyto operátory pro každý datový typ navrženy samostatně (říkáme, že jsou pro různé datové typy přetíženy). V jazyku C++ pracuje v programu ještě se streamy cin (console in) a cout (console out), které rovněž nemusíme otevírat ani zavírat a máme je po spuštění programu ihned k dispozici. cout << - výpis na standartní výstup cin >> - načtení ze standartního vstupu

38 38 Náš výše uvedený příklad můžeme pak přepsat takto: #include <iostream.h> void main() int pocet; cout << "Napis cislo: "; // výstup na cout cin >> pocet; // vstup z cin, řídí se podle typu proměnné cout << "Napsal jsi toto cislo: " << pocet; 13.2 Manipulátory Samozřejmě pouze pomocí operátorů << a >> nemůžeme postihnout všechny požadavky, které se v praktickém životě mohou vyskytnout. Proto byly zavedeny ještě manipulátory a funkce, které umožňují lépe pracovat se vstupem a výstupem dat. Tyto jsou deklarovány v hlavičkovém souboru iomanip.h. Základní manipulátory: flush - vyprázdni výstupní buffer endl - nový řádek + flush ends - znak \0 + flush left - zarovnávej doleva right - zarovnávej doprava scientific - exponentový tvar desetinného čísla fixed - neexponentový tvar desetinného čísla dec - celé číslo v desítkové soustavě oct - celé číslo v osmičkové soustavě hex - celé číslo v šestnáctkové soustavě ws - přeskoč bílé znaky (hlavně mezery na vstupu) showpos - znaménko se zobrazuje vždy boolalpha - hodnotu proměnné typu bool vypíše jako true, false noboolalpha - hodnotu proměnné typu bool vypíše jako 1, 0 Příklad: cout << x << flush << y << flush; cin >> ws >> x; cout << 1234 << hex << 1234 << endl; 13.3 Pomocné funkce Funkce pro vstup: get() - 0 až 3 parametry (kam, délka, koncový_znak) getline() - 2 až 3 parametry (kam, délka, koncový_znak) koncový znak řádku je implicitně nastaven na \n ignore() - ignorování vstupních znaků, 1 až 2 parametry (délka, koncový_znak) read(pole_znaků,délka) načtení stringu o max. délce delka

39 39 tellg() seekg() putback(znak) unget() peek() sync() - vrací pozici v souboru (struktura fstream::pos_type) - 1 až 2 parametry (pozice nebo posun,odkud) - vsune znak do vstupního bufferu - vrátí poslední znak do vstupního bufferu - který znak se přečte jako další? - vyprázdnění vstupního bufferu Funkce pro výstup setprecision(int) - počet desetinných míst setw(int) - šířka výstupního pole (jen pro následující položku!) setfill(int) - výplňkový znak put() - 1 parametr (znak) write() - 2 parametry (pole_znaků,délka) tellp() - vrací pozici v souboru (struktura fstream::pos_type) seekp() - 1 až 2 parametry (pozice nebo posun, odkud) flush() - vyprázdní zbytek bufferu (provede výstup obsahu) Příklad volání funkce getline pro čtení víceslovného text. řetězce: char jmeno[50]; // cin>>jmeno by vrátilo jen první slovo cin.getline(jmeno,sizeof(jmeno)); Příklad použití dalšich funkcí: cout <<setw(4)<<setfill('#')<< 33 << "+" << 22; // Na obrazovce obdržíme tento výpis: ##33+22 Nastavení manipulátoru setw() platí pouze pro jednu tisknutou položku, ostatní manipulátory platí až do další změny 13.4 Příklady použití Příklad: char a[100]; cout << "Napiš řetězec" << endl; cin.getline(a,99); // načtení max. 99 znaků do pole a cout << "napsal jsi " << a << endl; Příklad: float s,x; cout << "zadej polomer: "; cin >> x; // naplnění proměnné x z klávesnice s=m_pi*x*x; cout << s << endl; // endl - manipulátor konce řádku Příklad:

40 40 #include<iostream.h> #include<iomanip.h> void main ( ) int i; float f; // načtení int a float z cin cout << "Zadejte cele a desetinne cislo: "; cin >> i >> f; // výstup int a odradkovani cout << "Cele cislo: " << i << endl; // výstup float a odradkovani cout << "Desetinne cislo: "<< f << endl; // výstup proměnné i hexadecimálně // hex - manipulátor převodu na hexa cout << "Hexa vystup: "<< hex << i << endl; // výstup proměnné i se znaménkem cout << showpos << i << endl; // jiné řešení vystupu i hexadecimálně cout << setbase(16) << i << endl; // výstup f v exponenciálním tvaru // s přesností na 10 číslic cout << scientific << setprecision(10) << f << endl; // změna přesnosti na 6 číslic // obdoba cout << setprecision(6); cout.precision(6); // výstup f a návrat k pevné notaci cout << f << fixed << endl; char text[50]; cout << "Napis nejaky text: " << endl; cin >> ws; cin.getline(text, 50); cout << "napsal jsi: " << text; // odstranění oddělovačů (mezer) // ze vstupního bufferu Příklad načítání číselného údaje a následně stringu: Při čtení číselných a následně textových údajů (stringů) může nastat problém, že se program na instrukci čtení textu nezastaví a my nemáme šanci tento údaj zadat. Problém spočívá v tom, že při načítání číselného údaje jeho zadávání končíme klávesou ENTER, kterou představuje znak \n. Stream si po stisku klávesy ENTER z bufferu klávesnice vybere znaky, které patří do číselného údaje a končí prvním znakem, který do zadávaného čísla nepatří. Jestliže jsme zadávali správně, tak znak, který se už do čísla nevezme, je právě ENTER, tedy \n a tento zůstane v buffer. Jestliže pak načítáme z klávesnice string, počítá se s tím, že jeho zadávání také končí klávesou ENTER. Tato klávesa ale v bufferu už je, z minulého čtení čísla! Program tedy už nebude čekat až něco napíšeme, ale vezme jen znak \n z bufferu a končí se zadáváním. Pro nás se to pak jeví, jako že jsme zadali prázdný řetězec.

41 41 Tento problém musíme řešit tak, že pokud jsme před načítáním stringu četli číselný údaj, znak \n z klávesnice nejdříve instrukcí cin.get() vyčteme a tím ho odstraníme. Buffer klávesnice tak zůstane prázdný a instrukce cin.getline už na nás počká, abychom string zadali. Správný postup je tedy tento: int x,y; char text[100],text1[50]; cin>>x; // čtení čísla cin.get(); // odstranění '\n' z bufferu klávesnice cin.getline(text,sizeof(text)); // čtení řádku cin>>y; // čtení dalšího čísla cin.get(); // odstranění '\n' z bufferu klávesnice cin.getline(text1,sizeof(text1)); // čtení dalšího řádku Po instrukci vyčtení textového řetězce instrukci cin.get() už použít nesmíme! Vyčítání stringu totiž na rozdíl od vyčítání číselného údaje znak \n z bufferu klávesnice odstraní. V instrukci bychom tedy čekali zbytečně na další stisk klávesy ENTER. Příklad načtení čísla s kontrolou: int CtiInt() int x; // načítání čísla musí skončit před závěrečným \n // a peek tudíž musí vrátit jako následující znak '\n' // pokud ne, došlo při převodu stringu na int k chybě cin>>x; while(cin.peek()!='\n') // vynuluji případné příznaky chyb cin.clear(); // ignoruji až 1000 znaků v bufferu klavesnice, // nebo končím nalezením znaku \n = ENTER cin.ignore(1000,'\n'); cout<<"chyba, zopakujte zadani!"<<endl; cin>>x; return x; Shrnutí kapitoly Naučili jsme se další způsob jak pracovat s konzolou. Někdy se nám bude zdát snazší pracovat s takovými funkcemi jako je printf nebo scanf, tedy s funkcemi pracujícími se streamy stdin a stdout, jindy se nám bude pracovat snáze s prostředky, které jsme se naučili v této kapirole, tedy s těmi, které využívají streamy cin a cou. S čím budeme zrovna pracovat, záleží jen na nás.

42 42 Kontrolní otázky a úkoly 1) Jak vytiskneme pomocí operátoru << číslo typu float s přesností na dvě desetinná čísla a 10 znaků celkem? 2) Jak zabráníme, aby se nám desetinné číslo vypsalo v exponenciálním tvaru?

43 43 14 Přetěžování operátorů << a >> Obsah hodiny Naučíme se definovat chování operátorů << a >> pro naše datové typy. Cíl hodiny Po této hodině budete schopni: tisknout obsah struktury pomocí jediného operátoru << načíst obsah struktury pomocí jediného operátoru >> Klíčová slova přetěžování operátorů, ostream.h, istream.h V minulé kapitole jsme se se seznámili s novými operátory << a >>. Naučili jsme se je ale používat pouze pro základní datové typy. V této kapitole si ukážeme jak přetěžovat i tyto operátory pro vstup a výstup našich nových datových typů. Vycházíme vždy z těchto příkladů: výstupní operátor << ostream& operator<< (ostream& os, const T& t); vstupní operátor >> istream& operator>> (istream& is, T& t); Ostream je základní typ streamu pro výstup dat jak na konzolu, tak i např. do souboru. Istream je základní typ streamu pro vstup dat jak z konzoly, tak i např. ze souboru. Příklad: #include <iostream.h> #include <istream.h> #include <ostream.h>

44 44 ostream& operator<< (ostream& os, const Zlomek z); istream& operator>> (istream& os, Zlomek& z); void main() Zlomek a; cin >> a; cout << a; getch(); ostream& operator<< (ostream& os, const Zlomek z) os << z.citatel << "/" << z.jmenovatel; return os; istream& operator>> (istream& is, Zlomek& z) char znak; is >> z.citatel; is.read(&znak,1); is >> z.jmenovatel; return is; // načtení znaku '/' (nekontroluje se) Shrnutí kapitoly Naučili jsme se přetížit operátory << a >> i pro jiné datové typy než základní. Kontrolní otázky a úkoly 1) Přetižte operátor << pro výpis struktury údajů o žákovi. 2) Přetižte operátor >> pro naplnění struktury údajů o žákovi. Otázky k zamyšlení 1) Proč funkce přetížení operátorů << a >> vracejí referenci na ostream a istream? Co bychom nemohli provádět, kdybychom tuto referenci nevraceli? 2) Proč funkce přetížení operátorů << a >> používají streamy ostream a istream a ne cout a cin?

45 45 Literatuta [1]

46 46 15 Procvičování přetěžování operátorů Obsah hodiny Řešení příkladů pro přetěžování operátorů Deklarujte strukturu údajů o žákovi 1) Přetižte operátor << pro výpis struktury údajů o žákovi. 2) Přetižte operátor >> pro naplnění struktury údajů o žákovi 3) Přetižte operátor / tak, aby výsledkem operace zak1/zak2 byl průměrný věk obou žáků. 4) Přetižte operátory <, <=, >, >=, == a!= tak, aby výsledkem např. operace zak1 < zak2 bylo true, pokud žák1 je mladší než žák 2. Správnou funkci všech vámi navržených operátorů vyzkoušejte ve funkci main.

47 47 16 Práce se soubory Obsah hodiny Naučíme se pracovat se soubory pomocí prostředků, které nám nabízí C++. Cíl hodiny Po této hodině budete schopni: číst ze souborů zapisovat do souborů kopírovat soubory Klíčová slova fstream, ifstream, ofstream Pro práci se soubory můžeme v jazyku C++ používat také streamy deklarované v fstream.h. Podrobnou dokumentaci nalezneme na internetu na adrese [1] uvedené na konci kapitoly. Takto můžeme např. v C++ psát do souboru: #include <iostream.h> #include <iomanip.h> #include <fstream.h> void main() ofstream out; // deklarace výstupního souborového streamu out.open("soubor.txt"); // otevření souboru v text. módu if(out.is_open()) // povedlo se? for(int i=1;i<=10;i++) // výstup deseti čísel textově out << i << endl; out.close(); // zavření souboru else cout << "Soubor se nepodarilo otevřít";

Jazyk C++, některá rozšíření oproti C

Jazyk C++, některá rozšíření oproti C Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 1/22 Jazyk C++, některá rozšíření oproti C Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra

Více

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové

Více

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory Výhody objektového řešení Nástroje pro IO operace jsou v C++ součástí knihoven Hierarchie objektových

Více

přetížení operátorů (o)

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního

Více

Úvod do programování. Lekce 1

Úvod do programování. Lekce 1 Úvod do programování Lekce 1 Základní pojmy vytvoření spustitelného kódu editor - psaní zdrojových souborů preprocesor - zpracování zdrojových souborů (vypuštění komentářů atd.) kompilátor (compiler) -

Více

Základy C++ I. Jan Hnilica Počítačové modelování 18

Základy C++ I. Jan Hnilica Počítačové modelování 18 Základy C++ I 1 Přechod z C na C++ jazyk C++ je nadmnožinou jazyka C z hlediska syntaxe se jedná o velmi podobné jazyky, spolu s dalšími jazyky "céčkovské" rodiny, jako je např. C# každý platný program

Více

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: 1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.

Více

Programování v jazyce C a C++

Programování v jazyce C a C++ Programování v jazyce C a C++ Richter 1 Petyovský 2 1. března 2015 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno 2 Ing. Petyovský Petr, UAMT FEKT VUT Brno C++ Stručná charakteristika Nesdíĺı normu

Více

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: 1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.

Více

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {...

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {... Proudy v C++ Jmenné prostory Prostory jmen při vkládání několika hlavičkových souborů může vzniknout kolize zeleznice.h const int x=10; typedef struct {... } Hradlo; logika.h const int x=5; typedef struct

Více

Datové proudy objektový vstup a výstup v C++

Datové proudy objektový vstup a výstup v C++ Datové proudy objektový vstup a výstup v C++ Petr Šaloun 10. listopadu 2014 PJCPP Objektový vstup/výstup 10-1 Datové proudy objektový vstup a výstup v C++ Základní pojmy Znakje elementární textová informace,

Více

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19 C++ přetěžování funkcí a operátorů 1 Přetěžování funkcí jazyk C++ umožňuje napsat více funkcí se stejným názvem, těmto funkcím říkáme přetížené přetížené funkce se musí odlišovat typem nebo počtem parametrů,

Více

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro

Více

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016 ZPRO cvičení 2 Martin Flusser Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague October 17, 2016 Outline I 1 Outline 2 Proměnné 3 Proměnné - cvičení 4 Funkce 5 Funkce

Více

Zápis programu v jazyce C#

Zápis programu v jazyce C# Zápis programu v jazyce C# Základní syntaktická pravidla C# = case sensitive jazyk rozlišuje velikost písmen Tzv. bílé znaky (Enter, mezera, tab ) ve ZK překladač ignoruje každý příkaz končí ; oddělovač

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Typy Základní (primitivní) datové typy Deklarace Verze pro akademický rok 2012/2013 1 Typy v jazyce Java Základní datové typy (primitivní datové typy) Celočíselné byte, short,

Více

přetížení operátorů (o)

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - operátor je speciální

Více

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech 7 Formátovaný výstup, třídy, objekty, pole, chyby v programech Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost formátovanému výstupu,

Více

Přetěžování operátorů

Přetěžování operátorů Přetěžování operátorů Cíle lekce Cílem lekce je seznámit se s mechanizmem přetížení operátorů a s použitím tohoto mechanizmu při návrhu a implementaci programů. Po absolvování lekce budete: umět využívat

Více

PŘETĚŽOVÁNÍ OPERÁTORŮ

PŘETĚŽOVÁNÍ OPERÁTORŮ PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako

Více

Programovací jazyk C++ Cvičení 2

Programovací jazyk C++ Cvičení 2 Programovací jazyk C++ Cvičení 2 Ačkoliv opakujeme jazyk C, naučíme se již něco z C++ 1. Komentáře: komentáře v jazyce C: /* */ nesmějí se vnořovat je možné je využívat i v C++ používají se hlavně jako

Více

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; } Pole Kdybychom v jazyce C++chtěli načíst větší počet čísel nebo znaků a všechny bylo by nutné všechny tyto hodnoty nadále uchovávat v paměti počítače, tak by bylo potřeba v paměti počítače alokovat stejný

Více

Více o konstruktorech a destruktorech

Více o konstruktorech a destruktorech Více o konstruktorech a destruktorech Více o konstruktorech a o přiřazení... inicializovat objekt lze i pomocí jiného objektu lze provést přiřazení mezi objekty v původním C nebylo možné provést přiřazení

Více

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1 24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE

Více

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu } 5. Operátor čárka, - slouží k jistému určení pořadí vykonání dvou příkazů - oddělím-li čárkou dva příkazy, je jisté, že ten první bude vykonán dříve než příkaz druhý. Např.: i = 5; j = 8; - po překladu

Více

Konstruktory a destruktory

Konstruktory a destruktory Konstruktory a destruktory Nedostatek atributy po vytvoření objektu nejsou automaticky inicializovány hodnota atributů je náhodná vytvoření metody pro inicializaci, kterou musí programátor explicitně zavolat,

Více

Programovací jazyk Pascal

Programovací jazyk Pascal Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce

Více

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++ Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++ Třídy v C++ Třídy jsou uživatelsky definované typy podobné strukturám v C, kromě datových položek (proměnných) však mohou obsahovat i funkce

Více

9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h> 9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include int main(void) { int dcislo, kolikbcislic = 0, mezivysledek = 0, i; int vysledek[1000]; printf("zadejte

Více

Př. další použití pointerů

Př. další použití pointerů Př. další použití pointerů char *p_ch; int *p_i; p_ch = (char *) p_i; // konverze int * na char * 8 int i = 5; int *p_i; p_i = &i; POZOR!!!! scanf("%d", p_i); printf("%d", *p_i); Obecný pointer na cokoliv:

Více

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++ Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++ Proudy pro standardní vstup a výstup V jazyce C++ provádíme textový vstup a výstup prostřednictvím tzv. datových proudů Datové

Více

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje f1(&pole[4]); funkci f1 předáváme hodnotu 4. prvku adresu 4. prvku adresu 5. prvku hodnotu 5. prvku symbolická konstanta pro konec souboru je eof EOF FEOF feof Správné vytvoření a otevření textového souboru

Více

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky - Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky - Preprocesor je možné ovládat pomocí příkazů - řádky začínající

Více

Mělká a hluboká kopie

Mělká a hluboká kopie Karel Müller, Josef Vogel (ČVUT FIT) Mělká a hluboká kopie BI-PA2, 2011, Přednáška 5 1/28 Mělká a hluboká kopie Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky, Fakulta

Více

Programování v C++ 1, 1. cvičení

Programování v C++ 1, 1. cvičení Programování v C++ 1, 1. cvičení opakování látky ze základů programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí procvičených

Více

Programování v C++, 2. cvičení

Programování v C++, 2. cvičení Programování v C++, 2. cvičení 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 Operátory new a delete 2 3 Operátory new a delete minule

Více

8 Třídy, objekty, metody, předávání argumentů metod

8 Třídy, objekty, metody, předávání argumentů metod 8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním

Více

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr) Základy jazyka C Základy programování 1 Martin Kauer (Tomáš Kühr) Organizační záležitosti Konzultace Pracovna 5.076 Úterý 15:00 16:30 Emailem martin.kauer@upol.cz Web předmětu http://tux.inf.upol.cz/~kauer/index.php?content=var&class=zp1

Více

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 1/41 Základní příkazy Všechny příkazy se píšou malými písmeny! Za většinou příkazů musí být středník (;)! 2/41 Základní příkazy

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty. Proměnná Pojmenované místo v paměti sloužící pro uložení hodnoty. K pojmenování můžeme použít kombinace alfanumerických znaků, včetně diakritiky a podtržítka Rozlišují se velká malá písmena Název proměnné

Více

C++ objektově orientovaná nadstavba programovacího jazyka C

C++ objektově orientovaná nadstavba programovacího jazyka C C++ objektově orientovaná nadstavba programovacího jazyka C (1. část) Josef Dobeš Katedra radioelektroniky (13137), blok B2, místnost 722 dobes@fel.cvut.cz 5. května 2014 České vysoké učení technické v

Více

Operační systémy. Cvičení 4: Programování v C pod Unixem

Operační systémy. Cvičení 4: Programování v C pod Unixem Operační systémy Cvičení 4: Programování v C pod Unixem 1 Obsah cvičení Řídící struktury Funkce Dynamická alokace paměti Ladění programu Kde najít další informace Poznámka: uvedené příklady jsou dostupné

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech

Více

Operační systémy. Cvičení 3: Programování v C pod Unixem

Operační systémy. Cvičení 3: Programování v C pod Unixem Operační systémy Cvičení 3: Programování v C pod Unixem 1 Obsah cvičení Editace zdrojového kódu Překlad zdrojového kódu Základní datové typy, struktura, ukazatel, pole Načtení vstupních dat Poznámka: uvedené

Více

SYSTÉMOVÉ PROGRAMOVÁNÍ Cvičení č.1

SYSTÉMOVÉ PROGRAMOVÁNÍ Cvičení č.1 SYSTÉMOVÉ PROGRAMOVÁNÍ Cvičení č.1 Autor: Ing. Michal Bližňák Témata cvičení: Bleskový úvod do C++ Rozdíly mezi C a C++ Základním rozdílem mezi C a C++ samozřejmě je, že C++ je na rozdíl od tradičního

Více

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N Struktura (union) - struktura a union jsou složené typy, které "v sobě" mohou obsahovat více proměnných - struktura obsahuje v každém okamžiku všechny své proměnné, union obsahuje (=je "aktivní") pouze

Více

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií 1 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 12. října 2009 Organizace výuky Přednášky Teoretické základy dle normy jazyka C Cvičení Praktické úlohy odpřednášené látky Prostřední

Více

18. února 2015, Brno Připravil: David Procházka. Programovací jazyk C++

18. února 2015, Brno Připravil: David Procházka. Programovací jazyk C++ 18. února 2015, Brno Připravil: David Procházka Vstupní a výstupní proudy v C++ Programovací jazyk C++ Vstup dat do programu Strana 2 / 26 Obsah přednášky 1 Vstup dat do programu 2 Terminál 3 Textový soubor

Více

Programujeme v softwaru Statistica

Programujeme v softwaru Statistica Programujeme v softwaru Statistica díl druhý Newsletter Statistica ACADEMY Téma: Programování, makra, skripty Typ článku: Návody V tomto článku si ukážeme další možnosti při psaní maker v softwaru Statistica.

Více

Paměť počítače. alg2 1

Paměť počítače. alg2 1 Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových

Více

- jak udělat konstantu long int: L long velka = 78L;

- jak udělat konstantu long int: L long velka = 78L; Konstanty (konstatní hodnoty) Např.: - desítkové: 25, 45, 567, 45.678 - osmičkové: 045, 023, 03 vždy začínají 0 - šestnáctkové: 0x12, 0xF2, 0Xcd, 0xff, 0xFF - jak udělat konstantu long int: 245566553L

Více

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5 Obsah Obsah 1 Programovací jazyk Pascal 1 1.1 Struktura programu v Pascalu.................... 1 2 Proměnné 2 2.1 Vstup a výstup............................ 3 3 Operátory a některé matematické funkce 5

Více

Programování v C++ 3, 3. cvičení

Programování v C++ 3, 3. cvičení Programování v C++ 3, 3. cvičení úvod do objektově orientovaného programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Dokončení spojového

Více

PB161 Programování v jazyce C++ Přednáška 5

PB161 Programování v jazyce C++ Přednáška 5 PB161 Programování v jazyce C++ Přednáška 5 Jmenné prostory Vstupní/výstupní proudy Nikola Beneš 19. října 2015 PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 1 / 29 Jmenné

Více

PB161 Programování v jazyce C++ Přednáška 9

PB161 Programování v jazyce C++ Přednáška 9 PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30 Reklama PB173 Tematicky

Více

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

ZPRO v C Ing. Vít Hanousek. verze 0.3 verze 0.3 Hello World Nejjednoduší program ukazující vypsání textu. #include using namespace std; int main(void) { cout

Více

Dědění, polymorfismus

Dědění, polymorfismus Programování v jazyce C/C++ Ladislav Vagner úprava Pavel Strnad Dědění. Polymorfismus. Dnešní přednáška Statická a dynamická vazba. Vnitřní reprezentace. VMT tabulka virtuálních metod. Časté chyby. Minulá

Více

2 Datové typy v jazyce C

2 Datové typy v jazyce C 1 Procedurální programování a strukturované programování Charakteristické pro procedurální programování je organizace programu, který řeší daný problém, do bloků (procedur, funkcí, subrutin). Původně jednolitý,

Více

Základy programování (IZP)

Základy programování (IZP) Základy programování (IZP) Šesté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Petr Veigend, iveigend@fit.vutbr.cz 6. týden

Více

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele Strukturu lze funkci předat: hodnotou i pomocí ukazatele pouze pomocí ukazatele (reference na strukturu) pouze hodnotou (kopie struktury) (pole[i])+j adresa prvku na souřadnicích i, j adresa i-tého řádku

Více

Funkční objekty v C++.

Funkční objekty v C++. Funkční objekty v C++. Funkční objekt je instance třídy, která má jako svou veřejnou metodu operátor (), tedy operátor pro volání funkce. V dnešním článku si ukážeme jak zobecnit funkci, jak používat funkční

Více

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března Polymorfismus Cíle lekce Cílem lekce je vysvětlit význam pojmu polymorfismus jako základní vlastnosti objektově orientovaného programování. Lekce objasňuje vztah časné a pozdní vazby a jejich využití.

Více

IUJCE 07/08 Přednáška č. 6

IUJCE 07/08 Přednáška č. 6 Správa paměti Motivace a úvod v C (skoro vždy) ručně statické proměnné o datový typ, počet znám v době překladu o zabírají paměť po celou dobu běhu programu problém velikosti definovaných proměnných jak

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++ C++ Akademie SH 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory Za áte níci C++ 20. b ezna 2011 Obsah 1 Prom nné - primitivní typy Celá ísla ƒísla s pohyblivou desetinnou árkou, typ bool 2 Podmínka

Více

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) 28. prosince Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) 28. prosince Fakulta elektrotechniky a informatiky Katedra softwarových technologií 9 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 28. prosince 2009 Struktury Struktury heterogenní struktura položky mohou být různých datových typů vystupuje jako jediný objekt

Více

Vstupní a vstupní proudy v C++

Vstupní a vstupní proudy v C++ Programovací jazyk C++ MZLU - PEF - Ústav informatiky 11. října 2007 Vstup na terminál a čtení z něj Používá se knihovna iostream. Pro výstup lze použít standardní výstup cout. nebo chybový výstup cerr.

Více

Mnohotvarost (polymorfizmus)

Mnohotvarost (polymorfizmus) Mnohotvarost (polymorfizmus) TYPY MNOHOTVAROSTI... 2 PŘETĚŽOVÁNÍ METOD, PŘETĚŽOVÁNÍ OPERACÍ... 3 PŘETÍŽENÍ OPERÁTORŮ... 4 ČASTO PŘETĚŽOVANÉ OPERÁTORY... 4 PŘEPISOVÁNÍ... 7 VIRTUÁLNÍ METODY... 10 SEZNAM

Více

Odvozené a strukturované typy dat

Odvozené a strukturované typy dat Odvozené a strukturované typy dat Petr Šaloun katedra informatiky FEI VŠB-TU Ostrava 14. listopadu 2011 Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Odvozené a strukturované typy dat 14. listopadu

Více

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21. Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 21. září 2018 Jiří Dvorský (VŠB TUO) Vyhledávání 242 / 433 Osnova přednášky

Více

Práce se soubory. Základy programování 2 Tomáš Kühr

Práce se soubory. Základy programování 2 Tomáš Kühr Práce se soubory Základy programování 2 Tomáš Kühr Soubory z pohledu C Soubor zjednodušeně chápeme jako posloupnost bytů uložených někde na disku Datový proud (anglicky stream) Ještě obecnější přístup

Více

Vector datový kontejner v C++.

Vector datový kontejner v C++. Vector datový kontejner v C++. Jedná se o datový kontejner z knihovny STL jazyka C++. Vektor je šablona jednorozměrného pole. Na rozdíl od "klasického" pole má vector, mnoho užitečných vlastností a služeb.

Více

Základy programování (IZP)

Základy programování (IZP) Základy programování (IZP) Páté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Petr Veigend, iveigend@fit.vutbr.cz 5. týden

Více

Abstraktní třídy, polymorfní struktury

Abstraktní třídy, polymorfní struktury Karel Müller, Josef Vogel (ČVUT FIT) Abstraktní třídy, polymorfní struktury BI-PA2, 2011, Přednáška 9 1/32 Abstraktní třídy, polymorfní struktury Ing. Josef Vogel, CSc Katedra softwarového inženýrství

Více

Základy programování (IZP)

Základy programování (IZP) Základy programování (IZP) Deváté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Petr Veigend, iveigend@fit.vutbr.cz 27.11.2017,

Více

Lineární spojový seznam (úvod do dynamických datových struktur)

Lineární spojový seznam (úvod do dynamických datových struktur) Lineární spojový seznam (úvod do dynamických datových struktur) Jan Hnilica Počítačové modelování 11 1 Dynamické datové struktury Definice dynamické struktury jsou vytvářeny za běhu programu z dynamicky

Více

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace Předmět: Vývoj aplikací Téma: Pole Vyučující: Ing. Milan Káža Třída: EK3 Hodina: 14 Číslo: V/5 Programování v jazyce

Více

Úvod do programování. Lekce 3

Úvod do programování. Lekce 3 Úvod do programování Lekce 3 Řízení běhu programu - pokračování /2 příklad: program vypisuje hodnotu sin x dx pro různé délky integračního kroku 0 #include #include // budeme pouzivat funkci

Více

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Příkaz switch Příkaz switch provede příslušnou skupinu příkazů na základě hodnoty proměnné (celočíselné

Více

Ukazatele, dynamická alokace

Ukazatele, dynamická alokace Ukazatele, dynamická alokace Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad, Martin Mazanec Karel Richta,

Více

5 Přehled operátorů, příkazy, přetypování

5 Přehled operátorů, příkazy, přetypování 5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování

Více

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Základy programování (IZP)

Základy programování (IZP) Základy programování (IZP) Čtvrté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Petr Veigend, iveigend@fit.vutbr.cz 4.

Více

IUJCE 07/08 Přednáška č. 1

IUJCE 07/08 Přednáška č. 1 Úvod do předmětu Literatura Záznamy přednášek a vaše poznámky Harbison, S. P., Steele, G. L.: Referenční příručka jazyka C Herout, P.: Učebnice jazyka C Kernighan, B. W., Ritchie, D. M.: The C Programming

Více

Programování v C++ 1, 6. cvičení

Programování v C++ 1, 6. cvičení Programování v C++ 1, 6. cvičení dědičnost, polymorfismus 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu

Více

Pointery II. Jan Hnilica Počítačové modelování 17

Pointery II. Jan Hnilica Počítačové modelování 17 Pointery II 1 Pointery a pole Dosavadní způsob práce s poli zahrnoval: definici pole jakožto kolekce proměnných (prvků) jednoho typu, umístěných v paměti za sebou int pole[10]; práci s jednotlivými prvky

Více

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b Výrazy a operátory i = 2 i = 2; to je výraz to je příkaz 4. Operátory Unární - unární a unární + Např.: +5-5 -8.345 -a +b - unární ++ - inkrement - zvýší hodnotu proměnné o 1 - unární -- - dekrement -

Více

Opakování programování

Opakování programování Opakování programování HW návaznost - procesor sběrnice, instrukční sada, optimalizace rychlosti, datové typy, operace (matematické, logické, podmínky, skoky, podprogram ) - paměti a periferie - adresování

Více

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů Začínáme vážně programovat Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů Podmínky a cykly Dokončení stručného přehledu řídících struktur jazyka C. Složený příkaz, blok Pascalské

Více

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek 6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek 1/73 https://en.cppreference.com internetová stránka s referencemi https://gedit.en.softonic.com/download

Více

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Pole a Funkce. Úvod do programování 1 Tomáš Kühr Pole a Funkce Úvod do programování 1 Tomáš Kühr (Jednorozměrné) pole u Datová struktura u Lineární u Homogenní = prvky stejného datového typu u Statická = předem určený počet prvků u Pole umožňuje pohodlně

Více

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787 Stručný obsah První týden 25 den 1 Začínáme 27 den 2 Anatomie programu C++ 43 den 3 Proměnné a konstanty 57 den 4 Výrazy a příkazy 79 den 5 Funkce 107 den 6 Objektově orientované programování 141 den 7

Více

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA ze sady: 03 tematický okruh sady: Tvorba skript a maker ze šablony: 10 Algoritmizace a programování určeno pro: 4. ročník vzdělávací obor: vzdělávací

Více

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Preprocesor Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Programování v C++, A7B36PJC 4/2016, Lekce 9b https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start

Více

Programování v C++ 2, 4. cvičení

Programování v C++ 2, 4. cvičení Programování v C++ 2, 4. cvičení statické atributy a metody, konstruktory 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Přístupová práva

Více