Musíte uložit tisíc celých čísel. Opravdu chcete deklarovat int a, b, c... až po z a pak pokračovat? Ne. Je to zdlouhavé a náchylné k chybám. Místo toho použijte array.
Pole je sbírka hodnot stejného typu. Sbalí je do jednoho paměťového bloku. V C to deklarujete takto:
“int a[5];”.
To je vše. Pět celých čísel. Připraveni.
Proč pole v C začínají od nuly
To je nuance, o kterou začátečníci narážejí. Pole v C jsou indexována od začátku.
Pokud deklarujete int a[5], budete mít pět slotů. Jsou však očíslovány 0, 1, 2, 3 a 4. Prvek a[5] neexistuje. Pokud se pokusíte získat přístup k a[5], budete číst paměť, která nepatří do vašeho pole. C tě nezastaví. Jednoduše vrátí odpadky nebo způsobí havárii. Toto je funkce, nikoli chyba. Je to rychlé. Je to také nebezpečné.
K prvkům přistupujete pomocí hranatých závorek. a[0] je první prvek. a[4] je poslední.
Generování náhodných čísel v C
Pojďme vytvořit něco užitečného. Napíšeme program, který vygeneruje 10 náhodných čísel a seřadí je.
Nejprve potřebujete samotná čísla. Ve standardní knihovně C existuje funkce rand(), ale podívejme se na klasickou implementaci, abychom pochopili mechaniku. Tento kód používá lineární generátor kongruentů, metodu z knihy K&R C.
Všimněte si řádku #define MAX 10. Vytváří konstantu. Podle konvence se konstanty píší velkými písmeny. Díky tomu vynikají. Deklarujete pole int a[MAX] mimo funkci main. To z něj dělá globální proměnnou. Je k dispozici v kterékoli části programu.
Proměnná rand_seed je také globální. Začíná hodnotou 10. Protože seed je pevný, “náhodná” čísla jsou ve skutečnosti stejná při každém spuštění programu. Pokud chcete skutečnou náhodnost, musíte inicializovat generátor se systémovým časem. Mezitím je vytrvalost užitečná pro ladění.
Pochopení bublinového třídění
Nyní přichází ta těžší část. Řazení.
Použijeme bubble sort. Toto je nejjednodušší třídicí algoritmus. Je také nejpomalejší. Ale naučí vás, jak se smyčky a pole vzájemně ovlivňují.
Přidejte tento kód do své funkce „hlavní“ a nahraďte komentář „jiné věci“:
co se to tu děje?
Vnější smyčka se provede MAX-1 krát. Vnitřní smyčka se při každém průchodu provede méněkrát. Proč? Protože největší čísla se s každým průchodem „vznášejí“ na konec pole. Není třeba je znovu kontrolovat.
Uvnitř vnitřní smyčky porovnáváme a[y] s a[y+1]. Pokud je levý prvek větší, prohodíme je. K udržení hodnoty při přesunu prvků používáme dočasnou proměnnou t.
“Jediný snadný způsob, jak skutečně pochopit, co tento kód dělá, je spustit jej ručně.”
Vezměte si kus papíru. Nakreslete pět políček. Vložte do nich čísla. Spusťte kód řádek po řádku. Přesuňte čísla. Uvidíte, jak velká čísla klesnou na dno. Malí plují na vrchol. To je jasné. Je to mechanické.
Časté chyby při práci s poli v C
C tě nedrží za ruku. Spadneš z okraje.
- Bez kontroly hranic. Pokud přistupujete k
a[10]v poli o velikosti 10, C si nebude stěžovat. Přečte všechny paměti, které jsou poblíž. To vede k jemným chybám, které se těžko hledají. - Volání funkcí vyžadují závorky. Musíte napsat
x = rand();. Pokud napíšetex = rand;, přiřazujetexpaměťovou adresu funkce, nikoli její výsledek. Toto se zkompiluje. Tím se program přeruší.
Zkuste to
Nejen číst. Napište kód.
- Změňte smyčku, která vyplňuje pole, na jeden řádek. umíš to?
- Přesuňte logiku řazení bublin do samostatné funkce. Nazvěte to
void bubble_sort(). Přesuňte proměnnéx,yatdovnitř této funkce. Stanou se místními. Poleaje globální, takže jej není třeba předávat. - Změňte
rand_seedna jiné hodnoty. Sledujte změnu výstupu.
Základem jsou pole. Jsou stavebními kameny datových struktur. Zvládněte je a zbytek C bude jasnější. Ignorujte indexování od začátku a strávíte hodiny laděním chyby, která se stala před třemi kroky.






























