Programování v jazyce C a C++

Podobné dokumenty
Programování v jazyce C a C++

Objektové programování

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

Struktury a dynamická paměť

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

konstruktory a destruktory (o)

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

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

Jazyk C++ II. STL knihovna kontejnery část 1

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

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

Algoritmizace a programování

Programování II. Návrh programu I 2018/19

Virtuální metody - polymorfizmus

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

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

Funkční objekty v C++.

Více o konstruktorech a destruktorech

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Konstruktory a destruktory

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

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

Mělká a hluboká kopie

Základy programování (IZP)

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

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

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

Generické programování

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.

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

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

PROGRAMOVÁNÍ V C++ CVIČENÍ. Michal Brabec

Dědění, polymorfismus

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

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

Základy programování (IZP)

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

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

Základy programování (IZP)

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

Objektov orientované programování. C++ Akademie SH. 7. Objektov orientované programování. Michal Kvasni ka. Za áte níci C++ 2.

Vector datový kontejner v C++.

Základy objektové orientace I. Únor 2010

Úvod do programovacích jazyků (Java)

NPRG031 Programování II 1 / :25:46

NMIN201 Objektově orientované programování 1 / :36:09

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

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

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

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

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

Úvod do programovacích jazyků (Java)

Dynamická alokace paměti

10 Balíčky, grafické znázornění tříd, základy zapozdření

Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

Ukazka knihy z internetoveho knihkupectvi

Martin Flusser. December 15, 2016

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

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

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

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

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Opakování programování

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

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

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

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

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

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 -

Seminář Java II p.1/43

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

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Základy programování (IZP)

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

Paralelní programování

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Chování konstruktorů a destruktorů při dědění

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

Jazyk C# (seminář 6)

PREPROCESOR POKRAČOVÁNÍ

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

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

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

Jazyk C++ II. STL knihovna kontejnery část 2

Úvod do programování. Lekce 1

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

M4 PDF rozšíření. Modul pro PrestaShop.

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

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

Dynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr

Teoretické minimum z PJV

Programování v C++ VI

OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

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

Transkript:

Programování v jazyce C a C++ Příklad na tvorbu třídy Richter 1 4. prosince 2017 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno

Dvourozměrné pole pomocí tříd Zadání Navrhněte a napište třídu pro realizace dvourozměrného pole. Napište testovací funkci, která otestuje základní vlastnosti třídy a zároveň bude demonstrovat její použití.

Dvourozměrné pole pomocí tříd Upřesňující poznámky k řešení Pro pole vytvořte třídu CPole. Dvourozměrné pole realizujte jako pole prvků třídy CVector, která bude použitá pro jeden řádek pole. Pole realizujte pomocí dynamických proměnných - tzn. bude umožňovat libovolný rozměr pole. Pro pole navrhněte a napište základní operace (vznik a inicializaci pole, zánik pole, změny rozměrů pole, transponování pole, nastavení a získání hodnoty prvku na dané pozici,...). Navrhněte operace společné pro všechny datové typy: tj. pole by mělo pracovat i jako pole ukazatelů nebo struktur či tříd (tj. nerealizujte operace jako násobení, sčítání..., které nejsou společné všem datovým typům).

Dvourozměrné pole pomocí tříd Upřesňující poznámky k řešení autor - autor kódu třídy a jejích funkcí. uživatel - ten kdo využívá danou knihovnu (třídu) - ten kdo využívá kód napsaný někým jiným. Používá pouze interface - zveřejněné rozhraní knihovny/třídy. Uživatel si tedy musí přečíst návod ke kódu a jeho používání a dodržovat pravidla stanovená autorem. Uživatel nezasahuje do autorova kódu.

Dvourozměrné pole pomocí tříd Upřesňující poznámky k řešení II Následující stránky vás postupně provedou realizací. Při řešení uvedou důležité jevy a vlastnosti jazyka

Dvourozměrné pole pomocí tříd Rozbor řešení Je možné rozdělit projekt na více celků (tříd)? Uvažujte použití šablon (stejný kód ale různý datový typ) nebo dědění (mírná obměna kódu). Alternativou je využití existující třídy jako členského prvku jiné třídy.

Dvourozměrné pole pomocí tříd Rozbor řešení Navrhněte hierarchii tříd pro řešení pole a matematického pole (maticový počet).

řešení pomocí jednotlivých základních datových typů styl jazyka C Založte si projekt. V projektu vytvořte soubor s funkcí main().

řešení pomocí jednotlivých základních datových typů styl jazyka C Jaké proměnné budeme potřebovat pro realizaci vektoru? Uvažujte variantu proměnného/dynamického pole.

řešení pomocí jednotlivých základních datových typů styl jazyka C Proměnné použité pro pole budou jakého (základního) datového typu a jaká bude jejich funkce?

definice proměnných styl jazyka C Nadefinujte pomocí typedef nový datový typ T. Ve funkci main vytvořte ukazatel idata na tento typ a proměnnou ilen pro počet prvků. Proměnné vhodně inicializujte.

inicializace ukazatele do nikam styl jazyka C V jazyce C se pro inicializaci nepoužitého ukazatele používá předdefinovaná hodnota NULL. Jelikož její definice nebyla jednotná bylo místo této hodnoty v jazyce C++ zavedeno kĺıčové slovo nullptr. Upravte inicializaci ukazatele pomocí tohoto nového kĺıčového slova.

Složený datový typ styl jazyka C Pro vektor máme dvě proměnné, ale ve skutečnosti se váží k proměnné jedné, vektoru, který má pouze více hodnot/složek. Jaké jsou nevýhody použití více samostatných proměnných, které ve skutečnosti reprezentují jedinou proměnnou jinou? Existuje v jazyce C způsob jak z několika proměnných udělat proměnnou jednu? Jaký?

Struktura styl jazyka C Rozšiřte stávající kód o definici struktury CVector se složkami size t a idata. Přepište kód funkce main za použití struktury - včetně inicializace. Proměnnou nazvěte Vector. Původní kód: typedef double T; int main() { size t ilen = 0; T* idata = nullptr;

Inicializace proměnných styl jazyka C Jakou nevýhodu má použitý způsob inicializace? Jaké by bylo dobré řešení inicializace?

Inicializace proměnných styl jazyka C Jak je prováděna inicializace (autorem kódu v jazyce C) u typu int? Ukažte vznik proměnné bez inicializace, inicializaci hodnotou typu int a hodnotou typu double. Co se při jednotlivých inicializacích děje?

Struktura - manipulace s daty styl jazyka C Vezměme část z předchozího příkladu a dopišme řádek. Tento řádek vede k chybě. O jakou chybu se jedná? int main() { CVector Vector = {0, nullptr}; Vector.iLen = 10; // doplněný řádek

Přístupová práva - skrytí proměnných styl jazyka C++ Výhodou by bylo, kdyby přístup k proměnným ve struktuře bylo možné kontrolovat. Objektové programování přináší vlastnost Přístupových práv. Toto umožňuje rozlišit, ke kterým prvkům (members) může přistupovat pouze autor a které může používat i uživatel - tyto se nazývají interface. Objektové programování přináší i možnost funkcí ve třídě/struktuře. Tyto funkce se nazývají metody. Přes tyto metody uživatel manipuluje se skrytými proměnnými. Tyto vlastnosti plynou z toho, že data jsou považována za nejcennější součást programu a proto se je snažíme chránit před běžným uživatelem, jehož činnost kontrolujeme pomocí metod.

Přístupová práva - skrytí proměnných styl jazyka C++ Jelikož složený datový typ struktura nesplňuje uvedené požadavky na skrývání dat, a musí být zpětně kompatibilní s jazykem C, byl potřeba nový složený datový typ. Nový datový typ se jmenuje třída - class. Přepište v programu struct na class. K jakým změnám (chybám) při překladu došlo? typedef double T; struct CVector { size t ilen ; T* idata ; }; int main() { CVector Vector = {0, nullptr}; Vector.iLen = 10;

Přístupová práva - skrytí proměnných styl jazyka C++ Problém je v přístupu k proměnné ve funkci main. Jelikož proměnná je nyní skrytá pro uživatele, není možné s ní pracovat. Skryté části se říká privátní/soukromá. Vector.iLen = 10; // ve funkci main nelze //přistupovat k soukromým prvkům Pro autora třídy je proměnná přístupná. Proto metody ve veřejné sekci mohou přistupovat k soukromým proměnným.

Přístupová práva - skrytí proměnných styl jazyka C++ Členské prvky (data a metody) ve třídě jsou implicitně privátní - private. Proved te v rozpracované třídě přepnutí dat do veřejné sekce (Pouze pro vyzkoušení, v dalším data opět do private sekce). Přepnutí proved te za začátkem bloku třídy.

Přístupová práva - skrytí proměnných styl jazyka C++ (platí i dále) Nyní máme opět data veřejně přístupná - tím jsme si ukázali funkci mechanizmu přístupových práv. Jelikož data musí být v sekci private, přesuňte přepnutí na veřejné až za definici proměnných.

Terminologie třídy Pro manipulaci s proměnnými třídy se používají metody. Metodám pro nastavení a čtení členských proměnných se (někdy) říká setter a getter. Jak se říká proměnným datového typu třída? Jaký je rozdíl mezi metodou a funkcí?

Přístup k proměnným (getter) Napište do třídy metodu pro získání počtu prvků ve vektoru - GetLen. Zavolejte tuto metodu ve funkci main.

Inicializace - konstrukce Co je to konstruktor. Jaké má vlastnosti a k čemu slouží?

Inicializace - konstrukce Napište konstruktor bez parametrů - implicitní. Ukažte jeho volání ve funkci main.

Inicializace - konstrukce Konverzní konstruktor má jeden parametr. Převádí z hodnoty typu parametru na výsledný typ třídy. Napište konverzní konstrukotr z intu, který znamená počet pvků v poli (pvky vynulujte). Ukažte volání ve funkci main.

Inicializace - konstrukce Konstruktory mohou dělat různé věci. Záleží na autorovi. Napište konverzní konstrukotr z double, který vytvoří pole s jedním prvkem s touto hodnotou. Ukažte volání ve funkci main.

ukončení života proměnné Co je to destruktor? Jaké má vlastnosti a k čemu slouží?

ukončení života proměnné Destruktor může dělat různé věci. Záleží na autorovi. Napište destruktor, který vrátí alokovanou pamět. Ukažte volání ve funkci main.

ukončení života proměnné Jelikož se nedoporučuje volání destruktoru je lepší napsat metodu pro vyčištění/uložení... samostatně (Destroy, Clear, Null, Save...) Napište metodu Destroy a použijte ji v destruktoru. Ukažte volání metody Destroy ve funkci main.

Inicializace - konstrukce Často je nutné vytvořit kopii existujícího objektu (např. předávání parametrů hodnotou, návratová hodnota). K tomu se využívá kopykonstruktor. Kopyk. má jako parametr referenci na třídu jejímž je členem. Napište kopykonstruktor. Ukažte volání ve funkci main.

operátory Co je to operátor? Jaké má vlastnosti a k čemu slouží?

Operátory Operátory můžeme rozdělit podle počtu parametrů. Ty s jedním parametrem jsou unární. V hlavičce ale nemají žádný parametr, protože ten se to metody dostane jako this. Napište unární operátor!. Většinou se používá k signalizaci zda je s proměnnou možné pracovat. Ukažte volání ve funkci main.

Operátory Zvláštním typem unárního operátoru je operátor konverzní. Konverzní operátor mění objekt třídy na hodnotu jiného typu. Na rozdíl od konverzního konstruktoru, který přemění jiný typ na typ vytvářené třídy. Má název výsledného typu a nemá návratovou hodnotu. Napište konverzní op. na int, vracející počet prvků vektoru. Ukažte volání ve funkci main.

operátory Co je to binární operátor? Jaké má vlastnosti a k čemu slouží?

operátory Jaký je rozdíl mezi operátorem = a kopykonstruktorem?

Operátory Napište operátor =. Ukažte volání ve funkci main.

Operátory Bude operátor fungovat pro a = a;? Pokud nebude, opravte kód. Ukažte volání ve funkci main.

operátory Jaký je rozdíl mezi metodou, která má těĺıčko v hlavičkovém souboru a která má metodu definovanou ve zdrojovém (cpp) souboru?

Operátory Naznačte přesun těĺıčka operátoru = do zdrojového souboru a úpravu v hlavičkovém souboru.

Operátor výstupu - stream Napište operátor pro tisk proměnné. Formát vhodně zvolte. Ukažte volání ve funkci main.

Znovupoužitelnost kódu - šablony Vektor je obecný mechanizmus, který se hodí pro jakýkoli datový typ. Jak zajistit, aby mohl být CVector použit pro jakýkoli datový typ? I pro několik různých datových typů současně? Jak se jsmenuje mechanizmus, který to umožňuje? Jak funguje?

Šablony Přepište třídu CVector na šablony.

Šablony Kód ze zdrojového souboru se přenese za definici třídy a označí se jako šablona příslušná k datovému typu T.

Dědění Jaký je účel dědění? Lze využít při tvorbě vektoru s přidáním matematických funkcí?

Dědění Pomocí dědění ze třídy CVector vytvořte základ třídy CMathVector tak aby byly veřejné metody bázové třídy pro uživatele přístupné i ve třídě odvozené.

Využití třídy jako parametru Pomocí šablonové třídy CVector vytvořte třídu pro dvourozměrné pole CMatrix. Datovým typem řádkových vektorů bude T. Datovým typem řádků potom CVector<T>.

Využití třídy jako parametru Přepište šablonovou třídu pro pole tak, aby mohla obsahovat třídu CVector, nebo CMathVector. Typ vektoru bude U. Datovým typem řádkových vektorů bude T. Datovým typem řádků potom U<T>.