Hilfsmethoden
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 10 von 61.
Bisher haben wir Funktionen gesehen, die Struct-Daten ändern (wie player_take_damage) und Funktionen, die diese einfach nur anzeigen. Es gibt jedoch noch eine weitere wichtige Kategorie: Funktionen, die abgeleitete Werte berechnen aus Struct-Elementen, ohne etwas zu ändern.
Betrachten Sie eine Rectangle-Struct, die Breite und Höhe speichert. Die Fläche wird nicht gespeichert – sie wird bei Bedarf berechnet:
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
Dies sind Hilfsmethoden – sie nehmen die vorhandenen Daten des Structs und erzeugen einen neuen Wert. Beachten Sie, dass sie const-Pointer verwenden, da sie nur lesen und niemals schreiben. Das berechnete Ergebnis wird zurückgegeben, anstatt im Struct gespeichert zu werden.
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Dieses Muster hält Ihre Structs schlank – speichern Sie nur die wesentlichen Daten und berechnen Sie alles andere bei Bedarf. Es stellt außerdem sicher, dass abgeleitete Werte immer konsistent mit dem aktuellen Zustand sind.
Aufgabe
EinfachLassen Sie uns ein Circle-Modul erstellen, das abgeleitete Werte aus gespeicherten Daten berechnet. Sie werden das Schreiben von Hilfsmethoden üben – Funktionen, die Ergebnisse aus Struct-Membern berechnen, ohne diese zu verändern.
Sie werden drei Dateien erstellen:
circle.h: Deklarieren Sie einCircle-Struct mit einem einzelnendouble radiusMember. Deklarieren Sie außerdem zwei Hilfsmethoden:circle_area— nimmt einenconst-Pointer auf Circle entgegen und gibt die Fläche zurückcircle_circumference— nimmt einenconst-Pointer auf Circle entgegen und gibt den Umfang zurück
CIRCLE_H.circle.c: Implementieren Sie beide Hilfsmethoden. Verwenden Sie für die Berechnungen3.14159als Wert für Pi. Die Formel für die Fläche lautetpi * radius * radius, und die Formel für den Umfang lautet2 * pi * radius. Beide Funktionen sollten den Radius nur lesen – niemals modifizieren.main.c: Erstellen Sie einen Circle und verwenden Sie die Hilfsmethoden, um seine Eigenschaften zu berechnen und anzuzeigen.
Sie erhalten eine Eingabe: den radius des Kreises (als Double).
Initialisieren Sie in Ihrer Hauptdatei einen Circle mit dem gegebenen Radius und verwenden Sie dann Ihre Hilfsmethoden, um die Fläche und den Umfang zu berechnen und auszugeben.
Geben Sie die Ergebnisse in diesem Format aus:
Area: {area}
Circumference: {circumference}Verwenden Sie %.2f für beide Werte, um zwei Dezimalstellen anzuzeigen.
Zum Beispiel wäre bei einem Radius von 5.0 die Ausgabe:
Area: 78.54
Circumference: 31.42Spickzettel
Funktionen können abgeleitete Werte aus Struct-Membern berechnen, ohne das Struct zu verändern. Diese werden als Hilfsmethoden (helper methods) bezeichnet.
Hilfsmethoden verwenden const-Pointer, da sie Daten nur lesen und niemals schreiben:
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
Verwendung von Hilfsmethoden:
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Dieses Muster hält Structs schlank, indem nur wesentliche Daten gespeichert und abgeleitete Werte bei Bedarf berechnet werden, was die Konsistenz mit dem aktuellen Zustand gewährleistet.
Probier es selbst
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Erstelle eine Circle-Struktur mit dem gegebenen Radius
// TODO: Verwende die Hilfsmethoden circle_area und circle_circumference
// um die Ergebnisse zu berechnen und auszugeben
// Ausgabeformat:
// printf("Area: %.2f\n", ...);
// printf("Circumference: %.2f\n", ...);
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte 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-Implementierung