Tableaux et matrices

Approfondir : Tableaux et matrices

Un tableau regroupe plusieurs éléments de même type dans un stockage contigu. Il permet de traiter une série de notes ou de mesures sans déclarer une variable pour chaque valeur. Une matrice est un tableau dont les éléments sont eux-mêmes des tableaux.

Indices et capacité

int notes[4] = {12,7,15,10}; crée quatre entiers. Les indices valides sont 0,1,2,3. L’élément notes[4] est déjà hors du tableau, même si son nom semble désigner le quatrième élément. Le C ne vérifie pas automatiquement ces bornes. Il faut donc distinguer la capacité réservée et le nombre d’éléments réellement utilisés.

Un parcours correct

Une boucle for(size_t i=0; i<n; ++i) visite exactement les n indices valides. La condition est strictement inférieure à n. Pour une somme, initialiser l’accumulateur à zéro avant la boucle ; pour un maximum, partir du premier élément seulement si n est non nul. Écrire l’invariant « le total des éléments d’indice inférieur à i est déjà calculé » aide à suivre le parcours.

Calculer la longueur au bon endroit

Lorsque la variable désigne encore un véritable tableau, sizeof notes / sizeof notes[0] donne son nombre d’éléments. Dans un paramètre de fonction déclaré int notes[], le paramètre est ajusté en pointeur : sizeof ne donne plus la taille du tableau d’origine. Une fonction de parcours doit donc recevoir la longueur séparément.

Matrices et boucles imbriquées

Une déclaration int m[2][3] contient deux lignes de trois colonnes. L’élément m[i][j] utilise d’abord l’indice de ligne puis celui de colonne. Une boucle externe parcourt les lignes et une boucle interne les colonnes. Les dimensions et l’ordre des indices doivent être conservés lorsque l’on transmet une telle matrice à une fonction.

Copier et initialiser

Une affectation comme b=a ne copie pas le contenu de deux tableaux C ordinaires. On peut copier leurs éléments dans une boucle, ou utiliser une fonction adaptée si l’on connaît exactement les tailles et les contraintes de recouvrement. À la déclaration, une liste partielle comme int t[4]={1}; initialise le premier élément à 1 et les autres à zéro. Une déclaration sans initialisation ne fait pas cela.

Quatre cases, quatre indices
Indice0123
Valeur1271510

Tableaux : somme et maximum

#include <stdio.h>
int main(void) {
    int notes[] = {12, 7, 15, 10};
    size_t n = sizeof notes / sizeof notes[0];
    int somme = 0, maximum = notes[0];
    for (size_t i = 0; i < n; ++i) {
        somme += notes[i];
        if (notes[i] > maximum) { maximum = notes[i]; }
    }
    printf("Nombre = %zu\n", n);
    printf("Somme = %d\n", somme);
    printf("Maximum = %d\n", maximum);
    printf("Moyenne = %.1f\n", (double)somme / n);
    return 0;
}
Suivre le programme : Tableaux, somme et maximum
Instruction ou étapeExplication
n=4sizeof est utilisé dans la portée où notes est encore un tableau.
i=0 puis i=1somme devient 12 puis 19 ; maximum reste 12.
i=2 puis i=3somme devient 34 puis 44 ; maximum devient 15 et y reste.
(double)somme/n44/4 donne 11.0 ; la conversion assure une division réelle pour d’autres séries.

Sortie écran : essai 1

Chaque indice de 0 à 3 est visité une fois.

Nombre = 4
Somme = 44
Maximum = 15
Moyenne = 11.0

Matrices : totaux des lignes

#include <stdio.h>
int main(void) {
    int m[2][3] = {{1, 2, 3}, {4, 5, 6}};
    for (int i = 0; i < 2; ++i) {
        int total = 0;
        for (int j = 0; j < 3; ++j) {
            total += m[i][j];
        }
        printf("Ligne %d = %d\n", i, total);
    }
    return 0;
}
Suivre le programme : Matrices, totaux des lignes
Instruction ou étapeExplication
i=0total est créé à zéro pour la première ligne ; on ajoute 1,2,3.
i=1Un nouveau total repart de zéro ; on ajoute 4,5,6.
Bornesi<2 et j<3 protègent les deux dimensions.

Sortie écran : essai 1

Le total est réinitialisé pour chaque ligne.

Ligne 0 = 6
Ligne 1 = 15

S’entraîner et vérifier

Exercice 1. Pourquoi i<=n est-il faux pour parcourir n éléments ?

Voir la correctionMasquer la correction

Cela exécute un tour supplémentaire avec i=n. Or le dernier indice valide est n-1. Cette lecture est hors limites et n’a pas de résultat garanti.

Exercice 2. Comment calculer le total de toute la matrice ?

Voir la correctionMasquer la correction

Créer un accumulateur avant la boucle externe, puis y ajouter chaque m[i][j]. La matrice de démonstration donne 21. Le programme complet ci-dessus fournit la déclaration et les deux boucles ; il suffit de déplacer l’accumulateur et d’afficher après les parcours.

Solution complète :

#include <stdio.h>
int main(void) {
    int m[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int total = 0;
    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 3; ++j) {
            total += m[i][j];
        }
    }
    printf("Total = %d\n", total);
    return 0;
}

Sortie écran :

Total = 21

Pratiquer avec le TD/TP 1 corrigé · Tous les exercices C.

Repère de lecture : les codes proposés utilisent des constructions disponibles en C11. Les règles du langage et de sa bibliothèque sont consultables dans les projets publics du WG14 (C11) et du WG14 (C23). Les exemples n’utilisent pas les nouveautés propres à C23.

Questions / Réponses

Aucune question. Soyez le premier à poser une question.
★ ★ ★ ★ ★
2 votes. Moyenne 5 sur 5.

Ajouter un commentaire

Anti-spam