C jest z natury językiem minimalistycznym. Zajmuje się najważniejszymi kwestiami, a resztę pozostawia Tobie. Nie ma wbudowanego wejścia klawiaturowego ani wyjścia ekranowego. Jeśli chcesz wyświetlić tekst, potrzebujesz zewnętrznych narzędzi. Tutaj do gry wchodzą biblioteki programowania C. Są to fragmenty kodu wielokrotnego użytku, które rozszerzają podstawowe możliwości języka.

Pomyśl o nich jak o wtyczkach do swojej logiki. Standardowa biblioteka stdio obsługuje wejście i wyjście. Inne biblioteki zarządzają operacjami matematycznymi, ciągami znaków lub czasem. Korzystanie z bibliotek dzieli projekt na łatwe do zarządzania moduły. Ułatwia to debugowanie. Umożliwia także pobranie działającego kodu ze starych projektów i przeniesienie go do nowych.

Dlaczego kod modułowy ma znaczenie

Zapisanie wszystkiego w jednym pliku szybko prowadzi do chaosu. Otrzymujesz setki wierszy, które trudno śledzić. Biblioteki rozwiązują ten problem poprzez izolację funkcjonalności. Testujesz jedną funkcję. Sprawdzasz, czy to działa. Następnie przejdź do następnego kroku.

Rezultatem jest czystszy kod. Jest to również bezpieczniejsze. Jeśli pojawi się błąd, wiesz dokładnie, który moduł sprawdzić. Nie musisz szukać problemu w ogromnym, monolitycznym skrypcie.

Przykład: Refaktoryzacja sortowania losowego

Spójrzmy na praktyczny przykład. Wyobraź sobie program, który generuje liczby losowe, sortuje je i wyświetla na ekranie. Kod źródłowy może wyglądać jak splątany bałagan.

Ten kod wypełnia tablicę losowymi wartościami. Następnie stosuje sortowanie bąbelkowe. Na koniec wyświetla posortowaną listę. To działa. Ale nie nadaje się do ponownego użycia. Logika sortowania jest zakodowana na stałe. Rozmiar tablicy jest stały. Nie można łatwo zastąpić algorytmu sortowania ani źródła danych.

Krok 1: Wyodrębnianie funkcji sortowania

Pierwszym krokiem do utworzenia biblioteki jest wyodrębnienie. Weź pętlę sortowania bąbelkowego i zamień ją w funkcję. Ponieważ tablica a i stała MAX są w tym fragmencie kodu globalne, funkcja nie potrzebuje dla nich parametrów. Nie musi również zwracać wartości.

Zwróć uwagę na parametry. Teraz funkcja przyjmuje m – liczbę elementów. Dzięki temu jest elastyczny. Można sortować tablicę składającą się z 10 elementów. Lub tablica składająca się ze 100 elementów. Po prostu przekazujesz rozmiar.

Główna funkcja staje się prostsza. Wypełnia tablicę. Powoduje sortowanie. Wyświetla wynik.

To jest już lepsze. Ale kod jest nadal powiązany z tablicą globalną „a”. A co jeśli chcesz posortować inną tablicę? Lub przekazać dane z innego modułu?

Krok 2: Uogólnienie w celu zapewnienia prawdziwej możliwości ponownego użycia

Aby ten kod był naprawdę gotowy na bibliotekę, przekaż samą tablicę jako parametr. Zmień sygnaturę funkcji.

Mówi to kompilatorowi, aby zaakceptował tablicę liczb całkowitych dowolnego rozmiaru. Ciało funkcji nie ulega zmianie. Po prostu przekazujesz dane do logiki, zamiast polegać na stanie globalnym.

Wywołanie main zostało nieco zaktualizowane. Podajesz nazwę tablicy a i jej rozmiar MAX.

Nie używaj &a. Możesz pomyśleć, że potrzebujesz wskaźnika do całej tablicy. To jest błędne. W C nazwy tablic są konwertowane na wskaźniki do ich pierwszego elementu po przekazaniu do funkcji. Zrozumienie tej różnicy wymaga znajomości wskaźników. Ale na razie wiedz, że „a” wystarczy.

Dlaczego ta struktura wygrywa

ty