5.1 Le type tableau
Dans les sections précédentes, nous avons utilisé des variables de type
int et float. Ces types sont qualifiés de
scalaire car à chaque variable est associée une seule une
information simple. Ainsi, si on la déclaration : int
A=0;, la variable A ne contient qu'une seule valeur à un
moment donné. Par opposition, une variable d'un type
composé est associée à plusieurs informations.
5.1.1 Tableaux monodimensionnel
Si on veut stocker un tableau contenant n entiers dans une variable,
il nous faut tout d'abord définir la structure de données
correspondante. Ainsi, on va définir un tableau nom
à 10 entrées entières par la commande :
type nom[n]
;
On peut affecter 7 à la troisième composante du tableau
associé à cette variable par l'instruction var[3]=7;. On
peut affecter un tableau d'entiers var2 lors de sa
déclaration en utilisant l'instruction :
int var2[10] = {1,2,3,4,5,6,7,8,9,10} ;
Exercice 5.0 --- Crible d'Érathostène.
Construire un programme qui affiche tous les nombres premiers de 2
à 1000. Pour ce faire, on va utiliser le crible
d'Érathostène : on construit un tableau contenant tout les
entiers de 2 à 1000, puis on supprime (par exemple remplacer
par 0) les multiples de 2, puis ceux de 3, etc.
Exercice 5.1 --- Fréquence d'incidence dans un tableau.
Lors d'une enquête de satisfaction pour un produit, des clients
étaient invités à donner une note entière entre 0 et 20.
Les 500 réponses ont été collectées dans un tableau
d'entiers.
#define NbNote 500
int resultat[NbNote]={3, 7, 9, 0, 18, 5, 4, 19, 8, 3, 10, 7, 14, 13,
0, 18, 17, 5, 16, 4, 5, 1, 20, 6, 16, 10, 13, 12, 6, 5, 20, 8, 9, 15,
3, 17, 12, 10, 19, 3, 13, 4, 13, 14 , 17, 17, 15, 14, 18, 6, 17, 9, 9,
6, 15, 17, 11, 8, 8, 0, 19, 19, 13, 18, 11, 1, 16, 5, 16, 7, 18, 20,
3, 16, 3, 9, 1, 3, 20, 11, 6, 19, 0, 13, 10, 14, 13, 5, 1, 16, 2, 19,
10, 2, 14, 6, 8, 15, 4, 6, 8, 20, 4, 2, 0, 18, 19, 20, 13, 1, 13, 16,
12, 12, 7, 19, 13, 11, 3, 18, 10, 7, 20, 0, 4, 4, 16, 14, 19, 0, 0, 16,
4, 0, 7, 18, 15, 8, 8, 6, 1, 12, 17, 9, 1, 4, 13, 0, 8, 15, 19, 4,
3, 1, 3, 1, 1, 1, 6, 10, 15, 8, 14, 17, 14, 3, 5, 0, 19, 6, 8, 13, 14,
2, 1, 12, 4, 1, 10, 17, 11, 7, 11, 12, 6, 10, 8, 18, 13, 15, 12, 14,
8, 2, 2, 3, 17, 6, 9, 17, 9, 19, 16, 8, 18, 0, 10, 15, 2, 17, 2, 3,
13, 19, 13, 12, 12, 2, 2, 4, 17, 17, 17, 2, 11, 19, 13, 8, 0, 9, 8, 5,
4, 13, 9, 9, 19, 15, 19, 1, 19, 10, 20, 1, 11, 8, 13, 0, 10, 6, 5, 1,
11, 0, 8, 13, 5, 0, 15, 9, 7, 0, 10, 0, 1, 12, 12, 10, 19, 17, 0, 6,
16, 12, 8, 12, 14, 13, 15, 20, 7, 17, 1, 18, 15, 13, 6, 14, 18, 8, 13,
14, 8, 14, 7, 16, 2, 19, 14, 6, 17, 8, 11, 14, 16, 11, 19, 2, 20, 16,
2, 13, 14, 20, 6, 13, 20, 9, 3, 19, 3, 0, 7, 0, 16, 7, 4, 15, 16, 17,
2, 14, 3, 15, 12, 16, 18, 1, 5, 9, 2, 1, 5, 9, 5, 13, 10, 11, 16, 6,
16, 8, 13, 11, 6, 8, 2, 5, 2, 5, 9, 1, 7, 20, 19, 4, 14, 2, 8, 9, 5,
9, 9, 5, 15, 12, 3, 7, 15, 17, 6, 0, 7, 2, 17, 19, 20, 15, 1, 11, 11,
18, 9, 7, 1, 1, 17, 1, 17, 10, 2, 5, 1, 14, 7, 2, 3, 0, 4, 2, 9, 17,
3, 6, 7, 18, 14, 14, 4, 10, 3, 15, 16, 17, 6, 15, 12, 17, 9, 5, 14,
14, 6, 4, 4, 4, 17, 10, 10, 11, 13, 16, 3, 0, 2, 18, 3, 20, 5, 16, 6,
0, 8, 3, 3, 10, 2, 0, 6, 11, 12, 9, 18, 8, 6, 2, 0, 0, 19, 12, 17, 5,
19, 12, 17, 4, 0, 20, 8, 3, 7, 6, 10, 0, 3, 4, 4, 6, 11, 0, 13, 14,
17, 20, 12, 3, 18, 3, 13, 14 };
Construisez une procédure qui permet d'afficher les notes qui ont
été données le plus et le moins souvent ainsi que les
fréquences correspondantes. De plus, affichez un histogramme
horizontal des fréquences des notes données en entrées.
Indications. Pour ce faire, on va créer un tableau
de 21 éléments indicé de 0 à 20 dont la nième
composante contiendra le nombre de fois où la note i a été
donnée. Ensuite, il nous faudra déterminer le maximum et le
minimum de ce tableau et en déduire les notes les plus et moins
fréquentes.
L'exemple a été choisi afin que le maximum et le minimum des
fréquences soient uniques.
5.1.2 Tableaux bidimensionnel
Un tableau peut être multidimensionnel et coder une matrice 6x6
à coefficients flottant.
On peut définir le tableau à deux dimensions correspondant par
l'instruction :
float matrice[6][6];
et affecter à 1 le coefficient (i,j) de la variable
matrice par l'instruction matrice[i][j]=1;.
Remarquons que l'on peut déclarer et affecter la matrice 2x2
identité par l'instruction :
int id[2][2]={{1,0},{0,1}};
Exercice 5.2 --- Matrice : saisie, produit et affichage.
Écrivez une procédure qui permet de saisir deux
matrices 3x3, de faire leurs produit et de l'afficher.
Exercice 5.3 --- Jeu de la vie.
Le jeu de la vie a été élaboré par John H. Conway. On
considère un tableau bidimensionnel dont chaque cellule peut
être dans l'un des deux états suivants :
-
occupée (par une cellule vivante) ;
- vide (cellule morte).
Chacune des huits cases qui entourent une case donnée est dite
adjacente ou voisine.
Les règles du jeu sont les suivantes :
-
Règle de la survie : chaque cellule vivante ayant,
à l'étape n, deux ou trois cellules vivantes adjacentes
survit à l'étape n+1 ;
- Règles de la mort : chaque cellule vivante ayant
pour voisines, à l'étape n, quatre cellules vivantes
adjacentes ou plus, disparaît à l'étape n+1 (mort par
surpopulation). Une cellule vivante n'ayant qu'une ou aucune
cellule vivante adjacente meurt à l'étape suivante (mort par
isolement) ;
- Règle de naissances : chaque cellule morte ayant
exactement trois cellules vivantes adjacentes, engendre à
l'étape suivante une cellule vivante.
Le jeu de la vie est un exemple d'automate cellulaire. Nous allons
construire un programme permettant d'initialiser, de représenter
les états, de gérer et d'afficher cet automate.
Pour ce faire, il nous faut :
-
représenter les cellules par un tableau bidimensionnel (le
plan de jeu). Le plan du jeu est supposé infini. Il nous faut
donc le représenter par un tore de taille 20× 20 (pour
fixer les idées). Pour travailler dans ce tore, vous pouvez
supposer que les coordonnées sont dans un corps fini et utiliser
le reste de la division euclidienne % ;
- initialiser ce tableau ;
- construire un code qui permet la transition d'un état au
suivant (n'oubliez pas que cette transition nécessite une copie
du plan de jeu ;
- construire du code qui permettent l'affichage.
Pour tester votre programme voici quelques configurations classiques :
-
le clignotant
XXX
- le glisseur
X
X
XXX
- le tétramino
XXX
X
- le goinfre
XX
X
XXX
X
Enfin, vous pouvez choisir des conditions initiales aléatoires en
utilisant la fonction random() (cf. man random).
Pour tout commentaire : Alexandre Sedoglavic.