Les tableaux en C




        Les tableaux, tout comme les pointeurs, sont deux notions 2troitements liées en C qui permettent de rendre un programme bcp plus conçis, rapide et efficace. Il est donc important de tout bien assimiler.


Le C dispose de deux types de données composées (données qui peuvent contenir plusieurs valeurs à un instant t donné) : les structures, et les tableaux.
Un tableau est un ensemble de valeurs d'un même type, toutes référencées par un indice donnant leur position au sein de cet ensemble.


Sommaire

1. Les tableaux à une dimension
2. initialiser un tableau
3. les tableaux à plusieurs dimensions
4. les chaînes de caractères ou "string"
5. saisir et afficher des strings


Les tableaux à une dimension

        Faisons un programme par exemple qui nous calcule la moyenne (en degrés) de la température durant la semaine (ne surtout pas chercher l'utilité de ce programme !!).
Créons le programme et commentons-le ensuite :


#include <stdio.h>

#define NOMBRE_DE_JOURS_DANS_SEMAINE 7

void main(void)
{
  int tableauTemperature[NOMBRE_DE_JOURS_DANS_SEMAINE];
  int sommeDeToutesLesTemperatures = 0;
  float moyenneTemperatures;
  int increment;

  for (increment = 0 ; increment < NOMBRE_DE_JOURS_DANS_SEMAINE ; increment++)
  {
    printf("temperature jour %d : \n", increment);
    scanf("%d", &tableauTemperature[increment]);
  }

  for (increment = 0 ; increment < NOMBRE_DE_JOURS_DANS_SEMAINE ; increment++)
    sommeDeTouteLesTemperatures+=tableauTemperature[increment];

  moyenneTemperatures = sommeDeTouteLesTemperatures/NOMBRE_DE_JOURS_DANS_SEMAINE;

  prinf("la moyenne des température est de : %f\n", moyenneTemperatures);
}


        expliquons les étapes importantes de ce programme :
ligne 3 :"#define NOMBRE_DE_JOURS_DANS_SEMAINE 7" crée un symbole nommé NOMBRE_DE_JOURS_DANS_SEMAINE que le compilateur remplacera par la valeur 7 dans tout le programme.
ligne 7 :"int tableauTemperature[NOMBRE_DE_JOURS_DANS_SEMAINE];" crée un tableau d'entier de 7 cases.
ligne 12 à 16 : Grâce à la boucle "for" nous donnons une valeur à chacune des cases du tableau (valeur entrée au clavier).
ligne 18 et 19 : par le même principe on calcule la somme des temérature de la semaine...
ligne 21 : .... et par une division on calcule la moyenne de ces sommes.
Quelques remarques s'imposent :
En C la première case du tableau porte l'indice 0. Donc dans notre exemple, la dernière case du tableau aura le numero 6. Cette convention est souvent source d'erreur il faura donc veiller à être vigilant.
De même chacune des cases d'un tableau peut être manipulée comme n'importe quel variable.
Nous pourions donc faire "tableauTemperature[4] = 35;", "tableauTemperature[2]++;", "--tableauTemperature[increment];" ou utiliser la notation "&tableauTemperature[increment];" pour obtenir l'adresse d'une case du tableau.
Enfin un tableau peut avoir n'importe quel type reconnu par le compilateur si on suit la syntaxe suivante :


type nom_du_tableau_[nombredecases];



un tableau d'entier....


initialiser un tableau

        Il est possible de donner une valeur à une case d'un tableau en cours de programme comme nous l'avons vu de la sorte :


tableau[5]=6;

        mais il est aussi possible d'initialiser toute les cases d'un tableau au moment de sa création :


float tableauFlottant[5] = {5.4, 3.2, 6.4, 0.2, 1.9};
char chaineDeCaractere[7] = {'b', 'o', 'n', 'j', 'o', 'u', 'r'};


        Dans ce genre d'initialisation, il n'est pas néccesaire de donner le nombre de cases d'un tableau, le compilateur le devine au nombre d'éléments dans la right value :


short tab[] = { 0, 1, 2, 3};


        De même si le compilateur trouve entre les accolades moins d'éléments que le nombre de cases indiquées, il donnera aux cases sans valeurs le nombre 0. Il est donc possible pour initialiser tout un tableau avec le chiffre 0 de faire :


int tab[10]={0};



les tableaux à plusieurs dimensions

        Le C permet la création de tableaux à plusieurs dimensions. Ainsi :


int tab[7][4];


        crée un tableau de 7*4=28 cases (soit 21*2octets=56 octets occupés en mémoire). Ce genre de tableau peut s'initialiser de la sorte :


char tab[3][7] = {{'m', 'a', 'r', 'c', 'e', 'l'},
      {'r', 'o', 'b', 'e', 'r', 't'},
      {'a', 'r', 't', 'h', 'u', 'r'}};
//ou
char tab2[7][3] = {'m', 'a', 'r', 'c', 'e', 'l','r', 'o', 'b', 'e',
                           'r', 't','a', 'r', 't', 'h', 'u', 'r'};
//ou
char tab3[7][3];
tab3[0][0] = 'm';
tab3[0][1] = 'a';
tab3[1][3] = 'e';
//etc....



les chaînes de caractères ou "string"

        Un tableau de caractères, représente généralement une chaîne de caractères terminée par un caractère spécial que l'on nomme caractère nul : '\0' (tout les bits de cet octet sont à 0).
Le schéma suivant sera plus explicite :

Comme le montre ce schéma il est possible d'initialiser un tableau de caractères de la sorte :


char chaine1[24]="il fait beau aujourd'hui";
//ou
char chaine2[]="il fait beau aujourd'hui";


        Il est inutile de rajouter '\0' à la fin de la chaîne car le compilateur le fait automatiquement (sinon nous aurions deux '\0' d'affilée....).



et une chaîne de caractères


saisir et afficher des strings

        Pour ce genre d'opérations, nous pouvons utiliser les macros putchar() et getchar() :


#define ENTREE '\n'
#define CARACTERE_NUL '\0'


int increment = 0;
char mot[30];
//tant qu'on n'a pas appuyé sur enter pour faire un retour à la ligne
while ((mot[increment] = getchar()) != ENTREE)
  {
    //incrementer l'increment
    increment++;
  }
//le dernier caractère du tableau est '\n' alors que ce devrait être '\0'
//nous changeons donc '\n' par '\0'
mot[increment] = CARACTERE_NUL;

printf("vous avez entré\n");

//remettre l'increment à 0
increment = 0;

//tant qu'on a pas atteint le caractère nul....
while (mot[increment] != CARACTERE_NUL )
{
    putchar(mot[increment]);
    increment++;
}


        mais aussi les fonctions scanf et printf :
nous pouvons utiliser scanf pour lire une string :



char tab[30]
scanf("%s", tab);


        scanf permet ici de lire une string d'une longueur maximum de 40 caractères. Nous avions vu que pour la fonction scanf, nous devions obligatoirement donner une adresse. En fait pour le compilateur, "tab" équivaut à "&tab[0]", donc "scanf("%s", tab);" équivaut à scanf("%s", &tab[0]);
La fonction scanf ajoute d'elle-même le caractère nul à la fin de la chaîne de caractères.
nous pourrons dans le même principe faire :


printf("%s\n", tab);
//ou
printf("%s\n", &tab[0]);


        Nous verrons dès le mois prochain les pointeurs, d'ici là, révisez sur les anciens numeros de PCTeam la notion de bits......ce sera une bonne entrée en matière :-).


[ Précédent | Index | Suivant ]



par Valentin BILLOTTE
vbillotte@programmationworld.com
http://www.programmationworld.com
Dernière mise à jour: