Einführung

Einführung

Die C -Standardbibliothek bietet eine Vielzahl von Funktionen für viele übliche Aufgaben. Außerdem gibt es viele Bibliotheken für zusätzliche Funktionen, wie GUI -Design (GTK+) oder Datenbank -Schnittstelle (LIBPQ). Wenn Sie jedoch in der C-Programmierwelt voranschreiten, werden Sie bald immer wieder dieselben Anweisungen in derselben Reihenfolge wiederholen, und das wird zeitaufwändig und ineffizient. So können Sie einfach alle diese Anweisungen in eine Funktion und gerade einwickeln Forderung sagte Funktion, wenn Sie sie brauchen. Folgendes werden Sie lernen, indem Sie diesen Artikel lesen, sowie einige nützliche Tipps, die Ihr Leben erleichtern werden.

Erstellen Sie Ihre Funktionen

Nehmen wir zu einem einfachen Start an, Sie möchten einen Taschenrechner schreiben. Wir werden uns nicht auf die Schnittstelle konzentrieren (GUI vs Flüche gegen Slang vs CLI), da wir uns für die Interna interessieren. Es wäre klobig zu nicht Erstellen Sie eine Funktion für jede Operation, die Sie unterstützen, es sei denn.H, was das Ergebnis einer Basis zurückgibt, die an eine Macht angehoben wird. Zum Beispiel haben Sie zum Beispiel eine Funktion namens add (), die zwei dauert Argumente, Zumindest für den Moment und und kehrt zurück das Ergebnis. Wenn der Benutzer sich entscheidet, die von ihm eingeführten Nummer hinzuzufügen, sind Sie gerade gerecht Forderung Die Funktion mit den Zahlen, die der Benutzer eingegeben hat und Sie müssen sich keine Sorgen um etwas anderes machen. Diese drei Begriffe, die ich in Kursivschrift geschrieben habe, sind für das Verständnis von Funktionen von wesentlicher Bedeutung. Eine Funktion normalerweise (aber nicht immer) nimmt etwas an, führt eine Reihe von Operationen darüber und spuckt das Ergebnis aus. "Nicht immer", weil main (), wie Sie zuvor sehen konnten, ohne Argumente aufgerufen werden kann, und es gibt auch andere Beispiele. Aber konzentrieren wir uns vorerst auf unsere Beispiele. Die Zahlen, die zusammengefügt werden müssen. Der Verarbeitungsteil befindet sich im Körper der Funktion, wenn Sie ihm mitteilen, dass sie die Zahlen zusammen hinzufügen sollen. Danach wird der Teil „Ausspucken“ bezeichnet, der einen Wert zurückgibt, der in unserem Fall das Ergebnis der Ergänzung ist.

Mal sehen, worüber wir in einem praktischen Beispiel gesprochen haben:

#enthalten  /* Dies enthält die Definition von printf ()*/ Double Add (Double X, Double Y); int main () float zuerst, zweitens; printf ("Bitte geben Sie die erste Nummer ein.\ n "); scanf ("%f ", & zuerst); printf (" Bitte geben Sie die zweite Nummer ein.\ n "); scanf ("%f ", & Second); Double Add (Double A, Double B)  zurückkehren a + b;  printf ("Das Ergebnis der Zugabe ist %f \ n", add (zuerst, zweitens)); zurückkehren 0; 

Der obige Code hilft uns, obwohl wir bestenfalls simpel. Zuerst deklarieren wir die Funktion, Vor main (), und der Zweck besteht darin, den Namen, den Typ der Argumente und den Typ, den die Funktion zurücksetzt. Diese Zeile wird auch als Definieren des Funktionsprototyps bezeichnet. Wie Sie sehen können, müssen die Namen der Argumente aus der Erklärung nicht die gleichen sein wie die in der Definition verwendeten. Wenn dies Sie jedoch beunruhigt, verwenden Sie ein konstantes Benennungsschema, es ist in Ordnung. Bevor wir die Funktion verwenden, müssen wir sie definieren, wie in der Welt, was genau sie tut. Auch wenn der Körper der Funktion einzeln ist, genau wie in unserem Beispiel ist es am besten, dass Sie Zahnspangen für Lesbarkeit und für gute Gewohnheiten verwenden. Hier gibt alles, was die Funktion macht, das Ergebnis der Zugabe zwischen zwei Zahlen zurück.

Wir schlagen vor, dass Sie Namen für Funktionen, Argumente und gewöhnliche Variablen oder Konstanten verwenden, die widerspiegeln, was sie tun, wieder für eine gute Gewohnheit und für das Sparsamen der Programmierer, die Ihren Code lesen. Auch, Verwenden Sie Kommentare. Auch wenn in den obigen Code -Kommentaren übertrieben erscheinen, sind sie nicht. Wenn Sie sich den Code zwei Monate später ansehen, werden Sie keine Ahnung haben, was Ihnen in Ihrem Kopf war, als Sie den Code geschrieben haben. Verwenden Sie und missbrauchen Sie Kommentare, sie werden Sie retten, vertrauen Sie mir.

Übung

Es gibt Funktionen, die eine variable Anzahl von Argumenten akzeptieren können, z. B. printf (). Sie dürfen Google verwenden, um zu sehen, was sie tun, und versuchen, die Funktion add () umzuschreiben, um mehr als zwei Argumente zu akzeptieren oder eine andere Funktion zu erstellen. Sie können auch "Man 3 printf" verwenden.


Wir haben Ihnen gesagt, dass Main () ohne Argumente aufgerufen werden kann. Das bedeutet natürlich, dass es auch mit Argumenten aufgerufen werden kann. Wann ist das nützlich? In Programmen, die einfach sind wie unsere, sind die Klammern von Main () leer, da wir sie ohne Argumente nennen, leer sind. Wenn Ihre Programme jedoch in Komplexität wachsen, müssen Sie die Funktionalität von Argumenten hinzufügen, wie das GCC -V -Flag, das die Version druckt, die Funktionalität von Argumenten hinzufügen. Wenn eine solche Funktionalität gewünscht ist, muss Main () Argumente haben, um zwei genau zu sein. Die Hauptfunktion wird

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

Warten Sie, bevor Sie über die kryptischen Namen und die doppelten Sternchen ausflippen, bis Sie die Erklärung erhalten, was tatsächlich einfach ist. Das erste Argument ist eine Ganzzahl namens Argc, und der Name stammt aus "Argumentenzahl". Ein bisschen besser, richtig? Über das zweite Argument… nun, der Name steht offiziell für „Argumentvektor“ und es ist ein Zeiger auf einen Zeiger auf einen Char. In englischer Sprache speichert ARGC die Anzahl der Argumente, und speichert die Argumente als eine Reihe von Strings. Der Teil „Zeiger auf…“ wird im nächsten Teil des Artikels erklärt. Für den Moment müssen Sie nur noch wissen, dass der Name des Benutzers beispielsweise drei Argumente in das Programm eingibt, der Index Null von ARGV der Name ist des Programms selbst speichert Index One das erste Argument für das Programm und so weiter. Auf diese Weise können Sie einen Schalter/einen Fall verwenden, um die an Ihre Programme übergebenen Argumente zu überprüfen. Bevor wir Ihnen ein kurzes Beispiel geben, fühlen wir uns gezwungen, Ihnen zu sagen, dass Main zwei Argumente enthält, die vom Standard definiert sind, und so wird es für die meisten Linux- und Unix -Systeme verwendet. Wenn Sie jedoch an Windows oder Darwin arbeiten, haben Main () ein oder zwei weitere Argumente, diese sind jedoch systemabhängig und werden daher nicht definiert oder vom Standard gefordert. "Char ** argv" könnte auch als "char *argv []" geschrieben werden. Sie werden beides sehen, abhängig von der Präferenz des Entwicklers.

Vielleicht erinnern Sie sich, dass wir Ihnen im ersten Teil unserer Serie gesagt haben, wie wir Kimball Hawkins 'Yest -Programm für Beispiele verwenden werden. Es ist Zeit, dass wir anfangen. So geht Yest mit einem Teil der möglichen Benutzereingabe um:

Wenn (STRNCMP (argv [i], "-Help", 6) == 0 || strncmp (argv [i], ","-?", 2) == 0 || strncmp (argv [i]", "?", 1) == 0 || strncmp (argv [i]," help ", 4) == 0) yest_help (); / * Hilfe angefordert, anzeigen *// Wenn (strncmp (argv [i], "--version", 9) == 0 || strncmp (argv [i], "-lizenz", 9) == 0) yest_version (); / * Version/Lizenzinformationen angefordert */

In diesem Code sehen Sie vielleicht, wie Kimball seinen Code kommentiert, obwohl der Name der Funktionen, die er aufruft - yest_help () und yest_version () - ziemlich selbsterklärend sind. Die Standard -STRNCMP () -Funktion, die in String gefunden werden soll.H, vergleicht zwei Saiten, in unserem Fall Argv [i] und "Hilfe" zum Beispiel, aber nur die ersten x -Zeichen (4 in der "Hilfe" -Zeile) und gibt Null zurück, wenn die erste Zeichenfolge mit der zweiten übereinstimmt.

Übung

Wie würden Sie Switch/Case verwenden, um zu überprüfen, ob das erste Argument "-Help" und das zweite "-version" ist? Können diese Optionen zusammen verwendet werden?? Wie würde sich der Code unterscheiden?

Dinge, die man bewusst sein sollte

C erlaubt Ihnen nicht, eine Funktion in einem anderen zu definieren, mit Ausnahme Main (), die, wie wir sehen können, speziell ist. Seien Sie sich auch bewusst, dass das, was Sie in einer Funktion definieren, nur in einer Funktion „lebt“. Sie können also eine Variable mit dem Namen „A“ in drei verschiedenen Funktionen ohne Probleme definiert haben, aber das kann zu Problemen in größeren Programmen führen, sodass wir sie nicht empfehlen können.

Benutzerdefinierte Header -Dateien

Wenn Ihre Programme immer größer werden, werden Sie die Notwendigkeit finden, sie aufzuteilen. Sie können mehr als eine Quelldateien haben, aber Sie können auch Ihre eigenen Header schreiben. Wenn Sie also zu unserem Additionsprogramm zurückkehren, können Sie einen Header namens Operations erstellen.h, in der die Zeile "Double Add (Double X, Double Y)";. Einschließlich Ihres benutzerdefinierten Headers ist erledigt, so wie Sie systeminstallierte mit einer wichtigen Ausnahme einbeziehen: Denken Sie daran, doppelte Zitate anstelle von Winkelklammern wie folgt zu verwenden: „#include“ -Operationen.H"". Dieser Header kann in das Verzeichnis platziert werden, in dem die anderen Quelldateien gespeichert sind oder auf einem anderen Weg. Header -Dateien können auch Konstantendefinitionen (mit #define) oder andere Erklärungen enthalten, solange Sie wissen, dass sie in jeder Quelldatei des Programms verwendet werden. Es ist nicht obligatorisch, es ist nur eine gute Praxis. Wie würden Sie also einen Taschenrechner schreiben, der sich nur mit den grundlegenden arithmetischen Operationen befasst und Header verwendet?

Rekursive Funktionen

Wie wir erwarten, dass Sie einen Programmierhintergrund haben, sind wir sicher, dass Sie wissen, welche rekursiven Funktionen sind und wie/wann Sie sie verwenden sollen. Deshalb wird dieser Unterkapitel kürzer sein, als er normalerweise wäre. Kurz gesagt, man sagt über eine Funktion, um rekursiv zu sein, wenn sie sich selbst ruft. Obwohl das Konzept für neue Programmierer entmutigend sein könnte, kann eine einfachere, reale Art und Weise erklärt werden. Der Effekt, den Sie sehen, ist eine visuelle Darstellung der Rekursion. Aber wir geben Ihnen ein kurzes Beispiel, damit Sie besser verstehen, wann und wie Sie es verwenden sollen. Sie erinnern sich wahrscheinlich aus der Schule, als Sie über Faktorien unterrichtet wurden. Ein Faktororial ist das Produkt von allen Zahlen, die kleiner als es oder gleich sind, solange sie größer als Null sind. Die Notation dafür ist ein Ausrufezeichen, also 6! = 6*5*4*3*2*1 = 720. Wie können wir das auf C auf effizienteste Weise tun?? Natürlich verwenden Sie Rekursion.

int factorial (int number)  Wenn(Nummer <= 1) zurückkehren 1; anders zurückkehren Nummer * faktorial (Nummer 1)

Abschluss

Wir empfehlen, dass Sie Funktionen so oft wie möglich verwenden und ihre Prototypen in Header -Dateien so oft einfügen, da Ihr Code organisierter ist und Ihre Arbeit einfacher wird. Apropos Header, wir lassen es als letzte Übung für Sie, die Header -Datei zu lesen, die mathematische Operationen definiert (Mathematik.h) um eine Idee zu bekommen, wie es aussieht und wie es enthält. Verwenden Sie es dann, um den Taschenrechner mit einigen verbesserten Funktionen über die Grundlagen hinaus zu verbessern.

Hier ist, was Sie als nächstes erwarten können:

  • ICH. C Entwicklung unter Linux - Einführung
  • Ii. Vergleich zwischen C und anderen Programmiersprachen
  • III. Typen, Operatoren, Variablen
  • Iv. Ablaufsteuerung
  • V. Funktionen
  • Vi. Zeiger und Arrays
  • Vii. Strukturen
  • Viii. Grundlegende I/O
  • Ix. Codierungsstil und Empfehlungen
  • X. Ein Programm erstellen
  • Xi. Verpackung für Debian und Fedora
  • Xii. Ein Paket in den offiziellen Debian -Repositories erhalten

Verwandte Linux -Tutorials:

  • Dinge zu installieren auf Ubuntu 20.04
  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
  • Mastering -Bash -Skriptschleifen beherrschen
  • Dinge zu installieren auf Ubuntu 22.04
  • Ubuntu 20.04 Leitfaden
  • SQLite Linux -Tutorial für Anfänger
  • Mint 20: Besser als Ubuntu und Microsoft Windows?
  • Dinge zu tun nach der Installation Ubuntu 22.04 Jammy Quallen…
  • Wie man Kali Linux und Windows 10 Dual -Boot -Start hat