Menu
Coddy logo textTech

Patron Itérateur

Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 56 sur 61.

Le pattern Iterator fournit un moyen d’accéder séquentiellement aux éléments d’une collection sans exposer sa structure sous-jacente. Au lieu de donner aux utilisateurs un accès direct à un tableau, vous leur fournissez un objet qui sait parcourir les données, un élément à la fois.

Un itérateur a généralement besoin de deux informations : une référence à la collection et la position actuelle. En C, nous créons un struct pour conserver cet état :

typedef struct {
    int* data;      // pointeur vers le tableau
    int size;       // nombre total d'éléments
    int current;    // position actuelle
} IntIterator;

L’itérateur expose deux fonctions essentielles. has_next() vérifie s’il reste des éléments à lire, et next() renvoie l’élément actuel et avance la position :

int has_next(IntIterator* it) {
    return it->current < it->size;
}

int next(IntIterator* it) {
    return it->data[it->current++];
}

Utiliser l’itérateur paraît propre et masque les détails du tableau :

IntIterator it = create_iterator(numbers, 5);
while (has_next(&it)) {
    printf("%d\n", next(&it));
}

L’appelant n’a jamais besoin de savoir que numbers est un tableau ni comment fonctionne l’indexation. Cette abstraction permet de modifier facilement la structure de données sous-jacente ultérieurement, en passant par exemple d’un tableau à une liste chaînée, sans modifier le code qui utilise l’itérateur.

challenge icon

Défi

Facile

Construisons un itérateur NumberList : une abstraction claire qui vous permet de parcourir une collection d’entiers sans exposer la structure du tableau sous-jacent.

Vous allez organiser votre code sur trois fichiers :

  • iterator.h : définissez une structure IntIterator qui contient un pointeur vers un tableau d’entiers, la taille totale de la collection et la position actuelle. Déclarez trois fonctions : create_iterator (prend un pointeur de tableau et une taille, et renvoie un itérateur initialisé), has_next (vérifie s’il reste d’autres éléments) et next (renvoie l’élément actuel et avance la position). N’oubliez pas les gardes d’inclusion !
  • iterator.c : implémentez vos fonctions d’itérateur. La fonction create_iterator doit renvoyer un IntIterator par valeur, avec la position actuelle définie à 0. La fonction has_next renvoie 1 s’il reste d’autres éléments à lire, et 0 sinon. La fonction next renvoie l’élément à la position actuelle, puis incrémente la position.
  • main.c : lisez le nombre d’éléments, puis lisez chaque valeur entière dans un tableau. Créez un itérateur pour ce tableau, puis utilisez une boucle while avec has_next et next pour parcourir et afficher chaque élément sur sa propre ligne.

Votre programme recevra :

  1. Le nombre d’éléments du tableau
  2. Chaque valeur entière sur une ligne distincte

Utilisez le modèle d’itérateur pour afficher tous les éléments : aucun accès direct aux indices du tableau dans votre boucle de parcours !

Exemple de sortie lorsque les entrées sont 4, puis 10, 20, 30, 40 :

10
20
30
40

Exemple de sortie lorsque les entrées sont 3, puis -5, 0, 100 :

-5
0
100

Exemple de sortie lorsque les entrées sont 1, puis 42 :

42

L’itérateur masque la façon dont les données sont stockées. Votre boucle principale demande simplement « y en a-t-il d’autres ? » et « donne-moi le suivant », sans rien savoir des indices du tableau ni de la disposition en mémoire.

Essayez vous-même

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

int main() {
    int n;
    scanf("%d", &n);
    
    int arr[n];
    
    // TODO: Lire n valeurs entières dans le tableau
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    
    // TODO: Créer un itérateur pour le tableau
    
    // TODO: Utiliser une boucle while avec has_next et next pour parcourir
    // et afficher chaque élément sur sa propre ligne
    // N'utilisez PAS l'indexation directe du tableau dans votre boucle de parcours !
    
    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 Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur C en ligne