IB001 – Seminární skupiny 6, 7 a 24

Týden 7

Pole předem neznáme velikosti (od verze C99)

Standard C99 umožnil v programech v jazyce C definovat pole, jehož velikost je určená hodnotou proměnné. V předchozích verzích jazyka musela být velikost pole konstantou známou v době překladu programu. Využít toho lze např., pokud uživatel na začátku programu zadá velikost dalšího vstupu.
Následující program si vyžádá počet prvků načítané množiny a poté jednotlivé prvky načte do pole:

// Pocet prvku se nacte do predem definovane promenne n
printf("Zadejte pocet prvku: ");
scanf("%d", &n);
// Definice pole s velikosti ulozenou v promenne
int set[n];
// Nacteni jednotlivych prvku
for (int i = 0; i < n; i++)
{
    printf("Zadej %d. prvek mnoziny: ", i + 1);
    scanf("%d", &set[i]);
}

Řetězce I

Řetězec je v jazyce C reprezentován jako pole znaků - typu char, které jako poslední znak řetězce obsahuje hodnotu 0 - konstanta '\0'. Nulová hodnota v poli znaků říká, kde řetězec končí. Všechny funkce pracující s řetězci na tuto nulovou hodnotu spoléhají, pokud ji v řetězci zapomeneme, bude program pracovat chybně. V jazyce C je možné definovat řetězcovou konstantu - řetězec, který vytvoří kompilátor - takto:

char string[] = "Hello, World!";
// Nacteni retezce pomoci funkce gets
char string2[128];
printf("Zadejte retezec: ");
gets(string2);

Základní funkce pro práci s řetězci naleznete v hlavičkovém souboru string.h - http://www.cplusplus.com/reference/clibrary/cstring/.

Řadící algoritmy Bubble sort a Insertion sort

Oba uvedené algoritmy nejsou zrovna efektivní pro řazení velkého množství prvků, ale jsou jednoduché na pochopení a naprogramování.
Podrobnosti a hezké animace najdete např. zde:

Složené (agregované) datové typy II - vícerozměrné pole

V jazyce C je možné nadefinovat vícerozměrná pole. Výhodou vícerozměrných polí může být jednodušší zápis programu. Představme si, že chceme v programu definovat matici celých čísel o rozměrech 2x2, v C to můžeme udělat takto:

// definice matice 2x2 jako dvourozmerneho pole
int matrix[2][2];
// prvky matice pak můžeme adresovat pomocí dvou indexů od 0
int a11 = matrix[0][0];

Pokud v C definujeme vícerozměrné pole výše uvedeným bude pravděpodobně (záleží na kompilátoru) v paměti toto pole reprezentováno jako jednorozměrné. Např. naše matice se nejspíše uloží tak, že se nejprve uloží jednorozměrné pole matrix[0] a za něj pole matrix[1]. Celé to pak v paměti bude vypadat pole o 4 prvcích - int pole[4] = { matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1] };