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

Podobné dokumenty
Programování v C++ 1, 14. cvičení

Struktura programu v době běhu

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

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

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

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

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

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

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

Úvod do programování. Lekce 5

Rekurze. Jan Hnilica Počítačové modelování 12

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ý

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

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Programování v jazyce C a C++

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

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

Úvod do programování - Java. Cvičení č.4

Funkce, intuitivní chápání složitosti

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

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

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

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

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

Vícerozměrná pole. Úvod do programování 2 Tomáš Kühr

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

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

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

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Úvod do programovacích jazyků (Java)

Konstruktory a destruktory

Více o konstruktorech a destruktorech

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

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

Mělká a hluboká kopie

Základy programování (IZP)

Rekurzivní algoritmy

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

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

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

Algoritmizace a programování

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

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

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 -

Jazyk C# a platforma.net

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

Opakování programování

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

Algoritmizace prostorových úloh

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

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.

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

PROGRAMOVÁNÍ V C++ CVIČENÍ

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

5 Rekurze a zásobník. Rekurzivní volání metody

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

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

Základy programování (IZP)

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

Poslední nenulová číslice faktoriálu

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

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Maturitní otázky z předmětu PROGRAMOVÁNÍ

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

Implementace LL(1) překladů

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Binární soubory (datové, typované)

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

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

Úvod do programování. Lekce 3

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

Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT

10 Algoritmizace Příklad 2 Word 2007/ VBA

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

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

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

Programování v jazyce C a C++

Zápis programu v jazyce C#

Řešení sady 1. Úvod do programování 1 Tomáš Kühr

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Základy jazyka C. Základy programování 1 Tomáš Kühr

PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH 11 Dynamické datové struktury 11.1 Spojové struktury Příklad PROG_

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

IAJCE Přednáška č. 7. řízení semaforu na křižovatce = přepínání červená/oranžová/zelená

Programování v jazyce C pro chemiky (C2160) 6. Funkce, struktury

TG Motion verze 4 Modul Virtuální PLC návod k obsluze

6 Příkazy řízení toku

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

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

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

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Transkript:

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

Funkce co už víme u Nebo alespoň máme vědět... J u Co je to funkce? u Co jsou to parametry funkce? u Co je to deklarace a definice funkce? K čemu slouží? u Jak funguje předávání parametrů do funkce (hodnotou a odkazem)? u Co je to návratová hodnota funkce? u Jak probíhá vrácení výsledku funkce? u Jaké rozlišujeme rozsahy platnosti proměnných (nebo obecně identifikátorů)? u Se kterou proměnnou se bude pracovat, pokud jich existuje více se stejným identifikátorem?

Rekurzivní funkce

Rekurzivní funkce u Už (velmi dobře) známe z Paradigmat programování... J u Funkce, která ve svém těle volá sama sebe u Princip = postupné zjednodušování problému u Až k elementární situaci (jejíž řešení známe či snadno spočítáme) u Přerušení rekurze při splnění mezní podmínky u Příklady: u Výpočet faktoriálu, u Výpočet fibonacciho čísla, u QuickSort u MergeSort u a další (teoreticky cokoli s cyklem).

Příklad výhody a nevýhody rekurze long double factrec(unsigned int n){ if (n == 0) return 1; return n * factrec(n - 1); } long double factiter(unsigned int n){ long double out = 1; unsigned int i; for (i = 2; i <= n; i++) out *= i; return out; } int main(){ long double v1, v2; v1 = factrec(5); v2 = factiter(5); return 0; }

Výhody a nevýhody rekurze v C u Výhody: u Stručnější a přehlednější zápis (v některých situacích) u Přímočarý návrh algoritmu (u některých problémů) u Nevýhody: u Větší spotřeba paměti u Pomalejší běh programu u Rekurzi obvykle použijeme: u Pokud řešíme problém, který ze své podstaty rekurzivní (faktoriál, fibonaccioho čísla,...) u Pokud implementujeme algoritmy založené na principu rozděl a panuj u A pokud nám moc nezáleží na rychlosti a požadavcích na paměť...

Ukazatelé na funkce

Vytvoření ukazatele na funkci u Ukazatel je definován vždy pro určitý typ funkcí u Daný počet a typy parametrů u Daný typ návratové hodnoty u Příklad definice (funkce s 1 parametrem double vracející double): double(*p_fd2d)(double); u Příklad definice s inicializací: double polynoma(double x){ return 3 * x*x + 4 * x - 10; } double(*p_fd2d)(double) = polynoma; u Příklad definice s využitím vlastního datového typu: typedef double(*p_fd2d)(double); P_FD2D p_fd2d = polynoma;

Práce s ukazateli na funkce u Do ukazatele můžeme kdykoli vložit adresu funkce: P_FD2D dalsi_ukazatel; p_fd2d = polynoma; dalsi_ukazatel = p_fd2d; u Funkci uloženou v ukazateli můžeme zavolat: double v; v = polynoma(-2); v = (*p_fd2d)(-2); v = dalsi_ukazatel(-2); u Výše uvedené možnosti volání funkce jsou zcela ekvivalentní u Vztah mezi ukazateli na funkce a identifikátory funkcí je podobný jako vztah polí a ukazatelů na první prvek pole u Identifikátor funkce se chová jako konstantní ukazatel na funkci

Funkce jako parametr funkce u Definice funkce s parametrem typu ukazatel na funkci: double *map(double(*fce)(double), double *vstup, double pocet); u Volání funkce s parametrem typu ukazatel na funkci: double na3(double x){ return x*x*x; } double pole[] = { 1, 2, 3, 4, 5 }; double *out = map(na3, pole, 5); u Varianta s předáním funkce pomocí ukazatele: double(*p_na3)(double) = na3; double *out = map(p_na3, pole, 5);

Pole funkcí u Ukazatele v poli musí mít stejný počet a typy parametrů a stejný typ návratové hodnoty u Definice pole ukazatelů na funkce: double(*pole_fci[5])(double); u Příklad definice s inicializací: double(*pole_fci[])(double) = {na3,na4,sin,cos,tan}; u Varianta s použitím dříve definovaného typu: P_FD2D pole_fci[] = {na3, na4, sin, cos, tan}; u Volání funkcí z pole: double vysledek = pole_fci[1](-10);

Funkce s proměnlivým počtem parametrů

Princip FPPP u Při volání funkce se parametry kopírují na zásobník. u Pokud známe u adresu parametru na zásobníku u a typ tohoto parametru, u můžeme přistoupit k následujícímu parametru. u Problém: struktura zásobníku se může lišit u Díky standardní knihovně stdarg.h ji ale nemusíme znát u FPPP musí splňovat následující omezení u mít alespoň jeden pojmenovaný / pevný parametr u musí být znám i počet parametrů a jejich datové typy.

Obvyklé varianty FPPP u Počet a typy parametrů dány textovým řetězcem (např. printf, scanf) u Pevně dán typ parametrů a předá se jejich počet (např. výpočet sumy, průměru čísel) u Pevně dán typ parametrů a jako poslední parametr se použije zarážka, tj. nějaká předem určená speciální hodnota (NULL, '\0', 0.0, ) (např. spojení textových řetězců)

Definice a použití FPPP u Při deklaraci i definici FPPP se používá výpustka (... ) u Výpustka oznamuje překladači, že skutečný počet parametrů při volání funkce může být větší u Příklady deklarace funkcí: double prumer(int pocet, double prvni,...); int my_print(char* format,...); u Příklady definice funkcí: double prumer(int pocet, double prvni,...){ tělo } int my_print(char* format,...){ tělo } u Příklady volání funkcí: double vysledek = prumer(5, 1.2, 2.3, 4.3, 2.5, 7.1); print("průměr je %g. \n", vysledek);

Makra ze stdarg.h u Knihovna stdarg.h poskytuje datový typ va_list a makra va_start, va_arg a va_end u Proměnné typu va_list uchovávají informace o zásobníku u Vytvoření a inicializace proměnné typu va_list: va_list zasobnik; va_start(zasobnik, posledni_pojmenovany); u Přístup k dalšími parametru v pořadí: data = va_arg(zasobnik, double); u Ukončení práce se zásobníkem: va_end(zasobnik); u Pozor na datové typy parametrů: double vysledek = prumer(5, 1.0, 3.0, 2.0); //spravne double vysledek = prumer(5, 1, 3.0, 2.0);//spravne double vysledek = prumer(3, 1, (double)3, (double)2); //spravne double vysledek = prumer(3, 1, 3, 2); //chybne - proc?

Příklad FPPP double prumer(int pocet, double prvnicislo,...){ double vysledek; va_list zasobnik; int i; vysledek = prvnicislo; i = pocet - 1; va_start(zasobnik, prvnicislo); while (i > 0) { vysledek += va_arg(zasobnik, double); i--; } va_end(zasobnik); return vysledek/pocet; }

Příklad FPPP s komentáři double prumer(int pocet, double prvnicislo,...){ // prvni cislo je povinny/pojmenovany parametr, ostani volitelne double vysledek; // soucet cisel va_list zasobnik; // ukazatel na zasobnik int i; // ridici promenna cyklu } vysledek = prvnicislo; // vložíme primo prvni cislo i = pocet - 1; // prvni uz mame zpracovane va_start(zasobnik, prvnicislo); // inicializace while (i > 0) { // dokud nezpracujeme ocekavany pocet vysledek += va_arg(zasobnik, double); // nacteni dalsiho i--; // zbyva nacist o 1 mene } va_end(zasobnik); // konec prace se zasobnikem return vysledek/pocet; // dokonceni vypoctu