Zusammenfassung: Calculator Dispatch
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 37 von 61.
Aufgabe
EinfachErstelle einen Taschenrechner mithilfe einer Dispatch-Tabelle. Du erstellst ein Array von Funktionszeigern, das Operationscodes den entsprechenden Funktionen zuordnet, und verwendest es anschließend zur Durchführung von Berechnungen.
Schreibe ein Programm, das:
- einen
typedefnamensOperationfür einen Funktionszeiger erstellt, der zweiint-Parameter entgegennimmt und einenintzurückgibt - vier arithmetische Funktionen definiert:
add: gibt a + b zurücksub: gibt a - b zurückmul: gibt a * b zurückdivide: gibt a / b zurück (Ganzzahldivision)
- in
maineine Dispatch-Tabelle erstellt: ein Array aus 4 Funktionszeigern vom TypOperation, wobei Index 0 auf add, Index 1 auf sub, Index 2 auf mul und Index 3 auf divide verweist - drei Eingaben liest: zwei Ganzzahlen und einen Operationscode (0-3)
- den Operationscode verwendet, um die Dispatch-Tabelle zu indizieren und die entsprechende Funktion aufzurufen
- das Ergebnis ausgibt
Du erhältst drei Eingaben: die erste Zahl, die zweite Zahl und den Operationscode (0 für add, 1 für sub, 2 für mul, 3 für divide).
Deine Ausgabe sollte eine einzelne Ganzzahl sein: das Ergebnis der Operation:
7In diesem Beispiel mit den Eingaben 10, 3, 1 wählt der Operationscode 1 sub aus der Dispatch-Tabelle aus, sodass wir 10 - 3 = 7 berechnen.
Der entscheidende Punkt ist die Verwendung der Array-Indizierung zur Auswahl der Funktion: Es werden keine if- oder switch-Anweisungen benötigt. Deine Dispatch-Tabelle sollte so aussehen:
Operation ops[4] = {add, sub, mul, divide};Rufe die Funktion anschließend wie folgt auf: ops[code](a, b)
Probier es selbst
#include <stdio.h>
// TODO: Erstelle ein typedef namens 'Operation' für einen Funktionszeiger
// der zwei int-Parameter entgegennimmt und ein int zurückgibt
// TODO: Definiere die vier arithmetischen Funktionen: add, sub, mul, divide
int main() {
// Eingabe lesen
int a, b, code;
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &code);
// TODO: Erstelle die Dispatch-Tabelle (Array von 4 Operation-Funktionszeigern)
// Operation ops[4] = { ... };
// TODO: Verwende den Operationscode, um die entsprechende Funktion aufzurufen
// und speichere das Ergebnis
int result;
// Gib das Ergebnis aus
printf("%d\n", result);
return 0;
}Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box7Funktionszeiger
Funktionszeiger deklarierenFunktionszeiger aufrufenTypedef für FunktionszeigerFunktionen als Argumente übergebenZusammenfassung: Calculator Dispatch2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler