Algoritmizace a programování

Slides:



Advertisements
Podobné prezentace
A1PRG - Programování – Seminář Ing. Michal Typová konverze, oblast platnosti, paměťové třídy 9 Verze
Advertisements

Standardní knihovní funkce pro práci s textovými řetězci
Pro začátek něco lehčího
Programování v C jazyku - SEMINÁŘ
Dynamické dokumenty na straně klienta Informatika pro ekonomy II.
Programovací jazyk C++
Programování funkcí v Excelu
Základní pojmy v jazyce C
Základy jazyka C.
Prezentace a vysvětlení programového prostředí NXC
Příkazy Přednáška č. 4. Příkazy (statements)  Příkaz – dílčí krok programu (část kódu – zpravidla jeden řádek)  Program – posloupnost příkazů  Příkazy.
Pole, ukazatele a odkazy
Algoritmy I Cvičení č. 2. Cíl hodiny Datové typy a přetypování (int, float, double, bool, char, long, short) Konstanty – Celočíselné Desítkové – 15, 0,
Preprocess Úvod do tvorby funkcí Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní.
C# pro začátečníky Mgr. Jaromír Osčádal
If-else, do-while, switch, operátory
Programování v C++ Cvičení.
Algoritmy I Cvičení č. 3.
Druhé cvičení Vytváření identifikátorů Datové typy
Datové typy 6 A1PRG - Programování – Seminář
Informatika I 3. přednáška
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro práci se soubory 13 Verze
Vyučovací hodina 1 vyučovací hodina: Opakování z minulé hodiny 5 min Nová látka 20 min Procvičení nové látky 15 min Shrnutí 5 min 2 vyučovací hodiny: Opakování.
OSNOVA: a) Řetězce v C b) Funkce stdio.h pro řetězce c) Funkce string.h pro řetězce d) Příklad Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače.
Jednoduché datové typy
A1PRG - Programování – Seminář Ing. Michal Operátory (2. část) 4 Verze
Seminář C cvičení STL, Trolltech Ing. Jan Mikulka.
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
DEKLARACE PROMĚNNÝCH A KONSTANT
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
Počítače a programování 1
Cvičení.
Vstupy a výstupy znaků a) Terminálový vstup a výstup ( getchar(), putchar() ) Přečtěte znak pomocí systémové funkce getchar() a vypište ho pomocí putchar().
Příklady v jazyku C – část 3
Napište program v C pro výpočet plochy obdélníka se stranami A=3 a B=2. Výsledek vytiskněte s patřičným komentářem na obrazovku formátovým příkazem printf.
OSNOVA: a)Funkce – úvod b) Hlavičky funkcí c) Rekurze funkcí d)Knihovny funkcí e)Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače.
A1PRG - Programování – Seminář Ing. Michal Řízení běhu programu 5 Verze
Začínáme vážně programovat Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů.
PROGRAMOVÁNÍ V PHP PERSONAL HOME PAGES CYKLY V PHP.
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
C – jak na procedury Mgr. Lenka Švancarová. C – procedury #include int main() { printf("Ahoj\n"); return(0); } #include void pozdrav(void) { printf("Ahoj\n");
Ukazatele, řetězce Přednáška č. 3. Ukazatele  Ukazatel (pointer) – typ o velikosti 4 bajty (v 32bit. systémech) pro uložení adresy objektu na který ukazuje.
Soubory BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
ZÁKLADNÍ POJMY. ZDROJOVÝ TEXT PROGRAMU Tvoří: klíčová slova komentáře identifikátory.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část I.
C – if Mgr. Lenka Švancarová. if vývojový diagram Podmínka Příkaz(y) Podmínka Příkaz(y) Úplné větveníNeúplné větvení ++--
C – cyklus do-while Mgr. Lenka Švancarová.
Počítače a programování 1 2.přednáška. Základní lexikální struktura programu Program v jazyce Java je tvořen symboly a oddělovači Program Java je psán.
Pokročilé datové typy (struktury, unie, dynamické proměnné)
Funkce Přednáška č. 5. Funkce (functions)  posloupnost příkazů uvedená hlavičkou  využití – opakovaně volaná sekvence – strukturování programu – ošetření.
Programování v jazyce C++
Programování KONSTANTY, ČTENÍ PO JEDNOM ZNAKU GETCHAR() FORMÁTOVANÝ VÝSTUP POMOCÍ PRINTF, VÝVOJOVÉ DIAGRAMY, CYKLY.
Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY Datové typy a operátory Základní programové.
Programování ÚVOD, PROMĚNNÉ, OPERÁTORY A PODMÍNĚNÝ PŘÍKAZ ERIK KRÁL.
Programování OPERÁTOR SIZEOF, FUNKCE, POLE JAKO PARAMETRY FUNKCÍ ERIK KRÁL.
Počítače a programování 2
Typ struktura (1) Datový typ struktura (struct) je agrego-vaný heterogenní datový typ Jedná se o skupinu několika proměnných, které mohou mít různé datové.
Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král.
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Programovací jazyk C Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Ing. Jitka Vlčková. Dostupné z Metodického portálu ISSN.
Funkce výstupu (2) Funkce printf: deklarována v: stdio.h
Lexikální atomy jazyka C
Příkazy cyklu (1) Umožňují vícekrát (nebo ani jednou) pro-vést určitý příkaz Jazyk C rozlišuje příkaz cyklu: s podmínkou na začátku: obecný tvar: while.
Oblast platnosti identifikátoru (1)
Opakování základních příkazů a syntaxí v programovacím jazyce Pascal
Opakování ze 3. cvičení deklarace proměnných výpis na monitor (výstup)
C# přehled vlastností.
Proměnné (1) Proměnná: Definice proměnných:
Opakování ze 4. cvičení int a; printf("Zadej číslo: ");
Transkript prezentace:

Algoritmizace a programování Cvičení Jan Kordas jan.kordas@vsb.cz D400   2008

Obsah cvičení Kompilátor jazyka C. Seznámení s vývojovým prostředím. První program v jazyce C. Základní datové typy a konstanty. Operátory.  Konverze typů. Terminálový vstup/výstup. Větvení (if, switch). Cykly. Příkazy break, continue, goto. Bloky příkazů. Funkce. Viditelnost proměnných. Rekurze. Operátor "čárka". Ternární operátor. Paměťové třídy. Typové modifikátory. Pole. Ukazatele. Dynamicky alokovaná paměť. Struktury. Výčtový datový typ. Union. Bitová pole. Soubory. Knihovny standardních funkcí. Dynamické datové struktury.

Materiály Soubor materiálů k přemětu http://fei1.vsb.cz/stud_mat/K455/BAKALARI/2.rocnik/Algoritmizace/   Webové stránky ke cvičení http://homel.vsb.cz/~kor206/teaching/ap_cv.html Cvičení z minulých let http://skola.gamisk.net/ http://skolavsb.wz.cz/cecko/ Doporučená literatura HEROUT, P.: Učebnice jazyka C ŠALOUN, P.: Programovací jazyk C pro zelenáče BABUŠIAK, B., GÁLA, M.: Programovací jazyk C v príkladoch pre biomedicínskych technikov

Hodnocení cvičení Miniprojekt 3x5 ............ 15 bodů (do 16.10., 6.11., 20.11.)   Závěrečný projekt ........ 20 bodů (do 18.12.) --------------------------------------------  Maximum za zápočet ... 35 bodů Podmínka pro úspěšné absolvování 17 bodů

Překlad

Seznámení s vývojovým prostředím Vytvoření nového projektu Modifikace zdrojového souboru Uložení zdrojového souboru Kompilace zdrojových souborů Spuštění vytvořené aplikace Kompilace a spuštění v jednom kroku Ladění

Základní struktura programu v jazyce C // vložení standardního hlavičkového souboru #include <stdio.h> // vložení vlastního hlavičkového souboru #include "main.h"   // vstupní bod aplikace int main(int argc, char *argv[]) {     // příkazy } Komentáře // jednořádkový komentář /* Víceřádkový    komentář  */

Proměnné Deklarace typ_proměnné identifikátor_proměnné;   Globální vs. lokální proměnná int i;    // globální proměnná funkce() {     int j;    // lokální proměnná } Počáteční inicializace int i = 5; // deklarace proměnné i a její inicializace na hodnotu 5 // totéž složitěji int i;    // deklarace proměnné i i = 5;   // nastavení proměnné i na hodnotu 5

Datové typy v jazyce C Celočíselné char (8 bitů) short (16 bitů) int (32 bitů) long (64 bitů) Reálné float (32 bitů) double (64 bitů) Výčtový enum Ukazatel pointer (32 bitů)   Velikost některých datových typů je platformě závislá.

unsigned vs. signed unsigned neznaménkový datový typ unsigned char (0..255) unsigned short (0..65535) unsigned int (4294967296) unsigned long   signed znaménokový datový typ signed char (-128..127) signed short (-32768..32767) signed int (-65536..65535) signed long

Konstanty Celočíselné desítkové 1, 10, 129 long 12L, -35l unsigned 33U, 12u oktálové 01, 010, 0127 hexadecimální 0x1, 0x1F, 0x12A Reálné double 1E10, 15e-1, 3.14 , .2 float 1E5F, 123ef long double 15e3L Znakové (velikost int!) 'a', '/', \007, \x1f, \n, \r, \t, \0   klíčové slovo const const int i = 15;

Operace Operátor přiřazení = Aritemetické operace +,-, *, /, % Složené operátory přiřazení +=, -=, +=, /=, %=, >>=, <<=, &=, |=, ^= Operátory inkremenace/dekrementace o jedničku ++, -- Relační operátory >, >=, <, <=, ==, != Logické operátory !, &&, || Bitové operace &, |, ^, ~, <<, >>

Priority a postup vyhodnocování výrazů http://msdn.microsoft.com/en-us/library/2bxt6kc4(VS.71).aspx

Konverze datových typů Implicitní Prováděna automaticky. Vždy se konvertuje z "nižšího" typu na "vyšší". Pořadí typů pro konverzi: int -> unsigned int -> long -> unsigned long -> double -> long double double x; int i = 5; x = i; double r; r = i * x; // hodnota proměnné i je konvertována na double   Explicitní Prováděna na žádost programátora. double x = 5; int i; i = (int) x;    // jedná se v podstatě o „ořezání“ desetinné části

Klíčová slova auto, break, case, char, const, continue, default, do double, else, enum, extern, float, for, goto, if int, long, register, return, short, signed, sizeof, static struct, switch, typedef, union, unsigned, void, volatile, while   Mají předem daný význam => nelze použít jako indentifikátor!

Větvení - příkaz if Úplná podmínka if (výraz) {     // příkazy, které se provedou, když je výraz <> 0 } else     // příkazy, které se provedou, když je výraz == 0   Neúplná podmínka

Výběr z více alternativ - příkaz switch Syntaxe switch (výraz) {     case x :         // příkazy, které se provedou, když výraz == x     break;     case y :     case l:     case k:         // příkazy, které se provedou, když výraz == l || výraz == k     ...     default : /* příkazy, které se provedeou, pokud neodpovídá ani jedna z předchozích variat */ }

Cyklus - příkaz for Syntaxe for ( inicializace; podmínka; přízak(y)) {     // tělo cyklu }   Příklad int i; for (i = 0; i < 10; i++)     printf("Ahoj svete %d\n", i);

Cyklus - příkaz do Syntaxe do { // tělo cyklu } while (podmínka);   Příkazy v těle cyklu jsou prováděny, když je splněna podmínka na konci (za tělem). => Tělo cyklu je provedeno minimálně 1x!

Cyklus - příkaz while Syntaxe while (podmínka) { // tělo cyklu }   Příkazy v těle cyklu jsou prováděny, když je splněna podmínka na začátku. => Tělo cyklu se nemusí provést vůbec!

Příkaz continue Příklad int i = 0; while (i < 5) { i++;     if ((i % 2) == 0)         printf("%d je sude", i);     else         continue;    // skok na začátek cyklu     printf("\n"); }

Příkaz break Příklad int i = 0; while (i < 5) { i++;     if ((i % 2) == 0)         printf("%d je sude", i);     else         break;    // skok z cyklu ven     printf("\n"); }

Příkaz goto for (i = 0; i < 10; i++) {     for (j = 0; j < 10; j++) {         if (d[j] == 0)             goto chyba;         else             r[i]+= 1 / d[j];     } } goto bez_chyby; chyba: printf("Deleni nulou\n");   Pokud možno nepoužívat! Problém je vždy možné vyřešit bez tohoto příkazu!!!

Bloky { // začátek bloku // tělo bloku = příkazy, definice proměnných }    // konec bloku   Nutnost použití bloků u if, do, while, pokud tělo bloku obsahuje více než jeden příkaz. if (i == 1)     printf("jen jeden příkaz") if (i == 10) {     printf("první příkaz");     printf("druhý příkaz"); }

Viditelnost proměnných int a = 4;        // globální proměnná   void main() {    printf("a = %d\n", a); /* lokální proměnná, překrývá dříve deklarovanou      proměnnou se stejným názvem */    int a = 5;    printf("a = %d\n", a);    {       int j; // proměnná je "vidět" jen v rámci bloku    } }

Deklarace proměnných - chyba int a = 4;        // globální proměnná   void main() {    printf("a = %d\n", a); /* lokální proměnná, překrývá proměnné se stejným    názvem deklarované v nadřazených úrovních */    int a = 5;    printf("a = %d\n", a); // opětovná deklarace v rámci stejného bloku!!!    int a = 6; }

Paměťové třídy auto implicitní třída pro lokální proměnné extern pro sdílení proměnných mezi více soubory static lokální proměnná, která si uchovává hodnotu mezi jednotlivými voláními funkce globální proměnná, která je viditelná pouze v modulu, kde je definována register doporučení překladači, aby uložil proměnnou do registru počítače

Typové modifikátory const hodnota proměnné se po inicializaci již nemění   volatile upozornění překladače, že proměnná může být modifikována asynchronně

Funkce návratový_typ identifikátor_funkce(parametry_funkce) {     // tělo funkce     return výraz;    // výraz je typu návratový_typ }   Příkaz return ukončí provádění funkce. Nemusí být až na jejím konci. Když je návratový typ funkce void, příkaz return neobsahuje žádný výraz.

Volání funkcí Volání funkce hodnotou // funkce se volá secti (5, 3); int secti(int a, int b) {    return (a+b); }   Volání funkce odkazem // funkce se vola prohod(&x, &y); void prohod(int *a, int *b)    int pom = *b;    *b = *a;    *a = pom;

Prototyp funkce Příklad int soucet(int a, int b); // prototyp funkce   int main() {    int a, b;    scanf("%d%d", &a, &b);    printf("%d + %d = %d\n", a, b, soucet(a, b)); } int soucet(int a, int b)    return a + b;

Rekurze Funkce pro výpočet faktoriálu int fakt(int n) {   int fakt(int n) {    if (n <= 0) {       return 1;    }    else    {       return n * fakt(n - 1); }

Fibonacciho posloupnost Fibonnaciho posloupnost posloupnost, kde první člen f(0) = 0 a druhý člen f(1) = 1 a každý další člen je součet dvou předchozích f(n) = f(n-1) + f(n-2)

Fibonacciho posloupnost - rekurze int fibonacci(int n) {    if (n < 2)    {       if (n < 1)          return 0;       else          return 1;    } else       return (fibonacci(n-1) + fibonacci(n-2)); }

Fibonacciho posloupnost - cyklus int fibonacciC(int n) {    int p[MaxN];    p[0] = 0;    p[1] = 1;    int i;    for (i = 2; i <= n; i++)    {       p[i] = p[i-1] + p[i-2];    }    return p[n]; }

Terminálový vstup/výstup Hlavičkový soubor stdio.h    #include <stdio.h>   Funkce pro vstup    getchar()   // čte první znak, čtení se ukončí stiskem Enter    scanf()     // formátovaný vstup Funkce pro výstup putchar()   // zapíše znak    printf()    // formátovaný výstup

Formátovaný vstup Funkce scanf() Příklad int i; scanf("%d", &i);   Příklad    int i;    scanf("%d", &i); %d určuje formát vstupu (v tomto případě celé číslo). &i adresa proměnné, do které se má vstup uložit Pozor!!! Nazapomenout na & před názvem proměnné!!!

Formátovaný výstup Funkce printf() Příklad int i = 5;   Příklad    int i = 5;    printf("i = %d", i); i = text, který se vypíše %d určuje formát výpisu (v tomto případě dekadický celočíselný) i proměnná, která se vytiskne na terminál tam, kde je %d

Formátové specifikace %c     znak (je lepší použít funkci getchar() nebo putchar()) %d     celé číslo typu signed int %ld    celé číslo typu signed long %u     celé číslo typu unsigned int %lu    celé číslo typu unsigned long %f      reálné číslo typu float %lf     reálné číslo typu double %Lf    reálné číslo typu long double (L musí být velké) %x     číslo v hexadecimálním tvaru s malými písmeny - 5b8f %X    číslo v hexadecimálním tvaru s velkými písmeny - 5B8F %o     číslo v osmičkovém tvaru %s     řetězec

Escape sekvence \0     Nula, ukončení řetězce (má být na konci každého řetězce) \a     Pípnutí \b     Návrat o jeden znak zpět \f      Nová stránka nebo obrazovka \n     Přesun na začátek nového řádku \r      Přesun na začátek aktuálního řádku \t      Přesun na následující tabelační pozici \v     Stanovený přesun dolů \\      Obrácené lomítko \'      Apostrof \"     Uvozovky \?    Otazník

Operátor čárka Nejprve je vyhodnocen výraz vlevo od čárky, následně je vyhodnecen výraz vpravo od čárky. Syntaxe výraz: výraz1, výraz2 Příklad 1 (nejčastější použití) for (i = 0, j = 0; i < 5; i++, j++) {    //... }   Příklad 2 int a, b = 1, c = 2; a = (b++, b + c);

Ternární operátor Syntaxe výraz_podmínka ? výraz1 : výraz2 Příklad   Příklad x = (a < b) ? a : b; Totéž pomocí if if (a < b)    x = a; else    x = b;

Pole – statická – jednorozměrná Syntaxe      datovy_typ identifikator_pole[pocet_prvku_pole];   datovy_typ identifikator_pole[pocet_prvku_pole] = {p0, p1, ...}; Příklad 1 (práce s polem) int pole[3]; int i; for (i = 0; i < 3; i++) { printf(“zadej %d. cislo: “, i); scanf(“%d”, &pole[i]); } printf(“%d. cislo: %d\n”, i, pole[i]); Příklad 2 (pole jako argument funkce) int minimum(int pole[], int pocet) { // vypocet minima...

Pole – statická – vícerozměrná Syntaxe      datovy_typ identifikator[pocet_prvku1][pocet_prvku2]      datovy_typ identifikator[pocet_prvku1][pocet_prvku2] = {{p00},{},...} Příklad 1 (inicializace) int matice[3][2] = {{1,2}, {3,4}, {5,6}}; Příklad 2 (přístup k prvkům pole) int matice[3][2]; matice[0][0] = 1; matice[0][1] = 2; matice[1][0] = 3; matice[1][1] = 4; matice[2][0] = 5; matice[2][1] = 6;

Řetězce Jednorozměrné pole typu char[] ukončené znakem '\0'! Deklarace   Deklarace char retezec[10]; Inicializace char retezec[10] = "ahoj"; char retezec2[] = "ahoj"; Příklad 1 char retezec[10] = "ahoj", retezec2; printf("%d", retezec[0]); printf("%d", retezec[1]); printf("%d", retezec[2]); printf("%d", retezec[3]); printf("%d", retezec[4]); printf("%s", retezec); scanf("%s", retezec2); printf("%s", retezec2);

Standardní funkce pro práci s řetězci Hlavičkový soubror <string.h>   Délka řetězce     strlen(); Kopírování řetězce     strcpy(); Spojení řetězců     strcat(); Nalezení znaku v řetězci     strchr(); Porovnání dvou řetězců     strcmp(); Nalezení pořetězce v řetězci     strstr();

Ukazatele (Pointery) Příklad int i = 5; int *p_i = &i; printf("adr. &i=%p, &p_i=%p, p_i=%p\n", &i,&p_i,p_i); printf("hodnoty i=%d, p_i=%d\n", i, *p_i); i++; (*p_i)++;  *p_i = 11; 

Pointerová aritmetika Příklad int a[5] = {1,2,3,4,5}; int *p = a;  // totez co int *p = &a a int *p = &a[0] printf("adr. &a=%p, a=%p, &p=%p, p=%p\n", &a, a, &p, p); printf("hodnoty a[0]=%d, *p=%d\n", a[0], *p); printf("hodnoty a[1]=%d, *(p+1)=%d\n", a[1], *(p+1)); printf("hodnoty a[4]=%d, *(p+4)=%d\n", a[4], *(p+4)); p = p + 3; printf("adr. &a[3]=%p, &p=%p, p=%p\n", &a[3], &p, p); printf("hodnoty *p=%d\n", *p); p--; printf("hodnoty a[2]=%d, *p=%d\n", a[2], *p); *p = 50; *(p+1) = 44; printf("hodnoty a[3]=%d, *(p+1)=%d\n", a[3], *(p+1));

Pointery jako argumenty funkcí Příklad na prohození dvou čísel   int prohod(int *a, int *b) {    int pom = *a;    *a = *b;    *b = *a; }

Ukazatel na funkce Příklad int soucet(int a, int b) { return a + b; }   int rozdil(int a, int b) {    return a - b; void main() {    int (*p_f)(int a, int b);    p_f = soucet;    printf("%d\n", p_f(1, 2));    p_f = rozdil;

Dynamická paměť Alokace paměti void *malloc(size_t size); Uvolnění paměti void free(void *pointer); Alokace paměti s nastavením hodnot na 0 void *calloc(size_t nelements, size_t bytes); Realokace paměti void *realloc(void *pointer, size_t size); Určení velikosti typu – operátor sizeof()

Dynamická paměť Příklad 1 int *p_i; // alokace pameti p_i = (int*)malloc(100*sizeof(int)); if (p_i == NULL) { // alokace se nezdarila } else { // prace s polem p_i p_i[0] = 5; // uvolneni pameti free(p_i); }

Dynamická paměť Příklad 2 int *p_i, *p_i2; // alokace pameti p_i = (int*)malloc(100*sizeof(int)); if (p_i == NULL) { // alokace se nezdarila } else { // realokace pameti p_i2 = (int*)realloc(p_i, 10); if (p_i2 == NULL) { // realokace se nezdarila // prace s polem p_i p_i[0] = 5; // uvolneni pameti free(p_i); }

Vícerozměrná dynamická pole Realizace pomocí dynamického pole pointerů ukazujících na dynamické pole. Příklad // pro jednoduchost se netestuje uspesnost alokace #define radky 10 #define sloupce 10 int **pole, i; // alokace pameti pro pointery (ukazatele na radky) pole = (int**)malloc(radky*sizeof(int*)); // alokace pameti pro jednotlive radky for (i = 0; i < radky; i++) pole[i] = (int*)malloc(sloupce*sizeof(int)); // prace s polem scanf(”%d”, &pole[0][0]); printf(”%d”, pole[0][0]); // uvolneni pameti – nejprve radky, pak ukazatele free(pole[i]); free(pole);

Argumenty programu Vstupní bod aplikace: int main(int argc, char *argv[]) argc – počet argumentů (název programu je taky argument) arg[] – ukazatel na pole argumentů arg[0] – název programu arg[1] – 1. argument programu Příklad int main(int argc, char *argv[]) { int i; printf(“Pocet argumentu: %d”, argc); for (i = 0; i < argc; i++) printf(“Argument %d: %s”, i, argv[i]); return 0; }

Definice typů - typedef Pro definici/pojmenování nových typů – pointery typedef int *P_INT; P_INT p_int; Pro definici/pojmenování nových typů – struktury (viz dále) Přiklad (pointer na pointer) typedef P_INT *P_P_INT; P_P_INT p_p_i; //totez znamym zpusobem int **p_p_int;

Struktury Definice struktury a proměnných jirka, alois struct { char jmeno[10]; char prijmeni[20]; int vek; } jirka, alois; Definice pojmenované struktury a proměnných jirka, alois struct osoba {

Struktury Definice struktury a následná deklarace proměnných jirka, alois struct osoba { char jmeno[10]; char prijmeni[20]; int vek; }; struct osoba jirka, alois; Definice nového typu a proměnných jirka, alois tohoto typu typedef struct { } OSOBA; OSOBA jirka, alois;

Struktury – příklad Příklad typedef struct { char jmeno[10]; char prijmeni[20]; int vek; } OSOBA; OSOBA osoby[10]; void main() { printf(“Zadejete jmeno 1. osoby: ”); scanf(“%s”, &osoby[0].jmeno); printf(“Zadejete prijmeni 1. osoby: ”); scanf(“%s”, &osoby[0].prijmeni); printf(“Zadejete vek 1. osoby: ”); scanf(“%d”, &osoby[0].vek); printf(“Osoba 1: %s %s (%d)”, osoby[0].jmeno, osoby[0].prijmeni, osoby[0].vek); }

Výčtový datový typ – enum Příklad typedef enum { MODRA, BILA, ZLUTA, CERVENA, HNEDA } BARVY; BARVY barva = MODRA; char *nazvy[] = {”Modra”, ”Bila”, ”Zluta”, ”Cervena”, ”Hneda” }; printf(”Vybrana barva %s\n”, nazvy[barva]); Přiřazení hodnot konstantám MODRA = 5, BILA = 2, ZLUTA = 7,

Union Definice typedef union { int i; float f; char c; } PRVEK; PRVEK prvky[10]; Použití Vždy se může použít jen jeden z prvků unionu, protože všechny sdílejí stejnou paměť Union nenese informaci o typu prvku v něm uloženém Přístup je stejný jako ke struktuře (prvky[0].i = 5) K zamyšlení Jak poznat typ prvku v unionu?

Bitová pole Struktura o velikost int Můžeme definovat počet bitů, které jednotlivé prvky struktury zabírají Příklad 1 typedef struct { unsigned hodina : 5; // 0 az 23 => min. 5 bitu unsigned minuta : 6; // 0 az 59 => min. 6 bitu unsigned sekunda : 6; // 0 az 59 => min. 6 bitu } CAS; CAS mujCas; mujCas.hodina = 10; mujCas.minuta = 58; mujCas.sekunda = 50; Příklad 2 Funkce, která vrátí rozdíl dvou časů.

Práce se soubory Postup práce se soubory Dva typy souborů Otevření souboru Práce se souborem Uzavření souboru Ošetření chyb, které mohou nastat Dva typy souborů Textové soubory Binární soubory

Práce se soubory – otevření/uzavření Otevření souboru pomocí fopen(); Režimy otevření: r w a r+ w+ a+ Uzavření soboru pomocí fclose();

Práce se soubory – čtení/zápis Textové soubory fgetc() fputc() fscanf() fprintf() fgets() fputs() Binární soubory read() write()

Práce se soubory – testování konce řádku/souboru Konec řádku Konec souboru

Práce se soubory – pohyb v rámci souboru Vrácení posledního přečteného znaku zpět do bufferu Funkce ungetch(); Funguje většinou jen na poslední přečtený znak Pohyb v rámci souboru Funkce fseek();

Standardní hlavičkové soubory <assert.h> – makra pro ladění <ctype.h> – práce s znaky <math.h> – matematické funkce (přesnost double) <locale.h> – práce v národním prostředí <setjmp.h> – umožnění běžně nedovolených skoků <signal.h> – zpracování signálů <stdarg.h> – podpora proměnného počtu argumentů <stdio.h> – funkce pro vstup a výstup <stdlib.h> – běžné funkce <string.h> – práce s řetězci <time.h> – práce s datem a časem <errno.h> – systémové chyby <limits.h> – charakteristiky celých čísel <float.h> – charakteristiky reálných čísel <stddef.h> – standardní definice

Funkce pro práci se soubory (viz dříve) + hlavičkový soubor <stdio.h> Přejmenování souboru int rename(const char *old, const char *new); Ostranění souboru int remove(const char *fileName);

Práce se znaky – <ctype.h> isalnum() – je číslice nebo písmeno? isalpha() – je písmeno? isdigit() – je číslice? isxdigit() – je hexadecimální číslice? iscntrl() – je řídicí znak? islower() – je malé písmeno? isupper() – je velké písmeno? isspace() – je mezera? tolower() – převod na malé písmeno toupper() – převod na velké písmeno

Matematické funkce – <math.h> Goniometrické funkce: sin(x), cos(x), tan(x), asin(x), acos(x), atan(x), atan(x, y), sinh(x), cosh(x), tanh(x) Exponenciální funkce: exp(x) = ex Přirozený logaritmus: log(x) Dekadický logaritmus: log10(x) Umocnění: pow(x, y) = xy Druhá odmocnina: sqrt(x) Zaokrouhlení nahoru: ceil(x) Zaokrouhlení dolů: floor(x) Absolutní hodnota: fabs(x) Reálný zbytek po dělení x/y: fmod(x,y)

Funkce pro vstup a výstup <stdio.h> Práce se soubory fopen(), fclose(), remove(), rename(), fprintf(), fscanf(), fgetc(), fgets(), fputc(), fputs(), ungetc(), fread(), fwrite(), fseek(), ftell(), rewind(), fgetpos(), fsetpos(), feof() Práce se standardním vstupem a výstupem printf(), scanf(), getc(), gets(), putc(), puts(), getchar(), putchar(), Práce s řetězci sprintf(), sscanf(),

Standardní knihovna <stdlib.h> 1/2 Konverzní funkce atof() – konverze řetězce na double atoi() – konverze řetězce na int atol() – konverze řetězce na long int strtod() – konverze řetězce na double strtol() – konverze řetězce na long int strtoul() – konverze řetězce na unsigned long int Generování náhodných čísel rand() – generování náhodného čísla srand() – inicializace generátoru náhodných čísel Práce s dynamicky alokovanou pamětí calloc() – alokace dynamické paměti s inicializací malloc() – alokace dynamické paměti realloc() – realokace dynamické paměti free() – uvolnění dynamicky alokované paměti

Standardní knihovna <stdlib.h> 2/2 Ukončení programu abort() – nestandardní ukončení programu exit() – standardní ukonční programu atexit() – registrace ukončovací funkce Matematické funkce abs() – absolutní hodnota typu int labs() – absolutní hodnota typu long int div(x, y) – x/y a x%y současně pro typ int ldiv(x, y) – x/y a x%y současně pro typ long int Systémové funkce system() – volání systémového příkazu getenv() – poskytnutí informace o systémové proměnné Třídění bsearch() – binární vyhledávání qsort() – řazení algoritmem quick-sort

Funkce pro práci s časem <time.h> Počet tiků procesoru: clock() Počet sekund od 1. ledna 1970: time() Rozdíl dvou časů: difftime() Práce s položkami času: mktime() Konverze času do řetězce: asctime() Konverze počtu sekund do řetězce: ctime() Práce s GMT: gmtime() Výpočet složek času z počtu sekund: localtime() Formátová konverze složek času do řetězce: strftime()

Dynamické datové struktury – seznam text