Menu
Coddy logo textTech

Méthodes utilitaires

Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 10 sur 61.

Jusqu'à présent, nous avons vu des fonctions qui modifient les données d'une structure (comme player_take_damage) et des fonctions qui les affichent simplement. Mais il existe une autre catégorie importante : les fonctions qui calculent des valeurs dérivées à partir des membres de la structure sans rien modifier.

Considérez une structure Rectangle qui stocke la largeur et la hauteur. L'aire n'est pas stockée — elle est calculée à la demande :

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);
}

Ce sont des méthodes utilitaires — elles utilisent les données existantes de la structure pour produire une nouvelle valeur. Remarquez qu'elles utilisent des pointeurs const puisqu'elles ne font que lire, sans jamais écrire. Le résultat calculé est renvoyé plutôt que d'être stocké dans la structure.

Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box));       // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0

Ce modèle permet de garder vos structs légères : ne stockez que les données essentielles et calculez tout le reste au besoin. Cela garantit également que les valeurs dérivées sont toujours cohérentes avec l'état actuel.

challenge icon

Défi

Facile

Construisons un module Circle qui calcule des valeurs dérivées à partir de données stockées. Vous allez vous entraîner à écrire des méthodes d'aide (helper methods)—des fonctions qui calculent des résultats à partir des membres d'une structure sans les modifier.

Vous allez créer trois fichiers :

  • circle.h : Déclarez une structure Circle avec un seul membre double radius. Déclarez également deux méthodes d'aide :
    • circle_area — prend un pointeur const vers Circle et retourne l'aire
    • circle_circumference — prend un pointeur const vers Circle et retourne la circonférence
    Utilisez des gardes d'inclusion avec le symbole CIRCLE_H.
  • circle.c : Implémentez les deux méthodes d'aide. Pour les calculs, utilisez 3.14159 comme valeur de pi. La formule de l'aire est pi * radius * radius, et la formule de la circonférence est 2 * pi * radius. Les deux fonctions doivent uniquement lire le rayon—ne jamais le modifier.
  • main.c : Créez un Circle et utilisez les méthodes d'aide pour calculer et afficher ses propriétés.

Vous recevrez une entrée : le radius du cercle (sous forme de double).

Dans votre fichier principal, initialisez un Circle avec le rayon donné, puis utilisez vos méthodes d'aide pour calculer et afficher l'aire et la circonférence.

Affichez les résultats dans ce format :

Area: {area}
Circumference: {circumference}

Utilisez %.2f pour les deux valeurs afin d'afficher deux décimales.

Par exemple, avec un rayon de 5.0, la sortie serait :

Area: 78.54
Circumference: 31.42

Aide-mémoire

Les fonctions peuvent calculer des valeurs dérivées à partir des membres d'une structure sans modifier la structure elle-même. Celles-ci sont appelées méthodes auxiliaires (helper methods).

Les méthodes auxiliaires utilisent des pointeurs const puisqu'elles ne font que lire les données, sans jamais les modifier :

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);
}

Utilisation des méthodes auxiliaires :

Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box));       // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0

Ce modèle permet de garder les structures légères en ne stockant que les données essentielles et en calculant les valeurs dérivées à la demande, garantissant ainsi la cohérence avec l'état actuel.

Essayez vous-même

#include <stdio.h>
#include "circle.h"

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: Créer une struct Circle avec le rayon donné
    
    // TODO: Utiliser les méthodes auxiliaires circle_area et circle_circumference
    // pour calculer et afficher les résultats
    
    // Format d'affichage :
    // printf("Area: %.2f\n", ...);
    // printf("Circumference: %.2f\n", ...);
    
    return 0;
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Object Oriented Programming