Chapitre 3 : Tableaux
A) Tableaux un seul indice :
1) Domaines d'utilisation :
On utilise souvent les tableaux un seul indice pour :
- calculer les statistiques de base (moyenne, cart-type,
plus grande et plus petite valeurs , ...)
- trier, rechercher un lment en particulier
- afficher les informations traites (avant ou aprs le
tri, satisfont aux conditions voulues, etc ...)
2) Dclaration :
2.a) Faon directe :
int age[15] ;
float taille[25], poids[70] ;
age est un tableau de 15 entiers. age[0], age[1], ...,
A[14] sont 15 lments du tableau age. Chacun est de
type entier.
taille est un tableau de 25 rels. Ses lments sont
taille[0], taille[1], ..., taille[24].
etc ...
La faon de dclarer directement les tableaux est simple.
2.b) Faon structure :
Dclarer les tableaux age, taille, poids, sexe d'un groupe
de 150 personnes ou moins.
1. Style de C :
#define
int
float
char
int
Chapitre 3 : Les tableaux
MAX_PERS
150
age[MAX_PERS]
taille[MAX_PERS], poids[MAX_PERS]
sexe[MAX_PERS]
nbPers ; /* le nombre effectif de
;
;
;
personnes traites */
Page 62
2. Style en PASCAL (avec typedef : dfinition de type)
La dclaration typedef permet de crer des synonymes et
de les employer dans d'autres dclarations. Cette technique
est utilise pour clarifier un programme:
typedef
typedef
int Entier
; /* Entier est synonyme int */
char * Chaine ; /* Chaine est synonyme char*
*/
Avec :
typedef int
TabEntier[MAX_PERS] ;
TabEntier est le nom du type tableau de 150 entiers.
Les dclarations des tableaux peuvent se faire comme suit :
#define
MAX_PERS
typedef
typedef
typedef
int
TabEntier[MAX_PERS] ;
float TabReel [MAX_PERS] ;
char TabCar[MAX_PERS]
;
TabEntier
TabReel
TabCar
150
age ;
taille, poids ;
sexe ;
/* tableau d'entiers */
/* tableau des rels */
/* tableau des caractres */
3. Style de C++ (utilisation de const la place de #define)
(Ce n'est plus une matire du IFT 1160)
const int
MAX_PERS = 150;
float taille[MAX_PERS], poids[MAX_PERS];
char
sexe[MAX_PERS];
etc ...
/* non valide en */
/* C standard
*/
3) Schma d'un tableau :
On reprsente un tableau comme une commode plusieurs tiroirs
dont chaque tiroir contient un seul objet de mme type :
age[0]
age[1]
age[2]
age[3]
......
......
age[14]
Chapitre 3 : Les tableaux
45
20
27
49
...
....
21
Page 63
4) Manipulations d'un tableau :
1. On cre souvent des tableaux en lisant un ou plusieurs
fichiers de donnes. La boucle while est frquente :
Exemple :
......
int n = 0 ; /* compteur */
while ( !feof(donnees) ) {
fscanf(donnees,"%f\n", &taille[n]) ;
n++ ;
}
fclose (donnees);
2. On parcoure les indices d'un tableau avec la boucle for.
notez que le premier indice est zro :
for ( i = 0 ; i < nbElement ; i++ ) .....
3. Sur l'en-tte des fonctions, on n'a pas besoin de
mentionner les bornes des tableaux un seul indice :
float moyenne ( float t[], int n )
/* Cette fonction calcule et retourne la valeur
moyenne d'un tableau t qui contient n rels */
......
void trier ( int age[], float taille[], int nbPers)
4. Le nom d'un tableau n'est pas du tout une variable. C'est
une constante de type pointeur : c'est l'adresse de son
premier lment indice 0.
float taille[10] ;
taille
est quivalent
&taille[0]
Ainsi taille = ..... ; est toujours invalide
(on affecte une variable, pas une constante).
5. En C, on peut dclarer et initialiser un tableau :
#define NB_NOTES 7
float bareme[NB_NOTES] = { 100.0, 100.0, 25.0, 35.0, 40.0,
100.0, 100.0 } ;
Chapitre 3 : Les tableaux
Page 64
Ainsi, bareme[0] vaut 100.0
bareme[1] vaut 100.0
bareme[2] vaut 25.0
etc ....
(on corrige l'intra sur 100)
(on corrige le final sur 100)
(on corrige le TP1 sur 25)
6. En C, si t est le nom d'un tableau, on a :
t + i
* (t + i)
<====>
<====>
&t[i]
t[i]
7. On peut utiliser des pointeurs pour manipuler un tableau.
Cependant, il est souhaitable d'tre d'abord capable de
manipuler les indices avant d'utiliser des pointeurs qui,
eux provoquent souvent des erreurs si on ne matrise pas
bien le concept des pointeurs.
Exemples : crire une fonction qui affiche le contenu du
tableau des tailles l'cran :
a. avec les indices (plus simples comprendre)
void afficher ( float taille[], int nbPers )
{ int i ;
for ( i = 0 ; i < nbPers ; i++ )
printf("%3d) %8.2f\n", i, taille[i]) ;
}
b. avec un pointeur (un peu plus compliqu)
void afficher ( float * P, int nbPers )
{ int i ;
for ( i = 0 ; i < nbPers ; i++ )
printf("%3d) %8.2f\n", i, *(P+i) ) ;
}
OU (encore plus compliqu) :
void afficher ( float * P, int nbPers )
{ int i ;
while ( i < nbPers )
printf("%3d) %8.2f\n", i++, *P++ ) ;
L'utilisation de pointeur est plus frquente dans le
traitement des chanes de caractres (sous forme tableau des
caractres ou pointeur vers le type caractre).
Chapitre 3 : Les tableaux
Page 65
5) Exemples et exercices :
Exemple 1 : cration des tableaux et calculs des statistiques :
On dispose du fichier texte "[Link]". Chaque ligne de ce
fichier contient les informations d'une seule personne: sa
taille et son poids.
On a 20 personnes ou moins dans le fichier.
crire un programme utilisant des tableaux et des fonctions pour
calculer et afficher les statistiques suivantes :
Pour 17 personnes lues dans le fichier:
1.
La taille
- moyenne
:
- la plus grande :
- la plus petite :
2.
Le poids
- moyen
- le plus lourd
- le plus lger
:
:
:
1.68 mtre
1.83 mtre
1.43 mtre
61.69 kgs
86.20 kgs
42.50 kgs
Solution :
/* Fichier Tableau1.C
Matire principale
*/
: tableaux un seul indice
Donnes : "[Link]" (une taille et un poids par ligne)
1.63
54.9
1.57
56.3
1.73
63.0
etc ...
#include <stdio.h>
#define MAX_PERS 20 */ 20 personnes ou moins dans le fichier */
void creer ( float taille[], float poids[], int * P )
{
FILE * aLire = fopen("[Link]", "r");
int n = 0 ;
while ( !feof(aLire) ) {
fscanf(aLire, "%f%f\n", &taille[n], &poids[n]);
n++;
}
fclose (aLire);
*P = n ;
}
Chapitre 3 : Les tableaux
Page 66
/* Cette fonction permet de calculer la valeur moyenne
/ d'un tableau t qui contient exactement n rels. */
float moyenne ( float t [], int n )
{
float somme = 0.0 ;
int
i ;
for ( i = 0 ; i < n ; i++ ) somme += t[i];
return somme / n ;
}
/* Cette fonction dtermine la plus grande et la plus
petite valeur dans un tableau T de N rels. */
void determiner ( float t[], int n, float * PG, float * PP )
{
float plusGrande = t[0] ,
plusPetite = t[0] ;
int i ;
for ( i = 1 ; i < n ; i++ ) {
if ( t[i] > plusGrande ) plusGrande = t[i] ;
if ( t[i] < plusPetite ) plusPetite = t[i] ;
}
*PG = plusGrande ;
*PP = plusPetite ;
}
void main()
{
float
taille [MAX_PERS],
poids [MAX_PERS] ;
int
nbPers
;
float grandeTaille, petiteTaille,
lourdPoids , legerPoids
;
creer (taille, poids, &nbPers) ;
printf("Pour %d personnes lues dans le fichier:\n\n", nbPers);
determiner (taille, nbPers, &grandeTaille, &petiteTaille);
printf("
printf("
1.
La taille\n");
- moyenne
: %6.2f mtre\n",
moyenne(taille, nbPers));
printf("
- la plus grande : %6.2f mtre\n", grandeTaille);
printf("
- la plus petite : %6.2f mtre\n", petiteTaille);
printf("\n\n");
Chapitre 3 : Les tableaux
Page 67
determiner (poids, nbPers, &lourdPoids, &legerPoids);
printf("
2.
Le poids\n");
printf("
- moyen
: %6.2f kgs\n",
moyenne(poids, nbPers));
printf("
printf("
- le plus lourd
- le plus lger
: %6.2f kgs\n", lourdPoids);
: %6.2f kgs\n", legerPoids);
}
Exercice 1 :
Ajouter au programme de l'exemple 1 (exemple prcdent)
1.
une fonction avec l'en-tte suivant :
void afficher ( float taille[], float poids[], int nbPers )
et un appel de cette fonction pour afficher le contenu
de ces deux tableaux l'cran .
2.
une fonction avec l'en-tte suivant :
void afficher2( float * P, float * S, int n )
et un appel de cette fonction pour afficher le contenu
des 5 premiers lments des deux tableaux taille et poids
l'cran .
Exemple 2 (tri d'un tableau) :
Soit t un tableau de n rels (par exemple). crire un bloc
d'instructions permettant de trier le tableau t selon la
mthode du tri par slection (vue au cours pralable IFT 1810) :
Solution :
int i, j, indMinimum ;
float temporaire
;
for ( i = 0 ; i < n - 1 ; i++ ) /* du premier avant dernier */
{
indMinimum = i ;
for ( j = i + 1 ; j < n ; j++ )
if (t[j] < t[indMinimum]) indMinimum = j ;
if ( indMinimum != i ) {
/* on change */
temporaire
= t[i] ;
t[i]
= t[indMinimum] ;
t[indMinimum] = temporaire ;
}
Chapitre 3 : Les tableaux
Page 68
notes :
1)
2)
on va rviser en classe cette mthode de tri ;
on apprendra une autre mthode de tri rapide.
Exemple 3 (recherche avec une sentinelle) :
Programmer l'algorithme suivant qui permet de chercher un
lment dans un tableau (tri ou non) :
Soit t un tableau de n lments (tris ou non). Soit
aChercher une valeur chercher. L'algorithme de la
recherche avec une sentinelle se prsente comme suit :
indice = -1
t[n] = aChercher
Rpter
indice = indice + 1
Jusqu' t[indice] = aChercher
Si indice < n on trouve "indice"
Sinon on ne trouve pas.
Solution :
void chercher ( int t[], int n, int aChercher, int * P )
{
int indice = -1 ;
t[n] = aChercher ;
do
indice++ ;
while (t[indice] != aChercher) ;
*P = indice ;
}
Exemple d'utilisation :
/* Chercher un numro donn dans un tableau des numros
de nbEmp employs : */
#define MAX_EMP 1250
int unNumero, numero[MAX_EMP] ;
int nbEmp, indice ;
.......
printf("Quel est le numro de l'employ recherch ? ");
scanf("%d", &unNumero);
chercher ( numero, nbEmp, unNumero, &indice) ;
Chapitre 3 : Les tableaux
Page 69
if (indice == nbEmp )
printf("Dsol! on ne le trouve pas %d\n", unNumero);
else
{
printf("Son numro
: %d\n", numero[indice]);
printf("son ge
: %d\n", age [indice]);
etc ....
}
Exercice 2 (recherche dichotomique dans un tableau tri) :
Le tableau devrait tre tri avant d'appliquer cette mthode.
Soit le bloc d'instructions suivant qui rsume la mthode de
recherche dichotomique dans un tableau tri :
#define VRAI
#define FAUX
int
1
0
indice , mini, maxi, milieu , trouve ;
trouve = FAUX ; /* on ne trouve pas encore */
mini
maxi
= 0 ;
= N - 1 ; /* on examine tout le tableau */
while ( !trouve && (mini <= maxi) ) {
milieu = ( mini + maxi ) / 2 ;
if ( aChercher < t[milieu] )
maxi = milieu - 1 ;
else
if ( aChercher > t[milieu] )
mini = milieu + 1 ;
else
trouve = VRAI ;
}
if (trouve)
else
indice = milieu ;
printf("On ne le trouve pas!\n");
Simuler le programme avec le tableau t qui contient 7 lments.
( n = 6 ). La valeur recherche est :
Chapitre 3 : Les tableaux
a)
27
b)
100
c)
50
Page 70
t[0]
t[1]
t[2]
t[3]
t[4]
t[5]
t[6]
20
27
49
79
90
100
Exercice 3 (fusion de deux tableaux tris) :
crire une fonction qui fusionne deux tableaux d'entiers ordonns
en un seul tableau ordonn. crire un programme pour tester le bon
fonctionnement de votre fonction.
6) Exemple de rvision :
On dispose du fichier texte "[Link]". Chaque ligne de ce fichier
contient les informations d'un seul employ. On y trouve :
- le poste de travail
- le numro d'employ
:
- le nombre d'heures de travail:
- le taux d'horaire
:
un caractre :
'A' pour analyste
'P' pour programmeur
'O' pour oprateur
'S' pour secrtaire
un entier
un rel
un rel
On a 250 employs ou moins dans le fichier.
Contenu du fichier :
P 2754 40.01
P 1848 40.02
S 2636 32.50
A 1750 30.03
A 2168 33.04
O 4612 42.00
etc ....
Chapitre 3 : Les tableaux
19.01
23.01
12.00
25.16
25.20
10.12
Page 71
crire un programme en C qui permet :
- de lire le fichier, de mmoriser les donnes dans 3 tableaux :
poste, numero, salHebdo (salaire hebdomadaire)
- d'offrir un menu et traiter le choix de l'usager :
. afficher la liste des employs
. trier selon les numros des employs
. rechercher un employ (recherche avec 1 sentinelle si le
tableau n'est pas encore tri et recherche dichotomique
si le tri est fait)
. calculer et afficher quelques statistiques
Une solution possible :
/* Fichier : Tableaux.C
Objectifs pdagogiques : revoir presque toutes les matires
vues au cours IFT 1810, cours
pralable au langage C.
Donnes : [Link] contenant moins de 250 employs
*/
#include <stdio.h>
#include <ctype.h> /* pour la Conversion de type (ex. toupper(...))*/
#define MAX_EMP
250
/* au maximum, 250 employs */
/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Auteur : Jean, CHOQUETTE
Date : ...... 20xx
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ But de cette fonction :
+
+ La fonction permet de calculer et de retourner le meilleur
+
+ salaire hebdomadaire d'un poste de travail donn (voulu)
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Paramtres d'entre : Le tableau des salaires hebdo.
+
+
Le nb. d'employs N
+
+
Le poste voulu : un caractre
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Appel par la fonction principale
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
float meilleur( float salHebdo[],char poste[], int n, char posteVoulu)
{ float plusGrand = 0;
int
i ;
for (i = 0 ; i < n ; i++)
if (poste[i] == posteVoulu)
if (salHebdo[i] > plusGrand) plusGrand = salHebdo[i] ;
return plusGrand ;
}
Chapitre 3 : Les tableaux
Page 72
void obtenir(char * C)
{ char leChoix ;
int valide
; /* Oui ou Non le choix est valide */
printf("Tapez :\n");
printf("
printf("
printf("
printf("
printf("
A
T
C
S
Q
pour
pour
pour
pour
pour
visualiser\n");
trier\n");
rechercher\n");
statistiques\n");
quitter\n");
do {
printf("\nVotre choix parmi A, T, C, S ou Q ");
fflush(stdin);
leChoix = toupper(getchar());
valide = (
leChoix == 'A' || leChoix == 'T' ||
leChoix == 'C' || leChoix == 'S' ||
leChoix == 'Q' );
if (!valide)
printf("votre choix est imprvu, retapez S.V.P. ");
} while (!valide);
*C = leChoix ;
/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Auteur : Lise, LALIBERTE
Date : ...... 20xx
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ But de cette fonction :
+
+ La fonction permet de lire le fichier [Link], de remplir +
+ les 3 tableaux et de compter le nb. effectif d'employs lus
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Paramtres d'entre : Aucun
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Paramtres de sortie : Les trois tableaux,
+
+
un paramtre transmis par pointeur pour +
+
le nb. effectif d'employs lus
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Appel par la fonction principale
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
void lireCreer ( char poste[], int numero[], float salHebdo[], int * P)
{ int n = 0 ; /* compteur du nombre effectif d'employs lus
dclarer et "initialiser" (style courant de C) */
float nbHr, taux ;
FILE * donnees ;
donnees = fopen("[Link]", "r");
if (donnees == NULL)
printf("Problme d'ouverture du fichier lire!\n");
Chapitre 3 : Les tableaux
Page 73
else {
while (!feof(donnees)) {
fscanf(donnees,"%c%d%f%f\n", &poste[n], &numero[n],
&nbHr, &taux);
salHebdo[n] = nbHr * taux ;
n++;
};
fclose(donnees);
*P = n ;
}
}
/* afficher "explicitement" un poste de travail
Matires pdagogiques : slection multiple avec switch */
void ecrire (char unposte)
{
switch (unposte) {
case
case
case
case
'A'
'P'
'O'
'S'
:
:
:
:
printf("
printf("
printf("
printf("
}
printf("\n");
Analyste"); break ;
Programmeur"); break ;
Oprateur"); break ;
Secrtaire");
void afficher ( char poste[], int numero[], float salHebdo[], int n )
{ const int parEcran = 20 ;
int i ;
printf("Liste d'employs :\n");
for (i = 0 ; i < n ; i++)
{
printf("%4d) %5d %7.2f", i+1, numero[i], salHebdo[i]);
ecrire(poste[i]);
if ( (i + 1) % parEcran == 0 || i == (N-1))
{
printf("\nAppuyez sur Q pour quitter ");
if ( i < N-1 ) printf(" ou Entre pour continuer ");
fflush(stdin);
if (toupper(getchar()) == 'Q') break ;
}
Chapitre 3 : Les tableaux
Page 74
void demander(int * P)
{
printf("Quelques numros existants : 4371, 1750, 2325, 3215\n");
printf("Quel est le numro de l'employ recherch ? ");
scanf("%d", P);
}
void chercherSenti (int aChercher, int numero[], int nbEmpl, int * P)
{ int indice ;
printf("\nRecherche squentielle avec une sentinelle :\n\n");
indice = - 1 ;
numero[nbEmpl] = aChercher ;
do indice++;
while ( numero[indice] != aChercher );
if (indice == nbEmpl) indice = -1 ;
*P = indice ;
}
void continuer()
{ printf("\n\nAppuyez sur Entre ");
fflush(stdin);
getchar();
}
void chercherDicho (int aChercher, int numero[], int nbEmpl,
int * P)
{ int mini, maxi, milieu ;
int trouve ; /* Oui (1) ou Non (0) on trouve le numro recherch*/
printf("\nRecherche dichotomique dans un tableau tri:\n\n");
mini = 0 ;
maxi = nbEmpl - 1 ;
trouve = 0 ; /* on ne trouve pas encore */
while ( !trouve && mini <= maxi ) {
milieu = (mini + maxi) / 2 ;
if (aChercher < numero[milieu])
maxi = milieu - 1 ;
else if (aChercher > numero[milieu])
mini = milieu + 1 ;
else
trouve = 1 ; /* on trouve! */
}
if (!trouve) *P = -1 ;
else *P = milieu ;
}
Chapitre 3 : Les tableaux
Page 75
void trier ( char poste[], int numero[], float salHebdo[],
int nbEmpl)
{ int i, j, indMin ;
int
tempoNum
;
float
tempoSal
;
char
tempoPost
;
for ( i = 0 ; i < nbEmpl - 1 ; i++) {
indMin = i ;
for (j = i + 1 ; j < nbEmpl ; j++)
if ( numero[j] < numero[indMin] ) indMin = j ;
if ( indMin != i ) {
tempoNum
= numero[i];
numero[i]
= numero[indMin];
numero[indMin] = tempoNum
;
tempoSal
salHebdo[i]
salHebdo[indMin]
= salHebdo[i] ;
= salHebdo[indMin] ;
= tempoSal
;
tempoPost
poste[i]
poste[indMin]
= poste[i]
;
= poste[indMin] ;
= tempoPost
;
}
}
void main()
{
char
poste[MAX_EMP]
int
numero[MAX_EMP]
float salHebdo[MAX_EMP]
int
nbEmpl
char choix ;
int dejaTrie = 0 ; /* Faux au dbut */
int
aChercher, indice ;
lireCreer ( poste, numero, salHebdo, &nbEmpl );
do {
obtenir (&choix);
switch (choix) {
case 'A' : afficher ( poste, numero, salHebdo, nbEmpl ); break;
Chapitre 3 : Les tableaux
Page 76
case 'S' :
printf("meilleur salaire :\n");
printf(" - des analystes : %8.2f $\n",
meilleur(salHebdo, nbEmpl, 'A'));
printf(" - des oprateurs: %8.2f $\n",
meilleur(salHebdo, nbEmpl, 'O'));
continuer();
break ;
case 'C' : demander(&aChercher);
if(dejaTrie)
chercherDicho(aChercher, numero, nbEmpl, &indice);
else
chercherSenti(aChercher, numero, nbEmpl, &indice);
if (indice >= 0)
{ printf("Yahou!, on le trouve :\n");
printf("%5d %7.2f", numero[indice],
salHebdo[indice]);
ecrire(poste[indice]);
}
else printf("Dsol, on ne trouve pas %d\n", aChercher);
continuer();
break ;
case 'T' : trier ( poste, numero, salHebdo, nbEmpl);
dejaTrie = 1 ;
break ;
}
} while (choix != 'Q');
Excution :
Tapez
- A
- T
- C
- S
- Q
:
pour
pour
pour
pour
pour
visualiser
trier
rechercher
statistiques
quitter
Votre choix parmi A, T, C, S ou Q a
Liste d'employs :
1) 2754 760.59
2) 1848 920.86
3) 2636 390.00
4) 1750 755.55
5) 2168 832.61
6) 4612 425.04
7) 2325 405.20
8) 1512 811.76
9) 2340 762.58
10) 3428 925.34
11) 3563 487.50
12) 4101 422.50
Chapitre 3 : Les tableaux
Programmeur
Programmeur
Secrtaire
Analyste
Analyste
Oprateur
Oprateur
Analyste
Analyste
Programmeur
Secrtaire
Secrtaire
Page 77
13)
14)
15)
16)
17)
18)
19)
20)
4371
3629
2630
3215
3529
1538
4119
4121
645.85
967.21
606.42
807.82
454.52
929.19
879.70
648.59
Programmeur
Programmeur
Programmeur
Programmeur
Oprateur
Programmeur
Analyste
Programmeur
Appuyez sur Q pour quitter ou Entre pour continuer
21) 1023 857.11 Analyste
22) 1868 390.00 Secrtaire
23) 1944 390.00 Secrtaire
24) 1430 610.19 Programmeur
25) 3727 892.56 Programmeur
26) 4613 451.50 Oprateur
27) 3628 452.36 Oprateur
28) 4368 453.22 Oprateur
29) 2047 487.50 Secrtaire
30) 2565 422.50 Secrtaire
31) 3026 855.40 Programmeur
32) 4342 847.79 Analyste
33) 2451 822.76 Analyste
34) 1741 436.65 Oprateur
35) 1957 422.50 Secrtaire
36) 1327 853.75 Analyste
37) 1631 487.50 Secrtaire
38) 1644 390.00 Secrtaire
39) 2028 462.25 Oprateur
40) 2021 422.50 Secrtaire
Appuyez sur Q pour quitter
Tapez
- A
- T
- C
- S
- Q
:
pour
pour
pour
pour
pour
ou Entre pour continuer q
visualiser
trier
rechercher
statistiques
quitter
Votre choix parmi A, T, C, S ou Q s
meilleur salaire :
- des analystes :
- des oprateurs:
1217.20 $
760.59 $
Appuyez sur Entre
Tapez
- A
- T
- C
- S
- Q
:
pour
pour
pour
pour
pour
visualiser
trier
rechercher
statistiques
quitter
Votre choix parmi A, T, C, S ou Q c
Chapitre 3 : Les tableaux
Page 78
Quelques numros existants : 4371, 1750, 2325, 3215
Quel est le numro de l'employ recherch ? 2325
Recherche squentielle avec une sentinelle :
Yahou!, on le trouve :
2325 405.20 Oprateur
Appuyez sur Entre
Tapez
- A
- T
- C
- S
- Q
:
pour
pour
pour
pour
pour
visualiser
trier
rechercher
statistiques
quitter
Votre choix parmi A, T, C, S ou Q c
Quelques numros existants : 4371, 1750, 2325, 3215
Quel est le numro de l'employ recherch ? 5555
Recherche squentielle avec une sentinelle :
Dsol, on ne trouve pas 5555
Appuyez sur Entre
Tapez
- A
- T
- C
- S
- Q
:
pour
pour
pour
pour
pour
visualiser
trier
rechercher
statistiques
quitter
Votre choix parmi A, T, C, S ou Q t
Tapez
- A
- T
- C
- S
- Q
:
pour
pour
pour
pour
pour
visualiser
trier
rechercher
statistiques
quitter
Votre choix parmi A, T, C, S ou Q c
Quelques numros existants : 4371, 1750, 2325, 3215
Quel est le numro de l'employ recherch ? 3215
Recherche dichotomique dans un tableau tri:
Yahou!, on le trouve :
3215 807.82 Programmeur
Chapitre 3 : Les tableaux
Page 79
Appuyez sur Entre
Tapez
- A
- T
- C
- S
- Q
:
pour
pour
pour
pour
pour
visualiser
trier
rechercher
statistiques
quitter
Votre choix parmi A, T, C, S ou Q c
Quelques numros existants : 4371, 1750, 2325, 3215
Quel est le numro de l'employ recherch ? 6789
Recherche dichotomique dans un tableau tri:
Dsol, on ne trouve pas 6789
Appuyez sur Entre
Tapez
- A
- T
- C
- S
- Q
:
pour
pour
pour
pour
pour
visualiser
trier
rechercher
statistiques
quitter
Votre choix parmi A, T, C, S ou Q q
7) Tableau dynamique :
Si les donnes dpassent 64 kilo-octets, il est prfrable d'utiliser
un tableau dynamique o les donnes seront mmorises en zone de
mmoire dynamique.
Seules la dclaration et la demande d'allocation d'espace de mmoire
sont diffrentes :
const int MAX_EMP = 5000;
float * salHebdo ;
salHebdo = (float *) malloc (sizeof(float) * MAX_EMP);
Une fois que le tableau a t dclar et que l'espace de mmoire
dynamique a t allou, il suffit d'utiliser des indices pour
manipuler ce tableau dynamique :
salHebdo[23] dsigne le salaire hebdomadaire du 24 ime employ, etc.
Chapitre 3 : Les tableaux
Page 80
B) Les tableaux deux indices en C :
La plupart des applications des tableaux 2 indices sont en
calcul matriciel (mathmatiques). Pour le cours IFT 1160, nous
nous limitons un exemple simple : gestion des notes du cours
IFT 1160.
1) Dclaration du tableau des notes :
On peut dclarer un seul tableau 2 indices pour les notes o :
note [23] [0] vaut
82.7
signifie que la premire note (indice 0) du 24 ime tudiant
(indice 23) vaut 82.7.
Le premier indice dsigne le rang de l'tudiant ( la note de qui ? )
Le deuxime indice dsigne la catgorie de note ( pour quelle note ? ).
#define
MAX_ETUD 100 /* 100 tudiants ou moins */
#define
NB_NOTES
7 /*
7 notes (intra, final, tp1, tp2, tp3,
tps et globale)
*/
float note [MAX_ETUD] [NB_NOTES] ;
2) Manipulation :
1.
On utilise aussi la boucle for.
2.
On crit : note [12] [3], on n'crit pas note [12, 3].
3.
Sur l'en-tte d'une fonction, il faut donner au moins la
deuxime borne :
void afficher ( float note [] [NB_NOTES], int nbEtud)
3) Exemple :
crire une fonction et 2 appels de cette fonction pour afficher
l'cran :
- la moyenne d'intra
- la moyenne du final
Chapitre 3 : Les tableaux
(indice 0)
(indice 1)
Page 81
Solution :
float moyenne ( float note[] [NB_NOTES], int nbEtud, int catVoulu )
{ float somme = 0.0 ;
int
i
;
for ( i = 0 ; i < nbEtud ; i++ )
somme += note [i] [catVoulu] ;
return somme / nbEtud ;
Appels :
printf("La moyenne d'intra : %6.2f\n",
printf("La moyenne du final : %6.2f\n",
moyenne(note, nbEtud, 0) );
moyenne(note, nbEtud, 1) );
Exercices :
Exercice 1 (pour les tudiants en sciences mathmatiques) :
crire un programme qui comporte des fonctions pour tester les
calculs matriciels :
-
l'addition de deux matrices
la multiplication de deux matrices
la transposition d'une matrice
etc ...
Exercice 2 (carr magique) :
crire un programme permettant de fabriquer et d'afficher les
carrs magiques d'ordre impair entre 3 et 15.
Exemple :
Carr magique d'ordre 3 :
8
3
4
1
5
9
6
7
2
(La solution sera donne si l'exercice vous intresse).
Chapitre 3 : Les tableaux
Page 82