Programování v C++ David Bednárek.
|
|
- Viktor Holub
- před 9 lety
- Počet zobrazení:
Transkript
1 Programování v C++ David Bednárek
2 Pravidla studia NPRG041 2/2 Z,Zk
3 Zápis na cvičení Elektronický zápis do jednotlivých skupin is.cuni.cz/studium Zápis předmětů a rozvrhu - zápis Grupíček - výsledky Zapsáni musejí být všichni Do Kapacita laboratoře je omezena, skupiny nelze přeplňovat Zvláštní skupina pro repetenty Repetenti kontaktují cvičícího do Udělit zápočet může jen cvičící, ke kterému je student zapsán Kdo nebude do zapsán, zápočet v tomto šk. roce nedostane
4 Udělení zápočtu Základní podmínky společné všem skupinám Úspěšné složení zápočtového testu 1. a 2. pokusy ve zkouškovém období pokusy v dubnu 2-3 hodiny v laboratoři, společně pro všechny skupiny Vypracování zápočtového programu Dohoda o tématu - do listopadu Předvedení cvičícímu do Doladění a odevzdání do Další podmínky udělení zápočtu určuje cvičící Cvičící může podmínky individuálně upravit, pokud se s ním student na začátku semestru dohodne Přiměřená účast na cvičeních Úspěšné odevzdání domácího úkolu
5 Zkouška Zkouška bude provedena formou abc-testu Vlastnosti a pravidla jazyka C++ Používání knihoven C++ (kontejnery, algoritmy, iostream) Typické konstrukce objektového programování Run-time/static polymorphism Termíny Ve zkouškovém období ZS Během výuky v LS
6 Pravidla pro budoucí neúspěšné Zkouška Pokud letos složíte zkoušku se známkou výborně nebo velmi dobře a nedostanete zápočet, bude vám příští rok uznána Zápočet Tento mechanismus je implementován zkoušejícími, nikoliv studijním oddělěním Pokud nedostanete zápočet, budete příští rok opakovat ty části, které jste letos nesplnili Podmínky splněné letos se automaticky uznávají V příštím roce se musíte na začátku semestru přihlásit v SISu k některému z cvičících a dohodnout se s ním na konkrétních podmínkách
7 Historie C++
8 Historie C++ BCPL (Cambridge 1966) B (Bell Labs. 1969) C (Bell Labs. 1971) K&R C (Kernigan & Ritchie 1978) inspirace nadmnožina C with classes (Stroustrup 1979) téměř nadmnožina významná změna The C++ programming language (Stroustrup 1985) C++98 (ISO/IEC ) šablony C++03 (ISO/IEC ) C++TR1 (ISO/IEC ) paralelismus C++11 (ISO/IEC ) C++14 (2014+)
9 Historie C++ a C BCPL (Cambridge 1966) B (Bell Labs. 1969) C (Bell Labs. 1971) K&R C (Kernigan & Ritchie 1978) inspirace nadmnožina C with classes (Stroustrup 1979) téměř nadmnožina významná změna ANSI C (ANSI X3J ) The C++ programming language (Stroustrup 1985) C99 (ISO/IEC ) C++98 (ISO/IEC ) šablony C++03 (ISO/IEC ) C++TR1 (ISO/IEC ) C11 (ISO/IEC ) paralelismus C++11 (ISO/IEC ) C++14 (2014+)
10 Historie C++ - Objective-C BCPL (Cambridge 1966) B (Bell Labs. 1969) C (Bell Labs. 1971) inspirace nadmnožina téměř nadmnožina významná změna Objective-C (Cox & Love 1981) Object-Oriented Programing (Cox 1986) K&R C (Kernigan & Ritchie 1978) ANSI C (ANSI X3J ) C with classes (Stroustrup 1979) The C++ programming language (Stroustrup 1985) C99 (ISO/IEC ) C++98 (ISO/IEC ) šablony Objective-C 2.0 (Apple 2006) C++03 (ISO/IEC ) C++TR1 (ISO/IEC ) Objective-C++ (Apple 2010) C11 (ISO/IEC ) paralelismus C++11 (ISO/IEC ) C++14 (2014+)
11 Historie C++ - významné příbuzné jazyky BCPL (Cambridge 1966) B (Bell Labs. 1969) C (Bell Labs. 1971) inspirace nadmnožina téměř nadmnožina významná změna Objective-C (Cox & Love 1981) Object-Oriented Programing (Cox 1986) K&R C (Kernigan & Ritchie 1978) ANSI C (ANSI X3J ) C with classes (Stroustrup 1979) The C++ programming language (Stroustrup 1985) Java (Sun 1995) Objective-C 2.0 (Apple 2006) Objective-C++ (Apple 2010) C99 (ISO/IEC ) C11 (ISO/IEC ) C# (Microsoft 2002) C++/CLI (Microsoft 2005) paralelismus C++98 (ISO/IEC ) C++03 (ISO/IEC ) C++TR1 (ISO/IEC ) C++11 (ISO/IEC ) šablony C++14 (2014+)
12 Historie C++ - použití C v jádrech OS BCPL (Cambridge 1966) B (Bell Labs. 1969) C (Bell Labs. 1971) Unix 1973 inspirace nadmnožina téměř nadmnožina významná změna Objective-C (Cox & Love 1981) Object-Oriented Programing (Cox 1986) OS-X 2000 Objective-C 2.0 (Apple 2006) Objective-C++ (Apple 2010) Windows NT 1993 K&R C (Kernigan & Ritchie 1978) MacOS 1984 ANSI C (ANSI X3J ) C99 (ISO/IEC ) C11 (ISO/IEC ) C with classes (Stroustrup 1979) The C++ programming language (Stroustrup 1985) Linux 1991 C# (Microsoft 2002) C++/CLI (Microsoft 2005) paralelismus C++98 (ISO/IEC ) C++03 (ISO/IEC ) C++TR1 (ISO/IEC ) C++11 (ISO/IEC ) Java (Sun 1995) šablony C++14 (2014+)
13 Literatura
14 Literatura Pro začátečníky - před C++11 Bruce Eckel: Thinking in C++ (2000) Myslíme v jazyku C++ (Grada 2000) Miroslav Virius: Pasti a propasti jazyka C++ (Computer Press 2005) Programování v C++ (ČVUT 2001) Andrew Koenig, Barbara E. Moo: Accelerated C++ (2000) Stanley B. Lippman: Essential C++ (2000)
15 Literatura Pro středně pokročilé - před C++11 Andrei Alexandrescu, Herb Sutter: C++ Coding Standards (2005) Scott Meyers: Effective C++ (1998) More Effective C++ (1996) Effective STL (2001) Herb Sutter: Exceptional C++ (2000) More Exceptional C++ (2002) Exceptional C++ Style (2004) Nicolai M. Josuttis: Object-Oriented Programming in C++ (2002) The C++ Standard Library (1999)
16 Literatura Až si budete myslet, že všechno umíte - před C++11 Andrei Alexandrescu: Modern C++ Design (2001) Moderní programování v C++ (Computer Press 2004) David Vandevoorde, Nicolai M. Josuttis: C++ Templates (2003)
17 Literatura C++11 Scott Meyers: Overview of the New C++ (C++11) 360 slajdů z přednášek Vysvětluje motivaci k novým vlastnostem Bjarne Stroustrup: The C++ Programming Language - Fourth Edition Addison-Wesley. ISBN May 2013 Učebnice celého C++ Zatím jediná učebnice obsahující C++11
18 Je lepší C++ nebo Java/C#?
19 Je lepší C++ nebo Java/C#? Špatná otázka
20 Co programovat v C++ Pro které oblasti je C++ lepší než Java/C#? Důraz na výkon C++ umožňuje programovat způsobem, který neubírá na výkonu Když budete programovat v C++ stejným stylem jako v Java/C#, dostanete přibližně stejný výkon Spolupráce s hardware C++ nechystá na programátora nepříjemná překvapení (GC etc.) Embedded assembler, spojování s jinými jazyky Spolupráce s OS Všechny významné OS mají v C jádro a tudíž i rozhraní OS Většina systémových aplikací je v C nebo C++ Nativní knihovny jazyků Java/C# jsou implementovány v C/C++ Generické programování Mechanismus šablon v C++ je silnější než v C/C++ Způsob implementace šablon v C++ neubírá na výkonu
21 Co programovat v C++ Programování orientované na výkon Numerické výpočty Převládající jazyky: FORTRAN, C Pomalý posun směrem k C++ Databázové systémy Převládající jazyky: C/C++ Existují i databázové systémy v Javě Spolehlivé srovnání výkonu neexistuje Proč je Java/C# pomalejší? Garbage collection GC způsobuje mj. problémy s využitím cache Programování bez GC je pracnější, ale dává lepší výsledky Chybí pokročilé metody optimalizace v překladačích Vektorizace, transformace cyklů,... Existují i situace, kdy je Java/C# rychlejší Překladače Javy/C# mají jednodušší úlohu
22 Co programovat v C++ Proč C++ a ne C Stávající aplikace/knihovny/os jsou často v C Programování v C++ je pohodlnější než v C Menší pravděpodobnost chyb Šablony, operátory, zapouzdření,... Při troše šikovnosti stejný výkon jako v C Moduly psané v C++ a C lze spojovat extern "C" void do_something_in_c( int x); void my_cplusplus_function( int x) do_something_in_c( x); extern "C" void call_me_from_c( int y) /* C++ code here */
23 Co neprogramovat v C++ Co raději neprogramovat v C++ Interaktivní aplikace s GUI C++ nemá standardizované rozhraní na GUI Nativní rozhraní GUI v OS je většinou archaické C Knihovny pro GUI jsou archaické, nepřenositelné nebo obojí Qt, GTK+, wxwidgets... Garbage Collection při programování GUI citelně chybí Pokud je zároveň zapotřebí výkon, nic jiného než C++ nezbývá Aplikace skládané z mnoha cizích součástí Standard C++ poskytuje nedostatečné služby OS apod. Cizí knihovny obvykle doplňují chybějící části vlastní tvorbou Různé implementace chybějících částí mohou být v konfliktu
24 Proč C++ Proč (stále ještě) učíme C++? Většina řadových programátorů v C++ programovat nebude MFF chce vychovávat elitu Programování OS, databází, překladačů Vědecké výpočty vyžadující výkon Hry, robotika,... Údržba rozsáhlých a historických softwarových systémů Porozumíte-li tomu, jak funguje C++, budete lépe rozumět jiným programovacím jazykům architektuře počítačů a operačních systémů překladačům Zvládnutí C++ je odznakem zdatnosti matfyzáka
25 Hello, World! #include <iostream> int main( int argc, char * * argv) std::cout << "Hello, world!" << std::endl; return 0; Vstupní bod programu Dědictví jazyka C Žádné třídy ani metody Globální funkce main Parametry programu Z příkazové řádky Děleno na kousky Archaické datové typy Ukazatel na ukazatel Logicky pole polí std - namespace knihoven cout - standardní výstup globální proměnná << - výstup do streamu přetížený operátor endl - oddělovač řádek globální proměnná
26 Hello, World! Dělení do modulů Rozhraní modulů je nutno opsat do zvláštního souboru.hpp - hlavičkový soubor Definující i používající modul tento soubor inkluduje textová direktiva #include // world.hpp #ifndef WORLD_HPP_ #define WORLD_HPP_ void world(); #endif // main.cpp #include "world.hpp" int main( int argc, char * * argv) world(); return 0; // world.cpp #include "world.hpp" #include <iostream> void world() std::cout << "Hello, world!" << std::endl;
27 Hello, World! // world.hpp #ifndef WORLD_HPP_ #define WORLD_HPP_ #include <vector> #include <string> typedef std::vector< std::string> t_arg; void world( const t_arg & arg); #endif // main.cpp #include "world.hpp" int main( int argc, char * * argv) world( t_arg( argv + 1, argv + argc)); return 0; // world.cpp #include "world.hpp" #include <iostream> void world( const t_arg & arg) if ( arg.empty() ) std::cout << "Hello, world!" << std::endl;
28 Architektura Překladače / interpretry
29 CPU C P U
30 CPU rozumí pouze binárním kódu C P U
31 programování ve strojovém kódu C P U
32 programování ve strojovém kódu C P U
33 programování ve strojovém kódu C P U X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X
34 assembler C P U X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC X' ' DBL DC D'0' END BEGIN C P U assembler
35 operační systém C P U operační systém loader X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC X' ' DBL DC D'0' END BEGIN C P U assembler
36 operační systém C P U operační systém loader X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC X' ' DBL DC D'0' END BEGIN C P U assembler myprog.exe
37 překladač C P U operační systém loader X X X X X X X X X XXXX X X X X X X X X X X X XX X X X X XX X X XX X X X XXX X X X X X XX XXXX X XXXX X XX X XXX X X X XX X X X X X X X X XX X X X X X X X X X X X X X X XX X X X X X X X X X X X X READ INPUT TAPE 5, 501, IA, IB, IC 501 FORMAT (3I5) IF (IA) 777, 777, IF (IB) 777, 777, IF (IC) 777, 777, IF (IA+IB-IC) 777,777, IF (IA+IC-IB) 777,777, IF (IB+IC-IA) 777,777, STOP S = FLOATF (IA + IB + IC) / 2.0 AREA = SQRT( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) * + (S - FLOATF(IC))) WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA STOP END C P U překladač Fortran myprog.exe
38 překladač C C P U operační systém loader Hello, world! #include <stdio.h> int main(int,char**) printf( "Hello, world!\n"); C P U překladač C myprog.exe
39 překladač C C P U operační systém loader Hello, world! #include <iostream> int main(int,char**) std::cout << "Hello, world!\n"; C P U překladač C++ myprog.exe
40 interpret(er) INPUT "What is your name: ", U$ 20 PRINT "Hello "; U$ 30 INPUT "How do you want: ", N 40 S$ = "" 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NEXT I 80 PRINT S$ 90 INPUT "Do you want? ", A$ 100 IF LEN(A$) = 0 THEN A$ = LEFT$(A$, 1) 120 IF A$ = "Y" THEN PRINT "Goodbye ";U$ 140 END C P U interpret operační systém X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X
41 Interpretace s mezikódem 10 INPUT "What is your name: ", U$ 20 PRINT "Hello "; U$ 30 INPUT "How do you want: ", N 40 S$ = "" 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NEXT I 80 PRINT S$ 90 INPUT "Do you want? ", A$ 100 IF LEN(A$) = 0 THEN A$ = LEFT$(A$, 1) 120 IF A$ = "Y" THEN PRINT "Goodbye ";U$ 140 END C P U překladač 04FBC41E 77AB2000 1AE04E33 operační systém interpret X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X
42 interpretovaný mezikód (bytecode) public class HelloWorld public static void main(string[] args) System.out.println( "Hello, world!"); C P U překladač myprog.class C P U 04FBC41E 77AB2000 1AE04E33 interpret operační systém Hello, world!
43 JIT překladač public class HelloWorld public static void main(string[] args) System.out.println( "Hello, world!"); C P U překladač myprog.class C P U JIT překladač operační systém Hello, world!
44 Srovnání JIT/non-JIT public class HelloWorld public static void main(string[] args) System.out.println( "Hello, world!"); C P U překladač myprog.class C P U JIT překladač operační systém #include <iostream> int main(int,char**) std::cout << "Hello, world!\n"; C P U překladač myprog.exe C P U operační systém loader
45 Srovnání JIT/non-JIT JIT (Java, C#, C++/CLI) non-jit (C++) Distribuuje se bytecode (.class,.exe) Distribuce závislá na jazyku a překladači Distribuuje se (někdy) jako binární instrukce (.exe) Distribuce závislá na procesoru a OS Překladač zná přesně cílovou architekturu, může pozorovat chování programu Překladač má dost času na překlad
46 Dynamické spojování? public class HelloWorld public static void main(string[] args) mylib.doit(); překladač překladač myprog.class mylib.class C P U JIT překladač operační systém #include <iostream> int main() int main() doit(); std::cout << "Hello, world!\n"; překladač myprog.exe C P U operační systém loader překladač mylib.dll
47 Dynamické spojování import acme.mylib; public publiclass class HelloWorld HelloWorld public public static static void void main(string[] main(string[] args) args) mylib.doit(); System.out.println( "Hello, world!"); překladač překladač myprog.class mylib.class C P U JIT překladač operační systém #include "mylib.hpp" #include <iostream> int main() int main() doit(); std::cout << "Hello, world!\n"; // mylib.hpp void doit(); překladač myprog.exe C P U operační systém loader překladač mylib.dll
48 Překlad jednoduchého programu - statické spojování // iostream // iostream #include <fstream> #include <fstream> namespace std namespace std extern ofstream extern ofstream cout, cerr; cout, cerr; ; ; iostream.obj msvcrt.lib // myprog.cpp Kompilátor myprog.obj Linker myprog.exe #include <iostream> int main() std::cout << "Hello, world!\n";
49 Oddělený překlad a spojování modulů Standardní Standardní.obj Uživatelské.hpp Standardní.lib Uživatelské.cpp Kompilátor Přeložené.obj Linker Spustitelný soubor.exe
50 Spojování modulů myprog.cpp #include "bee.hpp" int main(int,char**) return B( 7); Kompilátor myprog.obj 0000: ???????? export main(int,argv**) import B(int) bee.hpp #ifndef bee_hpp #define bee_hpp int B( int q); #endif Linker myprog.exe 0000: : bee.cpp #include "bee.hpp" int B( int q) return q+1; Kompilátor bee.obj 0000: export B(int)
51 make Standardní Standardní.obj Uživatelské.hpp Standardní.lib Uživatelské.cpp Kompilátor Přeložené.obj Linker Spustitelný soubor.exe Make makefile
52 Integrované prostředí Standardní Standardní.obj Uživatelské.hpp Standardní.lib Uživatelské.cpp Kompilátor Přeložené.obj Linker Spustitelný soubor.exe Editor Debugger projekt
53 Statické knihovny Standardní Standardní.obj Uživatelské.hpp Standardní.lib Uživatelské.cpp Kompilátor Přeložené.obj Linker Spustitelný soubor.exe Knihovní.hpp Knihovna.lib Knihovní.cpp Kompilátor Přeložené.obj Librarian
54 Dynamické knihovny (Microsoft) Standardní Standardní.obj Uživatelské.hpp Standardní.lib Uživatelské.cpp Kompilátor Přeložené.obj Linker Spustitelný soubor.exe Knihovní.hpp Knihovna.lib Knihovní.cpp Kompilátor Přeložené.obj Linker Knihovna.dll
55 Dynamické knihovny (GNU) Standardní Standardní.o Uživatelské.hpp Standardní.a Uživatelské.cpp Kompilátor Přeložené.o Linker Spustitelný soubor Knihovní.hpp Knihovní.cpp Kompilátor Přeložené.o Librarian Knihovna.so
56 Deklarace a definice
57 Deklarace a definice Deklarace Zápis sdělující, že věc (typ/proměnná/funkce/...) existuje Identifikátor Základní vlastnosti věci Umožňuje překladači přeložit kód, který na věc odkazuje V některých případech je k tomu zapotřebí i definice Definice Zápis, který určuje všechny vlastnosti věci Obsah třídy, inicializace proměnné, kód funkce Umožňuje překladači vygenerovat kód a data, která věc reprezentují za běhu Každá definice je i deklarace Deklarace umožňují (některá) použití věci bez definice Oddělený překlad modulů Vyřešení cyklických závislostí Zmenšení objemu překládaného zdrojového kódu
58 Deklarace a definice One-definition rule #1: Jedna překladová jednotka... (modul, tj. jedno.cpp včetně inkludovaných hpp)... smí obsahovat nejvýše jednu definici věci One-definition rule #2: Program... (tj..exe včetně připojených.dll)... smí obsahovat nejvýše jednu definici proměnné nebo non-inline funkce Definice třídy, typu či inline funkce se v různých modulech opakovat smějí (typicky vložením téhož.hpp souboru) Nejsou-li opakované definice totožné, nebo nesouhlasí-li definice s deklarací, program je nekorektní Diagnostika na úrovni programu není normou požadována a překladače/linkery ji dělají jen v jednoduchých případech
59 Deklarace a definice tříd a typů Deklarace Definice Třída class A; class A... ; Struktura struct A; struct A... ; Unie (v C++ prakticky nepoužitelné) Pojmenovaný typ union A; union A... ; typedef A A2; typedef A * AP; typedef std::shared_ptr< A> AS; typedef A AA[ 10]; typedef A AF(); typedef AF * AFP1; typedef A (* AFP2)(); typedef std::vector< A> AV; typedef AV::iterator AVI;
60 Deklarace a definice proměnných Globální proměnná Statická položka třídy Statická konstantní položka třídy Statická lokální proměnná Nestatická položka třídy Nestatická lokální proměnná Deklarace Definice extern int x, y, z; int x; int y = 729; int z( 729); class A static int x, y, z; ; int A::x; int A::y = 729; int A::z( 729); class A static const int x = 729; ; void f() static int x; static int y = 7, z( 7); class A int x, y; ; void f() int x; int y = 7, z( 7); ;
61 Deklarace a definice funkcí non-inline Deklarace (.hpp nebo.cpp) Definice (.cpp) Globální funkce int f( int, int); int f( int p, int q) return p + q; Statická metoda class A static int f( int p); ; Nestatická metoda class A int f( int p); ; Virtuální metoda class A virtual int f( int p); ; int A::f( int p) return p + 1; int A::f( int p) return p + 1; int A::f( int) return 0; inline Deklarace (.hpp nebo.cpp) Definice (.hpp nebo.cpp) Globální inline funkce Nestatická inline metoda (a) Nestatická inline metoda (b) class A int f( int p); ; inline int f( int p, int q) return p + q; inline int A::f( int p) return p + 1; class A int f( int p) return p+1; ;
62 Umístění dat
63 Umístění dat Statická alokace = 1 instance na proces Globální proměnná Statická položka třídy Statická lokální proměnná [C++11] thread_local objekty = 1 instance na vlákno Zásobníková alokace = 1 instance na každé vyvolání Lokální proměnná Parametr předávaný hodnotou Návratová hodnota funkce Pomocná proměnná při výpočtu výrazu Dynamická alokace = řízeno programem Dynamicky alokovaná data (new/delete)
64 Inicializace Číselné typy, ukazatele Statická alokace Inicializováno nulou Zásobníková nebo dynamická alokace Neinicializováno! Třídy / struktury Inicializováno konstruktorem Lze určit parametry pro konstruktor Není-li konstruktor, platí tato pravidla pro jednotlivé části Parametr předávaný hodnotou / návratová hodnota funkce Inicializován copy-constructorem Není-li definován, je generován překladačem
65 Okamžik inicializace a destrukce Inicializace Destrukce Globální proměnná Před vstupem do main Po výstupu z main Statická položka třídy Před vstupem do main Po výstupu z main Statická lokální proměnná Lokální proměnná Při prvním průchodu řízení deklarací V okamžiku průchodu řízení deklarací Po výstupu z main Při výstupu z bloku Parametr předávaný hodnotou Návratová hodnota funkce Pomocná proměnná při výpočtu výrazu Před voláním funkce V příkazu return Když je vypočtena její hodnota Před návratem z funkce Po návratu z funkce Na konci příkazu (v deklaraci: na konci bloku) Dynamicky alokovaná data Při volání new Při volání delete
66 Nejdůležitější datové typy
67 Vybrané číselné typy bool char std::wchar_t int unsigned long long unsigned long long std::size_t double long double std::complex<double> false, true znak základní sady (např. ASCII, 8 bit) znak rozšířené sady (např. Unicode, 16/32 bit) celé číslo se znaménkem (obvykle 32 bit) celé číslo bez znaménka (obvykle 32 bit) extra velké celé číslo se znaménkem (64 bit) extra velké celé číslo bez znaménka (64 bit) dostatečně velké číslo pro velikost čehokoliv (32/64 bit) reálné číslo (Intel: 64 bit) přesnější reálné číslo (Intel: 80 bit) komplexní číslo dané přesnosti
68 Další důležité typy std::string std::wstring std::istream std::wistream std::ostream std::wostream struct T std::pair<t1,t2> std::vector<t> std::list<t> std::map<k,t> std::multimap<k,t> řetězec (nad char) řetězec (nad std::wchar_t) vstupní proud (nad char) vstupní proud (nad std::wchar_t) výstupní proud (nad char) výstupní proud (nad std::wchar_t) struktura uspořádaná dvojice s prvky typu T1 a T2 pole prvků typu T seznam prvků typu T asociativní pole prvků typu T indexované typem K asociativní pole s opakováním
69 Složené typy v C++ Složené typy jsou iluze poskytovaná překladačem Souvislý úsek paměti dělený na elementární typy sizeof(t) = velikost tohoto úseku Zarovnání může vynutit nevyužití některých míst Veškerá manipulace je překladačem rozložena na manipulaci s elementárními typy V jednoduchých případech (POD) lze kopírovat jako blok bajtů Pole: T a[n] N-tice stejných typů N musí být překladači známá konstanta Třída (class nebo struct) Pojmenované položky různých typů Ve složitějších případech režijní informace Dědičnost implementována vložením předka Virtuální dědičnost vyžaduje nepřímé odkazy na předky
70 Ukazatel vs. hodnota
71 Reference, ukazatelé, iterátory T & const T & T * const T * Reference Konstrukce jazyka C++ Použití syntakticky shodné s hodnotou (r.a) Ukazatel Konstrukce jazyka C/C++ Zvláštní operátory pro přístup k hodnotě (*p, p->a) Ukazatelová aritmetika pro přístup k sousedům v polích Manuální alokace/dealokace objektů Chytré ukazatele Třída ve standardních knihovnách C++ Zvláštní operátory pro přístup k hodnotě (*p, p->a) Automatická dealokace při zániku odkazů std::shared_ptr< T> std::unique_ptr< T> Iterátory Třídy reprezentující odkazy na prvky kontejneru typu K Zvláštní operátory pro přístup k hodnotě (*p, p->a) Napodobenina ukazatelové aritmetiky K::iterator K::const_iterator
72 Referenční semantika C#/Java vs. C++ Referenční typy (C#,Java) Ukazatele na objekty (C++) class T public int a; class test static void f( T z) z.a = 3; static void g() T x = new T(); //vznik x.a = 1; T y = x; //druhý odkaz y.a = 2; // x.a == 2 f( x); // x.a == 3 class T public: int a; ; void f( T * z) z->a = 3; void g() T * x = new T; //vznik x->a = 1; T * y = x; //druhý odkaz y->a = 2; // x->a == 2 f( x); // x->a == 3 //zrušení zařídí garbage collector delete x; //zánik je nutno vyvolat ručně
73 Referenční semantika C#/Java vs. C++ Referenční typy (C#,Java) Chytré ukazatele na objekty (C++) class T public int a; class test static void f( T z) z.a = 3; static void g() T x = new T(); //vznik x.a = 1; T y = x; //druhý odkaz y.a = 2; // x.a == 2 f( x); // x.a == 3 class T public: int a; ; void f( T * z) z->a = 3; void g() std::shared_ptr< T> x = new T; //vznik x->a = 1; std::shared_ptr< T> y = x; //druhý odkaz y->a = 2; // x->a == 2 f( x); // x->a == 3 //zrušení zařídí garbage collector //zrušení při zániku posledního odkazu
74 Hodnotová semantika C#/Java vs. C++ Hodnotové typy (C#) Objekty (C++) struct T int a; class test static void f( T z) z.a = 3; static void g() T x; //vznik x.a = 1; T y = x; //kopie y.a = 2; // x.a == 1 f( x); // x.a == 1 class T public: int a; ; void f( T z) z.a = 3; void g() T x; //vznik x.a = 1; T y = x; //kopie y.a = 2; // x.a == 1 f( x); // x.a == 1 //zrušení v okamžiku zániku proměnné //zrušení v okamžiku zániku proměnné
75 Hodnotová semantika C#/Java vs. C++ Předání odkazem (C#) (hodnotové typy) struct T int a; class test static void f( ref T z) z.a = 3; Předání odkazem (C++) class T public: int a; ; void f( T & z) z.a = 3; static void g() T x; //vznik x.a = 1; f( ref x); // x.a == 3 void g() T x; x.a = 1; f( x); // x.a == 3
76 Referenční semantika C#/Java vs. C++ Předání odkazem (C#) Referenční typy class T public int a; class test static void f( ref T z) z = new T(); //vznik static void g() T x = new T(); //vznik f( ref x); // x je nyní jiný objekt //zrušení zařídí garbage collector Předání odkazem (C++) Reference na ukazatel Užíváno řídce nebezpečí chyb class T public: int a; ; void f( T * & z) delete z; //zánik je nutno vyvolat ručně z = new T; //vznik void g() T * x = new T; //vznik f( x); // *x je nyní jiný objekt delete x; //zánik je nutno vyvolat ručně
77 Dynamická alokace my_class * p = 0; void f1() p = new my_class( 20, 30); void f2() delete p; Dynamická alokace pole std::vector je lepší void f2( std::size_t n) int * q = new int[ n]; q[ n-1] = p->m(); //... Dynamickou alokaci je nutné použít, pokud Rozsah života objektu se nekryje s vyvoláním funkce, nebo Alokovaný objekt je třída s dědičností zařazená do datové struktury Ostatní případy lze většinou nahradit použitím kontejnerů Kontejnery skrývají dynamickou alokaci uvnitř delete[] q;
78 Chytré ukazatele void f1() std::unique_ptr< my_class> p = new my_class( 20, 30); std::unique_ptr< my_class> q = std::move( p); // nuluje p q.reset( new my_class( 10, 20)); // dealokuje původní objekt // dealokuje druhý objekt void f2() std::shared_ptr< my_class> p = new my_class( 20, 30); std::shared_ptr< my_class> q = p; q.reset( new my_class( 10, 20)); Chytré ukazatele řeší dealokaci samy C++11 unique_ptr vždy jen jediný odkaz zajistí překladač shared_ptr počítání odkazů režie za běhu Slabší a pomalejší než Garbage Collection problém: cyklické struktury // dealokuje oba objekty
79 Reference
80 Reference Hodnotové typy (C++,C#,...) Referenční typy (C#,Java) Lokálně existující objekty (C++) Reference na objekty (C++) Ukazatele na objekty (C++) f(int y); class T... class T... class T... class T... void g() int x; //vznik void g() T x = new T; //vznik void g() T x; //vznik void g() T x; //vznik void g() T * x = new T; //vznik int y = z; //kopie //zrušení při //výstupu z bloku T y = x; //druhý odkaz y.f(); //zrušení zařídí //garbage //collector T y = x; //kopie y.f(); //zánik při //výstupu z bloku T & y = x; //odkaz y.f(); //zánik při //výstupu z bloku T * y = x; //druhý odkaz y->f(); delete y; //zánik x->f(); //chyba
81 Reference a ukazatelé Ukazatel (*) a reference (&) Z hlediska implementace ekvivalentní - ukazatel i reference na objekt jsou reprezentovány adresou tohoto objektu Ukazatel umí navíc: Přesměrování jinam Speciální hodnotu nulový ukazatel Ukazatelovou aritmetiku posouvání na sousední objekty v poli Dealokaci operator delete Referenci je možno použít jenom jedním z následujících způsobů: Typ proměnné Typ položky třídy Typ parametru funkce Typ návratové hodnoty funkce Odlišná syntaxe použití: Objekt a reference na objekt se syntakticky neliší Ukazatel se dereferencuje operátorem * Ukazatel na objekt se získá operátorem &
82 Reference a ukazatelé Pravidla pro začátečníky Kdy použít referenci: T & Výstupní parametr Návratová hodnota funkce zpřístupňující objekt T & vector<t>::at(size_t i) Kdy použít konstantní referenci: const T & Obvykle pouze kvůli rychlosti Parametr typu struktura/třída Návratová hodnota funkce zpřístupňující objekt ke čtení const T & vector<t>::at(size_t i) const Kdy použít ukazatel (T *) Je-li objekt dynamicky alokován Je-li nutná schopnost přesměrování, null, nebo aritmetika Nelze-li referenci správně namířit v okamžiku inicializace Kdy použít konstantní ukazatel (const T *) Sekundární odkaz na objekt, schopný pouze čtení
83 Reference a ukazatelé Pravidla pro pokročilejší Vlastník dynamicky alokovaného objektu je zodpovědný za jeho zrušení - musí použít ukazatel T * nelze-li jednoznačně určit vlastníka, použijte shared_ptr<t> Uživatel objektu Pokud je životnost pozorovatele kratší než životnost objektu lze použít referenci T & nebo const T & Pokud je životnost delší než životnost objektu nebo jinak komplikovaná je nutné použít ukazatel T * nebo const T *
84 Reference Novinky související s existencí reference Inicializaci reference nelze nahradit přiřazením Třídy obsahující referenci musí mít konstruktor Nelze rozlišit skutečné parametry předávané hodnotou a odkazem Návratová hodnota funkce může být l-hodnota a.at( i) = x; Zvýšené nebezpečí nekorektních konstrukcí int & f() int x; return x; // funkce vrátí referenci na neexistující objekt
85 Vracení odkazem Funkce jako add nemůže vracet referenci add vrací hodnotu různou od všech svých parametrů hodnotu parametrů nesmí měnit reference nemá na co ukazovat Špatné řešení č. 1: Lokální proměnná Complex & add( const Complex & a, const Complex & b) Complex r( a.re + b.re, a.im + b.im); return r; BĚHOVÁ CHYBA: r zaniká při návratu z funkce
86 Vracení odkazem Funkce jako add nemůže vracet referenci add vrací hodnotu různou od všech svých parametrů hodnotu parametrů nesmí měnit reference nemá na co ukazovat Špatné řešení č. 2: Dynamická alokace Complex & add( const Complex & a, const Complex & b) Complex * r = new Complex( a.re + b.re, a.im + b.im); return * r; PROBLÉM: kdo to odalokuje?
87 Vracení odkazem Funkce jako add nemůže vracet referenci add vrací hodnotu různou od všech svých parametrů hodnotu parametrů nesmí měnit reference nemá na co ukazovat Špatné řešení č. 3: Globální proměnná Complex g; Complex & add( const Complex & a, const Complex & b) g = Complex( a.re + b.re, a.im + b.im); return g; CHYBA: globální proměnná je sdílená Complex a, b, c, d, e = add( add( a, b), add( c, d));
88 Vracení odkazem Funkce jako add musí vracet hodnotou add vrací hodnotu různou od všech svých parametrů hodnotu parametrů nesmí měnit reference nemá na co ukazovat Správné řešení Complex add( const Complex & a, const Complex & b) Complex r( a.re + b.re, a.im + b.im); return r; Zkrácený (ekvivalentní) zápis return Complex( a.re + b.re, a.im + b.im);
89 Vracení odkazem Funkce jako add musí vracet hodnotou Complex add( const Complex & a, const Complex & b) Complex r( a.re + b.re, a.im + b.im); return r; Data se při vracení z funkce (několikrát) kopírují z = add( x, y); plnění proměnné r [constructor] kopie ven z funkce [copy-constructor] přiřazení [operator=] [C++11] rvalue reference mohou některá kopírování usnadnit Řešení bez kopírování existuje za cenu dynamické alokace u malých dat (Complex, string) se nevyplatí
90 Vracení odkazem Řešení bez kopírování class ComplexBody public: ComplexBody( double r, double i) : re( r), im( i) double re, im; ; Complex add( const Complex & a, const Complex & b) return Complex( a.re() + b.re(), a.im() + b.im()); return r; class Complex public: Complex( double r, double i) : b( new ComplexBody( r, i)) double re() const return b->re; double im() const return b->im; private: std::shared_ptr< ComplexBody> b; ; Ekvivalent garbage-collection ComplexBody je sdíleno několika instancemi Complex a zaniká s posledním z nich Garbage-collection metodou markand-sweep bývá rychlejší než počítání odkazů (shared_ptr) Pro malé třídy (Complex) je kopírování levnější než dynamická alokace
91 Reference a ukazatelé Pravidla pro vracení hodnot odkazem Pokud hodnota, kterou funkce vrací, existuje v nějakém objektu i po návratu z funkce, lze vrátit odkaz na tento objekt (konstantní) referencí T & vector<t>::back(); const T & vector<t>::back() const; T & T::operator+=(const T & b); T & T::operator++();// prefixová verze ++ vrací novou hodnotu Pokud se hodnota, kterou funkce vrací, nově spočítala a není nikde uložena, funkce musí vracet hodnotou T operator+( const T & a, const T & b); T T::operator++(int);// postfixová verze ++ vrací starou hodnotu
92 STL Standard Template Library
93 STL Kontejnery Prefabrikáty základních datových struktur Šablony parametrizované typem ukládaného objektu Všechny kontejnery pracují s kopiemi vkládaných hodnot Typ hodnot musí mít alespoň copy-constructor a destruktor Některé druhy kontejnerů či operací s nimi vyžadují i operator= nebo konstruktor bez parametrů Hodnoty se přidávají a odebírají metodami odpovídajícími druhu kontejneru K hodnotám je možno přistupovat pomocí iterátoru, který reprezentuje inteligentní ukazatel dovnitř kontejneru Prostřednictvím iterátoru je možno měnit uložené hodnoty
94 STL Příklad #include <deque> typedef std::deque< int> my_deque; my_deque the_deque; the_deque.push_back( 1); the_deque.push_back( 2); the_deque.push_back( 3); int x = the_deque.front(); // 1 the_deque.pop_front(); my_deque::iterator ib = the_deque.begin(); my_deque::iterator ie = the_deque.end(); for ( my_deque::iterator it = ib; it!= ie; ++it) *it = *it + 3; int y = the_deque.back(); // 6 the_deque.pop_back() int z = the_deque.back(); // 5
95 STL Kontejnery Sekvenční kontejnery Seřazeny podle vzrůstající režie [C++11] array< T, N> - pole se staticky danou velikostí vector< T> - pole prvků s přidáváním zprava basic_string< T> - vektor s terminátorem string = basic_string< char> - řetězec (ASCII) wstring = basic_string< wchar_t> - řetězec (Unicode) deque< T> - fronta s přidáváním a odebíráním z obou stran [C++11] forward_list< T> - jednosměrně vázaný seznam list< T> - obousměrně vázaný seznam Odvozené kontejnery queue< T> - fronta (maskovaná deque) priority_queue< T> - prioritní fronta (vylepšený vector) stack< T> - zásobník (maskovaný vector)
96 STL Kontejnery Pomocné metody kontejneru Test prázdnosti bool empty() const Počet prvků size_t size() const nepoužívat pro testy prázdnosti
97 STL Kontejnery Metody kontejneru, vracející iterátory Odkaz na začátek kontejneru - první platný prvek iterator begin() const_iterator begin() const Odkaz za konec kontejneru - za poslední platný prvek iterator end() const_iterator end() const iterator a const_iterator jsou typy definované uvnitř kontejneru, zvané iterátory přístupné konstrukcemi jako vector< int>::iterator vlastnosti iterátorů jsou mírně závislé na druhu kontejneru Iterátor kontejneru obsahujícího typ T je třída s operátory definovanými tak, aby se chovala podobně jako "T *" "(ukazatel na typ T) resp. "const T *" Vytváří se tak iluze, že kontejner je pole
98 Kategorie iterátorů Norma C++ definuje 5 kategorií iterátorů random_access bidirectional forward output input Kategorie určuje, které syntaktické konstrukce musí iterátor umožňovat vector, basic_string a deque list random_access bidirectional forward_list forward Pro iterátor I jsou definovány tyto operace: output *I = x input *I /* pouze pro čtení */ random_access, bidirectional, forward *I /* čtení i zápis */ všechny kategorie ++I, I++ random_access, bidirectional, forward, input I1 == I2, I1!= I2 random_access, bidirectional --I, I-- random_access I += n, I + n, n + I I -= n, I - n, I1 - I2 I[ n] I1 < I2, I1 > I2, I1 <= I2, I1 >= I2
99 STL Iterátory Operátory definované na iterátorech přístup k prvku, na který iterátor ukazuje T & iterator::operator *() const const T & const_iterator::operator *() const posouvání iterátoru směrem ke konci jednosměrný iterátor iterator & iterator::operator++() posouvání iterátoru směrem k začátku obousměrný iterátor iterator & iterator::operator--() libovolný posun iterátor s přímým přístupem iterator operator+( iterator, int) iterator operator-( iterator, int)
100 STL Kontejnery Metody kontejneru pro vkládání iterator insert( iterator p, T x) vsune (kopii) x před prvek, na který ukazuje iterátor p vrací iterátor ukazující na vložený prvek void insert( iterator p, int n, T x) vsune n kopií x před prvek, na který ukazuje iterátor p template< typename other_iterator> void insert( iterator p, other_iterator b, other_iterator e) před prvek, na který ukazuje iterátor p, vsune kopii posloupnosti prvků ohraničené iterátory b a e Tato posloupnost nesmí být uvnitř téhož kontejneru Tato posloupnost může být součástí jiného druhu kontejneru je-li p == end(), vkládání připojuje na konec kontejneru všechny dříve existující iterátory odkazující na tento kontejner jsou po použití insert neplatné, včetně p výjimka: kontejnery list a forward_list iterátory mířící na původní prvky nebo end() zachovávají
101 STL Kontejnery Konstruktory kontejneru K() Vytvoří prázdný kontejner (array: kontejner dané velikosti) K( int n, T x = T()) Vytvoří kontejner s n kopiemi hodnoty x Má-li typ T konstruktor bez parametrů, není třeba udávat x template< typename other_iterator> K( other_iterator b, other_iterator e) Vytvoří kontejner naplněný kopií posloupnosti prvků ohraničené iterátory b a e Tato posloupnost může být součástí jiného druhu kontejneru
102 STL Kontejnery Původní vkládací metody kopírují vkládané prvky Zbytečná práce, nemožnost použití některých typů (unique_ptr) [C++11] move Metody insert a push_back/front mají move varianty iterator insert( iterator p, T && x) Překladač ji použije, je-li parametrem pomocná proměnná... k.insert( it, a + b); // operator nebo funkce vracejici hodnotou k.insert( it, T( x, y, z)); // bezejmenny objekt... nebo pokud je použito std::move k.insert( it, std::move( a)); Move-semantika: Proměnná a bude (může být) vyprázdněna Move-semantika poskytuje úsporu času (a prostoru), pokud typ T obsahuje dynamicky alokovaná data je na move semantiku připraven (má move-konstruktory) std::vector< std::string> k; std::string a = "..."; k.push_back( a + ".kzr");
103 STL Kontejnery Původní vkládací metody kopírují vkládané prvky Zbytečná práce, nemožnost použití některých typů (unique_ptr) [C++11] emplace Metody insert a push_back/front mají emplace varianty iterator emplace( iterator p, T1 && x1,..., Tn && xn); void emplace_back( T1 && x1,..., Tn && xn); void emplace_front( T1 && x1,..., Tn && xn); Do kontejneru je přidán nový prvek inicializovaný konstruktorem s parametry x1,..., xn std::vector< std::vector< int> > k; k.emplace_back( 100, 0); Šetří kopírování vkládaného prvku oproti původnímu zápisu k.push_back( std::vector< int>( 100, 0)); Šetří i v případě nepřipraveného typu bez move-semantiky V případě vector< int> by to kopírování ušetřila sama move-semantika Poznámka: rvalue reference v hlavičce emplace funkcí dovolují i lvalue operandy pomocí skládání referencí a funkce std::forward
104 STL Kontejnery Metody kontejneru pro odebírání iterator erase( iterator p) vyjme prvek, na který ukazuje iterátor p p nesmí být rovno end() vrací iterátor ukazující na prvek za vyjmutým prvkem (nebo end()) iterator erase( iterator p, iterator e) vyjme všechny prvky mezi p a e, včetně p a vyjma e p nesmí být rovno end() vrací iterátor odkazující na prvek e (původní iterátor e nebude platný) všechny iterátory odkazující na tento kontejner jsou po použití erase neplatné, včetně p a e výjimka: kontejnery list a forward_list iterátory mířící na nesmazané prvky zachovávají void clear() erase( begin(), end());
105 STL Kontejnery Odvozené funkce manipulace s konci kontejneru Přidání jednotlivého prvku void push_front( T x) return insert( begin(), x); list, deque void push_back( T x) return insert( end(), x); list, deque, vector Odebrání jednotlivého prvku void pop_front() return erase( begin()); list, deque void pop_back() return erase( --end()); list, deque, vector
106 STL Kontejnery Odvozené funkce kontejneru pro přístup k prvkům Prvky na koncích list, deque, vector podmínka:! empty() T & front() const T & front() const obě provádějí return * begin(); T & back() const T & back() const obě provádějí auto it = end(); --it; return * it; [C++11] auto umožňuje deklaraci proměnné bez uvedení typu typ si odvodí překladač z inicializace, v tomto případě K::[const_]iterator
107 STL Kontejnery Odvozené funkce kontejneru pro přístup k prvkům Prvky uprostřed deque, vector, string podmínka: n < size() at: porušení podmínky vyvolá výjimku operator[]: porušení podmínky způsobí nedefinované chování T & at( int n) T & operator[]( int n) const T & at( int n) const const T & operator[]( int n) const všechny provádějí return * ( begin() + n);
108 STL - Kontejnery složitost operace na kontejneru s n prvky list deque vector basic_string přídání / odebrání jednoho prvku na začátku push_front pop_front konstantní konstantní funkce neexistuje funkce neexistuje přídání / odebrání jednoho prvku na i-té pozici insert erase konstantní min( i, n - i) n - i n - i přídání / odebrání m prvků na i-té pozici insert erase m přesuny mezi seznamy (splice) jsou konstantní m +min( i, n - i) m + n - i m + n - i přídání / odebrání jednoho prvku na konci push_back pop_back konstantní konstantní konstantní funkce neexistuje nalezení i-tého prvku begin() + i funkce neexistuje konstantní konstantní konstantní paměťová náročnost kontejneru s prvky velikosti s (s + K) * n K řádově 16 B q * s * n q kolem 1.2 q * s * n q kolem 1.2 q * s * n q kolem 1.2
109 Asociativní kontejnery
110 STL - Kontejnery Asociativní kontejnery Uspořádané (samovyvažující se stromy) set<t> - množina multiset<t> - množina s opakováním map<k,t> - asociativní pole, tj. parciální zobrazení K -> T multimap<k,t> - relace s rychlým vyhledáváním podle klíče K [C++11] Hashované [C++11] unordered_set<t> - množina [C++11] unordered_multiset<t> - množina s opakováním [C++11] unordered_map<k,t> - asociativní pole, tj. parciální zobrazení K -> T [C++11] unordered_multimap<k,t> - relace s rychlým vyhledáváním podle klíče K pair<a,b> - pomocná šablona uspořádané dvojice s položkami first, second
111 STL - Kontejnery Uspořádané kontejnery vyžadují uspořádání na klíčích Klíčem se rozumí první parametr šablony kontejneru Uspořádání se obvykle definuje operátorem < definovaným na typu klíče Pozor na konstrukce typu set< char *> Uspořádání lze rovněž zadat přídavným parametrem šablony Definované uspořádání nemusí být antisymetrická relace pokud platí! (x < y) &&! (y < x) pak jsou prvky x a y považovány za ekvivalentní
112 STL - Kontejnery Uspořádané kontejnery vyžadují uspořádání na klíčích Vystačí si s operací < V nejjednodušším případě to funguje samo std::map< std::string, int> mapa; Pokud typ uspořádání nemá, lze jej definovat obecně bool operator<( const Klic & a, const Klic & b) return...; std::map< Klic, int> mapa; Pokud obecná definice uspořádání nevyhovuje, lze definovat uspořádání funktorem pouze pro daný typ kontejneru struct Usporadani bool operator()( const Klic & a, const Klic & b) const return...; ; std::map< Klic, int, Usporadani> mapa; Pokud různé instance kontejneru mají mít různé uspořádání, lze do funktoru doplnit datové položky struct Usporadani Usporadani( bool a); /*...*/ bool ascending; ; std::map< Klic, int, Usporadani> mapa( Usporadani( true));
113 STL - Kontejnery Uspořádání na klíčích implementace Knihovny definují funktor std::less< K> template< typename K> class less public: bool operator()( const K & a, const K & b) const return a < b; ; Šablona kontejneru má typový parametr - typ funktoru template< typename K, typename T, typename L = std::less< K> > class map public: Konstruktor kontejneru dostává hodnotu funktoru explicit map( const L & c = L()) : cmp_( c) /*...*/ /*...*/ private: ; L cmp_; Kontejner drží jednu instanci funktoru Metody kontejneru volají operátor () na instanci funktoru iterator find_( /*...*/) /*...*/ if ( cmp_( x, y) ) /*...*/
114 STL - Kontejnery Uspořádání na klíčích hashující kontejnery Kontejner vyžaduje funktory pro hashování a pro porovnání template< typename K> class hash public: std::size_t operator()( const K & a) const /*...*/ ; template< typename K> class equal_to public: bool operator()( const K & a, const K & b) const return a == b; ; Šablona kontejneru má dva další parametry template< typename K, typename T, typename H = std::hash< K>, typename E = std::equal_to< K> > class unordered_map; Konstruktor kontejneru dostává hodnoty funktorů explicit unordered_map( std::size_t initial_bucket_count = /*...*/, const H & h = L(), const E & e = E());
115 STL - Kontejnery Asociativní kontejnery procházení Kontejnery lze procházet iterátory Uspořádané kontejnery jsou prezentovány v uspořádání podle klíčů Iterátor je bidirectional Hashující kontejnery jsou prezentovány v implementačnědefinovaném pořadí Iterátor je forward Metody begin() a end() a operátory iterátorů mají stejný význam, jako u sekvenčních kontejnerů Kontejnery [unordered_][multi]map< K, T> obsahují uspořádané dvojice - typ std::pair< const K, T> Klíč (it->first) nelze modifikovat, hodnotu (it->second) ano Procházení celého asociativního kontejneru se užívá málokdy Iterátory se častěji získávají vyhledáváním
116 STL - Kontejnery Asociativní kontejnery vyhledávání iterator set::find( T x) iterator multiset::find( T x) iterator map::find( K x) iterator multimap::find( K x) iterator unordered_set::find( T x) iterator unordered_multiset::find( T x) iterator unordered_map::find( K x) iterator unordered_multimap::find( K x) pokud v kontejneru existuje prvek s klíčem ekvivalentním x: vrací iterátor ukazující na první takový prvek multiset, multimap: další takové prvky jsou dostupné operací ++ jinak vrací end() složitost operace uspořadné kontejnery: O( log( size())) hashující kontejnery: průměrně O(1), nejhůře O( size())
PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE
PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE 2011 Jan Janoušek BI-PJP Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Základní informace Přednášky: doc. Ing. Jan Janoušek, Ph.D.
Šablony, kontejnery a iterátory
7. října 2010, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 21 Šablona funkce/metody Šablona je obecný popis (třídy, funkce) bez toho, že by
Šablony, kontejnery a iterátory
11. března 2015, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 31 Obsah přednášky 1 Šablony 2 Abstraktní datové struktury 3 Iterátory 4 Array
PROGRAMOVÁNÍ V C++ CVIČENÍ
PROGRAMOVÁNÍ V C++ CVIČENÍ INFORMACE Michal Brabec http://www.ksi.mff.cuni.cz/ http://www.ksi.mff.cuni.cz/~brabec/ brabec@ksi.mff.cuni.cz gmichal.brabec@gmail.com PODMÍNKY ZÁPOČTU Základní podmínky společné
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
PB161 Programování v jazyce C++ Přednáška 3
PB161 Programování v jazyce C++ Přednáška 3 Kontejnery Iterátory Algoritmy Nikola Beneš 4. října 2016 PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 1 / 25 Standardní knihovna C++ Už
Jazyk C++ II. STL knihovna kontejnery část 1
Jazyk C++ II STL knihovna kontejnery část 1 AR 2013/2014 Jazyk C++ II STL kontejnery Kontejnery jsou třídy, jejichž instance slouží k uskladňování dat. Každý druh kontejneru má své výhody a nevýhody. Kontejnery
Ú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í
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ů
Programování v C++ NPRG041 Programování v C++ - 2015/2016 David Bednárek
Programování v C++ NPRG041 Programování v C++ - 2015/2016 David Bednárek 1 Zápočty Základní podmínky společné všem skupinám Úspěšné složení zápočtového testu 1. a 2. pokusy ve zkouškovém období... 3. pokusy
PB161 Programování v jazyce C++ Přednáška 3
PB161 Programování v jazyce C++ Přednáška 3 Kontejnery Iterátory Algoritmy Nikola Beneš 2. října 2018 PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 1 / 27 Automatická dedukce typů (od
map, multimap - Asociativní pole v C++.
map, multimap - Asociativní pole v C++. Jedná se o asociativní pole. V asociativním poli jsou uloženy hodnoty ve tvaru (klíč,hodnota), kde klíč je vlastně "index" prvku. Klíčem může být libovolný objekt,
Jazyk C++ II. STL knihovna kontejnery část 2
Jazyk C++ II STL knihovna kontejnery část 2 AR 2013/2014 Jazyk C++ II Asociativní kontejnery Slovníky u kterých pořadí dat nemá smysl. Kontejner si sám určuje, kam který údaj uloží. Údaje mají tvar klíč/hodnota.
Programování v C++ 1, 5. cvičení
Programování v C++ 1, 5. cvičení konstruktory, nevirtuální dědě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 3 Shrnutí minule procvičené
2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.
Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus
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é
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í
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
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 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í
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
PB161 Programování v jazyce C++ Přednáška 10
.. PB161 Programování v jazyce C++ Přednáška 10 Šablony Nikola Beneš 23. listopadu 2015 PB161 přednáška 10: šablony 23. listopadu 2015 1 / 29 K zamyšlení Jaký je rozdíl mezi new int[10] a new int[10]()?
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ů
Množina v C++ (set, multiset).
Množina v C++ (set, multiset). Množina je datová struktura, ve které jsou uloženy nějaké prvky. V množině nesmí být dva stejné prvky. Naopak multimnožina může obsahovat i stejné prvky. Nad množinou lze
PROGRAMOVÁNÍ V C++ CVIČENÍ. Michal Brabec
PROGRAMOVÁNÍ V C++ CVIČENÍ Michal Brabec ARCHITECTURE Input 2 / 15 TASK Vytvořte základní data pro filesystem (zatím v main) Jednu autorizační autoritu Jeden registr souborů Cyklus který zpracovává vstup
Abstraktní datové typy
Karel Müller, Josef Vogel (ČVUT FIT) Abstraktní datové typy BI-PA2, 2011, Přednáška 10 1/27 Abstraktní datové typy Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky,
Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++
Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++ Globální konstantní proměnné Konstantní proměnné specifikujeme s klíčovým slovem const, tyto konstantní proměné
Úvod do programovacích jazyků (Java)
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích
Generické programování
Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =
PREPROCESOR POKRAČOVÁNÍ
PREPROCESOR POKRAČOVÁNÍ Chybová hlášení V C# podobně jako v C++ existuje direktiva #error, která způsobí vypsání chybového hlášení překladačem a zastavení překladu. jazyk C# navíc nabízí direktivu #warning,
PB161 Programování v jazyce C++ Přednáška 10
PB161 Programování v jazyce C++ Přednáška 10 Šablony Nikola Beneš 27. listopadu 2017 PB161 přednáška 10: šablony 27. listopadu 2017 1 / 33 Šablony PB161 přednáška 10: šablony 27. listopadu 2017 2 / 33
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
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
Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech
Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech cíl: vytvořit třídu inf_system pro ukládání informací o studentech a zaměstnancích působících na fakultě příklad použití: int main() { inf_system
PB161 Programování v jazyce C++ Přednáška 4
PB161 Programování v jazyce C++ Přednáška 4 Přetěžování funkcí Konstruktory a destruktory Nikola Beneš 9. října 2017 PB161 přednáška 4: přetěžování funkcí, konstruktory, destruktory 9. října 2017 1 / 20
Matematika v programovacích
Matematika v programovacích jazycích Pavla Kabelíková am.vsb.cz/kabelikova pavla.kabelikova@vsb.cz Úvodní diskuze Otázky: Jaké programovací jazyky znáte? S jakými programovacími jazyky jste již pracovali?
Jazyk C++ I. Šablony
Jazyk C++ I Šablony AR 2013/2014 Jazyk C++ I Úvod Zatím známe programovací styly: Strukturované programování, Objektově orientované programovaní. AR 2013/2014 Jazyk C++ I 2 Příklady void Print(const int&
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
MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ
MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE
Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem
Jazyk C++ 1 Blok 3 Objektové typy jazyka C++ Studijní cíl Ve třetím bloku bude představen a rozebrán nejdůležitější objektový typ jazyka C++ a to sice třída. Po absolvování bloku bude student schopen navrhovat
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
Jazyk C++ I. Šablony 2
Jazyk C++ I Šablony 2 AR 2013/2014 Jazyk C++ I Třídy template class TVektor { T *a; int n; static int PocInstanci; public: TVektor(int _n = 0) : n(_n) { a = new T[n]; PocInstanci++; } ~TVektor()
Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy
Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 Procesor Procesorem je objekt, který vykonává algoritmem popisovanou
PB161 6. přednáška (26. října 2015)
PB161 6. přednáška (26. října 2015) Standardní knihovna C++ obsahuje řadu částí, některé už jsme viděli (strings, I/O streams) mimo jiné obsahuje i knihovní funkce ze standardní knihovny jazyka C jiné
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
Standardní algoritmy vyhledávací.
Standardní algoritmy vyhledávací. Vyhledávací algoritmy v C++ nám umožňují vyhledávat prvky v datových kontejnerech podle různých kritérií. Také se podíváme na vyhledávání metodou půlením intervalu (binární
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
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
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
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
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
DTP Základy programování Úvod do předmětu
DTP Základy programování 01 - Úvod do předmětu Úvod Co již umíte? Plán předmětu Studijní materiály Způsob ukončení předmětu Základní pojmy I. Řešený problém: Řešeným nebo zpracovávaným problémem je konkrétní
<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************
zdroje/zdroje.xml
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.
Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013
Předměty Algoritmizace a programování Seminář z programování Verze pro akademický rok 2012/2013 Verze pro akademický rok 2012/2013 1 Přednášky Jiřina Královcová MTI, přízemí budovy A Tel: 48 53 53 521
Základní datové struktury
Základní datové struktury Martin Trnečka Katedra informatiky, Přírodovědecká fakulta Univerzita Palackého v Olomouci 4. listopadu 2013 Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013
Objektově orientované programování
10. října 2011 Pragmatické informace Volitelný předmět, zápočet: zápočtový program(s dokumentací), aktivní účast na cvičení(body v CodExu), praktický test, zkouška: zkoušková písemka na objektový návrh
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
Kolekce, cyklus foreach
Kolekce, cyklus foreach Jen informativně Kolekce = seskupení prvků (objektů) Jednu již známe pole (Array) Kolekce v C# = třída, která implementuje IEnumerable (ICollection) Cyklus foreach ArrayList pro
Úvod do programovacích jazyků (Java)
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích
PB161 Programování v jazyce C++ Přednáška 8
.. PB161 Programování v jazyce C++ Přednáška 8 Výjimky Správa prostředků (RAII) Nikola Beneš 9. listopadu 2015 PB161 přednáška 8: výjimky, RAII 9. listopadu 2015 1 / 24 . PB161 přednáška 8: výjimky, RAII
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á
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,
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í
Jazyk C++ II. Šablony a implementace
Jazyk C++ II Šablony a implementace AR 2013/2014 Jazyk C++ II Úvod Dědičnost a kompozice nejsou vždy tou správnou odpovědí na požadavky znovupoužitelnosti kódu. Proto máme možnost definování určité třídy
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í
konstruktory a destruktory (o)
konstruktory a destruktory (o) - slouží k ovlivnění vzniku (inicializace) a zániku (úklid) objektu - základní myšlenkou je, že proměnná by měla být inicializována (nastavena do počátečního stavu) a zároveň
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
Teoretické minimum z PJV
Teoretické minimum z PJV Pozn.: následující text popisuje vlastnosti jazyka Java zjednodušeně pouze pro potřeby výuky. Třída Zavádí se v programu deklarací třídy což je část programu od klíčových slov
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,
Struktura programu v době běhu
Struktura programu v době běhu Miroslav Beneš Dušan Kolář Struktura programu v době běhu Vztah mezi zdrojovým programem a činností přeloženého programu reprezentace dat správa paměti aktivace podprogramů
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
Programovací jazyk C++ Hodina 1
Programovací jazyk C++ Hodina 1 Používané překladače Bloodshed Dev C++ http://www.bloodshed.net/devcpp.html CodeBlocks http://www.codeblocks.org pokud nemáte již nainstalovaný překladač, stáhněte si instalátor
ADT/ADS = abstraktní datové typy / struktury
DT = datové typy obor hodnot, které může proměnná nabývat, s operacemi na tomto oboru určen: obor hodnot + výpočetní operace např. INT = { 2 147 483 648 až +2 147 483 647} + {+,,*,/,} ADT/ADS = abstraktní
Výrazy, operace, příkazy
Výrazy, operace, příkazy 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 Karel Richta, Martin Hořeňovský,
Šablony funkcí a tříd (Templates) Genericita
Šablony funkcí a tříd (Templates) Genericita Šablony funkcí Motivace přetížíme funkci pro výpočet minima ze dvou hodnot: int minimum(int a, int b) { return (a
PB161 Programování v jazyce C++ Přednáška 1
PB161 Programování v jazyce C++ Přednáška 1 Organizace Úvod do C++ Nikola Beneš 18. září 2018 PB161 přednáška 1: organizace, úvod do C++ 18. září 2018 1 / 36 Cíle předmětu 1. ukázat možnosti jazyka C++
PB161 Programování v jazyce C++ Přednáška 7
PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z
PB161 Programování v jazyce C++ Přednáška 7
PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z
11. Přehled prog. jazyků
Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 11 1 Základy algoritmizace 11. Přehled prog. jazyků doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze
PB161 Programování v jazyce C++ Přednáška 6
PB161 Programování v jazyce C++ Přednáška 6 Kontejnery Iterátory Algoritmy Nikola Beneš 26. října 2015 PB161 přednáška 6: kontejnery, iterátory, algoritmy 26. října 2015 1 / 37 Standardní knihovna C++
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
Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;
Programovací jazyk C(++) static struct vm_area_struct * unmap_fixup(struct mm_struct *mm, struct vm_area_struct *area, unsigned long addr, size_t len, struct vm_area_struct 1. *extra) Základy { struct
OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů... 8-1 8.2 Standardně zavedené proudy... 8-1 8.
David MATOUŠEK OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PØÍKLADECH Praha 2011 David Matoušek Objektové programování v C++ v pøíkladech Lektoroval Ing. Bohumil Brtník, Ph.D. Bez pøedchozího písemného svolení nakladatelství
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
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
Koncepce (větších) programů. Základy programování 2 Tomáš Kühr
Koncepce (větších) programů Základy programování 2 Tomáš Kühr Parametry a návratová hodnota main Již víme, že main je funkce A také tušíme, že je trochu jiná než ostatní funkce v programu Funkce main je
Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /
Správa paměti doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Motivace Úrovně správy paměti. Manuální
Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký 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ů
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é
PB161 Programování v jazyce C++ Přednáška 4
PB161 Programování v jazyce C++ Přednáška 4 Dynamická alokace Kopírovací konstruktor Přetypování v C++ Nikola Beneš 12. října 2015 PB161 přednáška 4: dynamická alokace, kopírovací konstruktor, casting
Maturitní otázky z předmětu PROGRAMOVÁNÍ
Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti
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
Lineární datové struktury
Lineární datové struktury doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB TUO) Lineární datové
Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí
Kolekce obecně Seznamy a iterátory doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Kolekce ::= homogenní sada prvků
Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG 2008-9)
Programování v C++ Úplnej úvod Co se naučíte? tak samozřejmě C++, s důrazem na: dynamické datové struktury Objektově Orientované Programování STL (standardní knihovna šablon) vytváření vlastních šablon
IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33
Objekt jako proměnná Objekty a metody Objekt = proměnná referenčního typu vznik pomocí new, chování viz pole jako referenční proměnná minulý semestr Stack Heap objekt ref this 10 20 atr1 atr2 jinyobjekt
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
Konec a tak. PB173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 15.
Konec a tak PB173 Programování v C++11 Vladimír Štill, Jiří Weiser Fakulta Informatiky, Masarykova Univerzita 15. prosince 2014 Konec a tak PB173 15. prosince 2014 1 / 15 Náplň Perf constexpr initializer
PB161 Programování v jazyce C++ Přednáška 1
PB161 Programování v jazyce C++ Přednáška 1 Organizace Úvod do C++ Nikola Beneš 18. září 2018 PB161 přednáška 1: organizace, úvod do C++ 18. září 2018 1 / 36 Cíle předmětu 1. ukázat možnosti jazyka C++