IJC Jazyk C. Petr Peringer peringer AT fit.vutbr.cz. (Verze: ) Božetěchova 2, Brno. Úvod ISO C libc C99 11 Debug C++ Link Opt...
|
|
- Agnieszka Sikorska
- 6 lat temu
- Przeglądów:
Transkrypt
1 Úvod ISO C libc C99 11 Debug C++ Link Opt... IJC Jazyk C 1/271 IJC Jazyk C Petr Peringer peringer AT fit.vutbr.cz Vysoké učení technické v Brně Fakulta informačních technologií, Božetěchova 2, Brno (Verze: ) Přeloženo: 6. února 2019
2 IJC Jazyk C 2/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Pravidla Literatura Úvod Tyto slajdy jsou určeny pro studenty předmětu IJC na FIT. Obsahují popis jazyka ISO C vhodný pro studenty, kteří již zvládli triviální základy programování v C. Obsah slajdů je velmi stručný, podrobnější informace jsou součástí výkladu. Předpokládá se též samostatná práce studentů s literaturou. Programy jsou sázeny následujícím způsobem: text programu a poznámky (max 50 znaků) Pro úsporu místa jsou někdy formátovány nestandardně. Občas jsou použity rámečky pro zvýraznění.
3 IJC Jazyk C 3/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Pravidla Literatura Pravidla IJC = přednášky úkoly konzultace hodnocení celkem 100 bodů: 30b 2 úkoly 70b zkouška Poznámka: Je dobré číst odbornou literaturu.
4 Úvod ISO C libc C99 11 Debug C++ Link Opt... Pravidla Literatura IJC Jazyk C 4/271 Zdroje informací Oficiální stránka: Aktuální informace pro studenty: Dobrá literatura WWW odkazy man 3 Nápověda v integrovaném prostředí...
5 IJC Jazyk C 5/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Pravidla Literatura Literatura British Standards Institute: The C Standard: Incorporating Technical Corrigendum 1, Willey, 2003 (C99) Herout, P.: Učebnice jazyka C, 6. vydání, Kopp, 2010 ISO: Programming languages C, WG14 N1570 Committee Draft, April 12, 2011 (C11) Kerninghan, B.; Ritchie, D.: The C Programming Language, 2nd edition, Addison-Wesley, 1988 Kerninghan, B.; Ritchie, D.: Programovací jazyk C, Computer Press, 2006 Kernighan B., Pike R.: The Practice of Programming, Addison-Wesley, 1999
6 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Historie jazyka C ALGOL 60 (1960) BCPL (1967) B (1970) Bell Laboratories C (1972) K&R ANSI C (1989) norma pro USA ISO C90 (1990) mezinárodní norma ISO C90 + TC (1994) doplňky a opravy ISO C99 (1999) mezinárodní norma ISO C99 + TC (2004) doplňky a opravy ISO C11 (2011) mezinárodní norma ISO C18 (2018) = platný standard Kerninghan, Ritchie: The C Programming Language (Addison-Wesley 1978). Aktuální norma: ISO/IEC 9899:2018 (C18) Překladače a vývojová prostředí pro jazyk C viz WWW IJC Jazyk C 6/271
7 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 7/271 Novinky v C11 některé části normy jsou nepovinné ( optional ) podpora vláken ( threads ) možnost specifikovat zarovnávání ( alignment ) UNICODE znaky a řetězce (bylo v revizi 2004) typově generické výrazy static_assert anonymní struktury a unie funkce bez návratu (atribut noreturn) výlučný přístup k souborům doplnění charakteristik pro float/double/... volitelná podpora pro kontrolu mezí a analýzu likvidace funkce gets (nahrazeno gets_s)
8 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 8/271 Charakteristika jazyka C Obecně využitelný programovací jazyk tradičně používaný pro systémové programování. C je jazyk nižší úrovně. Otevřený jazyk; malé jádro je snadno rozšiřitelné (knihovny). Dobře napsané programy v C jsou efektivní. Existuje velké množství programů napsaných v C. Programy jsou přenositelné při dodržování jistých pravidel. Existují překladače na prakticky všechny platformy. Populární díky operačnímu systému UNIX. Je standardizovaný (ISO/ANSI).
9 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 9/271 Nevýhody jazyka C Nedisciplinovanému uživateli umožňuje psát zcela nesrozumitelné programy (i["abcdef"], viz IOCCC) Je nutné dodržovat jisté konvence nekontrolované překladačem (ale existují prostředky na dodatečné kontroly například program lint): parametry funkce printf meze polí konzistence při sestavování programu nedefinované chování: int overflow, Manuální správa paměti. (Ne vždy jde o nevýhodu. Existuje možnost použít garbage collector viz např. libgc)...
10 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 10/271 Doporučený styl psaní programů if ( a > b ) { /* varianta A */ text odsazený o 2-8 znaků } if ( a > b ) /* varianta B */ { text odsazený o 2-8 znaků } Zarovnávání textu programu je důležité pro jeho dobrou čitelnost. Překladače zarovnání nevyžadují ani nekontrolují. Poznámky: Automatické formátování zdrojových textů (GNU indent) Automatické generování dokumentace ze zdrojových textů programů (např. doxygen).
11 IJC Jazyk C 11/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra První program Soubor ahoj.c #include <stdio.h> /* vloží rozhraní */ int main(void) { printf("ahoj!\n"); return 0; } Způsob zpracování cc ahoj.c./a.out # pro Linux, UNIX, GNU C Poznámka: Struktura programu v jazyku C
12 IJC Jazyk C 12/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Základní datové typy void char short int long long long float double prázdná množina hodnot znak krátké celé číslo celé číslo (+-podle registru procesoru) dlouhé celé číslo (min 32 bitů) velmi dlouhé celé číslo (min 64 bitů) reálné číslo reálné číslo s dvojnásobnou přesností Implicitní typové konverze int float char int
13 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Řetězce Řetězcové literály (C11) "text řetězce může obsahovat speciální znaky (char[])" u8"text UTF-8 (char[])" u"text UTF-16 (char16_t[])" U"text UTF-32 (char32_t[])" L"text (wchar_t[])" \\ = znak \ \" = znak " \t = tabelátor (posun na následující sloupec N*8)... Poznámky: Pozor na jména souborů v MS-DOS stylu ("c:\text.txt") Pozor na další omezení např. *printf() %% IJC Jazyk C 13/271
14 IJC Jazyk C 14/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Funkce printf printf("formátovací řetězec" [, parametry]); Knihovní funkce, není součástí jazyka Formátovací řetězec popisuje způsob tisku parametrů, znak % má speciální význam označuje začátek formátu Základní formáty %f číslo v plovoucí čárce %d desítkové celé číslo %o oktalové celé číslo %x šestnáctkové celé číslo %c znak %s řetězec znaků %% znak %
15 IJC Jazyk C 15/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příkaz for for(poč_nastavení; test; nastav_další_krok) for(;;) {... } /* nekonečný cyklus */ Příklad int main(void) { int i; for(i=1; i<=10; i++) printf(" %f \n", 1.0/i); return 0; }
16 IJC Jazyk C 16/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Symbolické konstanty #define JMENO hodnota #define ZACATEK 1 Použití const nebo enum const int ZACATEK = 1; enum { ZACATEK = 1 }; není zcela ekvivalentní, ale obecně lepší.
17 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Standardní vstup Příklad: počítání znaků int main(void) { long nc = 0; /* zaručený rozsah do 2e9 */ while(getchar()!=eof) /* čtení znaku */ nc++; printf("%ld znaků \n", nc); } /* ^ long */ Druhá verze int main(void) { long nc; for( nc = 0; getchar()!=eof; nc++ ) ; // prázdný příkaz - vše je v záhlaví printf("%ld znaků \n", nc); } IJC Jazyk C 17/271
18 IJC Jazyk C 18/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad: kopírování souboru Standardní vstup standardní výstup #include <stdio.h> int main(void) { int c; // POZOR na chybné použití char c; while ( (c = getchar())!= EOF ) // priorita = putchar(c); return 0; }
19 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad: počítání slov int main(void) { int c; long nl=0, nw=0, nc=0; // počet řádků, slov a znaků bool inword = false; // stav automatu while( (c = getchar())!= EOF ) { nc++; if( c == \n ) nl++; // nový řádek if( c == c == \n c == \t ) inword = false; // oddělovač else if(!inword ) { inword = true; // začíná slovo nw++; } } printf("%ld %ld %ld\n", nl, nw, nc); return 0; } IJC Jazyk C 19/271
20 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 20/271 Stavové automaty (Finite-state machines) Stavy: konečný počet, počáteční stav, koncové stavy Vstupní abeceda Výstupní abeceda Přechodová funkce (hrany v grafové reprezentaci) Výstupní funkce (Mealy/Moore) Implementace: switch(stav), tabulka+interpret,... Snadno modifikovatelné, čitelnější kód Použití: regulární výrazy, zpracování textu, HW, řízení,...
21 IJC Jazyk C 21/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad: automat1 grafová reprezenatce nex / A 1 nex / - ney / B X / A 0 X / - 2 Y / B 3 cokoli / -
22 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad: automat1 typická implementace int stav = 0; // počáteční stav T vstup; while ((vstup=dalsi_symbol())!= KONEC) { switch(stav) { case 0: if (vstup==x) stav=2; else stav=1; break; case 1: if (vstup==x) stav=3; OUTPUT(A); break; case 2: if (vstup==y) stav=3; OUTPUT(B); break; case 3: stav=0; break; } } IJC Jazyk C 22/271
23 IJC Jazyk C 23/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad: automat2 pro vynechání poznámek Graf popisující automat na odstranění /*... */ poznámek / out(/) c c out(c) 0 / c out(/c) " out(") " out(") 1 c out(c) 4 * \ out(\) c out(c) 2 5 * c * 3 / out(space)
24 IJC Jazyk C 24/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad: automat2 kód int stav = 0; // počáteční stav int c; while ((c=getchar())!= EOF) { switch(stav) { case 0: if(c== / ) stav=1; else if (c== " ) { stav=4; putchar(c); } else putchar(c); break; case 1: if(c== * ) stav=2; else if(c== / ) putchar(c); else { stav=0; putchar( / ); putchar(c); } break; case 2: if(c== * ) stav=3; break;
25 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad: automat2 dokončení case 3: if(c== / ) { stav=0; putchar( ); } else if(c!= * ) stav=2; break; case 4: if(c== \\ ) stav=5; else if(c== " ) stav=0; putchar(c); break; case 5: stav=4; putchar(c); break; } // end switch } // end while if(stav!=0) fprintf(stderr, "Error\n"); Poznámka: Chybí zpracování ", \ a komentářů // IJC Jazyk C 25/271
26 IJC Jazyk C 26/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad: histogram počtu číslic int main(void) { int c; // načtený znak nebo EOF int ndigit[10] = { 0, }; while( (c=getchar())!= EOF ) if(isdigit(c)) // je číslice? ndigit[c- 0 ]++; // znak --> číslo printf("digit: number\n"); for(int i=0; i<10; i++) printf(" %c : %d\n", i+ 0, ndigit[i]); printf("\n"); return 0; }
27 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Definice funkce ISO C int power(int x, int n) { /* umocňování */ int p; for( p=1; n>0; n-- ) p = p * x; return p; /* návrat s hodnotou p */ } Volání funkce printf("%d %d %d\n", i, power(2,i), power(-3,i)); Poznámky: Předávání parametrů hodnotou (kromě pole) Pořadí vyhodnocování argumentů nedefinováno Prototyp funkce IJC Jazyk C 27/271
28 IJC Jazyk C 28/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra K&R definice funkce Podle K&R (velmi zastaralé, nepoužívat) power(x, n) /* K&R: implicitní typ int */ int x, n; /* K&R: deklarace parametrů */ { int i, p; for( i=p=1; i<=n; i++ ) p = p * x; return p; } Poznámky: K&R nezná pojem prototyp funkce K&R deklarace funkcí nutná jen pro typ různý od int
29 void copy(char s[], const char s1[]) { /* s1 do s */ while( (*s++ = *s1++)!= \0 ); } IJC Jazyk C 29/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad: nalezení nejdelšího řádku v textu... #define MAXLINE 1000 /* implementační limit */ int getline(char s[], int lim) { int c, i; for(i=0; i<lim-2 && (c=getchar())!=eof && c!= \n ; i++) s[i] = c; if(c== \n ) s[i++] = c; /* uložit včetně \n */ s[i] = \0 ; /* řetězec končí znakem \0 */ return i; }
30 IJC Jazyk C 30/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad:... pokračování int main(void) { char line[maxline]; /* načtený řádek */ char save[maxline]; /* nejdelší řádek */ int max = 0; int len; while( (len=getline(line,maxline)) > 0 ) if( len > max ) { /* je delší? */ max = len; copy(save, line); /* pole předá odkazem */ } if( max > 0 ) printf("%s", save); return 0; }
31 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 31/271 Jazyk C systematická definice Základní množina znaků (1 byte) písmena: číslice: 0-9 a-za-z grafické znaky:! & *. < [ ^ " + / = \ _ } # (, : > ] { ~ % ) - ;? mezera, nový řádek, BS, HT, VT, FF V identifikátorech, znakových/řetězcových literálech, jménech hlavičkových souborů a poznámkách mohou být i jiné znaky.
32 IJC Jazyk C 32/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Poznámky (comments) /* text C poznámky */ // text C99+ poznámky do konce řádku // poznámka s trigraph??/ pokračuje i na dalším řádku ISO C nedovoluje vnořené poznámky. (Použijte #if 0 ) Poznámka je přepsána na jednu mezeru až po rozvoji maker Poznámka: Některé zastaralé (ne ISO C) implementace nevkládaly mezeru
33 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 33/271 Operátory a separátory! &= + -- /= << == >>= ^ = % ( ++ -= : <<= >? ^= %= ) += -> ; <= >= [ { } & *,. < = >> ] ~ && *= - / Poznámka: Operátor % a záporná čísla: C89: implementation defined, C99, C11: LIA (Language Independent Arithmetic) Poznámka: pro znaménkový typ zbytek modulo
34 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 34/271 Identifikátory rozlišují se velká a malá písmena (case sensitive) minimální rozlišovaná délka 63(31) znaků konvence pro zápis identifikátorů: identifikátory preprocesoru velkými písmeny #define YES 1 ostatní identifikátory malými písmeny int i; dlouhé identifikátory s podtržítkem mezi slovy int muj_dlouhy_identifikator; speciální jména začínají znakem func Zvláštní prostory jmen pro návěští ( labels ), označení struktur/unií/výčtů ( tags ), členy struktur/unií a ostatní idetifikátory.
35 IJC Jazyk C 35/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Klíčová slova auto else long switch break enum register typedef case extern restrict union char float return unsigned const for short void continue goto signed volatile default if sizeof while do inline static double int struct _Alignas _Atomic _Complex _Imaginary _Static_assert _Alignof _Bool _Generic _Noreturn _Thread_local
36 IJC Jazyk C 36/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Jednoduché typy a velikost údajů void nezabírá pamět bool pouze hodnoty true/false char znak (vždy 1 bajt, celočíselný typ) short int krátké celé číslo (min 16 bitů) int standardní celé číslo long int celé číslo, min 32 bitů long long int celé číslo, min 64 bitů float reálné číslo (malá přesnost) double reálné číslo, dvojnásobná přesnost long double reálné číslo, extra přesnost (např. 10B) float complex komplexní číslo, přesnost float double complex komplexní číslo, přesnost double
37 IJC Jazyk C 37/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Typy a velikost údajů char <= short <= int <= long <= long long Příklady sizeof(t) pro různé architektury PC/64bit PC/32bit PC/16bit char short int 4 nebo long long long 8 8 (8) float double long double void* nebo 4
38 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra signed a unsigned unsigned char unsigned unsigned long signed char unsigned int const a volatile const T Objekt takto označený nelze modifikovat přiřazením. volatile T Tato specifikace zabrání překladači provádět optimalizace při přístupu k objektu. Významné zvláště při komunikaci mezi paralelními procesy. Poznámka: const-correctness IJC Jazyk C 38/271
39 IJC Jazyk C 39/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Literály: celá čísla Celočíselné literály desítkové osmičkové šestnáctkové přípona bez přípony l nebo L ll nebo LL u nebo U Příklady číslice1-9 číslice0-9 0 číslice0-7 0x číslice0-9, a-f, A-F typ int long long long +specifikace unsigned 0L UL LL 077 0x3F 0xFFFFU
40 IJC Jazyk C 40/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Literály v plovoucí řádové čárce přípona bez přípony l nebo L f nebo F typ double long double float Příklady: e-3L F 3e1-2e+9 Poznámky: decimal desítkový základ (finanční aplikace) šestnáctkový formát: 0xfeeP10F
41 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Znakové literály <znak> znakový literál, je typu int Speciální znaky ( escape-sequence ) \ apostrof \a alert pípnutí \b backspace posun zpět (BS) \f nová stránka (FF) \n nový řádek (LF, CRLF) \r návrat vozíku (CR) \t horizontální tabelátor (HT) \\ znak \ \x<číslo> znak s ordinálním číslem hexadecimálně \<číslo> znak s ordinálním číslem oktalově Příklady n \\ \n \x80 \0 \ IJC Jazyk C 41/271
42 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 42/271 Víceznakové a široké literály Znakové konstanty anglický termín zápis typ multi-byte character xxx int wide character L xxx wchar_t wide character u xxx char16_t wide character U xxx char32_t Poznámky: UNICODE kódování: \u03af, \U Víceznaková (multi-byte) reprezentace: UTF-8 Kódování zdrojového textu
43 IJC Jazyk C 43/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Řetězcové literály Řetězcové konstanty zápis "<znaky (i speciální a multi-byte)>" u8"<znaky (i speciální a multi-byte)>" L"<znaky (i speciální a multi-byte)>" u"<znaky (i speciální a multi-byte)>" U"<znaky (i speciální a multi-byte)>" typ char[] char[] wchar_t[] char16_t[] char32_t[] Překladač doplní na konec řetězce znak \0 Překladač překóduje obsah řetězce podle implementací definované lokalizace. Použije funkce mbstowcs, mbrtoc16 *, mbrtoc32 *
44 IJC Jazyk C 44/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Řetězcové literály příklady "" // prázdný řetězec (char[1]) "text se znakem \" v řetězci" " text \ pokračování textu na následujícím řádku" "řetězec1" <mezery, nové řádky> "řetězec2" // "řetězec1řetězec2" "\0" "12" // char[4]: \0 1 2 \0 u8"něco" "a" "b" U"c" // U"abc"
45 IJC Jazyk C 45/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Deklarace datový_typ deklarátor [=ini_hodnota],... ; Příklady char line[100]; /* definice pole 100 znaků */ void f(void); /* deklarace funkce - prototyp */ void (*fp)(void); /* ukazatel na funkci */ const char backslash = \\ ; int i = 0; double eps = 1.0e-5;
46 IJC Jazyk C 46/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Okamžik inicializace Příklad statické (obvykle globální) proměnné se inicializují při překladu, bez inicializace mají hodnotu 0 automatické (lokální) proměnné se inicializují, když tok řízení dosáhne místa deklarace, bez inicializace mají nedefinovanou hodnotu dynamické (malloc()) nelze přímo inicializovat int x; // inicializováno při překladu na 0 void f(void) { int i; // i neinicializováno int j = 1; // inicializováno při každém volání char *p = malloc(100); // p inicializováno // *p neinicializováno }
47 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 47/271 Rozsah deklarace identifikátor deklarovaný na globální úrovni má rozsah od místa deklarace do konce zdrojového textu modulu identifikátor uvedený jako formální parametr funkce má rozsah od místa deklarace do konce těla funkce identifikátor deklarovaný uvnitř bloku má rozsah do konce bloku návěští má rozsah funkce, ve které je definováno jméno makra má rozsah od příkazu #define do konce textu modulu nebo do příkazu #undef
48 IJC Jazyk C 48/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Viditelnost identifikátoru Příklad: int x = 10; int main() { double x = 1.1; /* ve funkci platí double x */ printf("%f",x); return 0; } void printx(void) { /* zde platí int x */ printf("%d",x); }
49 IJC Jazyk C 49/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra typedef Vytváření nových jmen (synonym) datových typů. Nejde o vytvoření nového typu. Příklady typedef int length_t; length_t len, maxlen=100; typedef int (*ptr2f_t)(void); /* ukaz. na funkci */ ptr2f_t numcmp, swap; typedef char * string_t; string_t s, lineptr[10]; je ekvivalentní: char *s, *lineptr[10];
50 IJC Jazyk C 50/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Ukazatel, adresa Deklarace/definice ukazatele int *px = NULL; Získání ukazatele na objekt (proměnnou) int x, y; px = &x; // operátor získání adresy objektu Odkaz na objekt (proměnnou) y = *px; // operátor zpřístupnění objektu px = &x; y = *px; // v tomto kontextu ekvivalent y = x Výskyt na levé straně přiřazení (pojem L-hodnota) *px = 0; *px += 4; (*px)++;
51 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 51/271 Použití ukazatelů Předávání parametrů odkazem void f(char *s, int (*p)[3], void (*fp)(void)); Dynamické přidělování paměti double *s = malloc(100*sizeof(double)); Dynamické datové struktury // Linux lists: struct list_head queue = LIST_HEAD_INIT(queue); //... struct list_head *pos; list_for_each(pos, queue) { struct node *d; d = list_entry(pos, struct node, head); d->data = 0; }
52 IJC Jazyk C 52/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Adresový prostor obrázek
53 IJC Jazyk C 53/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Ukazatele jako argumenty funkcí Příklad: Vzájemná záměna hodnot proměnných void swap(int *px, int *py) { register int temp = *px; *px = *py; *py = temp; } Volání: int x,y; /*...*/ swap(&x,&y); ^^^^^ pozor! Poznámka: C++ a typ reference
54 IJC Jazyk C 54/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Ukazatel a pole int a[10], *pa; pa = &a[0]; // ukazatel na první prvek pole x = *pa; // je ekvivalentní x = a[0] Ukazuje-li pa na i-tý prvek pole, potom (pa+1) ukazuje na prvek i+1. V našem příkladu *(pa+1) je stejné jako a[1] Je možné místo pa = &a[0]; napsat pa = a; a potom platí: a[i] == *(pa+i) Obecně pro jazyk C vždy platí: a[i] == *(a+i) Poznámky: Není možné zapsat a++ Meze polí se nekontrolují
55 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 55/271 Adresová aritmetika S ukazateli lze provádět aditivní operace. Jednotkou výpočtu je velikost cílového objektu. Operace mají smysl jen v rámci jednoho pole. Například: posun ukazatele o 1 prvek: p++ (vpřed), p-- (vzad) posun ukazatele o N prvků: p+=5 (vpřed o 5 prvků) rozdíl ukazatelů: p2 - p1 (počet prvků mezi ukazateli) Příklad: Posun ukazatele na další prvek pole int *ip = pole; ip++; // posun adresy o sizeof(int) bajtů
56 IJC Jazyk C 56/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Omezení operací s ukazateli Dva ukazatele nelze sčítat, násobit, dělit, posouvat ani kombinovat s float a double překladač by měl hlásit chybu. Pozor chybné operace s ukazatelem const char *p1 = "abcdef"; const char *p2 = "ghijkl"; p1 += p2; // chyba - nesmyslná adresa p1 *= 2; // chyba - nesmyslná adresa p1 >>= 2; // chyba - nesmyslná adresa p1 += 3.14; // chyba - nesmysl const void *p = p1; p += 3; // chyba - nelze pro void*
57 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad: délka řetězce size_t strlen(const char *s) { size_t n; for(n=0; *s!= \0 ; s++) n++; return n; } Efektivnější varianta: size_t strlen(const char *s) { const char *p = s; while( *p ) p++; return p-s; // rozdíl ukazatelů } Poznámky: Je možné i volání f(&a[2]) resp. f(a+2) Nejefektivnější je obvykle strlen z knihovny. IJC Jazyk C 57/271
58 IJC Jazyk C 58/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Přehled povolených operací: ptr+int, ptr+=int, ptr++ posun ptr-int, ptr-=int, ptr-- posun ptr1 - ptr2 rozdíl ptr[i] indexování *ptr zpřístupnění cíle ptr1 = ptr2 přiřazení Upozornění: Operace s neinicializovaným ukazatelem jsou nebezpečné a nelze je většinou kontrolovat překladačem! Pozor typická chyba char *s; // Neinicializováno nebo implicitní NULL *s = A ; // Zápis znaku na chybné místo v paměti
59 IJC Jazyk C 59/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Řetězce Řetězec je pole znaků, lze jej tedy přiřadit ukazateli: char *message = ""; // inicializace message = "Now is the time."; // nejde o kopii! Operace s řetězci: Kopie znakových řetězců: char *strcpy(char *s1, const char *s2) { char *s = s1; while( *s++ = *s2++ ); return s1; } Upozornění: obrácené pořadí parametrů: strcpy(kam,odkud) nekontroluje velikost řetězců (možné buffer overflow) chování nedefinováno pro překrývající se s1 a s2
60 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 60/271 Řetězce pokračování kopie řetězců s omezením délky: char *strncpy(char *s1, const char*s2, size_t n); spojování řetězců: char *strcat(char *s1, const char*s2); char *strncat(char *s1, const char*s2, size_t n); lexikální porovnání řetězců: int strcmp(const char*s1, const char *s2); int strncmp(const char*s1, const char *s2, size_t n); int strcoll(const char *s1, const char *s2); mnoho dalších funkcí (memcpy, strchr, strstr, strlen) viz std. rozhraní <string.h>
61 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 61/271 Vícerozměrná pole prvkem pole může být opět pole (do libovolné úrovně) static int day_tab[2][13] = { { 0,31,28,31,30,31,30,31,31,30,31,30,31 }, { 0,31,29,31,30,31,30,31,31,30,31,30,31 }, }; prvky jsou uloženy po řádcích nelze zkracovat a[x][y] jako a[x,y] (není hlášena chyba!) parametry typu pole se předávají vždy odkazem v parametrech není nutné udávat rozměr nejlevějšího indexu (počet řádků). Pro mapovací funkci to není podstatné. (Příklad: int f(int day_tab[][13]); ) parametr typu pole (T[]) je ekvivalentní parametru typu ukazatel (T*)
62 IJC Jazyk C 62/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Inicializace pole ukazatelů const char *month_name(int n) { // pole ukazatelů na řetězce static const char *name[] = { "illegal month", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; return (n<1 n>12)? name[0] : name[n]; } Poznámka: char a[10][20]; // pole znakových polí char *b[10]; // pole ukazatelů na řetězce
63 IJC Jazyk C 63/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Argumenty příkazového řádku (command line) Programu TEST lze zadat argumenty při spuštění: TEST argument1 argument2... poslední_argument argv[0] argv[1] argv[2] argv[argc-1] argv[0] je jméno programu (nebo ""), argv[argc] má hodnotu NULL Příklad: Výpis argumentů program echo int main(int argc, char *argv[]) { for(int i=1; i<argc; i++) printf("%s ", argv[i]); printf("\n"); return 0; }
64 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 64/271 Druhá (horší) varianta výpisu argumentů int main(int argc, char *argv[]) { while(--argc>0) printf("%s ", *++argv); // špatně čitelné printf("\n"); return 0; } Poznámka: getopt a různé formáty argumentů program -i program -i hodnota program -i=hodnota program --include hodnota program --include[=hodnota]
65 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Struktury struct Date { unsigned char day; unsigned char month; int year; }; // tag struct Date d = {21,10,1993}; struct Date dat; Odkaz na člen struktury: x = d.year; // jméno_proměnné. jméno_členu Je možné vnořování struktur Struktury lze předávat jako parametry funkcím a vracet jako funkční hodnotu IJC Jazyk C 65/271
66 IJC Jazyk C 66/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Struktury omezení Povolené operace jsou pouze:. zpřístupnění položky = přiřazení (nebo inicializace) & získání ukazatele na proměnnou Ostatní operace jsou zakázané (struktury nelze sčítat atd.). Poznámka: v C++ lze definovat potřebné operátory
67 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Anonymní struktury a unie (C11) struct X { int x; struct Anonymous1 { int y; }; union Anonymous2 { int i; float f; }; } s; s.y = 1; s.f = F; jednodušší a čitelnější zápis IJC Jazyk C 67/271
68 IJC Jazyk C 68/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Neúplná deklarace struktury struct ABC; Lze použít pro definici ukazatelů: struct ABC *p; Lze použít pro externí deklaraci proměnné: extern struct ABC x; // O.K. Nelze použít pro definici proměnné: struct ABC x; // chyba
69 IJC Jazyk C 69/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Použití ukazatele na strukturu struct Date *ptr = &d; x = ptr->year; je ekvivalentní příkazu x = (*ptr).year; Operátory. a -> mají vysokou prioritu (viz tabulka operátorů) ++ptr->day je proto ekvivalentní ++(ptr->day) Poznámky: Dávejte přednost čitelnější formě: ptr->member Nepřehánět: ptr->next->next->next->prev
70 IJC Jazyk C 70/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Velikost struktury v bajtech operátor sizeof sizeof(struct XYZ) sizeof(dat1) sizeof expr // bez závorek jen pro výrazy Velikost struktury nemusí být součtem velikostí jednotlivých složek. Důvodem je zarovnání (alignment) složek i celkové velikosti struktury. Pozor na vložené místo (padding) při kopírování celých struktur (memcpy, fwrite,...) je možný únik informací. Poznámky: Little endian / big endian, _Alignof(typ) _Alignas(typ) _Alignas(const-expr)
71 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad počítání slov v textu... Struktura může obsahovat ukazatel na sebe: struct treenode { char *word; // řetězec int count; struct treenode *left; // levý následník struct treenode *right; // pravý následník }; int main() { // neúplná implementace struct treenode *root = NULL; char word[maxword]; int len; while( (len=getword(word, MAXWORD))!= EOF) if(len>0) root = tree_insert(root,word); tree_print(root); } IJC Jazyk C 71/271
72 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad... vložení do stromu struct treenode * tree_insert(struct treenode *p, const char *w) { int cond; if( p == NULL ) { // nové slovo p = tree_alloc(); // malloc s kontrolou NULL p->word = strdup(w); p->count = 1; p->left = p->right = NULL; } else if( (cond=strcmp(w,p->word)) == 0 ) p->count++; // == slovo se opakuje else if( cond<0 ) // < do levého podstromu p->left = tree_insert(p->left,w); else // > do pravého podstromu p->right = tree_insert(p->right,w); return p; } IJC Jazyk C 72/271
73 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 73/271 Bitová pole (bitfields) Vhodné pro úsporné uložení dat na několika bitech Lze použít pouze uvnitř struktur (a unií) Příklad: struct flags { unsigned is_kw : 1; // uloženo v jednom bitu unsigned is_ext : 1; unsigned : 2; // výplň 2 bity unsigned is_stat : 1; unsigned : 0; // zarovnání na unsigned unsigned num_bit : 12; // uloženo ve 12 bitech } flags; // velikost 2*unsigned
74 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 74/271 Bitová pole pokračování Nevýhody: Pomalejší přístup k položkám Nelze použít operátory & (získání adresy), sizeof ani makro offsetof. Některé detaily jsou definovány implementací: Pořadí obsazování bitů (od LSB nebo od MSB) Položka přesahující konec alokační jednotky je nebo není zarovnána int b:3; může mít hodnoty 0..7 nebo 4..3 Používejte např. unsigned int b:3; Poznámka: Lze nahradit explicitní prací s bitovými operacemi
75 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Unie (1.p union) Všechny položky začínají na stejné adrese (začátek unie) a překrývají se. Platná (aktivní) je vždy jen jedna položka. Použití složek je stejné jako u struktur Inicializovat lze pouze první složku (C90), podle C99+ jakoukoli složku {.name = value } Příklad: union u_tag { if(typ==int) int ival; printf("%d\n", u.ival); float fval; else if(typ==float) char *pval; printf("%f\n", u.fval); } u; else if(typ==string) printf("%s\n", u.pval); else error("chyba"); union u_tag x = { 1 }; //C99+: = {.fval = 0.1 }; IJC Jazyk C 75/271
76 IJC Jazyk C 76/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Ukazatel na funkci obsahuje adresu kódu funkce, může být použit pouze k volání funkce (ukazatelová aritmetika není použitelná). Ukazatel: T (*fp)(void); reprezentuje ukazatel na funkci bez parametrů vracející typ T. Máme-li funkci: T funkce(void) { /* kód funkce */ } potom přiřazení do ukazatele má v ISO C tvar: fp = &funkce; // & lze vynechat Použití ukazatele k volání funkce: (*fp)(); fp(); // volání cílové funkce // lze zkrátit (doporučuji)
77 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad řazení pole ukazatelů na objekty... //*** řadicí algoritmus - netestováno, doladit! void sort( void *v[], unsigned n, int (*cmp)(const void *p1, const void *p2)) { int gap, i, j; for( gap=n/2; gap>0; gap/=2 ) for( i=gap; i<n; i++ ) for( j=i-gap; j>=0; j-=gap ) { void *tmp; if(cmp(v[j],v[j+gap]) <= 0) // porovnání break; tmp = v[j]; // swap v[j] = v[j+gap]; v[j+gap] = tmp; } } IJC Jazyk C 77/271
78 IJC Jazyk C 78/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad dokončení Příklad: Řazení pole ukazatelů použití: char *lineptr[100]; // pole řetězců int nlines;... sort(lineptr,nlines,&strcmp); ^^^^^^^ Problém: konverze kde int strcmp(const char *s1, const char *s2); je standardní funkce z knihovny (viz <string.h>). Poznámka: Standardní knihovna obsahuje qsort()
79 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 79/271 Výčtový typ Příklady Konstanty ve výčtu jsou typu int a mají hodnoty rostoucí postupně od nuly Lze explicitně specifikovat hodnoty položek (konstant) Proměnné výčtového typu jsou kompatibilní s typem int Označení (tag) výčtu nesmí kolidovat: struct A {}; enum A {}; union A {}; je chyba! enum dny { PO, UT, ST, CT, PA, SO, NE }; typedef enum Boolean { FALSE, TRUE } Boolean; enum bitmask { bit0=1, LSB=bit0, bit1, bit2=1<<2, bit3=1<<3, bit4=1<<4 }; enum { RAZ, DVA, TRI } e; // proměnná, "no tag"
80 IJC Jazyk C 80/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Použití výčtu Příklad: enum dny d=po; int i = d; // hodnota 0 d++; // přičte 1, pozor na výsledek printf("%d", d); // vytiskne 1 d = 2; // v C přípustné, ale NEPOUŽÍVAT! Poznámka: V C++ jsou i lepší výčtové typy (enum class)
81 IJC Jazyk C 81/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Operátory Aritmetické operátory + - (binární i unární) * / % modulo Pro komutativní operátory není definováno pořadí vyhodnocení operandů Pozor na operátor % a na výpočty v plovoucí čárce Relační operátory ==!= < > <= >=
82 IJC Jazyk C 82/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Operátory pokračování Logické operátory logické nebo (OR) && logické a (AND)! logické ne (NOT) Zkrácené vyhodnocování: A B je-li A!=0, pak se B nevyhodnocuje A && B je-li A==0, pak se B nevyhodnocuje Příklad: Přestupný rok (Gregoriánský kalendář) (year%4 == 0 && year%100!= 0 year%400 == 0)
83 IJC Jazyk C 83/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Implicitní konverze typů Celočíselná rozšíření (integral promotions): zachovávají hodnotu včetně znaménka char, short int, bitová pole int nebo unsigned Poznámka: argumenty funkcí (...), K&R float double Obvyklé aritmetické konverze u binárních aritmetických operací: 1 Je-li jeden operand typu long double, je druhý převeden na long double a výsledek je také long double 2 jinak, je-li double... 3 jinak, je-li float...
84 IJC Jazyk C 84/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Implicitní konverze typů pokračování Jinak se provedou celočíselná rozšíření pro oba operandy a potom: 1 jestliže oba operandy mají stejný typ neprovádí se další konverze, 2 jinak, jsou-li oba operandy signed nebo oba unsigned převede se vše na typ s větším rozsahem. 3 Jinak, jestliže unsigned typ má větší nebo stejný rozsah, je druhý operand převeden na unsigned. 4 Jinak, jestliže signed operand může reprezentovat všechny hodnoty unsigned operandu, je druhý operand převeden na signed. 5 Jinak jsou oba převedeny na odpovídající unsigned typ.
85 IJC Jazyk C 85/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Problém signed/unsigned char vzniká při převodu znaků na int: signed char int rozsah unsigned char int rozsah Příklad: int getchar(void); /* vrací EOF (tj. -1) nebo znak */ int c; /* musí být typu int!!! */ c = getchar(); if(c==eof)... /* pro char c; bude chybné */
86 IJC Jazyk C 86/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Explicitní konverze (typ) výraz Příklad: problém kontextové operace dělení int i1,i2; double f;... f = i1/i2; f = (double)i1/i2; // celočíselné dělení f = i1/(i2+1.0)
87 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Operátory pokračování Operátory ++ a increment (zvýšení o 1) -- decrement (snížení o 1) ++i před použitím hodnoty prefixový zápis i++ po použití hodnoty postfixový zápis Příklad: int x, n=5; x = n++; /* x = 5, n = 6 */ x = ++n; /* x = 7, n = 7 */ Poznámka: Tyto unární operátory lze použít pouze pro proměnné! (přesněji: L-hodnoty). Nelze například napsat (55+5)++ IJC Jazyk C 87/271
88 IJC Jazyk C 88/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad Příklad: odstranění zadaného znaku z řetězce int squeeze( char s[], char c ) { int i,j; for( i=j=0; s[i]!= \0 ; i++ ) if( s[i]!= c ) s[j++] = s[i]; s[j] = \0 ; }
89 IJC Jazyk C 89/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Operátory pokračování Logické operátory po bitech & bitové AND (bitwise and) bitové OR ^ bitové XOR ~ bitová negace (NOT) Posuny bitů << posun vlevo >> posun vpravo Poznámka: unsigned operand: logický posun, signed operand: nedefinováno/aritmetický posun
90 IJC Jazyk C 90/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad Příklad: čtení bitového pole z proměnné int getbits(unsigned x, unsigned p, unsigned n) { return (x>>(p+1-n)) & ~( ~0 << n) ; } \ / \ / posun na pravý maska okraj slova n jedniček Jak se vyhnout závislosti na počtu bitů slova: ~0 = samé jedničky ve slově libovolné délky (nezávislé) x & ~077 nezávislé na délce slova x & závislé uvažuje 16 bitů
91 IJC Jazyk C 91/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Operátory pokračování Přiřazovací operátory a výrazy += -= *= /= %= <<= >>= &= ^= = Přiřazení má hodnotu a typ levé strany. c1 op= c2 je ekvivalentní c1 = c1 op (c2) Příklad: (pozor na závorky) x *= y + 1 x = x * (y + 1) Není nutné optimalizovat společné podvýrazy, často je čitelnější: yyval[yypv[p3+p4]+yypv[p1+p2]] += 2;
92 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 92/271 Příklad: součet jednotkových bitů int bitcount(unsigned n) { int b; for( b=0; n!= 0; n >>= 1 ) } if(n & 1) b++; return b; // hodnota nejnižšího bitu Poznámka: Pozor na vedlejší efekty i = i++; pole[j] = pole[k]++; // nedefinováno! // nedefinováno pro j==k
93 IJC Jazyk C 93/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Operátory pokračování Podmíněný výraz e1? e2 : e3 Je-li e1!=0, pak výraz má hodnotu e2, jinak e3 Vyhodnocuje se pouze jeden z výrazů e2, e3 Příklad: formátování tisku for(int i=0; i < N; i++) printf("%6d%c", a[i], (i%10==9 i==n-1)? \n : ); Příklad: funkce max int max(int a, int b) { return (a>b)? a : b; }
94 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Priorita a asociativita operátorů operátory asociativita ( ) [ ] ->.! ~ & * (typecast) sizeof * / % + - << >> < <= > >= ==!= & ^ &&?: = *= /= %= += -= &= ^= = <<= >>=, Poznámka: je možné přeskupení komutativních operátorů IJC Jazyk C 94/271
95 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příkazy Výraz-příkaz Výraz se stane příkazem, zapíšeme-li za něj středník. Hodnota takového výrazu se zanedbá. Příklad: x = 0; i++; printf("xxx"); Složený příkaz blok { deklarace příkaz1 příkaz2... příkazn } Poznámky: Za } není středník! (pozor na makra) C99: deklarace proměnných mohou být mezi příkazy IJC Jazyk C 95/271
96 IJC Jazyk C 96/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příkazy pokračování Podmíněný příkaz if( výraz ) příkaz1 [ else příkaz2 ] Poznámka: nejednoznačnost se řeší jako v Pascalu a jiných jazycích: else patří k poslednímu volnému if
97 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 97/271 Příklad: binární vyhledávání /* hledáme x v poli v[] o rozměru n */ int binary( int x, int v[], int n) { int low = 0; int mid; int high = n - 1; while( low<=high ) { mid = (low + high) / 2; if( x<v[mid] ) high = mid - 1; else if ( x>v[mid] ) low = mid + 1; else return mid; /* nalezeno mid */ } return -1; /* nenalezeno */ }
98 IJC Jazyk C 98/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příkazy pokračování Příkaz switch switch( výraz ) { case konstantní_výraz : příkaz1... [ default : příkaznplus1; ] } Poznámka: Pozor: funguje jinak než v Pascalu!
99 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad: počítání číslic, prázdných znaků a ostatních int main() { int c, i, nwhite=0, nother=0, ndigit[10] = { 0, }; while( (c=getchar())!= EOF ) switch(c) { case 0 : case 1 : case 2 : case 3 : case 4 : case 5 : case 6 : case 7 : case 8 : case 9 : ndigit[c- 0 ]++; break; /* nepokračovat */ case : case \n : case \t : nwhite++; break; /* ukončí switch */ default : nother++; break; /* i zde je dobré */ } /* switch i while */ printf("digits = "); for(i=0; i<10; i++) printf(" %d ", ndigit[i]); printf("\n ws=%d, other=%d\n", nwhite, nother); } IJC Jazyk C 99/271
100 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 100/271 Příkazy pokračování Cyklus while while ( <výraz> ) <příkaz> Cyklus for for( <výraz1>; <výraz2>; <výraz3> ) <příkaz> for(;;) <příkaz> // nekonečný cyklus for(int i=0; i<n; i++) // běžné použití pole[i]=0;
101 IJC Jazyk C 101/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příkazy pokračování Příklad: řazení vzestupně (shell-sort) /* funkce řadí pole v[] o rozměru n vzestupně */ void shell(int v[], int n) { int gap, i, j, temp; for( gap=n/2; gap>0; gap/=2) for( i=gap; i<n; i++) for( j=i-gap; j>=0 && v[j]>v[j+gap]; j-=gap) { temp = v[j]; v[j] = v[j+gap]; v[j+gap] = temp; } }
102 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Operátor čárka postupné vyhodnocení výrazů, použití posledního Příklady: void reverse(char s[]) { // obrácení řetězce int i, j; // TODO: pozor na int overflow for( i=0, j=strlen(s)-1; i<j; i++, j--) { int c = s[i]; s[i] = s[j]; s[j] = c; } } assert( ("index x mimo meze", x<max) ); Poznámka: čárky oddělující argumenty funkcí nejsou operátory! IJC Jazyk C 102/271
103 IJC Jazyk C 103/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příkazy pokračování Cyklus do-while do příkaz while( výraz ); // cyklí dokud podmínka platí Poznámky: Provede se alespoň jednou Podle statistik cca 5% cyklů Příklad: konverze čísla na znaky v opačném pořadí do { s[i++] = n % ; }while( (n/=10) > 0 );
104 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příkaz break Ukončuje nejblíže nadřazený příkaz switch, while, for, nebo do-while Příklad: vynechání koncových mezer a tabulátorů int main() { int n; char line[maxline]; while( (n=getline(line,maxline)) > 0 ) { while( --n >= 0 ) if(!isspace(line[n]) ) break; line[n+1] = \0 ; printf("%s\n", line); } return 0; } IJC Jazyk C 104/271
105 IJC Jazyk C 105/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příkaz continue Přeskočí zbytek těla cyklu a pokračuje podmínkou cyklu for( i=0; i<n; i++ ) { if( a[i] < 0 ) continue;... /* pouze pro >= 0 */ } Poznámka: Eliminace zanoření těla cyklu
106 IJC Jazyk C 106/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příkaz goto a návěští Použitelné pouze v rámci jedné funkce void f() { //... goto identifikátor; //... identifikátor : příkaz; //... } Poznámky: Používat opatrně, minimalizovat použití Nikdy neskákat do strukturovaných příkazů
107 IJC Jazyk C 107/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Příklad praktické použití skoku int f() { for (...) for (...) { // 2. úroveň //... if (chyba) goto error; //... } return kladny_vysledek; error: // ošetření chyby return -1; }
108 IJC Jazyk C 108/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Funkce typ jméno ( deklarace_parametrů ) { deklarace lokálních proměnných příkazy // C99: i deklarace } Funkce může vracet struktury, unie ale ne pole Příkaz return return; /* u funkce void f() */ return e; /* e=výraz kompatibilní s typem fce */ Poznámky: C99+: inline funkce, C11: _Noreturn
109 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Rekurze viz Rekurze. Příklad: výpis celého čísla desítkově void printd(int n) { int i; if(n<0) { putchar( - ); n = -n; } if((i=n/10)!= 0) printd(i); putchar(n% ); } // rekurze Poznámka: tail recursion IJC Jazyk C 109/271
110 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 110/271 Argumenty funkcí jsou předávány hodnotou pole se předávají odkazem (ukazatel na první prvek) problémy s funkcemi s proměnným počtem argumentů C99: func,... Poznámka: API, ABI
111 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 111/271 Argumenty funkcí pokračování Funkce s proměnným počtem argumentů typ f(typ1 parametr1,... ); // variadic function Musí být alespoň jeden pevný parametr Funkce musí mít informace o skutečném počtu argumentů při zavolání va_list, va_start(), va_arg(), va_end() Příklad: Standardní funkce s proměnným počtem argumentů int printf(const char *fmt,... ); int sprintf(char *s, const char *fmt,... );
112 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Externí proměnné Program = množina globálních proměnných a funkcí Globální proměnné Jsou to statické proměnné Inicializace při překladu (Použití např. pro omezení počtu argumentů funkcí) Deklarace funkce je implicitně externí (extern je zbytečné): extern int plus(int,int); int plus(int,int); U proměnných je podstatný rozdíl: extern int a; int a; // definice Použití: extern deklarace před použitím, modularita Poznámka: C89: nedeklarované funkce: extern int f(); IJC Jazyk C 112/271
113 IJC Jazyk C 113/271 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra Rozsah platnosti (scope) Úsek programu, ve kterém je jméno definované automatické proměnné blok globální proměnné od deklarace do konce souboru jména parametrů prototyp, funkce návěští funkce
114 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 114/271 Statické proměnné existují trvale bez ohledu na aktivaci funkcí Pozor: proměnná nebo funkce označená static je platná pouze v rámci souboru (modulu) a není viditelná z jiných modulů Příklad: int count; // statická a externí static char buffer[100]; // statická a ne-externí static int plus(int a, int b) // statická=ne-externí { static int s = 1; // statická a lokální int n = a + buffer[b]; // automatická=lokální return s = (n + count*s); }
115 Úvod ISO C libc C99 11 Debug C++ Link Opt... Úvod Ukazatele Operátory Příkazy Moduly Makra IJC Jazyk C 115/271 Proměnné register Pokud je to možné, jsou uloženy v registru procesoru (rychlost) Pouze pro automatické proměnné Nelze získat ukazatel na registrovou proměnnou Příklad: int swap(int *x, int *y) { register int tmp = *x; *x = *y; *y = tmp; }
Charakteristika jazyka C
Pravidla Literatura Úvod Pravidla Literatura Pravidla IJC Jazyk C Petr Peringer peringer AT fit.vutbr.cz Vysoké učení technické v Brně Fakulta informačních technologií, Božetěchova 2, 612 66 Brno (Verze:
Wstęp do programowania 1
Wstęp do programowania 1 Struktury Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 12 Struktura dla dat - przykład #include struct Date { int y; short m; short
Reprezentace dat. BI-PA1 Programování a Algoritmizace I. Ladislav Vagner
Reprezentace dat BI-PA1 Programování a Algoritmizace I. Ladislav Vagner Katedra teoretické informatiky Fakulta informačních technologíı ČVUT v Praze xvagner@fit.cvut.cz 9., 11. a 12. října 2017 Obsah Dvojková
Programowanie Proceduralne
Programowanie Proceduralne Struktury Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 10 Co dziś będzie: Definiowanie struktury Deklarowanie zmiennych bȩda cych strukturami
Martin Pergel. 26. února Martin Pergel
26. února 2017 Užitečné informace Navážeme na Programování I, změníme jazyk na C#, podrobnosti o C# budou v navazujícím kurzu, soustředíme se na totéž, co v zimě, tedy: technické programování, návrh a
PROGRAMOWANIE w C prolog
PROGRAMOWANIE w C prolog dr inż. Jarosław Stańczyk Uniwersytet Przyrodniczy we Wrocławiu Wydział Biologii i Hodowli Zwierząt Katedra Genetyki 1 / jaroslaw.stanczyk@up.wroc.pl programowanie w c 17.10.2014
B0B99PRPA Procedurální programování
B0B99PRPA Procedurální programování Řidící struktury, výrazy Stanislav Vítek Katedra radioelektroniky Fakulta elektrotechnická České vysoké učení v Praze 1/48 Přehled témat Část 1 Řídicí struktury Kódovací
Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe
Wykład 15 Wprowadzenie do języka na bazie a Literatura Podobieństwa i różnice Literatura B.W.Kernighan, D.M.Ritchie Język ANSI Kompilatory Elementarne różnice Turbo Delphi FP Kylix GNU (gcc) GNU ++ (g++)
(1) Derivace. Kristýna Kuncová. Matematika B2 17/18. Kristýna Kuncová (1) Derivace 1 / 35
(1) Derivace Kristýna Kuncová Matematika B2 17/18 Kristýna Kuncová (1) Derivace 1 / 35 Růst populací Zdroj : https://www.tes.com/lessons/ yjzt-cmnwtvsq/noah-s-ark Kristýna Kuncová (1) Derivace 2 / 35 Růst
B0B99PRPA Procedurální programování. Stanislav Vítek
3. Základní řidící struktury B0B99PRPA Procedurální programování Stanislav Vítek Katedra radioelektroniky Fakulta elektrotechnická České vysoké učení v Praze 1/40 Přehled témat Y Část 1 Programování v
B0B99PRPA Procedurální programování
B0B99PRPA Procedurální programování Základní řidící struktury Stanislav Vítek Katedra radioelektroniky Fakulta elektrotechnická České vysoké učení v Praze 1/40 Přehled témat Část 1 Programování v C Zdrojové
Úvodní informace. 18. února 2019
Úvodní informace Funkce více proměnných Cvičení první 18. února 2019 Obsah 1 Úvodní informace. 2 Funkce více proměnných Definiční obor Úvodní informace. Komunikace: e-mail: olga@majling.eu nebo olga.majlingova@fs.cvut.cz
Programowanie strukturalne język C - wprowadzenie
Programowanie strukturalne język C - wprowadzenie Dr inż. Sławomir Samolej D102 C, tel: 865 1766, email: ssamolej@prz-rzeszow.pl WWW: ssamolej.prz-rzeszow.pl Cechy programowania strukturalnego Możliwość
Aproximace funkcí 1,00 0,841 1,10 0,864 1,20 0,885. Body proložíme lomenou čarou.
Příklad Známe následující hodnoty funkce Φ: u Φ(u) 1,00 0,841 1,10 0,864 1,20 0,885 Odhadněte přibližně hodnoty Φ(1,02) a Φ(1,16). Možnosti: Vezmeme hodnotu v nejbližším bodě. Body proložíme lomenou čarou.
Wykład 1
Wstęp do programowania 1 Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 1 Wprowadzenie Cel wykładów z programowania proceduralnego Wykład jest poświęcony językowi C i jego
Komplexní analýza. Martin Bohata. Katedra matematiky FEL ČVUT v Praze Martin Bohata Komplexní analýza Mocninné řady 1 / 18
Komplexní analýza Mocninné řady Martin Bohata Katedra matematiky FEL ČVUT v Praze bohata@math.feld.cvut.cz Martin Bohata Komplexní analýza Mocninné řady 1 / 18 Posloupnosti komplexních čísel opakování
Literatura. Zdroje informací. Tyto slajdy jsou určeny pro předmět ICP na FIT VUT v Brně. Obsahují základní popis jazyka C++ vhodný pro studenty, kteří
Úvod Jazyk Knihovny C++11/14/17 Úvod Úvod Jazyk Knihovny C++11/14/17 Literatura Seminář C++ Petr Peringer peringer AT fit.vutbr.cz Vysoké učení technické v Brně, Fakulta informačních technologií, Božetěchova
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Kristýna Kuncová. Matematika B3
(10) Vícerozměrný integrál II Kristýna Kuncová Matematika B3 Kristýna Kuncová (10) Vícerozměrný integrál II 1 / 30 Transformace Otázka Jaký obrázek znázorňuje čtverec vpravo po transformaci u = x + y a
Wstęp do programowania 1
Wstęp do programowania 1 Argumenty funkcji main Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 11 Argumenty funkcji main dwa równoważne sposoby int main(int argc, char*
TGH01 - Algoritmizace
TGH01 - Algoritmizace Jan Březina Technical University of Liberec 28. února 2017 Co je to algoritmus? Porovnávání algoritmů Porovnávání algoritmů Co je to algoritmus? Který algoritmus je lepší? Záleží
Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1 Pętle Pętla jest konstrukcją sterującą stosowaną w celu wielokrotnego wykonania tego samego zestawu instrukcji jednokrotne
Kristýna Kuncová. Matematika B2 18/19
(6) Určitý integrál Kristýna Kuncová Matematika B2 18/19 Kristýna Kuncová (6) Určitý integrál 1 / 28 Newtonův integrál Zdroj: https://kwcalculus.wikispaces.com/integral+applications Kristýna Kuncová (6)
ggplot2 Efektní vizualizace dat v prostředí jazyka R Martin Golasowski 8. prosince 2016
ggplot2 Efektní vizualizace dat v prostředí jazyka R Martin Golasowski 8. prosince 2016 Jak vizualizovat? Požadované vlastnosti nástroje opakovatelnost, spolehlivost separace formy a obsahu flexibilita,
Programowanie strukturalne język C
Programowanie strukturalne język C Dr inż. Sławomir Samolej D102 C, tel: 865 1766, email: ssamolej@prz-rzeszow.pl WWW: ssamolej.prz-rzeszow.pl S. Samolej - Informatyka 1 Cechy programowania strukturalnego
1. Brian W. Kernighan, Dennis M. Ritchie, Język ANSI C, WNT, Warszawa 1998.
Literatura Język C 1. Brian W. Kernighan, Dennis M. Ritchie, Język ANSI C, WNT, Warszawa 1998. 2. Andrzej Zalewski, Programowanie w językach C i C++ z wykorzystaniem pakietu Borland C++, Nakom, Poznań
Języki i metody programowania. Omówienie języków C, C++ i Java
Języki i metody programowania Omówienie języków C, C++ i Java Język C Język programowania ogólnego przeznaczenia Historia: M. Richards - BCPL - lata 60-te ubiegłego stulecia K. Thompson - B dla UNIX (DEC
Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1
Typy złożone Struktury, pola bitowe i unie. Programowanie Proceduralne 1 Typy podstawowe Typy całkowite: char short int long Typy zmiennopozycyjne float double Modyfikatory : unsigned, signed Typ wskaźnikowy
Quick sort, spojové struktury
Quick sort, spojové struktury BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních
Internet a zdroje. (Zdroje na Internetu) Mgr. Petr Jakubec. Katedra fyzikální chemie Univerzita Palackého v Olomouci Tř. 17.
Internet a zdroje (Zdroje na Internetu) Mgr. Petr Jakubec Katedra fyzikální chemie Univerzita Palackého v Olomouci Tř. 17. listopadu 12 26. listopadu 2010 (KFC-INTZ) Databáze, citování 26. listopadu 2010
Obsah Atributová tabulka Atributové dotazy. GIS1-2. cvičení. ČVUT v Praze, Fakulta stavební, katedra mapování a kartografie
ČVUT v Praze, Fakulta stavební, katedra mapování a kartografie září 2010 prezentace 1 2 Obecně otevření atributové tabulky (vlastnosti vrstvy Open Attribute Table) řádky v tabulce jednotlivé záznamy (objekty)
Elementární funkce. Edita Pelantová. únor FJFI, ČVUT v Praze. katedra matematiky, FJFI, ČVUT v Praze
Elementární funkce Edita Pelantová FJFI, ČVUT v Praze Seminář současné matematiky katedra matematiky, FJFI, ČVUT v Praze únor 2013 c Edita Pelantová (FJFI) Elementární funkce únor 2013 1 / 19 Polynomiální
Funkce zadané implicitně. 4. března 2019
Funkce zadané implicitně 4. března 2019 Parciální derivace druhého řádu Parciální derivace druhého řádu funkce z = f (x, y) jsou definovány: Parciální derivace 2 f 2 = ( ) f 2 f 2 = ( ) f 2 f a 2 f 2 f
Automatové modely. Stefan Ratschan. Fakulta informačních technologíı. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Automatové modely Stefan Ratschan Katedra číslicového návrhu Fakulta informačních technologíı České vysoké učení technické v Praze Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Stefan
TGH01 - Algoritmizace
TGH01 - Algoritmizace Jan Březina Technical University of Liberec 31. března 2015 Metainformace materiály: jan.brezina.matfyz.cz/vyuka/tgh (./materialy/crls8.pdf - Introduction to algorithms) SPOX: tgh.spox.spoj.pl
Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C
Grzegorz Cygan Wstęp do programowania mikrosterowników w języku C Mikrosterownik Inne nazwy: Microcontroler (z języka angielskiego) Ta nazwa jest powszechnie używana w Polsce. Mikrokomputer jednoukładowy
Podstawy języka C++ Marek Pudełko
Podstawy języka C++ Marek Pudełko Elementy języka C++ identyfikatory, słowa kluczowe, stałe i teksty, operatory, separatory, odstępy, komentarze. 2 Komentarz Komentarz to opis działania danego fragmentu
Programowanie I C / C++ laboratorium 03 arytmetyka, operatory
Programowanie I C / C++ laboratorium 03 arytmetyka, operatory Jarosław Piersa Wydział Matematyki i Informatyki, Uniwersytet Mikołaja Kopernika 2013-02-19 Typ znakowy Typ znakowy Typ wyliczeniowy # include
Język ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
Numerické metody minimalizace
Numerické metody minimalizace Než vám klesnou víčka - Stříbrnice 2011 12.2. 16.2.2011 Emu (Brkos 2011) Numerické metody minimalizace 12.2. 16.2.2011 1 / 19 Obsah 1 Úvod 2 Základní pojmy 3 Princip minimalizace
Język C - podstawowe informacje
Język C - podstawowe informacje Michał Rad AGH Laboratorium Maszyn Elektrycznych 2014-12-05 Outline Program w języku C Funkcje Składnia Instrukcje sterujace Na koniec... Po kolei napisać program (zwykły
wykład I uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Wstęp do języka C wykład I dr Jarosław Mederski Spis Ogólne informacje
Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 2 3 4 5 6 7 Charakter wykładu ˆ zakłada znajomość idei programowania strukturalnego (np. w Pascalu) oraz podstaw używania środowiska UNIX (wykonywanie
5. a 12. prosince 2018
Integrální počet Neurčitý integrál Seminář 9, 0 5. a. prosince 08 Neurčitý integrál Definice. Necht funkce f (x) je definovaná na intervalu I. Funkce F (x) se nazývá primitivní k funkci f (x) na I, jestliže
Uzupełnienie dot. przekazywania argumentów
Uzupełnienie dot. przekazywania argumentów #include #include struct nowa { int f; char line[20000]; int k; } reprezentant; int main() { void funkcja7( struct nowa x); reprezentant.k=17;
1 Soustava lineárních rovnic
Soustavy lineárních rovnic Aplikovaná matematika I Dana Říhová Mendelu Brno Obsah 1 Soustava lineárních rovnic 2 Řešitelnost soustavy lineárních rovnic 3 Gaussova eliminační metoda 4 Jordanova eliminační
Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?
Zadanie 01 W przedstawionym ponizej programie w jezyku ANSI C w miejscu wykropkowanym brakuje jednej linii: #include... int main() { printf("tralalalala"); return 0; } A. B. "iostream" C.
Matematika 2, vzorová písemka 1
Matematika 2, vzorová písemka Pavel Kreml 9.5.20 Přesun mezi obrazovkami Další snímek: nebo Enter. Zpět: nebo Shift + Enter 2 3 4 Doporučení Pokuste se vyřešit zadané úlohy samostatně. Pokud nebudete vědět
PA152,Implementace databázových systémů 2 / 25
PA152 Implementace databázových systémů Pavel Rychlý pary@fi.muni.cz Laboratoř zpracování přirozeného jazyka http://www.fi.muni.cz/nlp/ 19. září 2008 PA152,Implementace databázových systémů 1 / 25 Technické
Pobieranie argumentów wiersza polecenia
Pobieranie argumentów wiersza polecenia 2. Argumenty wiersza polecenia Lista argumentów Lista argumentów zawiera cały wiersz poleceń, łącznie z nazwą programu i wszystkimi dostarczonymi argumentami. Przykłady:
Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego
Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego 1 /24 Pisanie pojedynczych znaków z klawiatury do pliku #include void main(void) { FILE *fptr; // wkaznik do pliku, tzw. uchwyt
Necht je funkce f spojitá v intervalu a, b a má derivaci v (a, b). Pak existuje bod ξ (a, b) tak, že f(b) f(a) b a. Geometricky
Monotónie a extrémy funkce Diferenciální počet - průběh funkce Věta o střední hodnotě (Lagrange) Necht je funkce f spojitá v intervalu a, b a má derivaci v (a, b). Pak existuje bod ξ (a, b) tak, že f (ξ)
Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory
Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory Jarosław Piersa Wydział Matematyki i Informatyki, Uniwersytet Mikołaja Kopernika 2013-02-19 Pętla while Pętla while Pętla
wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,
, Programowanie, uzupełnienie notatek: dr Jerzy Białkowski , 1 2 3 4 , Wczytywanie liczb , Wczytywanie liczb 1 #include 2 #include < s t d l i b. h> 3 4 int main ( ) { 5 int rozmiar, numer
Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016
Wykład 1 3 marca 2016 Słowa kluczowe języka Java abstract, break, case, catch, class, const, continue, default, do, else, enum, extends, final, finally, for, goto, if, implements, import, instanceof, interface,
Czy procesor musi się grzać?
Czy procesor musi się grzać? Np. dodawanie 2 liczb 1-bitowych. Możliwych stanów początkowych: cztery Możliwych stanów końcowych: dwa to można opisać jako zmianę entropii zmiana entropii = (stała Boltzmanna)
Co nám prozradí derivace? 21. listopadu 2018
Co nám prozradí derivace? Seminář sedmý 21. listopadu 2018 Derivace základních funkcí Tečna a normála Tečna ke grafu funkce f v bodě dotyku T = [x 0, f (x 0 )]: y f (x 0 ) = f (x 0 )(x x 0 ) Normála: y
Materiały. Języki programowania II (Java+AVR-GCC) Literatura
Języki programowania II (Java+AVR-GCC) http://abm.p.lodz.pl dr inż. Michał Ludwicki Literatura Materiały Mikrokontrolery AVR Język C Podstawy programowania Mirosław Kardaś, Atnel, Szczecin, 2011. Specyfikacja
Programowanie obiektowe
Programowanie obiektowe Wykład 2: Wstęp do języka Java 3/4/2013 S.Deniziak: Programowanie obiektowe - Java 1 Cechy języka Java Wszystko jest obiektem Nie ma zmiennych globalnych Nie ma funkcji globalnych
Na ekranie monitora zostaną wyświetlone w dwu liniach teksty Pierwsza linia Druga linia
Struktura programu W programach napisanych w C++ litery wielkie i małe są rozróżniane i często po nauce Pascala są przyczyną błędów. Program napisany w języku C++ składa się zazw yczaj z następujących
Cauchyova úloha pro obyčejnou diferenciální rovnici
Řešení ODR v MATLABu Přednáška 3 15. října 2018 Cauchyova úloha pro obyčejnou diferenciální rovnici y = f (x, y), y(x 0 ) = y 0 Víme, že v intervalu a, b existuje jediné řešení. (f (x, y) a f y jsou spojité
Program w C. wer. 10 z drobnymi modyfikacjami! Wojciech Myszka :28:
Program w C wer. 10 z drobnymi modyfikacjami! Wojciech Myszka 2015-05-02 18:28:29 +0200 Tak wygląda program w języku C 1 / Hello World in C, Ansi s t y l e / 2 #include < s t d i o. h> 3 i n t main ( void
Podstawy programowania. Wykład 2 Zmienne i obsługa wejścia/wyjścia. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 2 Zmienne i obsługa wejścia/wyjścia Krzysztof Banaś Podstawy programowania 1 Programowanie Programowanie typowe kroki zapis kodu źródłowego w pliku tekstowym kompilacja usuwanie
Programowanie strukturalne i obiektowe
Programowanie strukturalne i obiektowe Język C część I Opracował: Grzegorz Flesik Literatura: A. Majczak, Programowanie strukturalne i obiektowe, Helion, Gliwice 2010 P. Domka, M. Łokińska, Programowanie
Inżynieria Wytwarzania Systemów Wbudowanych
GUT Intel 2015/16 1/30 Inżynieria Wytwarzania Systemów Wbudowanych Wykład 3 Iwona Kochańska Katedra Systemów Elektroniki Morskiej WETI PG October 18, 2018 Dobre praktyki GUT Intel 2015/16 2/30 Przenośność
Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.
Typy, operatory, wyrażenia. Wejście i wyjście. Typy, operatory, wyrażenia Zmienna: [] [ '[' ']' ] ['=' ]; Zmienna to fragment pamięci o określonym
Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/YOS: Přednáška II. 6. říjen, / 26
Operační systémy Řízení výpočtu Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci Petr Krajča (UP) KMI/YOS: Přednáška II. 6. říjen, 2017 1 / 26 Reprezentace hodnot záporná čísla jsou v doplňkovém
Matematika (KMI/PMATE)
Matematika (KMI/PMATE) Úvod do matematické analýzy Limita a spojitost funkce Matematika (KMI/PMATE) Osnova přednášky lineární funkce y = kx + q definice lineární funkce význam (smysl) koeficientů lineární
Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak
Katedra Elektrotechniki Teoretycznej i Informatyki wykład 12 - sem.iii M. Czyżak Język C - preprocesor Preprocesor C i C++ (cpp) jest programem, który przetwarza tekst programu przed przekazaniem go kompilatorowi.
nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof
nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof 1 adres zmiennej Do pobrania adresu zmiennej używa się jednoargumentowego operatora & (uwaga & może mieć także znaczenie dwuargumentowego
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float
Logika V. RNDr. Kateřina Trlifajová PhD. Katedra teoretické informatiky Fakulta informačních technologíı BI-MLO, ZS 2011/12
Logika V. RNDr. Kateřina Trlifajová PhD. Katedra teoretické informatiky Fakulta informačních technologíı České vysoké učení technické v Praze c Kateřina Trlifajová, 2010 BI-MLO, ZS 2011/12 Evropský sociální
Inne darmowe! kompilatory języka C działające m.in. po systemem WINDOWS:
Inne darmowe! kompilatory języka C działające m.in. po systemem WINDOWS: IDE (ang. integrated development environment) działające online [ nie trzeba niczego instalować! ]: https://www.onlinegdb.com Wielosystemowe
Programowanie Proceduralne
Programowanie Proceduralne Unie, typdef, opeartory bitowe, operator przecinkowy Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 11 Definicja Unia (ang. union) jest typem,
Program w C. wer. 12 z drobnymi modyfikacjami! Wojciech Myszka :59:
Program w C wer. 12 z drobnymi modyfikacjami! Wojciech Myszka 2018-06-29 14:59:06 +0200 Tak wygląda program w języku C 1 /* H e l l o World i n C, Ansi s t y l e */ 2 # i n c l u d e < s t d i o. h> 3
Linea rnı (ne)za vislost
[1] Lineární (ne)závislost Skupiny, resp. množiny, vektorů mohou být lineárně závislé nebo lineárně nezávislé... a) zavislost, 3, b) P. Olšák, FEL ČVUT, c) P. Olšák 2010, d) BI-LIN, e) L, f) 2009/2010,
Języki programowania - podstawy
Języki programowania - podstawy Andrzej Dudek Wydział Techniczno Informatyczny W Jeleniej Górze Dudek A. Informatyka przemysłowa tendencje i wyzwania 26.10.2015 1 /24 Algorytm określony sposób rozwiązania
Struktury czyli rekordy w C/C++
Struktury czyli rekordy w C/C++ Wprowadzenie do programowania w języku C struktury. pola bitowe, unie Struktury (rekordy) są złożonymi zmiennymi, składającymi się z elementów różnych typów zwanych polami,
20. Pascal i łączenie podprogramów Pascala z programem napisanym w C
Opublikowano w: WEREWKA J..: Podstawy programowana dla automatyków. Skrypt AGH Nr 1515, Kraków 1998 20. i łączenie podprogramów a z programem napisanym w Ze względu na duże rozpowszechnienie języka, szczególnie
IEL Přechodové jevy, vedení
Přechodové jevy Vedení IEL/přechodové jevy 1/25 IEL Přechodové jevy, vedení Petr Peringer peringer AT fit.vutbr.cz Vysoké učení technické v Brně, Fakulta informačních technologíı, Božetěchova 2, 61266
Język programowania C51 dla mikroprocesorów rodziny MCS51
Język programowania C51 dla mikroprocesorów rodziny MCS51 Typy danych Typ danej Rozmiar Zakres wartości bit 1 bit 0 lub 1 signed char 1 bajt -128 do +127 unsigned char 1 bajt 0 do 255 signed int 2 bajty
Microsoft IT Academy kurs programowania
Microsoft IT Academy kurs programowania Podstawy języka C# Maciej Hawryluk Język C# Język zarządzany (managed language) Kompilacja do języka pośredniego (Intermediate Language) Kompilacja do kodu maszynowego
dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )
dynamiczny przydział pamięci malloc() free() realloc() calloc() memset() memcpy( ) mempcpy( ) memmove() (wskaźniki!! ) 1 dynamiczny przydział pamięci void * memccpy (void * to, void * from, int c, int
۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]
1 Plik jest wydzielonym fragmentem pamięci (najczęściej dyskowej) posiadającym nazwę. Z punktu widzenia C plik jest ciągiem bajtów, z których każdy może zostać oddzielnie odczytany. Zgodnie ze standardem
Kristýna Kuncová. Matematika B2
(3) Průběh funkce Kristýna Kuncová Matematika B2 Kristýna Kuncová (3) Průběh funkce 1 / 26 Monotonie (x 2 ) = 2x (sin x) = cos x Jak souvisí derivace funkce a fakt, zda je funkce rostoucí nebo klesající?
Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia Krzysztof Banaś Podstawy programowania 1 Typy danych Podstawowe wbudowane typy danych języka C: _Bool 0 i 1 (C99) znaki (char) 7
Język ANSI C. Pierwsze starcie. Programowanie Proceduralne 1
Język ANSI C Pierwsze starcie. Programowanie Proceduralne 1 Znowu trochę historii 1972 Dennis Ritchie (Bell Labs.,New Jersey), projekt języka C na bazie języka B 1973 UNIX, jądro w C, pierwszy przenośny
Co nie powinno być umieszczane w plikach nagłówkowych:
Zawartość plików nagłówkowych (*.h) : #include #define ESC 27 dyrektywy dołączenia definicje stałych #define MAX(x,y) ((x)>(y)?(x):(y)) definicje makr int menu(char* tab[], int ilosc); struct
Funkcja (podprogram) void
Funkcje Co to jest funkcja? Budowa funkcji Deklaracja, definicja i wywołanie funkcji Przykłady funkcji definiowanych przez programistę Przekazywanie argumentów do funkcji Tablica jako argument funkcji
Matematika III Stechiometrie stručný
Matematika III Stechiometrie stručný matematický úvod Miroslava Dubcová, Drahoslava Janovská, Daniel Turzík Ústav matematiky Přednášky LS 2015-2016 Obsah 1 Zápis chemické reakce 2 umožňuje jednotný přístup
Języki i metodyka programowania. Wprowadzenie do języka C
Literatura: Brian W. Kernighan, Dennis M. Ritchie Język Ansi C, Wydawnictwa Naukowo - Techniczne, 2007 http://cm.bell-labs.com/cm/cs/cbook/index.html Scott E. Gimpel, Clovis L. Tondo Język Ansi C. Ćwiczenia
Edita Pelantová, katedra matematiky / 16
Edita Pelantová, katedra matematiky seminář současné matematiky, září 2010 Axiomy reálných čísel Axiomy tělesa Axiom 1. x + y = y + x a xy = yx (komutativní zákon). Axiom 2. x + (y + z) = (x + y) + z a
Wykład I. Programowanie. dr inż. Janusz Słupik. Gliwice, 2014. Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik
Wykład I I Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Zaliczenie przedmiotu Na laboratorium można zdobyć 100 punktów. Do zaliczenia niezbędne jest
Bardzo szybkie podsumowanie: wykład 1 wer. 6 z drobnymi modyfikacjami!
Bardzo szybkie podsumowanie: wykład 1 wer. 6 z drobnymi modyfikacjami! Wojciech Myszka 2016-05-08 17:54:50 +0200 Uwagi 1. Obowiązuje cały materiał! 2. Tu tylko podsumowanie. Program w C wer. 11 z drobnymi
Języki i metody programowania I
Języki i metody programowania I dr inż. Piotr Szwed Katedra Informatyki Stosowanej C2, pok. 403 e-mail: pszwed@agh.edu.pl http://home.agh.edu.pl/~pszwed/ Aktualizacja: 2012-10-17 2. Podstawy składni języka
Stałe i zmienne znakowe. Stała znakowa: znak
Stałe i zmienne znakowe. Stała znakowa: znak Na przykład: a, 1, 0 c Każdy znak jest reprezentowany w pamięci przez swój kod. Kody alfanumerycznych znaków ASCII to liczby z przedziału [32, 127]. Liczby
Biblioteka standardowa - operacje wejścia/wyjścia
Biblioteka standardowa - operacje wejścia/wyjścia Przemysław Gawroński D-10, p. 234 Wykład 6 15 stycznia 2019 (Wykład 6) Biblioteka standardowa - operacje wejścia/wyjścia 15 stycznia 2019 1 / 14 Outline
Podstawy Programowania
Podstawy Programowania Wykład XI Przetwarzanie napisów, drzewa binarne Robert Muszyński Katedra Cybernetyki i Robotyki, PWr Zagadnienia: reprezentacja napisów znakowych, operowanie na napisach: porównywanie,
MATEMATIKA 3. Katedra matematiky a didaktiky matematiky Technická univerzita v Liberci
MATEMATIKA 3 Dana Černá http://www.fp.tul.cz/kmd/ Katedra matematiky a didaktiky matematiky Technická univerzita v Liberci Osnova: Komplexní funkce - definice, posloupnosti, řady Vybrané komplexní funkce
Podstawy Programowania. Przetwarzanie napisów, drzewa binarne
Podstawy Programowania Wykład XI Przetwarzanie napisów, drzewa binarne Robert Muszyński ZPCiR ICT PWr Zagadnienia: reprezentacja napisów znakowych, operowanie na napisach: porównywanie, kopiowanie, łączenie,
ECLIPSE wnioski z dwóch pierwszych laboratoriów
PODSTAWY PROGRAMOWANIA 3-4 WYKŁAD 22-10-2015 ECLIPSE wnioski z dwóch pierwszych laboratoriów Dodanie pliku i konfiguracji startowej (każdy uruchamiany program powinien mieć własna konfigurację startową)