Vier bewährte Muster für benutzerdefinierte Funktionen in C
Vier bewährte Muster für benutzerdefinierte Funktionen in C
Erkunden Sie vier verschiedene Wege, eine benutzerdefinierte Funktion zu implementieren, die prüft, ob eine Zahl prim ist, und lernen Sie, welcher Ansatz die größte Klarheit und Wiederverwendbarkeit bietet.
Nachfolgend demonstrieren vier vollständige Programme, wie dieselbe logische Aufgabe mit unterschiedlichen Funktionssignaturen ausgedrückt werden können. Alle vier Ausgaben sind identisch, doch die Designentscheidungen variieren und veranschaulichen wichtige Trade-offs im Funktionsdesign.
Beispiel 1: Keine Argumente, kein Rückgabewert
#include <stdio.h> void checkPrimeNumber(); int main() { checkPrimeNumber(); // Argument wird nicht übergeben return 0; } // Rückgabetyp ist void, bedeutet, es gibt keinen Wert zurück void checkPrimeNumber() { int n, i, flag = 0; printf("Positive Ganzzahl eingeben: "); scanf("%d",&n); for(i=2; i <= n/2; ++i) { if(n%i == 0) { flag = 1; } } if (flag == 1) printf("%d ist keine Primzahl.", n); else printf("%d ist eine Primzahl.", n); }
Die checkPrimeNumber() Funktion ist verantwortlich für die Benutzereingabe, den Primzahltest und die Ausgabe des Ergebnisses. Da ihr Rückgabetyp void ist, kommuniziert sie das Ergebnis ausschließlich durch Seiteneffekte.
Beispiel 2: Keine Argumente, aber ein Rückgabewert
#include <stdio.h> int getInteger(); int main() { int n, i, flag = 0; // kein Argument wird übergeben n = getInteger(); for(i=2; i<=n/2; ++i) { if(n%i==0){ flag = 1; break; } } if (flag == 1) printf("%d ist keine Primzahl.", n); else printf("%d ist eine Primzahl.", n); return 0; } // gibt die vom Benutzer eingegebene Ganzzahl zurück int getInteger() { int n; printf("Positive Ganzzahl eingeben: "); scanf("%d",&n); return n; }
Hier kapselt getInteger() die Eingaberoutine und gibt den Wert an main zurück, der dann die Primzahl-Prüflogik übernimmt. Diese Trennung macht den Eingabeschritt in verschiedenen Kontexten wiederverwendbar.
Beispiel 3: Argument übergeben, kein Rückgabewert
#include <stdio.h> void checkPrimeAndDisplay(int n); int main() { int n; printf("Positive Ganzzahl eingeben: "); scanf("%d",&n); // n wird an die Funktion übergeben checkPrimeAndDisplay(n); return 0; } // Rückgabetyp ist void, bedeutet, es gibt keinen Wert zurück void checkPrimeAndDisplay(int n) { int i, flag = 0; for(i=2; i <= n/2; ++i) { if(n%i == 0){ flag = 1; break; } } if(flag == 1) printf("%d ist keine Primzahl.",n); else printf("%d ist eine Primzahl.", n); }
In diesem Muster wird die Verantwortung für die Anzeige des Ergebnisses in die Hilfsfunktion verlagert. Während dies main schlank hält, koppelt die Funktion nun den Algorithmus mit I/O, was die Wiederverwendbarkeit verringert.
Beispiel 4: Argument übergeben und Rückgabewert
#include <stdio.h> int checkPrimeNumber(int n); int main() { int n, flag; printf("Positive Ganzzahl eingeben: "); scanf("%d",&n); // n wird an die checkPrimeNumber() Funktion übergeben // der zurückgegebene Wert wird der flag Variable zugewiesen flag = checkPrimeNumber(n); if(flag == 1) printf("%d ist keine Primzahl",n); else printf("%d ist eine Primzahl",n); return 0; } // int wird von der Funktion zurückgegeben int checkPrimeNumber(int n) { int i; for(i=2; i <= n/2; ++i) { if(n%i == 0) return 1; } return 0; }
Dieses Design hält den Algorithmus isoliert und gibt ein einfaches Status-Flag zurück. Der Aufrufer entscheidet, wie das Ergebnis präsentiert wird, was die Funktion hochgradig wiederverwendbar in Bibliotheken oder größeren Anwendungen macht.
Den optimalen Ansatz wählen
Während alle vier Implementierungen dieselbe Ausgabe erzeugen, ist der wartbarste und testbarste Ansatz Beispiel 4: die Zahl als Argument übergeben und ein Boolean-ähnliches Flag zurückgeben. Dieses Muster folgt dem Single-Responsibility-Prinzip, ermöglicht Unit-Tests von checkPrimeNumber ohne I/O-Abhängigkeiten und lässt sich leicht in komplexere Systeme integrieren.
Letztlich hängt die Wahl von Ihrer Projektarchitektur ab. Wenn die Funktion direkt mit dem Benutzer interagieren muss, mag Beispiel 3 ausreichen. Für Bibliothekscode oder Dienste, wo I/O woanders gehandhabt wird, bietet Beispiel 4 die größte Flexibilität.
C Sprache
- Namespaces in C# meistern: Organisation, Gültigkeitsbereich und Best Practices
- C Datentypen erklärt: int, float, char und mehr – Ein vollständiger Leitfaden
- C Programmierungsoperatoren meistern: Ein umfassender Leitfaden
- C-Standardbibliothek-Funktionen meistern: Praxisleitfaden
- C++ Variablen und Datentypen: Experten‑Guide zu int, double, char, string, bool
- Zeiger in C: Umfassender Leitfaden zu Typen, Verwendung und Best Practices
- C-Programmierung meistern: Umfassendes Tutorial für Einsteiger
- C-Datentypen verstehen: Umfassender Leitfaden
- C-Funktionen meistern: Struktur, Deklaration & Best Practices
- Variable Argumente in C meistern: Ein praktischer Leitfaden