Algoritmizace a programování Jazyk C výrazy České vysoké učení technické Fakulta elektrotechnická Ver.1.10 J. Zděnek 2015
Struktura programu (1) Program v C se skládá z následujících součástí: Příkazy preprocesoru (Preprocessor commands) Definice typů (type definitions) Prototypy funkcí (function prototypes) kde je uvedena deklarace: Jména funkce Vstupních parametrů Návratové hodnoty funkce Proměnné (variables) Funkce (functions) (v C je procedura funkce bez návratové hodnoty) A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 2
Funkce v C mají tento tvar: Struktura programu (2) Každý program musí obsahovat právě jednu funkci main() Všechny funkce (včetně main()) mají jednotný formát: typ_navrat_hodnoty jmeno_fce (parametry_fce){ lokalni promenne prikazy } Uvnitř funkce nelze definovat lokální funkce (definice funkci nesmí být vnořené) Na formátování zdrojového textu překladači nezáleží. Formátování zlepšuje autorovi (i ostatním) čitelnost a potlačuje chyby. A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 3
Model kompilace (1) soubor2.h soubor1.c Header soubor3.c Source code Source code 1) Preprocessor Zdroj.kód C Zdroj.kód ASM 2) Compiler Assembly code 3) Assembler Object code soubor4.asm Source code soubor5.lib Libraries Knihovny 4) Linker Spustitelný kód Executable code A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 4
Model kompilace (2) Vytvoření spustitelného kódu (viz obr): 1) Preprocesor: Čte zdrojový kód v C Odstraní komentáře Upraví zdrojový text podle direktiv preprocesoru (řádky začínající #) Vloží do textu obsah jiného souboru #include. Odebere text vymezený direktivami podmíněného překladu Expanduje makra 2) Překladač C: Čte výstup z preprocesoru Kontroluje syntaktickou správnost textu Hlásí chyby a varování Generuje text v assembleru (když nejsou chyby) A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 5
Model kompilace (3) Vytvoření spustitelného kódu (viz obr): 3) Assembler: Čte výstup z překladače C Generuje relokovatelný object kód (kód s nevyřešenými odkazy mezi moduly) Přeloží případné moduly zapsané přímo v assembleru (mix programovacích jazyků) 4) Linker (spojovací program): Čte object kód všech zůčastněných modulů programu Připojí knihovní object moduly (přeložené dříve nebo dodané), Vyřeší odkazy mezi moduly Generuje spustitelný kód (zjednodušené) A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 6
Soubor platných znaků (ASCII) (1) C - základní soubor znaků: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m h o p q r s t u v x y z 0 1 2 3 4 5 6 7 8 9! # % & ( ) * +, -. / : ; < = >? [ \ ] ^? _ { } ~ Oddělovače (whitespace characters) space, horizontal tab, vertical tab, newline, form feed \0 - null char (koncový znak řetězce) A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 7
Soubor platných znaků (ASCII) (2) C - základní soubor znaků (pokrač.): Řídicí znaky pro řízení výstupních zařízení (escape sequences) Escape sequence Výstup Escape sequence Výstup \a Beep (pípnutí) \ Znak \b Backspace \ Znak \f Form feed \? Znak? \n Newline \\ Znak \ \r Carriage return \o \oo \ooo o=osmičkové ( př: \741 ) číslice (octal dig) \t Horizontal tab \xh h =šestnáctkové ( př: \x1008 ) číslice (hex dig.) \v Vertical tab C - ostatní znaky: Mohou se použít v komentářích, řetězcích a znakových konstantách A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 8
Identifikátory C - pravidla pro volbu identifikátorů: Obsahuje A,..,Y,a,..,z,0,..,9 a znak _ (underscore) První znak není číslice Rozlišují se velká a malá písmena (case sensitive) Délka identifikátoru není omezena, ale pouze 31 prvních znaků je významných (může se lišit podle implementace) C - rezervovaná slova (keywords): Musí být zapsaná malými písmeny auto default float register struct volatile break do for return switch while case double goto short typedef char else if signed union const enum int sizeof unsigned continue extern long static void A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 9
Datové typy Při návrhu algoritmů a psaní programů ve vyšších programovacích jazycích abstrahujeme od binární podoby paměti počítače S daty pracujeme jako s hodnotami různých datových typů, které jsou uloženy v datových objektech Datový typ (zkráceně jen typ) specifikuje: množinu hodnot (+ reprezentace) množinu operací, které lze s hodnotami daného typu provádět Příklad typu: celočíselný typ int v jazyku C: množinou hodnot jsou celá čísla (interval je závislý na implementaci) množinu operací tvoří aritmetické operace +, -, *, /, jejichž výsledkem je hodnota typu int relační operace ==,!=, >, >=, <, <=, jejichž výsledkem je logická hodnota. V jazyce C není zavedena logický typ proměnné. Logický stav se vyhodnocuje dle hodnoty číselné proměnné kde: = 0 znamená "false", 0 znamená "true" A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 10
Reprezentace dat v počítači bit (binary digit dvojková číslice; angl. bit drobek, kousek) základní a nejmenší jednotky informace nabývá hodnot 0 nebo 1 byte (též bajt, česky - slabika) uspořádaná osmice bitů 0 1 1 0 0 1 1 1 Násobky 1 kb = 1 000 bajtů (dekadický kilobajt, malé k ) 1 KB = 1 024 bajtů = 2 10 (binární kilobajt, velké K ) 1 MB = 1 048 576 bajtů = 2 20 1 GB = 1 073 741 824 bajtů = 2 30 A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 11
Číselné soustavy - polyadické Reprezentace celých čísel Desítková soustava 138,24 = 1*10 2 +3*10 1 +8*10 0 +2*10-1 +4*10-2 =1*100+3*10+8*1+2*0,1+4*0,01 Dvojková soustava 11010,01 b = 1*2 4 +1*2 3 +0*2 2 +1*2 1 +0*2 0 +0*2-1 +1*2-2 = 1*16+1*8+0*4+1*2+0*1+0*1/2+1*1/4= 26,25 Šestnáctková soustava (hexadecimal numeral system) a = 0, 1, 2, 9, A, B, F ; z = 16 Př: 07D h = 0*16 2 + 7*16 1 + D*16 0 = 0 + 112 + 13 = 125 A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 12
Reprezentace čísel v počítači Celá kladná čísla přímý binární kód Př: 125 d = 0*2 7 +1*2 6 +1*2 5 +1*2 4 +1*2 3 +1*2 2 +0*2 1 +1*2 0 = 01111101 b = 0 + 64 + 32 + 16 + 8 + 4 + 0 + 1 Celá záporná čísla dvojkový doplněk (two s complement) Př: -125 d = 10000011 b Výpočet: Kladnéčíslo: x = +125 d = 0111 1101 b ------------------------------- Zápornéčíslo: -x = -125 d znaménkový bit NOT x = 1000 0010 b +1 -------------------------------- = 1000 0011 b (jednotkový doplněk) (dvojkový doplněk) velikost čísla (není to přímý binární kód!) A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 13
Nepřesnost v zobrazení reálných čísel Pokusme se v dekadické soustavě zapsat číslo 1/3 (jedna třetina) 0,3 přesněji 0,33 lépe 0,333... 0,333333333333333333333333333333333333 Jelikož máme omezený paměťový prostor, nikdy neuložíme číslo 1/3 přesně (Jak by číslo 1/3 vypadalo v trojkové soustavě?) 0*3 1 + 0*3 0 + 1*3-1 = (0,1) 3 A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 14
Nepřesnost v zobrazení reálných čísel Reálná čísla X se zobrazují ve tvaru: X= mantisa * základ exponent exponent mantisa Nepřesnosti způsobují 1. Iracionálníčísla ( e, π, 2,. ) 2. Čísla, jež mají v dané soustavě periodický rozvoj (1/3 ve dvojkové či dekadické soustavě, 1/10 ve dvojkové) 3. Čísla, která mají příliš dlouhý zápis double (celkem 64 bitů) 1 bit znaménko dvě možnosti, +,- 11 bitů exponent 2048 možností 52 bitů 4 503 599 627 370 496 možností, tedy asi 4,5 biliardy - není možné v typu double přesně uložit čísla se zápisem delším než 52 bitů! A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 15
Model reprezentace reálných čísel Reálnáčísla se zobrazují jako aproximace daná rozsahem paměťového místa vyhrazeného pro číslo. Reálná čísla se zobrazují ve tvaru: X = mantisa*základ exponent = m*z exponent Mantisa musí být normalizována: 0,1 <= m < 1, důvod: jednoznačnost zobrazení Model: délka mantisy 3 pozice + znaménko délka exponentu 2 pozice + znaménko Příklad: X = 77.5 = +0.775*z +02 lze zakódovat znaménko + = 0, = 1 z je 10 (16, 2,..) + 775 + 02 0 775 0 02 A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 16
Model reprezentace reálných čísel Maximální zobrazitelné kladnéčíslo Minimální zobrazitelné kladné číslo Maximální zobrazitelné záporné číslo (v absolutní hodnotě) Minimální zobrazitelné záporné číslo (v absolutní hodnotě) Nula Jak je to se zobrazitelnými hodnotami okolo nuly, Jak je to se sousedy aproximací? + 999 + 99 + 100-99 - 999 + 99-100 - 99 + 000??? 0-0.999z 99 0.999z 99-0.101z -99 0.000z?? 0.101z -99-0.100z -99 0.100z -99 A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 17
Model reprezentace reálných čísel Jaká je vzdálenost dvou aproximací?? To závisí na hodnotě!!! +MAXIMUM 0.999z 99 NULA 0.000z?? 0.100z -99 0.101z -99 0.100z12 0.101z 12 Aproximace reálných čísel: nejsou na číselné ose rozložené rovnoměrně!! NULA +MAXIMUM A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 18
Reálnáčísla v C (typ double) Reálná čísla se zobrazují ve tvaru: X= mantisa*základ exponent = m*z exponent V C jsou reálná čísla reprezentována typem double na 64 bitů, norma IEEE 754 znaménkový bit (s), exponent, mantisa nejmenšíčísla v normalizovaném tvaru (v abs. hodnotě) ±2 1022 ±2.2250738585072020 10 308 největší čísla ±(1-(1/2) 53 )2 1024 ±1.7976931348623157 10 308 A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 19
Datové typy (1) Celočíselné datové typy: Typ Velikost [byte] Rozsah Použití char 1-128 až +127 nebo 0 až 255 Znaky unsigned char 1 0 až 255 Malá čísla signed char 1-128 až +127 Malá čísla int 2 nebo 4-32.768 až +32.767 nebo -2.147.483.648 až +2.147.483.647 Celá čísla unsigned int 2 nebo 4 0 až 65.535 nebo 0 až 4.294.967.295 Kladná celá čísla short 2-32.768 až +32.767 Celá čísla unsigned short 2 0 až 65.535 Kladná celá čísla long 4-2.147.483.648 až +2.147.483.647 Velká celá čísla unsigned long 4 0 až 4.294.967.295 Kladná celá čísla Velikost celočíselných typů určená implementací Vždy ale platí (v byte): char <= short <= int <= long Typ boolean není (až ANSI C99), = 0 ->false,!= 0 -> true A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 20
Datové typy (2) C - reálná čísla (neceločíselné datové typy): Velikost reálných čísel určená implementací Většina překladačů se řídí standardem IEEE-754-1985, potom jsou rozsahy reálných čísel dány následující tabulkou: Typ Velikost [byte] Rozsah (uveden pro kladná č.) Přesnost float 4 1.2E-38 až 3.4E+38 6 desítkových číslic double 8 2.3E-308 až 1.7E+308 15 desítkových číslic long double 10 3.4E-4932 až 1.1E+4932 19 desítkových číslic C - typ void: void značí prázdnou hodnotu nebo proměnnou bez typu (jen ukazatelé) void funkce1 (.) - fukce bez návratové hodnoty (procedura) int funkce2 (void) - funkce bez vstupních parametrů void *ptr; - ukazatel bez určeného typu (viz dále) A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 21
Konstanty (1) 6 typů konstant: Celočíselné (integer constants) Reálné (floating constants) Znakové (character constants) Řetězcové (literal constants) (literály) Výčtové (enumeration constants) (pojmenované prvky množiny) Symbolické (#define MAX 300) A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 22
Konstanty - celočíselné (2) Formát celočíselné konstanty: Desítkový - nezačíná číslicí 0 (nula), př: 1024 Osmičkový - začíná číslicí 0 (nula), př: 012 Šestnáctkový - začíná znaky 0x nebo 0X (nula x), př: 0x7F8A číslice a,..,f (A,..,F) mohou být velká i malá pismena Typ celočíselné konstanty: Není-li určen explicitně, přiřadí se nejbližší dostatečně veliký typ Desítkové konst. - int, long, unsigned long Šestnáctkové a osmičkové - int, unsigned int, long, unsigned long Určí se explicitně znaky U nebo u (unsigned), L nebo l (long) jinak int Desítkově Osmičkově Šestnáctkově Typ 15 017 0xF int 32767 077777 0x7FFF int 10U 012U 0xAU unsigned int 16L 020L 0x10L long 27UL 0333ul 0x1BUL unsigned long A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 23
Konstanty - reálné (3) Formát reálné konstanty: S řádovou tečkou př: 41.9 Mantisa a exponent př: 5.67E-3 // 5.67*10-3 nebo rovněž 5.67e-3 Typ reálné konstanty: Není-li určen explicitně, pak je - double Určí se explicitně znaky F nebo f - float L nebo l - long double V tabulce jsou všechny konstanty typu double 5.19 0.519E1 0.0519e+2 519E-2 12. 12.0.12E2 12e0 370000.0 37e+4 3.7E+5 0.37e6 0.000004 4E-6 0.4e-5.4E-5 A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 24
Konstanty - znakové (4) Formát znakové konstanty : Jeden nebo více znaků v jednoduchých apostrofech př: B, g, ab, 9 Hodnota znakové konstanty : Jednoznaková konstanta má hodnotu odpovídajícího kódu znaku př: v ASCII kódu 0 ~= 48, A ~=65 Víceznaková konstanta - hodnota závisí na implementaci překladače C Typ znakové konstanty: Znaková konstanta je typu int Pozn: Řídicí znaky (escape sequences) mohou tvořit znakové konstanty př: \n A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 25
Konstanty - řetězcové (literály) (5) Formát řetězcové konstanty (literálu) : Posloupnost znaků a řídicích znaků (escape sequences) uzavřená v uvozovkách př: Já jsem řetězcová konstanta! \n Pozn: Řetězcové konstanty oddělené pouze oddělovači (whitespace characters) jsou sloučeny do konstanty jediné. př: Já jsem řetězcová konstanta! \n se sloučí do Já jsem řetězcová konstanta! \n Typ řetězcové konstanty: Řetězcová konstanta je uložená v poli typu char (array of char) a je zakončená znakem \0 př: Nazdar se uloží v poli typu char takto: N a z d a r \0 A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 26
Konstanty - výčtové (enum type) (6) Formát výčtové konstanty : enum { CERVENA, MODRA, BILA, CERNA}; pak CERVENA=0 a každý další prvek má hodnotu o jedničku vyšší enum { MALY=5, VETSI, VELKY, NEJVETSI } pak MALY=5, VETSI=6 a každý další prvek má hodnotu o jedničku vyšší Typ výčtové konstanty: Výčtová konstanta je typu int A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 27
Konstanty - symbolické #define (7) Formát symbolické konstanty #define: Konstanta se založí příkazem preprocessoru #define (je to makro bez parametrů, každé #define musí být na samostatné řádku) př: #define CERVENA 0 /* Zde muze byt komentar */ #define MODRA 1 / /Je zvykem jména konstant psát velkými písmeny #define BILA 2 Hodnotu konstanty je možné vyjádřit konstantním výrazem př: #define MAX_1 (100*5)-12 Symbolické konstanty mohou být vnořené př: #define MAX_2 MAX_1+30 A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 28
Komentář C používá dva způsoby označení komentáře: /* Toto je komentář */ /* Toto je rovněž komentář */ rozdělený na několik řádků // Toto je též komentář až do konce řádku /* Komentář nesmí být vnořený do jiného komentáře /* to je chybný zápis komentáře */ */ Preprocesor nahradí každý komentář jednou mezerou //.. tento způsob některé překladače nepodporují A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 29
Proměnné a přiřazení Proměnná je datový objekt, který je označen jménem a je v něm uložena hodnota nějakého typu, která se může měnit alfa 0 hodnota proměnné jméno proměnné datový objekt V jazyku C zavedeme výše uvedenou proměnnou deklarací int alfa = 0; Hodnotu proměnné lze změnit přiřazovacím příkazem alfa 0 alfa = 37; alfa 37 A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 30
Deklarace proměnných Proměnné se zavádějí deklaracemi Příklady deklarací proměnných: int i; // deklarace proměnné i typu int double x; // deklarace proměnné x typu double Proměnná deklarovaná uvnitř funkce (lokální proměnná) nemá deklarací definovanou hodnotu Deklaraci proměnné lze doplnit o inicializaci proměnné: int x = 10; // deklarovaná proměnná má hodnotu 10 Deklarací lze zavést několik proměnných stejného typu: int x, z; A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 31
Přiřazovací příkaz Slouží pro přiřazení hodnoty proměnné Tvar přiřazovacího příkazu: <proměnná> = <výraz>; Příklad: x = y + z; proměnné x se přiřadí součet hodnot proměnných y a z x = x + 1; hodnota proměnné x se zvětší o 1 Příklady přiřazovacích příkazů: int i; double d; char c i = 14; d = 3.14; c = 'A'; A0B36PRI A8B14ADP PROGRAMOVÁNÍ Algoritmizace a programovaní 02 -Jazyk C - výrazy 32 32
Přiřazovací příkaz Přířazovací operátory: <proměnná> = <proměnná> <OP> <výraz> ~ <proměnná> <OP>= <výraz> Př.: j += 5; ~ j = j + 5; přiřazení je výraz!!!: Př.: int x, y; x = 7; // má hodnotu 7 a lze tedy opět přiřadit!! y = x = x + 6;// vyhodnotí se jako y = (x = (x + 6)); A0B36PRI A8B14ADP PROGRAMOVÁNÍ Algoritmizace a programovaní 02 -Jazyk C - výrazy 33 33
Příkaz výstupu - printf() printf("cislo Pi = %6.3f \n ", Math.PI); Výstup na obrazovku: Cislo Pi = 3.142 Specifikace formátu %[$indexparametru][modifikátor][šířka][.přesnost]konverze konverze - povinný parametr typ celé číslo d,o,x - dekadicky, oktalově a hexadecimálně typ double f je desetinný zápis; e,e vědecký s exponentem šířka - počet sázených míst, zarovnání vpravo přesnost - počet desetinných míst modifikátor - v závislosti na typu konverze určuje další vlastnosti, například pro konverzi f (typ double) symbol + určuje, že má být vždy sázeno znaménko, symbol - určuje zarovnání vlevo, symbol 0 doplnění čísla zleva nulami. \n přechod na další řádek a další A0B36PRI A8B14ADP PROGRAMOVÁNÍ Algoritmizace a programovaní 02 -Jazyk C - výrazy 34 34
Příkaz vstupu scanf() V dalších příkladech budeme potřebovat příkazy pro vstup číselných dat zadaných na klávesnici Použijeme standardní funkce scanf() #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int pocet; scanf("%d", &pocet); printf("pocet = %d", pocet); } Ve funkci scanf() je nutné uvést očekávaný formát vstup (zde %d znamená celočíselný formát a proměnnou do které se má hodnota z klávesnice uložit. Pozor před hodnotou musí být znak & (znamená to volání odkazem viz další přednášky) A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 35
Typové konverze Typová konverze je operace, která hodnotu nějakého typu převede na hodnotu jiného typu, důvod jiná reprezentace čísel Typová konverze může být implicitní (vyvolá se automaticky) nebo explicitní (v programu je třeba ji explicitně předepsat) Konverze typu int na double je v jazyku C implicitní: kde se očekává hodnota typu double, může být uvedena hodnota typu int, která se automaticky převede na hodnotu typu double Příklad: double x; int i = 1; x = i; //hodnota 1 typu int se automaticky převede //na hodnotu 1.0 typu double Převod hodnoty typu double na int (odseknutím neceléčásti) je třeba explicitně předepsat Příklad: double x = 1.2; int i; i = (int)x; //hodnota 1.2 typu double se odseknutím //necelé části převede na hodnotu 1 typu int A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 36
Výrazy Výraz předepisuje výpočet hodnoty určitého typu Příklad výrazu: {14.6 + sin(3.14)} * a 100 Výraz může obsahovat: proměnné konstanty volání funkcí binární operátory unární operátory závorky Pořadí operací předepsaných výrazem je dáno: Příklad: prioritou operátorů asociativitou operátorů výraz pořadí operací zdůvodnění x + y * z x + (y * z) * má vyšší prioritu než x + y + z x + y) + z + je asociativní zleva A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 37
Aritmetické operátory Pro operandy typu int a double budeme požívat tyto aritmetické operátory (seřazeno sestupně podle priority): unární (změna znaménka) binární *, /, % (násobení, dělení a zbytek po dělení) binární + a (sčítání a odčítání) Jsou-li oba operandy stejného typu, výsledek aritmetické operace je téhož typu Jsou-li operandy různého typu, operand typu int se implicitní konverzí převede na hodnotu typu double a výsledkem operace je hodnota typu double Výsledkem dělení operandů typu int je celá část podílu např. 7/3 je 2-7/3 je -2 Pro zbytek po dělení platí: x % y = x (x / y) * y např: 7%3 je 1; -7%3 je -1; 7%-3 je 1; -7%-3 je -1 speciální inkrementační a dekrementační operátory: ++x, x++, --x, x-- A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 38
Relační operátory Hodnoty všech jednoduchých typů jsou uspořádané a lze je porovnávat relačními operátory Budeme používat tyto relační operátory (priorita je menší než priorita aritmetických operátorů): >, <, >=, <= (větší než, menší než, větší nebo rovno, menší nebo rovno) ==,!= (rovná se, nerovná se) Výsledek relační operace je (true, když relace označená operátorem platí, false v opačném případě)(true se v "C" hodnotí dle výsledku 0 a false dle výsledku = 0. V "C" není typ logické proměnné. Jestliže při porovnáváníčíselných hodnot jsou operandy různého typu, operand typu int se implicitní konverzí převede na hodnotu typu double Relační operátory mají menší prioritu, než aritmetické operátory A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 39
Logické operátory Logické operátory jsou unární a binární unární! (negace) binární && resp. & (konjunkce, logický součin) binární resp. (disjunkce, nevýhradní logický součet, OR) binární ^ (disjunkce, výhradní logický součet, XOR) x y!x x && y x y x ^ y false false true false false false false true true false true true true false false false true true true true false true true false Negace má stejnou prioritu, jako změna znaménka, logický součin má nižší prioritu než relační operátory Operace && a se vyhodnocují zkráceným způsobem, tj. druhý operand se nevyhodnocuje, jestliže lze výsledek určit již z prvního operandu A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 40
Standardní knihovny (1) Standardní knihovny (ANSI C library Standard Library) : Vlastní jazyk C neobsahuje žádné prostředky pro vstup a výstup dat, složitější matematické operace, práci s řetězci, třídění, blokové přesuny dat v paměti, práci s datem a časem, komunikaci s operačním systémem,správu paměti pro dynamické přidělování, vyhodnocení běhových chyb (run-time errors) apod. Tyto a další funkce jsou však obsaženy ve standardních knihovnách (ANSI C Library) dodávaných s překladači jazyka C. Uživatel dostává k dispozici přeložený kód knihoven (který se připojuje linkuje k uživatelovu kódu) a hlavičkové soubory (headers) s prototypy funkcí, novými typy, makry a konstantami Hlavičkové soubory (obdoba interface v Javě) se připojují k uživatelovu kódu direktivou preprocesoru #include < >. Je zvykem, že hlavičkové soubory mají rozšíření *.h, např. stdio.h A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 41
Standardní knihovny (2) Standardní knihovny (ANSI C library Standard Library) pokrač: Standardní knihovny jsou rozděleny do následujících částí: (uvedeno pro ANSI C95): Vstup a výstup (formátovaný i neformátovaný) stdin.h Rozsahy čísel jednotlivých typů limits.h Matematické funkce stdlib.h math.h Zpracování běhových chyb (run-time errors) errno.h assert.h A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 42
Standardní knihovny (3) Standardní knihovny (ANSI C library Standard Library) pokrač: Standardní knihovny jsou rozděleny do následujících částí: (uvedeno pro ANSI C95) pokrač: Klasifikace znaků (typ char) ctype.h Práce s řetězci (string handling) string.h Internacionalizace (adaptace pro různé jazykové mutace) locale.h Vyhledávání a třídění stdlib.h Blokové přenosy dat v paměti string.h A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 43
Standardní knihovny (4) Standardní knihovny (ANSI C library Standard Library) pokrač: Standardní knihovny jsou rozděleny do následujících částí: (uvedeno pro ANSI C95) pokrač: Správa paměti (Dynamic Memory Management) stdlib.h Datum a čas time.h Komunikace s operačním systémem stdlib.h signal.h Nelokální skok (lokální je součástí jazyka, viz goto) setjump.h A8B14ADP Algoritmizace a programovaní -Jazyk C - výrazy 44
Algoritmizace a programování Jazyk C Jazyk C výrazy KONEC České vysoké učení technické Fakulta elektrotechnická