9.3.2010
Program – převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h> int main(void) { int dCislo, kolikBcislic = 0, meziVysledek = 0, i; int vysledek[1000]; printf("Zadejte desitkove cislo: "); scanf("%d", &dCislo); printf("\n"); meziVysledek = dCislo; do { vysledek[kolikBcislic] = meziVysledek % 2; meziVysledek = meziVysledek / 2; kolikBcislic++; } while (meziVysledek > 0); kolikBcislic--; printf("Cislo %d je v binarni podobe: \n", dCislo); for (i = kolikBcislic; i >= 0; i--) { printf("%1d", vysledek[i]); } printf("\n\nHotovo."); while(!kbhit()) ; return 0; }
Formátovaný vstup a výstup Pro formátovaný vstup je v stdio.h funkce scanf(); Pro výstup: printf();
Základní použití : scanf("%d", &i); - tato funkce takto zavolaná přečte z klávesnice celé číslo (%d) a uloží ho do proměnné i. int i = 12; printf("I je %d \n", i);
Vypíše na výstup řetězec: I je 12 (a odřádkuje.)
Např.: - úryvek z programu přečte z klávesnice 2 čísla a vytiskne je. int i, j; scanf("%d %d", &i, &j); // Načte 2 čísla, může být zapsáno printf("%d + %d = %d", i, j, i + j);
i odděleně
- pokud zadáme například čísla 4 a 7 bude mít volání funkce printf výstup: 4 + 7 = 11 - tj. posloupnost %d nahradí příslušným číslem a ostatní text mezi zůstane stejný.
Formátové specifikace – formátovací řetězce - je to posloupnost podle které překladač pozná jaký formát má výstup mít - posloupnosti začínají znakem % určující formát vstupu/výstupu - pokud chcete zobrazit znak %, musíte použít zdvojení %% Řetězec
Data
%c %d nebo %i %ld %u %lu %f %Lf %lf %x
%o
Znak (raději použít putchar()) signed int signed long int unsigned int unsigned long int float(pro printf double) long double(L musí být velké !) double (obv. nejde u printf()) hexadecimální malými písmeny např. 1a2c hexadecimální velkými písmeny např. 1A2C celé číslo v osmičkové soustavě
%s
řetězec (string)
%X
Příklady : int i, j; i = 7; j = 4; printf("soucet je %d.", i + j); vypíše : soucet je 11. printf("Pracovali na 100 %%."); vypíše : Pracovali na 100 %. (pro výpis znaku % je nutné napsat %%) printf("soucet je %d soucin je %d\n", i + j, i * j); vypíše : soucet je 11 soucin je 28 a odřádkuje printf("\007Ha ! Ivan !");
vypíše : Ha ! Ivan ! (a pískne \007 = \a – pozor jen na některých systémech) printf("Toto je \"BackSlash\" : \\"); vypíše : Toto je "BackSlash" : \
Přípomínka (z MATLABu) cesta k souboru: "C:\\windows\\supervirus\\od_vildy_bránaře\\baf.exe" Pozor při tisknu jedné proměnné vícekrát, musím samozřejmě v printfu tuto proměnnou zapsat tolikrát, kolikrát ji tisknu: int c = 'A'; printf("Znak %c má hodnotu %d (%Xh)", c, c, c); vypíše : Znak A má hodnotu 65 (41h) printf("Znak %c má hodnotu %d (%Xh)", '*', '*', '*'); vypíše : Znak * má hodnotu 42 (2Ah)
Formátovní počtu míst ve výpisu a počtu desetinných míst printf("Je přesně %2d:%02d hodin.", hodiny, minuty); vypíše : Je přesně 1:05 hodin. - 2 v řídící posloupnosti znamená, že číslo bude tištěno minimálně na 2 znaky, zleva se doplňují mezery), pokud uvedu %02 budou se zleva doplňovat nuly. printf("Toto je reálné číslo : %4.2f ", 2.8356); vypíše : Toto je reálné číslo : 2.83 %4.2 znamená, že reálné číslo bude tištěno na 4 znaky, z nich 2 budou za desetinnou tečkou (desetinná místa) a + jedna desetinná tečka (taky se počítá) Pro řetězec (string): printf("Toto je %s", "Nějaký textový řetězec"); vypíše : Toto je Nějaký textový řetězec - hlavně pro případy, kdy je textový řetězec v proměnné: Musím mít #include <string.h> na začátku, kvůli strcpy(a,b) .....
char jmeno[20];
strcpy(jmeno, "Petr Kropik"); // naplním řetězec jmeno .... nějaký program .... printf("Jmenuji se %s", jmeno); Pozor výjimka u scanf: char jmeno[20]; scanf("%s", jmeno); // naplním řetězec jmeno,zde není znak & .... nějaký program .... printf("Jmenuji se %s", jmeno); Časté chyby :
int i, j; printf("%d", i, j); // mnoho argumentů printf("%d %d", i); // málo argumentů scanf("%d", i); // chybí operátor &, tedy má být &i; (pokračování na další straně)
Konstanty - dokončení Např.: int x = y = z =
x, y, z; 25; 023; 0xF2;
long int velka; velka = 2455665537L; printf("\nVelka: %ld\n", velka);
Vytiskne: Velka: -1839301759
Reálné konstanty Např.: 0.345 0.25 .25 3.146767 5e6
znamená 5 . 106
8.566E23
znamená 8,566 . 1023
Pozor!!!!! 0.0 tohle nula typu double 0 tohle je nula typu int - stejně tak 3.0, 4.0, 8.0 jsou double - stejně tak 3, 4, 8 jsou int - implicitně jsou reálné konstanty typu double, tj. napíšu-li 2.345, chápe to C jako double Pokud potřebuji konst. typu float: 1.3e3f nebo 1.3e3F
Pokud potřebuji konst. typu long double (pozor nechodí v Dev C++ pod Windows): 13.56e35L
Znakové konstanty - uzavřeny do apostrofů 'a' '*' 'M' - hodnota odvozena z tabulky ASCII (ordinální čísla) - POZOR – znakové konstanty v C jsou typu int - pro zápis "neviditelných", netisknutelných znaků (nový řádek, backspace, tabelátor atp.) použijeme kód zapsaný do uvozovek tímto způbem: '\kod' kde kod je oktalová nebo šestnáctková číslice Např.: '\012' '\007' '\x0A' '\XD' '\x1f' (pozn. kódům uvozeným znakem \ se někdy říká escape sekvence) '\n' – nový řádek ('\x0A') '\r' – návrat na začátek téhož řádku ('\x0D') '\f' – odstránkovat – chová se dle OS ('\x0C') '\t' – tabelátor ('\x09') '\b' – backspace ('\x08') '\a' – pípnutí – chová se dle OS ('\x07') '\\' – znak \ ('\x5C') – důležité v řetězcích, hlavně tam, kde je v řetězci uložena cesta na disku (např. "C:\\Windows\\system32\\supervir.exe") '\'' – znak ' ('\x2C')
'\0' – nulový znak ('\x00') – používá se jako znak na konci řetězce – tj. ukončuje řetězce (tzv. nulový byte) '"' – uvozovky jako jeden znak v řetězci, ale musím napsat \"
Řetězcové konstanty - uvedeny mezi uvozovkami, např. "Jak se máte?"
Výrazy a operátory i=2 i = 2;
to je výraz to je příkaz
Operátory Unární - unární – a unární + Např.: +5 -5 -8.345 - unární ++ - inkrement - zvýší hodnotu proměnné o 1 - unární -- - dekrement - sníží hodnotu proměnné o 1 a = 5; a++; // funguje jako a = a + 1; // v a je teď 6 Používají dvěma způsoby - jako prefix – před názvem proměnné: ++i nebo --i - proměnná i je napřed zvýšena (snížena) o 1 a teprve následně se vykonná zbytek řádku - jako postfix – za názvem proměnné: i++ nebo i-- napřed se vykonná výpočet v řádku a teprve potom je proměnná i je zvýšena (snížena) o 1 Např.: int i = 5, j = 1, k; i++; // i bude 6 j = ++i; // i bude 7, j bude 7 j = 0; // vynulujeme j (bude 0), i zůstává 7 j = i++; // j bude 7 dle i a pak i bude 8 k = --j + 2; // j bude 6, potom +2 a k bude 8 k = j-- + 2; // j je 6, +2, k bude 8, j bude 5
#include <stdio.h> int main(void) { int i; i = 5;
printf("Prefix: %d\n", ++i); i = 5; printf("Postfix: %d\n", i++); printf("A ted i: %d\n", i); while(!kbhit()) ; return 0; }
Základní binární operátory - sčítání + - odečítání – - násobení * - reálné dělení / - celočíselné dělení / - dělení modulo % - zbytek po celočíselném dělení (např. 10%3 bude 1) Jak je to s tím dělením? - C to pozná podle datových typů operandů Tj.: int / int – dělí celočíselně (např. 13 / 5 bude 2) int / float – dělí reálně int / double – dělí reálně float / int – dělí reálně double / int – dělí reálně atd. pro další typy (long, short jsou jako int, long double jako double) Pozor, toto je zdrojem častých chyb: double vysl, pi; pi = 3.1415; vysl = 4 / 3 * pi; vysl bude 3.1415, protože 4 typu int / 3 typu int je 1 Správný zápis: double vysl, pi; pi = 3.1415; vysl = 4.0 / 3.0 * pi; // stačí 4/3.0 nebo 4.0/3 Stejná chyba: double vysl, pi; int a, b; a = 4; b = 3; pi = 3.1415; vysl = a / b * pi;
vysl bude 3.1415, protože a typu int / b typu int je 1
Přiřazovací operátor - v C vypadá takto = Upozornění: double a; a = 5; - nezpůsobí chybu, ale nutím program k převodu 5 typu int na 5.0 typu double. Zbytečně. Korektnější: double a; a = 5.0;
l-hodnota = výraz; // hodnota nalevo od přiřazení Další operátory přiřazení += např. a += b * 3 + x znamená a = a + (b * 3 + x) -= totéž obdobně *= např. a *= b + 3 - x znamená a = a * (b + 3 - x) /= totéž obdobně %= totéž obdobně atd. totéž pro ostatní binární operátory (bez mezery)