27.2.2007 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 % a určující formát vstupu/výstupu - pokud chcete zobrazit znak %, musíte použít zdvojení %% Řetězec Data %c Znak (raději použít putchar()) %d nebo %i signed int %ld signed long int %u unsigned int %lu unsigned long int %f float(pro printf double) %Lf long double(l musí být velké!) %lf double (obv. nejde u printf()) %x hexadecimální malými písmeny např. 1a2c %X hexadecimální velkými písmeny např. 1A2C %o osmičkové číslo %s řetězec (string) 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()...
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 Celočíselné - desítkové: 25, 45, 567 - osmičkové: 045, 023, 03 vždy začínají 0 - šestnáctkové: 0x12, 0xF2, 0Xcd, 0xff, 0xFF - jak udělat konstantu long int: 245566553L int x, y, z; x = 25; y = 023; z = 0xF2; int velka; velka = 2455665537L; printf("\nvelka: %ld\n", velka); Vytiskne: Velka: -1839301759 Reálné konstanty 0.345 0.25.25 3.146767 5e6 znamená 5. 10 6 8.566E23 znamená 8,566. 10 23
Pozor!!!!! 0.0 tohle double nula 0 tohle je int nula - 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: 13e3f nebo 13e3F Pokud potřebuji konst. typu long double (pozor nechodí v Dev C++ pod Windows): 13.56e35L Poznámka: pozor v Dev C++ (resp. kompilátoru mingw) je problém s použitím proměnných typu long double a long int raději se jim v programech vyhněte. S double a int (běžně užívanými) problémy nejsou. Pro zájemce uvádím, že nejde ani tak o problém překladače, jako spíše Windows ;) Doporučuji do libovolného vyhledávače zadat klíčová slova: mingw windows "long double" ;)) Najdete např. http://www.mingw.org/mingwiki/index.php/long%20double nebo http://www.digitalmars.com/archives/cplusplus/3793.html. 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 '\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 '"' 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 to je výraz i = 2; to je příkaz
Operátory Unární - unární a unární + +5-5 -8.345 - unární ++ - inkrement - zvýší hodnotu proměnné o 1 - unární -- - dekrement - sníží hodnotu proměnné o 1 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 suffix 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 int i = 5, j = 1, k; i++; // i bude 6 j = ++i; // i bude 7, j bude 7 j = 0; // vynulujeme j (bude 0) 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
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; Další operátory přiřazení += např. a += b * 3 + x znamená a = a + (b * 3 + x) -= totéž obdobně oprava-upozornit *= 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)