Hilfsmethoden
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 10 von 61.
Bisher haben wir Funktionen gesehen, die Struct-Daten verändern (wie player_take_damage), und Funktionen, die sie einfach anzeigen. Aber es gibt noch eine weitere wichtige Kategorie: Funktionen, die abgeleitete Werte aus Struct-Mitgliedern berechnen, ohne etwas zu verändern.
Betrachte eine Rectangle-Struktur, 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 verwenden die vorhandenen Daten der Struktur und erzeugen einen neuen Wert. Beachte, dass sie const-Zeiger verwenden, da sie nur lesen und niemals schreiben. Das berechnete Ergebnis wird zurückgegeben, anstatt in der Struktur 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 deine Strukturen schlank: Speichere nur die wesentlichen Daten und berechne alles andere bei Bedarf. Außerdem wird sichergestellt, dass abgeleitete Werte immer mit dem aktuellen Zustand übereinstimmen.
Aufgabe
EinfachErstelle ein Circle-Modul, das abgeleitete Werte aus gespeicherten Daten berechnet. Du übst das Schreiben von Hilfsmethoden: Funktionen, die Ergebnisse aus Struct-Mitgliedern berechnen, ohne sie zu verändern.
Du erstellst drei Dateien:
circle.h: Deklariere einCircle-Struct mit einem einzigendouble radius-Mitglied. Deklariere außerdem zwei Hilfsmethoden:circle_area: akzeptiert einenconst-Zeiger auf Circle und gibt die Fläche zurückcircle_circumference: akzeptiert einenconst-Zeiger auf Circle und gibt den Umfang zurück
CIRCLE_H.circle.c: Implementiere beide Hilfsmethoden. Verwende für die Berechnungen3.14159als Wert von Pi. Die Flächenformel lautetpi * radius * radius, und die Umfangsformel lautet2 * pi * radius. Beide Funktionen sollen den Radius nur lesen: Ändere ihn niemals.main.c: Erstelle einen Circle und verwende die Hilfsmethoden, um seine Eigenschaften zu berechnen und auszugeben.
Du erhältst eine Eingabe: den Radius des Kreises (als double).
Initialisiere in deiner Hauptdatei einen Circle mit dem gegebenen Radius und verwende anschließend deine Hilfsmethoden, um die Fläche und den Umfang zu berechnen und auszugeben.
Gib die Ergebnisse in diesem Format aus:
Area: {area}
Circumference: {circumference}Verwende für beide Werte %.2f, um zwei Dezimalstellen anzuzeigen.
Bei einem Radius von 5.0 würde die Ausgabe beispielsweise so aussehen:
Area: 78.54
Circumference: 31.42Probier es selbst
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Erstelle ein Circle-Struct mit dem gegebenen Radius
// TODO: Use circle_area and circle_circumference helper methods
// 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 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 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-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler