Wstęp

Wstęp

Biblioteka standardowa C oferuje mnóstwo funkcji dla wielu zwykłych zadań. Istnieje również wiele bibliotek dla dodatkowych funkcji, takich jak GUI Design (GTK+) lub interfejs bazy danych (libpq). Jednak w miarę postępów w świecie programowania C wkrótce powtarzasz te same instrukcje w tej samej kolejności, co stanie się czasochłonne i nieefektywne. Więc możesz po prostu owinąć wszystkie te instrukcje w funkcji i po prostu dzwonić wspomniana funkcja, kiedy jej potrzebujesz. Oto, czego się nauczysz, czytając ten artykuł, a także kilka przydatnych wskazówek, które ułatwią Twoje życie.

Tworzenie swoich funkcji

Aby uzyskać prosty początek, powiedzmy, że chcesz napisać kalkulator. Nie skupimy się na interfejsie (GUI vs Kurses vs Slang vs. CLI), ponieważ jesteśmy zainteresowani wewnętrznymi. Byłoby to niezgrabne nie Utwórz funkcję dla każdej operacji, którą zdecydujesz się obsługiwać, chyba że istnieje już jedna, jak pow (), zdefiniowana w matematyce.H, który zwraca wynik podnoszonej bazy do mocy. Na przykład w celu dodania będziesz mieć funkcję o nazwie add (), która wymaga dwóch argumenty, przynajmniej na razie i zwroty wynik. Więc kiedy użytkownik zdecyduje się dodać liczby, które wprowadził, po prostu dzwonić funkcja z liczbami wprowadzonymi przez użytkownika i nie musisz się martwić niczym innym. Te trzy terminy, które napisałem kursywą, są niezbędne do zrozumienia funkcji. Funkcja zwykle (ale nie zawsze) wymaga czegoś, robi wiele operacji w tym czymś i wypluwa wynik. „Nie zawsze”, ponieważ Main (), jak widać wcześniej, można nazwać żadnych argumentów, a także inne przykłady. Ale na razie skupmy się na naszych przykładach. Liczby, które należy dodać, to argumenty, które „coś” podajesz funkcję przetwarzania. Część przetwarzania znajduje się w treści funkcji, kiedy każesz jej dodać liczby. Następnie część „wypychania” nazywa się zwracającą wartość, która w naszym przypadku jest wynikiem dodania.

Zobaczmy, o czym rozmawialiśmy w praktycznym przykładzie:

#włączać  /* Zawiera definicję printf ()*/ podwójne dodanie (podwójne x, podwójne y); int main () float pierwszy, drugi; printf („Wprowadź pierwszy numer.\ n ”); scanf („%f ”i pierwszy); printf („ Wprowadź drugą liczbę.\ n "); scanf („%f ”i sekunda); podwójne add (double a, double b)  powrót A + B;  printf („Wynik dodania to %f \ n”, add (pierwszy, drugi)); powrót 0; 

Powyższy kod, choć w najlepszym razie uproszczony, pomaga nam dokładnie wskazać to, o czym rozmawialiśmy. Najpierw deklarujemy funkcję, zanim main (), a celem jest znanie nazwy, typu argumentów i typu funkcji. Ta linia jest również nazywana definiowaniem prototypu funkcji. Jak widać, nazwy argumentów z deklaracji nie muszą być takie same jak te użyte w definicji, ale jeśli to cię niepokoi, użyj stałego schematu nazewnictwa, w porządku jest w porządku. Zanim użyjemy tej funkcji, musimy ją zdefiniować, jak w powiedz światu, co jest dokładnie tak, że tak jest. Nawet jeśli ciało funkcji jest jednokierunkowe, podobnie jak w naszym przykładzie, najlepiej używać aparatów ortodontycznych do czytelności i dobrego nawyku. Tutaj wszystko, co robi funkcja, zwraca wynik dodania między dwiema liczbami.

Sugerujemy użycie nazwisk do funkcji, argumentów i zwykłych zmiennych lub stałych, które odzwierciedlają to, co robią, ponownie dla dobrego nawyku i oszczędzania programistów odczytania kodu prób zgadywania, do czego robi zmienna „xyzgth”. Również, Użyj komentarzy. Nawet jeśli w powyższych komentarzach kodowych mogą wydawać się przesadne, nie są. Kiedy spojrzysz na kod dwa miesiące później, nie będziesz mieć pojęcia, co masz na myśli, kiedy napisałeś kod. Więc używaj i nadużyj komentarzy, będą cię uratować, zaufaj mi.

Ćwiczenia

Istnieją funkcje, które mogą zaakceptować zmienną liczbę argumentów, takich jak na przykład printf (). Możesz korzystać z Google, aby zobaczyć, co robią, i spróbować przepisać funkcję add (), aby zaakceptować więcej niż dwa argumenty lub utworzyć inną funkcję. Możesz także użyć „Man 3 printf”.


Powiedzieliśmy ci, zanim ten main () można zadzwonić bez żadnych argumentów. Oczywiście oznacza to, że można go również wywołać argumentami. Kiedy jest to przydatne? W programach prostych, takich jak nasze, ponieważ nazywamy ich bez żadnych argumentów, nawiasy main () są puste. Ale kiedy twoje programy będą rosły ze złożonością, zwłaszcza jeśli zostaną zorientowane na wiersz poleceń, będziesz musiał dodać funkcjonalność argumentów, takich jak flaga GCC -V, która drukuje wersję. Gdy taka funkcjonalność jest pożądana, main () musi mieć argumenty, dwa, które precyzyjnie. Główna funkcja staje się

int main (int argc, char ** argv) …

Zanim wystraszyć się o tajemnicze imiona i podwójne gwiazdki, poczekaj, aż otrzymasz wyjaśnienie, co jest w rzeczywistości proste. Pierwszym argumentem jest liczba całkowita o nazwie Argc, a nazwa pochodzi z „liczby argumentów”. Trochę lepiej, prawda? O drugim argumencie… cóż, nazwa jest oficjalnie „argumentem” i jest to wskaźnik do wskaźnika do zwęglenia. Teraz, w języku angielskim, podczas gdy ARGC przechowuje liczbę argumentów, ARGV przechowuje argumenty jako serię strun. Część „wskaźnik do…” zostanie wyjaśniona w następnej części artykułu, na razie wszystko, co musisz wiedzieć, to to, że jeśli na przykład użytkownik wpisuje trzy argumenty do programu, indeks zero argv będzie nazwą samego programu indeks jeden będzie przechowywał pierwszy argument programu i tak dalej. W ten sposób możesz użyć przełącznika/obudowy, aby sprawdzić argumenty przekazane do twoich programów. Zanim podamy ci krótki przykład, czujemy się zmuszeni powiedzieć, że Main ma dwa argumenty określone przez standard, i w ten sposób jest on używany w większości systemów Linux i Unix. Jeśli jednak (będziesz) pracował w systemie Windows lub Darwin, Main () będzie miał jeszcze jeden lub dwa kolejne argumenty, ale są one zależne od systemu, a zatem nie są zdefiniowane ani wymagane przez standard. Ponadto „char ** argv” może być również napisane jako „char *argv []”. Zobaczysz oba, w zależności od preferencji programisty.

Pamiętasz, że powiedzieliśmy ci w pierwszej części naszej serii, jak będziemy korzystać z tego programu Kimball Hawkins. Nadszedł czas, abyśmy zaczęli, więc oto jak w przeszłości radzi sobie z częścią możliwego wejścia użytkownika:

Jeśli (strncmp (argv [i], "--help", 6) == 0 || strncmp (argv [i], "-?", 2) == 0 || strncmp (argv [i],"?", 1) == 0 || strncmp (argv [i]," help ", 4) == 0) minest_help (); / * żądana pomoc, wyświetl go */ Jeśli (strncmp (argv [i], "--version", 9) == 0 || strncmp (argv [i], "--licence", 9) == 0) miny_version (); / * żądane informacje o wersji/licencji */

W tym kodzie możesz zobaczyć, jak Kimball komentuje swój kod, chociaż nazwa funkcji, które wywołuje - w przeszłości_help () i w przeszłości () - są dość oczywiste. Standardowa funkcja strncmp (), którą można znaleźć w ciągu.H, porównuje dwa ciągi, na przykład w naszym przypadku Argv [I] i „pomoc”, ale tylko pierwsze X znaków (4 w linii „Pomoc”) i zwraca zero, jeśli pierwszy ciąg pasuje do drugiego.

Ćwiczenia

Jak użyłbyś przełącznika/obudowy, aby sprawdzić, czy pierwszym argumentem jest „-Help”, a drugi to „-version”? Czy te opcje można używać razem? Jak różni się kod?

Rzeczy, o których należy pamiętać

C nie pozwala na zdefiniowanie funkcji w innej, z wyjątkiem main (), która jest, jak widzimy, specjalne. Uważaj również, że to, co definiujesz w funkcji „żyje” tylko w funkcji. Możesz więc mieć zmienną o nazwie „A” zdefiniowaną w trzech różnych funkcjach bez żadnych problemów, ale może to prowadzić do problemów w większych programach, więc nie zalecamy tego.

Niestandardowe pliki nagłówka

Ponieważ twoje programy będą coraz większe, znajdziesz potrzebę ich podziału. Możesz mieć więcej niż jedno pliki źródłowe, ale możesz również napisać własne nagłówki. Wracając do naszego programu dodawania, możesz utworzyć nagłówek nazwany operacje.H, który będzie miał linię „Double Add (podwójne x, double y);”, więc twój program poradzi sobie tylko z definicją, częścią, w której mówisz, że add () zwróci A + B. Dołączenie niestandardowego nagłówka odbywa się tak, jak uwzględniasz z jednym ważnym wyjątkiem: pamiętaj, aby używać podwójnych cytatów zamiast nawiasów kątowych, takiego: operacje „#include”.H"". Ten nagłówek można umieścić w katalogu, w którym inne pliki źródłowe są przechowywane lub na innej ścieżce, określone jako argument do GCC, aby wiedział, gdzie szukać. Pliki nagłówka mogą zawierać również definicje stałych (z #Define) lub inne deklaracje, o ile wiesz, że będą używane w każdym pliku źródłowym programu. To nie jest obowiązkowe, to po prostu dobra praktyka. Jak więc napisałbyś kalkulator, który zajmuje się wyłącznie podstawowymi operacją arytmetyczną i używa nagłówków?

Funkcje rekurencyjne

Oczekujemy, że będziesz mieć pewne pochodzenie programowania, jesteśmy pewni, że wiesz, jakie są funkcje rekurencyjne i jak/kiedy ich używać. Właśnie dlatego ten podrozdział będzie krótszy niż normalnie. Krótko mówiąc, mówi się o funkcji, która ma być rekurencyjna, gdy się wywołuje. Chociaż koncepcja może być zniechęcająca dla nowych programistów, można wyjaśnić jedną prostszą, prawdziwą rekurencję. Efekt, który widzisz, jest wizualna reprezentacja rekurencji. Ale damy ci krótki przykład, abyś lepiej zrozumiał, kiedy i jak z niego korzystać. Prawdopodobnie pamiętasz ze szkoły, kiedy nauczono cię o czynnikach. Czynnik jest wynikiem wszystkich liczb całkowitych mniejszych niż on lub równy, o ile są większe niż zero. Notacja do tego jest znak wykrzyknika, więc 6! = 6*5*4*3*2*1 = 720. Jak możemy to zrobić w najskuteczniej? Oczywiście za pomocą rekurencji.

Inst Factorali (numer int)  Jeśli(numer <= 1) powrót 1; w przeciwnym razie powrót Numer * Factorial (Number-1)

Wniosek

Zalecamy korzystanie z funkcji tak często, jak to możliwe, i umieszczać ich prototypy w plikach nagłówka tak często, ponieważ kod będzie bardziej zorganizowany, a praca stanie się łatwiejsza. Mówiąc o nagłówkach, pozostawiamy to jako ostatnie ćwiczenie, aby rozpocząć czytanie pliku nagłówka definiującego operacje matematyczne (matematyka.h) Aby dowiedzieć się, jak to wygląda i co zawiera. Następnie użyj go, aby ulepszyć kalkulator z pewną ulepszoną funkcjonalnością poza podstawami.

Oto, czego możesz się spodziewać następnego:

  • I. C Opracowanie w Linux - Wprowadzenie
  • Ii. Porównanie C i innych języków programowania
  • Iii. Typy, operatorzy, zmienne
  • Iv. Kontrola przepływu
  • V. Funkcje
  • Vi. Wskaźniki i tablice
  • VII. Struktury
  • VIII. Podstawowe I/O
  • IX. Styl kodowania i zalecenia
  • X. Budowanie programu
  • Xi. Opakowanie dla Debiana i Fedory
  • XII. Uzyskanie pakietu w oficjalnych repozytoriach Debiana

Powiązane samouczki Linux:

  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Mastering Bash Script Loops
  • Rzeczy do zainstalowania na Ubuntu 22.04
  • Ubuntu 20.04 Przewodnik
  • Samouczek SQLite Linux dla początkujących
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 22.04 JAMMY Jellyfish…
  • Jak podwójnie rozruch Kali Linux i Windows 10