Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král.

Podobné prezentace


Prezentace na téma: "Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král."— Transkript prezentace:

1 Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král

2 Obsah Symbolické konstanty Výčtové konstanty Příkaz pro větvení switch
Jednorozměrná pole Inicializace pole Přístup k prvkům pole Kopírování a porovnávání prvků pole Dvojrozměrná pole

3 Symbolické konstanty Kromě symbolických konstant využíváme také výčtové konstanty pomocí klíčového slova enum. Následující příklad nevhodného použití symbolických konstant upravíme na dalším snímku s využitím výčtových konstant. #include <stdio.h> #define HRAJE 0 #define VYHRAL 1 #define PROHRAL 2 #define KONEC 3 int main() { int stav = HRAJE; do int znak = getchar(); if (znak == 'q') stav = KONEC; } } while (stav == HRAJE); return 0; Symbolické konstanty očíslované „ručně“

4 Výčtové konstanty (enum)
U výčtových konstant za nás může kompilátor generovat hodnoty. Často představují vhodnější variantu než symbolické konstanty. #include <stdio.h> enum StavHry { HRAJE, VYHRAL, PROHRAL, KONEC }; int main() enum StavHry stav = HRAJE; do int znak = getchar(); if (znak == 'q') stav = KONEC; } } while (stav == HRAJE); return 0; Výčtové konstanty očíslované kompilátorem automaticky od 0. Výčtový typ

5 Výčtové konstanty (enum)
Hodnoty u výčtových konstant můžeme zadávat také i ručně. Automatické očíslování potom pokračuje od poslední ručně zadané hodnoty. #include <stdio.h> enum StavHry { HRAJE = 10, VYHRAL = 20, PROHRAL, KONEC }; int main() enum StavHry stav = HRAJE; do int znak = getchar(); if (znak == 'q') stav = KONEC; } } while (stav == HRAJE); return 0; Výčtové konstanty očíslované částečně „ručně“ a částečně automaticky PROHRAL == 21, KONEC == 22

6 Switch Příkaz switch slouží ke větvení programu na základě konstantních celočíselných hodnot například znakových konstant. enum StavHry stav = HRAJE; do { int znak = getchar(); switch (znak) case 'q': stav = KONEC; break; case 'w': stav = VYHRAL; case 'l': stav = PROHRAL; default: } } while (stav == HRAJE); Klíčové slovo break používáme k tomu aby program nepokračoval na další case. Otestujte co se stane, pokud break vynecháme. Volitelně je možné použít klíčové slovo default které označuje všechny ostatní možnosti než jsou v case. Poslední break není nutný, ale je jen doporučený.

7 Ukázka příkazu switch a výčtových konstant
Live coding

8 Jednorozměrné pole Pole je nepřerušený blok po sobě jdoucích objektů stejného typu. Délka pole musí být konstanta. Pouze standard C99 obsahuje povinně pole s proměnnou délkou - Variable- Length Array (VLA), ale standard C11 už obsahuje VLA pouze jako nepovinnou (volitelnou) součást. int a[10]; Definuje pole o velikosti 10, tedy blok po sobě jdoucích objektů typu int pojmenovaných a[0] až a[9] a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

9 Inicializace pole Vynechaný počet prvků pole char a[] = "abc";
Výchozí hodnota prvků pole na zásobníku je náhodná (co zrovna zůstalo v paměti). Při definici je možné pole zároveň i inicializovat. Inicializovat pole můžeme řetězcem a nebo hodnotami ve složených závorkách. Při inicializaci můžeme vynechat počet prvků pole pokud si jej kompilátor může dopočítat. Vynechaný počet prvků pole char a[] = "abc"; a[0] a[1] a[2] a[3] 'a' 'b' 'c' '\0' Načte pouze první 3 znaky a vynechá znak '\0' na konci řetězce. Menší počet než 3 nepůjde přeložit. U většího počtu doplní '\0'. char b[3] = "abc"; b[0] b[1] b[2] 'a' 'b' 'c'

10 Inicializace pole Inicializace pomocí složených závorek.
char a[] = { 'a', 'b', 'c' }; a[0] a[1] a[2] 'a' 'b' 'c' int b[] = { 0, 1, 2 }; b[0] b[1] b[2] 1 2 int c[3] = { 0 }; c[0] c[1] c[2] Pouze první hodnota bude 10 a zbytek bude 0 int d[3] = { 10 }; d[0] d[1] d[2] 10

11 Indexy pole int pole[] = { 0, 1, 2, 3 }; int prvek = 0;
K prvkům pole přistupujeme pomocí operátoru indexace []. Jazyk C nehlídá indexy pole a může dojít k přepsání paměti a poškození dat nebo vlastního programu a dojít k nepředvídatelným chybám nebo i pádu celého programu. int pole[] = { 0, 1, 2, 3 }; int prvek = 0; prvek = pole[0]; // 1. prvek prvek = pole[2]; // 2. prvek prvek = pole[3]; // 3. prvek prvek = pole[4]; // 4. (posledni) prvek pole[-1] = 100; pole[5] = 200; Přepíše paměť před polem Přepíše paměť za polem, častá chyba programátorů v jazyce C

12 Přístup k prvkům Nastavení všech prvků pole na 0
#include <stdio.h> #define DELKA 3 int main() { int pole[DELKA] = { 0 }; for (int i = 0; i < DELKA; i++) pole[i] = i * 2; } int prvek = pole[i]; printf("%d ", prvek); return 0; Nastavení všech prvků pole na 0 Přiřazení hodnoty prvku pole Získání hodnoty prvku pole

13 Práce s polem Jazyk C neumí pracovat s polem jako s celkem, nemůžeme tedy mezi sebou pole jednoduše kopírovat nebo porovnávat. Musíme pracovat buď s jednotlivými prvky pole a nebo využít například funkce pro práci s pamětí. Lepší situace je u textových řetězců, kde můžeme využít například funkce pro kopírování (strcpy) nebo porovnávání (strcmp). Tyto funkce mají jako parametry ukazatele a proto je probereme později. int poleA[] = { 0, 1, 2, 3 }; int poleB[] = { 0, 1, 2, 3 }; bool test = false; // poleA = poleB; test = poleA == poleB; test = poleA > poleB; Nejde ani přeložit! Porovná pouze adresy prvních prvků! Porovná pouze adresy prvních prvků!

14 Porovnání dvou polí Pokud chceme zjistit zda prvky pole rovnají, tak musíme ověřit každý prvek zvlášť. To samé platí pro kopírování prvků pole a další operátory. int poleA[] = { 0, 1, 2, 3 }; int poleB[] = { 0, 2, 2, 3 }; bool testRovnostiHodnot = true; for (int i = 0; i < 4; i++) { if (poleA[i] != poleB[i]) testRovnostiHodnot = false; break; }

15 Kopírování hodnot pole
#define N 4 int main() { int poleA[N] = { 0, 1, 2, 3 }; int poleB[N] = { 0 }; for (int i = 0; i < N; i++) poleB[i] = poleA[i]; } return 0; Kopírujeme prvek po prvku

16 Dvojrozměrná pole Prakticky jde pole polí Vnořená inicializace
#include <stdio.h> #define VYSKA 3 #define SIRKA 2 int main() { char matice[VYSKA][SIRKA] = { {'1', '2'}, {'3', '4'}, {'5', '6'} }; for (int i = 0; i < VYSKA; i++) for (int j = 0; j < SIRKA; j++) char prvek = matice[i][j]; printf("%c ", prvek); } printf("\n"); return 0; Prakticky jde pole polí Vnořená inicializace Získáme j-tý prvek v i-tém pole Získáme i-té pole

17 Ukázka práce s polem Live coding

18 Děkuji za pozornost Otázky?


Stáhnout ppt "Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král."

Podobné prezentace


Reklamy Google