Musisz przechowywać tysiąc liczb całkowitych. Czy naprawdę chcesz zadeklarować „int a, b, c…” aż do „z”, a następnie kontynuować? Nie. Jest to żmudne i podatne na błędy. Zamiast tego użyj tablica.
Tablica to zbiór wartości tego samego typu. Pakuje je w jeden blok pamięci. W C deklarujesz to w ten sposób:
int a[5];
To wszystko. Pięć liczb całkowitych. Gotowy do pracy.
Dlaczego tablice w C zaczynają się od zera
To jest niuans, na który potykają się początkujący. Tablice w C są indeksowane od zera.
Jeśli zadeklarujesz „int a[5]”, będziesz mieć pięć miejsc. Ale są one ponumerowane 0, 1, 2, 3 i 4. Element „a[5]” nie istnieje. Jeśli spróbujesz uzyskać dostęp do a[5], będziesz czytać pamięć, która nie należy do twojej tablicy. C Cię nie zatrzyma. Po prostu zwróci śmieci lub spowoduje awarię. To jest funkcja, a nie błąd. To jest szybkie. To także niebezpieczne.
Dostęp do elementów uzyskuje się za pomocą nawiasów kwadratowych. a[0] jest pierwszym elementem. a[4] jest ostatnim.
Generowanie liczb losowych w C
Stwórzmy coś pożytecznego. Napiszemy program, który wygeneruje 10 liczb losowych i je posortuje.
Najpierw potrzebujesz samych liczb. W standardowej bibliotece C znajduje się funkcja rand(), ale spójrzmy na klasyczną implementację, aby zrozumieć mechanikę. W tym kodzie zastosowano generator kongruentu liniowego, metodę z książki K&R C.
Zwróć uwagę na linię „#define MAX 10”. Tworzy stałą. Zgodnie z konwencją stałe zapisuje się wielkimi literami. To sprawia, że się wyróżniają. Deklarujesz tablicę int a[MAX] poza funkcją main. To sprawia, że jest to zmienna globalna. Jest dostępny w dowolnej części programu.
Zmienna rand_seed jest również globalna. Zaczyna się od wartości 10. Ponieważ ziarno jest stałe, liczby „losowe” są w rzeczywistości takie same przy każdym uruchomieniu programu. Jeśli chcesz prawdziwej losowości, musisz zainicjować generator czasem systemowym. W międzyczasie trwałość jest przydatna do debugowania.
Zrozumienie sortowania bąbelkowego
Teraz nadchodzi trudniejsza część. Sortowanie.
Użyjemy sortowania bąbelkowego. To najprostszy algorytm sortowania. Jest także najwolniejszy. Ale uczy, jak pętle i tablice oddziałują na siebie.
Dodaj ten kod do swojej funkcji „main”, zastępując komentarz „inne rzeczy”:
Co tu się dzieje?
Pętla zewnętrzna jest wykonywana MAX-1 razy. Wewnętrzna pętla jest wykonywana mniej razy przy każdym przebiegu. Dlaczego? Ponieważ największe liczby „przepływają” na koniec tablicy przy każdym przejściu. Nie ma potrzeby ich ponownego sprawdzania.
Wewnątrz wewnętrznej pętli porównujemy „a[y]” z „a[y+1]”. Jeśli lewy element jest większy, zamieniamy je. Używamy zmiennej tymczasowej t do przechowywania wartości podczas przenoszenia elementów.
„Jedynym prostym sposobem, aby naprawdę zrozumieć, do czego służy ten kod, jest ręczne uruchomienie go.”
Weź kawałek papieru. Narysuj pięć pudełek. Wpisz w nie liczby. Wykonaj kod linia po linii. Przesuń liczby. Zobaczysz, że duże liczby opadają na dno. Najmłodsi unoszą się na górę. To jest jasne. To mechaniczne.
Typowe błędy podczas pracy z tablicami w C
C nie trzyma cię za rękę. Spadniesz z krawędzi.
- Brak sprawdzania granic. Jeśli uzyskasz dostęp do
a[10]w tablicy o rozmiarze 10, C nie będzie narzekał. Odczyta każdą pamięć znajdującą się w pobliżu. Prowadzi to do subtelnych błędów, które trudno znaleźć. - Wywołania funkcji wymagają nawiasów. Musisz wpisać
x = Rand();. Jeśli napiszeszx = rand;, przypiszeszxadres pamięci funkcji, a nie jej wynik. To się kompiluje. To psuje program.
Spróbuj tego
Nie tylko czytaj. Napisz kod.
- Zmień pętlę wypełniającą tablicę na jedną linię. Czy potrafisz to zrobić?
- Przenieś logikę sortowania bąbelkowego do osobnej funkcji. Nazwij to „void bubble_sort()”. Przenieś zmienne
x,yitwewnątrz tej funkcji. Staną się lokalne. Tablicaajest globalna, więc nie ma potrzeby jej przekazywania. - Zmień
rand_seedna inne wartości. Obserwuj zmianę wyjścia.
Tablice to podstawa. Stanowią elementy składowe struktur danych. Opanuj je, a reszta C stanie się jaśniejsza. Zignoruj indeksowanie od zera, a spędzisz godziny na debugowaniu awarii, która wydarzyła się trzy kroki temu.






























