02 Jazyk C - je imperativní říkáme, co se má udělat, voláme příkazy - další imperativní jazyky: Pascal, Java, C/C++ apod. - na rozdíl od jazyků deklarativních např. Prolog, Haskell, Scheme, Lisp (funkcionální jazyk, zvláštní případ deklarativních jazyků) - jazyky často oba přístupy míchají, tj. i imperativní jazyky, mají některé vlastnosti deklarativních a naopak Různé programovací jazyky: http://www.linuxexpres.cz/praxe/programovaci-jazyky Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí Znaky char (uložen na 8 bitech = 1 byte (bajt)) Celá čísla short int (není určeno, ale musí být <= int) int (musí být <= long int a zároveň >= short int) long int (musí být >= int) - místo short int lze psát jen short
- místo long int lze psát jen long - signed znaménková celá čísla - unsigned neznaménková = pouze kladná celá čísla - výchozí stav je proměnná znaménková pokud neuvedu nic Např.: int k; // jde o znaménkový int signed int j; // jde též o znaménkový int unsigned int k; // jde o NEznaménkový int
Reálná čísla float na 32 bitech (IEEE 754 formát) double na 64 bitech (IEEE 754 formát) long double na 80 bitech, pozor: funguje chybně výstup na - následek chybné impl. ve Windows Jak za běhu zjistit kolik proměnná zabírá v paměti? Pomocí funkce: kolikbytu = sizeof(proměnná) nebo kolikbytu = sizeof(název_datového_typu) Např: vel = sizeof(k); // do vel se uloží počet bytů prom. k vel = sizeof(long int); // velikost typu long int v bytech Př.: /* Velikosti zakladnich typu pomoci sizeof */ #include <stdio.h> #include <stdlib.h> int main(void) printf("\n\rvelikosti zakladnich typu v Bytech \n\r"); printf("================================== \n"); printf("char %2d \n", sizeof(char)); printf("short %2d \n", sizeof(short)); printf("int %2d \n", sizeof(int)); printf("long %2d \n", sizeof(long)); printf("float %2d \n", sizeof(float)); printf("double %2d \n", sizeof(double)); printf("long double %2d \n", sizeof(long double)); printf("file %2d \n", sizeof(file));
while (!(kbhit())) ; return 0; Výsledek (překladač MinGW pod 32 bit WinXP): Výsledek na serveru eryx (32 bit *NIX systém) Výsledek na serveru edison (Linux Ubuntu 64bit, 2x procesor Xeon(4ř jádro)
Pozn. typ FILE je definován v hlavičkovém souboru stdio.h takto: typedef struct _iobuf char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname; FILE; Jak souvisí datové typy se zobrazením čísel v paměti počítače viz další strana...
Zobrazení v paměti počítače - ve dvojkové soustavě Např.: negace v C dva druhy! negace logické hodnoty (kladná čísla = true, pravda)!3 výsledkem bude 0 (tj. nepravda)!1 výsledkem bude 0 (tj. nepravda) if!(a < 5) - jestliže a není menší než 5 ~ negace bit po bitu pracuje s čísly na binární úrovni (dvojkový doplněk) ~3 D = 252 D (předpokládáme unsigned char) ~00000011 B = 11111100 B ~1 D = 254 D (předpokládáme unsigned char) ~00000001 B = 11111110 B
Jazyk C - pokračování - slabá typová kontrola C je poměrně benevolentní při konverzích různých datových typů - zvyk štábní kultura pro přehlednost - názvy funkcí a proměnných malá písmena na začátku (prom_jmeno, promjmeno) - konstanty velkými písmeny (M_PI, MAX, MOJE_KONST) - vlastní datové typy velkými písmeny (VECTOR, POLE10, CLOVEK) - povinné: - název proměnné nesmí začínat číslicí, obsahovat mezeru atp. - délka názvu proměnné maximální počet znaků se může lišit dle překladače (6 je stoprocentně bezpečné, ale většinou lze více) - blok začíná a končí Blok - např. tělo funkce - tělo cyklu, podmínky - samostatný blok ("jen tak") - na začátku bloku, lze deklarovat proměnné Např.: for (int i = 0; i < 10; i++) // deklaruji i příkazy; // a hned použiji příkazy; - tady už i neexistuje - proměnná i bude existovat jen uvnitř bloku = těla cyklu int i; příkazy;
- proměnné lze při deklaraci hned inicializovat nastavit hodnotu - pozor: C se nijak nestará o hodnoty proměnných, které programátor vytvořil, ale nenastavil jim hodnotu!!! Je v nich hodnota, která byla zrovna v paměti na místě na kterém se proměnná vytvořila. Jak inicializovat: int i = 80; v podstatě je to totéž jako: int i; i = 80; int i = 0; Program: Největší společný dělitel dvou čísel #include <stdio.h> int nsd(int a, int b) if((a <= 0) (b <= 0)) return 0; while (a > 0) if(a > b) a = a - b; else b = b - a; if (b == 0) return a; return 0; int main () int vysledek; vysledek = nsd(12345,9985); printf("nejvetsi spolecny delitel cisel %d a %d je %d", 12345,9985, vysledek);
/* Nasleduje cekaci smycka ceka na stisk klavesy, tj. doku není stisknuta nejaka kl. Smycka zajistuje, aby se okno s programem automaticky nezavrelo. */ while (!kbhit()) ;