Preprocess Úvod do tvorby funkcí Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní.

Slides:



Advertisements
Podobné prezentace
A1PRG - Programování – Seminář Ing. Michal Typová konverze, oblast platnosti, paměťové třídy 9 Verze
Advertisements

Standardní knihovní funkce pro práci s textovými řetězci
ÚVOD DO C++ 3 TŘÍDY a objekty - POKRAČOVÁNÍ
Programování v C jazyku - SEMINÁŘ
Funkce Připomeňme si program pro výpočet faktoriálu:
Standardní knihovní funkce: matematika a datum a čas
Racionální čísla, operátory, výrazy, knihovní funkce
Programování 2 Cvičení 5.
Příkazy Přednáška č. 4. Příkazy (statements)  Příkaz – dílčí krok programu (část kódu – zpravidla jeden řádek)  Program – posloupnost příkazů  Příkazy.
Pole, ukazatele a odkazy
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Počítače a programování 1. Obsah přednášky Výjimky - základní typy výjimek Způsoby zpracování výjimek.
C++ Přednáška 3 Konstantní a statické členy tříd, ukazatel this, konstantní instance třídy Ing. Jiří Kulhánek , kat. 352, VŠB TU Ostrava 2004.
Cvičení 2 Proměnné(jednoduché a složené) a konstanty První program Zápis výrazů.
Programování v C++ Cvičení.
Algoritmizace a programování
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
8. přednáška typedef - preprocesor Studijní materiály najdete na adrese:
Struktury, qsort, mergesort BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií.
Seminář C++ 9. cvičení Šablony Ing. Jan Mikulka. Šablony ► template – vzory, podle kterých může překladač tvořit skupiny podobných tříd nebo funkcí, které.
Práce se soubory. * soubory patří k základním datovým prvkům v počítači * převážná většina programovacích jazyků má podporu určité formy práce se soubory.
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro práci se soubory 13 Verze
OSNOVA: a) Řetězce v C b) Funkce stdio.h pro řetězce c) Funkce string.h pro řetězce d) Příklad Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače.
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
Příklady v jazyku C – část 6
DEKLARACE PROMĚNNÝCH A KONSTANT
Současný svět Projekt č. CZ /3. 1
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
Vstupy a výstupy znaků a) Terminálový vstup a výstup ( getchar(), putchar() ) Přečtěte znak pomocí systémové funkce getchar() a vypište ho pomocí putchar().
OSNOVA: a)Programování se soubory b)Záloha databáze v souboru c) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
Příklady v jazyku C – část 4
Příklady v jazyku C – část 3
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro vstup a výstup 12 Verze
Dennis MacAlistair Ritchie
OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
Příklady v jazyku C – část 2
OSNOVA: a) Preprocesor b) ANSI-C knihovny c) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 1 pro obor EST BPC1E.
Napište program v C pro výpočet plochy obdélníka se stranami A=3 a B=2. Výsledek vytiskněte s patřičným komentářem na obrazovku formátovým příkazem printf.
OSNOVA: a) Příkazy pro větvení b) Příkazy pro cykly c) Příkazy pro řízení přenosu d) Příklad Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače.
Knihovna GLib ● Multiplatformní nástavba standardní C knihovny (běží na Windows, Linux, Mac,...) ● Naleznete zde nástroje pro komfortní práci s řetězci.
OSNOVA: a)Funkce – úvod b) Hlavičky funkcí c) Rekurze funkcí d)Knihovny funkcí e)Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače.
Realloc a qsort examples BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
13/04/20151 Datový typ třída – class (1) Datový typ definovaný uživatelem Poskytuje mechanismus pro modelování entit, s nimiž manipulují aplikace Charakterizuje.
STRING A UKAZATELE. Co to je řetězec? Řetězec v Javě je samostatný objekt. Je konstantní, co znamená, že jednou vytvořený řetězec nelze změnit. Chceme-li.
C – jak na procedury Mgr. Lenka Švancarová. C – procedury #include int main() { printf("Ahoj\n"); return(0); } #include void pozdrav(void) { printf("Ahoj\n");
Pokročilé programování v C++ (část B)
Příklady v jazyku C – část 1. Výstupy pomocí printf. printf(" Tisk textu \n v apostrofech \n ") ; p=10; printf("%d\n", p) ; /* tisk konstanty */ printf("Tisk.
Příklady v jazyku C – část 8. Napište program, který inicializuje 2-rozměrné pole uživatele (5 řádků, 2 sloupce) a naplní ho hodnotami (první sloupec.
Soubory BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
Příklady v jazyku C – část 2
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Příklady v jazyku C – část 2
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část I.
C – procedury Mgr. Lenka Švancarová.
Pokročilé datové typy (struktury, unie, dynamické proměnné)
Funkce Přednáška č. 5. Funkce (functions)  posloupnost příkazů uvedená hlavičkou  využití – opakovaně volaná sekvence – strukturování programu – ošetření.
Programování KONSTANTY, ČTENÍ PO JEDNOM ZNAKU GETCHAR() FORMÁTOVANÝ VÝSTUP POMOCÍ PRINTF, VÝVOJOVÉ DIAGRAMY, CYKLY.
Programování OPERÁTOR SIZEOF, FUNKCE, POLE JAKO PARAMETRY FUNKCÍ ERIK KRÁL.
Y36PJC Programování v jazyce C/C++
Programování v jazyce C++
Programovací jazyk C Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Ing. Jitka Vlčková. Dostupné z Metodického portálu ISSN.
Funkce výstupu (2) Funkce printf: deklarována v: stdio.h
Řetězce (24) Funkce strchr: deklarována v: string.h
Oblast platnosti identifikátoru (1)
Opakování ze 3. cvičení deklarace proměnných výpis na monitor (výstup)
C# přehled vlastností.
Funkce s proměnným počtem parametrů
Opakování ze 4. cvičení int a; printf("Zadej číslo: ");
Transkript prezentace:

Preprocess Úvod do tvorby funkcí Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní parametrů hodnotou Oblast platnosti a paměťové třídy Oddělený překlad Speciální direktivy preprocesoru Typové modifikátory Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní parametrů hodnotou Oblast platnosti a paměťové třídy Oddělený překlad Speciální direktivy preprocesoru Typové modifikátory

Princip preprocesoringu /* vlo ž ení soubor ů */ #include /*systém*/ #include "makra.h" /*vlastní*/ void main(){ /* vlo ž ení souboru */ #include "deklarace.c" /* vyu ž ití konstant */ a = KONSTA; b = KONSTB; /* volání makra */ printf("%d", VETSI(a,b)); } /* vlo ž ení soubor ů */ #include /*systém*/ #include "makra.h" /*vlastní*/ void main(){ /* vlo ž ení souboru */ #include "deklarace.c" /* vyu ž ití konstant */ a = KONSTA; b = KONSTB; /* volání makra */ printf("%d", VETSI(a,b)); } /* definice konstant */ #define KONSTA 10 #define KONSTB 20 /* definice makra */ #define VETSI(x,y)\ ((x)>(y))?(x):(y) /* definice konstant */ #define KONSTA 10 #define KONSTB 20 /* definice makra */ #define VETSI(x,y)\ ((x)>(y))?(x):(y) int a, b; Preprocesor … int printf(const char *,...); … void main(){ int a, b; a = 10; b = 20; printf("%d", ((a)>(b))?(a):(b)); } … int printf(const char *,...); … void main(){ int a, b; a = 10; b = 20; printf("%d", ((a)>(b))?(a):(b)); } makra.h hlavni.c stdio.h math.h deklarace.c string.h memory.h math.h …

Direktivy preprocesoru … void main(){ unsigned int a, b; a = pow((double)27,1./3); b = pow((double)9*3,1./1+2); printf("a=%d,b=%d\n",a,b); if (1 <= (a) && (a) <= 10) printf("JMENO %d", 1990); } … void main(){ unsigned int a, b; a = pow((double)27,1./3); b = pow((double)9*3,1./1+2); printf("a=%d,b=%d\n",a,b); if (1 <= (a) && (a) <= 10) printf("JMENO %d", 1990); } #include #define ODMOCNINAN(x,n)\ pow((double)x,1./n) void main(){ UINT a, b; a = ODMOCNINAN(27,3); b = ODMOCNINAN(9*3,1+2); printf("a=%d,b=%d\n",a,b); if INTERVAL(a,1,10) printf("JMENO %d", ROK); } #include #define ODMOCNINAN(x,n)\ pow((double)x,1./n) void main(){ UINT a, b; a = ODMOCNINAN(27,3); b = ODMOCNINAN(9*3,1+2); printf("a=%d,b=%d\n",a,b); if INTERVAL(a,1,10) printf("JMENO %d", ROK); } Vkládaní souborů #include #include ".\\cesta\\muj.h" Definice maker bez parametrů #define ROK 1990 #define JMENO "Petr" #define UINT unsigned int Definice maker s parametry #define MINNULA(x)\ ((x)<0)? 0 :(x) #define ODMOCNINAN(x,n)\ pow((double)(x),1./(n)) #define INTERVAL(x,OD,DO)\ (OD <= (x) && (x) <= DO) #undef ODMOCNINAN

Podmíněný překlad Direktivy pro podmíněný překlad #define, #if, #else, #error … #define, #ifdef, #ifndef,… Direktivy pro podmíněný překlad #define, #if, #else, #error … #define, #ifdef, #ifndef,… #define JAZYK 1 #if JAZYK == 1 #define NAZEV "Muj Obchod" #elif JAZYK == 2 #define NAZEV "My Shop" #else #error JAZYK není nastaven #endif #define JAZYK 1 #if JAZYK == 1 #define NAZEV "Muj Obchod" #elif JAZYK == 2 #define NAZEV "My Shop" #else #error JAZYK není nastaven #endif #include void main() { printf(NAZEV); } … void main() { printf("Muj Obchod"); } #ifndef _ZNAKY_ #define _ZNAKY_ #define MAL(Z) ((Z)>='a'&&(Z)<='z') #define VEL(Z) ((Z)>='A'&&(Z)<='Z') #define POS ('a'-'A') #define NAVEL(Z) (MAL(Z))?(Z-POS):Z #define NAMAL(Z) (VEL(Z))?(Z+POS):Z #endif #ifndef _ZNAKY_ #define _ZNAKY_ #define MAL(Z) ((Z)>='a'&&(Z)<='z') #define VEL(Z) ((Z)>='A'&&(Z)<='Z') #define POS ('a'-'A') #define NAVEL(Z) (MAL(Z))?(Z-POS):Z #define NAMAL(Z) (VEL(Z))?(Z+POS):Z #endif znaky.h #include #include "znaky.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) putchar(NAVEL(zn)); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } #include #include "znaky.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) putchar(NAVEL(zn)); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } hlavni.c #define _DEF_ … #ifdef _DEF_ … #ifndef _DEF_ … #include "znaky.h" #define PISMALYZNAK(znak)\ putchar(NAMAL(znak)) #include "znaky.h" #define PISMALYZNAK(znak)\ putchar(NAMAL(znak)) mujio.h #include #include "znaky.h" #include "mujio.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) PISMALYZNAK(zn); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } #include #include "znaky.h" #include "mujio.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) PISMALYZNAK(zn); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } hlavni.c

Základy tvorby funkcí #include int secti(int, int); void main(){ int v, cislo = 7; v = secti(cislo, 10); printf("%d\n", v); } int secti(int a, int b){ return a+b; } rtyp jméno( [typ par1] [,typ par2] [,…] ) { … return [(rtyp)hodnota]; } rtyp jméno( [typ par1] [,typ par2] [,…] ) { … return [(rtyp)hodnota]; } Definice void funkceA(int parametr){ … } long funkceB(int parametr){ long hodnota; … return hodnota; } int funkceC(){ int hodnota; … return hodnota; } [rtyp prom;] [prom =] jméno([pr1][,pr2][,…]); [rtyp prom;] [prom =] jméno([pr1][,pr2][,…]); Deklarace void funkceA(int parametr); long funkceB(int); int funkceC();

int secti(int a, int b); void main(){ int v, cislo = 7; v = secti(cislo, 10); printf("%d\n", v); } int secti(int a, int b){ int ret = a + b; return ret; } Zjednodušený popis principu předávaní parametrů hodnotou … ?? 7 7 ?? (v) 7 (cislo) ?? 0x x0123 (adr) ?? (return) 10 (par. a) 7 (par. b) (ret) 17 (return) 17 (v) 17 (return) 17 (v) int secti(int a, int b); void main(){ int v, cislo = 7; v = secti(cislo, 10); printf("%d\n", v); } int secti(int a, int b){ int ret = a + b; return ret; } … Zásobník 0x0000 0xFFFF

Rekurzivní funkce #include double faktorial( int cislo) { if (cislo == 1 || cislo == 0) return 1; else return cislo * faktorial(--cislo); /*rekurze*/ } void main(){ int cislo; double f = 0; printf("Faktorial\n==========\n"); printf("Zadej cislo: "); scanf("%d",&cislo); printf("%d! = %.0lf\n(%G)\n", cislo,f,f = faktorial(cislo)); } #include double faktorial( int cislo) { if (cislo == 1 || cislo == 0) return 1; else return cislo * faktorial(--cislo); /*rekurze*/ } void main(){ int cislo; double f = 0; printf("Faktorial\n==========\n"); printf("Zadej cislo: "); scanf("%d",&cislo); printf("%d! = %.0lf\n(%G)\n", cislo,f,f = faktorial(cislo)); }

extern & static Globální Lokální Oblast platnosti a paměťové třídy auto static register auto static register Globální & Lokální int global; void funkce(){ int lokal = 11; global = 22; } void main(){ int v; funkce(); v = lokal * 2; v = global * 2; printf("%d",v); } auto & static & register int funkce(){ static int a = 1; auto int b = 1; a++,b++; return a*b; } void main(){ register int i,v; for(i=1;i<5;i++){ v = funkce(); printf("%d ",v); }} extern static extern static extern int gbA; static int gbB; int fc(){ gbA++; gbB++; return gbA+gbB; } int gbA; int fc(); static int gbB; void main(){ gbA = 10; gbB = 20; printf("%d",fc()); } Hlavni.c Funkce.c

Typové modifikátory void fc(const char *text, int n){ const int pocet = n*3; printf("%d. %s", pocet, text); } void main() { const unsigned char ne = 3; const double e = ; int pole[ne]; fc("Dnes je p ř ednáška",1); ne = 6; } void fc(const char *text, int n){ const int pocet = n*3; printf("%d. %s", pocet, text); } void main() { const unsigned char ne = 3; const double e = ; int pole[ne]; fc("Dnes je p ř ednáška",1); ne = 6; } const volatile char hodnota; void irq(){ hodnota++; } void main(){ … if(hodnota < 1) sleep(100); … } volatile char hodnota; void irq(){ hodnota++; } void main(){ … if(hodnota < 1) sleep(100); … } volatile

Oddělený překlad int fca(int a) { return 2*a; } #include "FnA.c" #include "FnB.c" void main(){ int a = fca(10); int b = fcb(20); } Hlavni.c FnA.c int fcb(int b) { return b/2; } FnB.c Hlavni.obj int fca(int a) { return 2*a; } #include "FnA.h" #include "FnB.h" void main(){ int a = fca(10); int b = fcb(20); } FnA.c int fcb(int b) { return b/2; } FnB.c Hlavni.objFnA.objFnB.obj int fca(int); FnA.h int fcb(int); FnB.h Hlavni.c

Speciální direktivy preprocesoru #define TISKTEXT(T)\ printf("%s",#T) #define PROM(C) prom##C #define CHYBA(T) \ {printf( "CHYBA \t\"%s\"\n" \ "\tRadek %d\n" \ "\tSoubor(%s)\n", \ T, __LINE__, __FILE__ );} void main(){ int PROM(A) = 1, PROM(B) = 2; TISKTEXT(ahoj jak se mas); printf("%d\n",promA); printf("%d\n",PROM(B)); CHYBA("Soubor nebyl nalezen"); } void main(){ int PROM(A) = 1, PROM(B) = 2; TISKTEXT(ahoj jak se mas); printf("%d\n",promA); printf("%d\n",PROM(B)); CHYBA("Soubor nebyl nalezen"); } #line 151 "soubor.c" __LINE__ __FILE__ __DATE__ __TIME__ #pragma … # ##

Příklad #ifndef _KVADRO_ #define _KVADRO_ #define REALRESULT 1 #define IMGRESULT 2 int kvadro( double, double, double ); extern double rex1,rex2,imx1,imx2; #endif #ifndef _KVADRO_ #define _KVADRO_ #define REALRESULT 1 #define IMGRESULT 2 int kvadro( double, double, double ); extern double rex1,rex2,imx1,imx2; #endif funkce.h #include #include " funkce.h " int kvadro( double a, double b, double c){ double D = b*b - 4*a*c; if (D<0.){ rex2 = rex1 = -b/(2*a); imx2 = -(imx1=sqrt(fabs(D))/(2*a)); return IMGRESULT; } else { rex1 = (-b + sqrt(D))/(2*a); rex2 = (-b - sqrt(D))/(2*a); return REALRESULT;}} #include #include " funkce.h " int kvadro( double a, double b, double c){ double D = b*b - 4*a*c; if (D<0.){ rex2 = rex1 = -b/(2*a); imx2 = -(imx1=sqrt(fabs(D))/(2*a)); return IMGRESULT; } else { rex1 = (-b + sqrt(D))/(2*a); rex2 = (-b - sqrt(D))/(2*a); return REALRESULT;}} funkce.c #include #include " funkce.h " double rex1,rex2,imx1,imx2; void main(){ double a,b,c; printf("Kvadraticka rovnice\n" "===================\n"); printf("Zadej koeficienty a, b, c:"); scanf("%lf,%lf,%lf",&a,&b,&c); switch (kvadro(a,b,c)){ case REALRESULT: printf("x1 = %8.2lf\n",rex1); printf("x2 = %8.2lf\n",rex2); break ; case IMGRESULT: printf("x1=%.2f%+.2fj\n",rex1,imx1); printf("x2=%.2f%+.2fj\n",rex2,imx2); break ; } #include #include " funkce.h " double rex1,rex2,imx1,imx2; void main(){ double a,b,c; printf("Kvadraticka rovnice\n" "===================\n"); printf("Zadej koeficienty a, b, c:"); scanf("%lf,%lf,%lf",&a,&b,&c); switch (kvadro(a,b,c)){ case REALRESULT: printf("x1 = %8.2lf\n",rex1); printf("x2 = %8.2lf\n",rex2); break ; case IMGRESULT: printf("x1=%.2f%+.2fj\n",rex1,imx1); printf("x2=%.2f%+.2fj\n",rex2,imx2); break ; } hlavni.c