Title: Chapitre 2 : Les tableaux
1Chapitre 2 Les tableaux
- Demi Module dInformatique
- Filières SMP-SMC
- Semestre 2, 2006
2Sommaire
- Notion de tableau
- Déclaration dun tableau
- Initialisation dun tableau
- Propriétés daccès aux éléments dun tableau
- Propriétés de la taille dun tableau
- Les tableaux à plusieurs dimensions
- Exercices corrigés
3Notion de tableau
4Définition
- Un tableau est une structure de données formée
dun nombre de variables ayant le même nom et le
même type. - Un tableau représente le contenu dune suite
déléments comme une variable simple représente
le contenu dun élément simple. - Un tableau est composé déléments de même type et
chaque élément dun tableau est référencé par un
indice unique.
5Définition (suite)
- Les éléments dun tableau sont rangés dans la
mémoire à des emplacements contigus (lun après
lautre).
Un élément
Un indice
Représentation dun tableau en mémoire
6Pourquoi les tableaux ?
- On utilise les tableaux, par exemple pour
- Stocker les termes dune suite.
- Stocker les composantes dun vecteur.
- Stocker les coefficients dune matrice.
- Stocker les coefficients dun polynôme.
- Stocker les caractères dune chaîne de
caractères. - Etc.
7Déclaration d'un tableau
8Définition
- Pour déclarer un tableau en C, il faut utiliser
lopérateur entre crochets qui se note . - La syntaxe générale de déclaration dun tableau
est la suivante - Type_éléments Nom_tableauNombre_éléments
- Type_éléments ? représente le type des éléments
du tableau. - Nom_tableau ? cest le nom du tableau.
- Nombre_éléments ? cest le nombre déléments du
tableau.
9Exemple
- Déclarer un tableau de 5 entiers, un tableau de
20 caractères, un tableau de 100 nombres réels en
simple précision et un tableau de 100 nombres
réels en double précision. - Solution
- int t5
- char a20
- float x100
- double y100
10Remarque
- On peut factoriser par le type identique lors de
la déclaration de plusieurs tableaux de même
type. Par exemple, on peut faire les déclarations
suivantes - int a10, b20
- float x100, y100
11Exercice corrigé
- Que déclare-t-on par les instructions suivantes
- int a, b100
- char c15, d10
- float x10, z20
- Solution
- a est une variable simple de type int.
- b est un tableau de 100 entiers.
- c est un tableau de 15 caractères.
12Exercice corrigé
- d est un tableau de 10 caractères.
- x est un tableau de 10 nombres réels en simple
précision. - y est un tableau de 20 nombres réels en simple
précision.
13Initialisation d'un tableau lors de la déclaration
14Syntaxe dinitialisation
- On peut initialiser un tableau lors de sa
déclaration. - Pour cela, il faut écrire les valeurs de ses
éléments entre les symboles et de la manière
suivante - Type_élém Nom_tabTaille val1, val2, ,
valn - Ou
- Type_élém Nom_tab val1, val2, , valn
15Syntaxe dinitialisation
- La deuxième forme montre quon peut omettre le
nombre des éléments dun tableau. - Dans ce cas, le nombre des éléments du tableau
sera défini comme le nombre des valeurs dans la
séquence entre les accolades.
16Exercice corrigé
- Indiquer les éléments de chacun des tableaux
suivants, ainsi que leur nombre - int tab15 2, 3, 5, 7, 11
- int tab2 0, 2, 4, 6, 8
- int tab3100 1
17Solution
- tab1 ? 5 éléments 2, 3, 5, 7 et 11
- tab2 ? 5 éléments 0, 2, 4, 6 et 8
- tab3 ? 100 éléments le premier élément est 1
et les autres sont tous des 0
18Exercice corrigé
- Découvrir les erreurs dans les déclarations
suivantes - int 5 2, 3, 5, 7, 11
- int a3 10, 20, 40, 60, 80
- int s-4
- int t4.7
19Solution
- 1 ? le nom du tableau manque.
- 2 ? le nombre des valeurs dans la séquence
dinitialisation dépasse le nombre des éléments
indiqué entre et . - 3 ? le nombre des éléments dun tableau ne peut
être négatif (ou égal à 0). - 4 ? le nombre des éléments dun tableau ne peut
être un nombre réel.
20Propriétés daccès aux éléments dun tableau
- Soit X un tableau de N éléments dun certain type
T - Xi désigne lélément dindice i dans le tableau
X. - Les indices du tableau X vont de 0 à N-1.
- Par exemple int X4 déclare un tableau de 4
entiers. Son premier élément est X0 et son
dernier élément est X3.
21Propriétés daccès aux éléments dun tableau
- Xi est considéré comme une variable simple de
type T. On peut lui appliquer toutes les
opérations possibles sur le type T. - Exemples int X4 On peut écrire
- X1 3 / affectation de 3 à X1/
- scanf("d", X2) / je lis X2 /
22Propriétés daccès aux éléments dun tableau
- printf("d", X0) / jaffiche X0 /
- X3 / jincrémente la valeur de X3 /
- X0-- / je décrémente la valeur de X0 /
- A sqrt(X2) / je calcule la racine carrée de
X2 /
23Propriétés daccès aux éléments dun tableau
- Le langage C neffectue aucun contrôle sur les
bornes dun tableau. - Exemple int X4 déclare un tableau de 4
entiers qui sont X0, X1, X2 et X3. Si on
écrit X7 13 le compilateur ne va pas
signaler une erreur, tout simplement, il va
mettre 13 dans la quatrième case après le
dernier élément de X. Ce qui risque de modifier
une valeur qui pourrait déjà se trouver à cet
endroit.
24Propriétés daccès aux éléments dun tableau
- On ne peut pas affecter un tableau à un autre
(laffectation globale de tableau est interdite
en C). - Cela signifie que si int A5, B5 il ne faut
pas écrire B A - Pour recopier un tableau dans un autre, il faut
leffectuer élément par élément (par une boucle
for par exemple) for(i 0 i lt N i) Bi
Ai
25Exercice
- On veut affecter le tableau a au tableau b.
quelles sont les erreurs dans le programme
suivant - int a5 1, 2, 3, 4, 5
- int b5, i
- b a
- for(i 0 i lt 5 i) bi ai
26Exercice
- Correction
- b a / Faux car laffectation globale entre
les tableaux est impossible en C / - for(i 0 i lt 5 i) bi ai
- / Cest vrai, mais il y a une petite erreur la
condition darrêt dans la boucle for est i lt 5 et
non i lt 5, car le dernier élément de b est 4 et
non 5. Il faut donc écrire / - for(i 0 i lt 5 i) bi ai
27Exercices corrigés
28Énoncés des exercices
- Écrire un programme qui déclare un tableau de 100
entiers et qui linitialise par les nombres de 1
à 100 (dans lordre). - Écrire un programme qui permet de saisir 20
nombres réels en simple précision et les stocker
dans un tableau. - Écrire un programme qui permet de ranger les
éléments 2, 3, 5, 7, 11, 13, 17 et 19 dans un
tableau et de les afficher sur une seule ligne.
29Énoncés des exercices
- Quaffiche ce programme ?
- includeltstdio.hgt
- main()
- int a 3, 8, 15, 21, 30, 41 int i
- for(i 0 i lt 5 i 2)
- printf("d d\n", ai, ai1)
- for(i 0 i lt 5 i 2)
- if(ai 2 0)
- printf("d ", ai)
30Solutions des exercices
- Exercice 1
- includeltstdio.hgt
- main( )
-
- int a100
- int i
- for(i 0 i lt 100 i)
- ai i 1
31Solutions des exercices
- Exercice 2
- includeltstdio.hgt
- main( )
- float a20
- int i
- for(i 0 i lt 20 i)
- printf("ad ", i)
- scanf("f", ai)
32Solutions des exercices
- Exercice 3
- includeltstdio.hgt
- main()
-
- int Tab 2, 3, 5, 7, 11, 13, 17, 19
- int i
- for(i 0 i lt 8 i)
- printf("d\t", Tabi)
33Solutions des exercices
- Exercice 4. Le programme va afficher
- 3 8
- 15 21
- 30 41
- 30
34Propriétés de la taille dun tableau
- La taille dun tableau est le nombre de ses
éléments. - Elle doit être de type int (ou dun type
compatible au type int). - Elle est définie soit par
- Une constante numérique
35Propriétés de la taille dun tableau
- Une constante définie par le macro define
- Une constante symbolique définie par le mot clé
const - Une expression symbolique
36Exemple
- Quelle est la taille des tableaux suivants
- define N 10
- const int K 5
- int a15
- int bN
- char cK
- float d2 N
- double eN K 1
15, constante numérique
10, constante define N
5, constante symbolique
20, expression symbolique
16, expression symbolique
37Remarque
- La taille dun tableau ne peut être définie comme
le nom dune variable. - Ainsi, les déclarations de tab1 et tab2 sont
incorrectes - int N
- int tab1N
- int K 10
- double tab2K
Incorrectes il ne faut pas utiliser les noms de
variables dans la taille dun tableau
38Section B
les tableaux à plusieurs dimensions
Section A
39Définition
- Un tableau à plusieurs dimensions est défini
comme un tableau de tableaux. - Jusquà ce moment nous navons étudier que les
tableaux à une seule dimension. - Nous pouvons aussi définir des tableaux de
dimensions 2, 3, etc. - Pour un tableau de dimensions k, il faut donner
la taille pour chaque dimension (k valeurs).
40Exemple
- Déclarer
- Un tableau dentiers de dimension 2 de taille (4,
5) - Un tableau de caractères de dimension 2 de taille
(10, 10) - Un tableau de doubles de dimension 3 de taille
(5, 7, 7)
41Solution
- int tab145
- char tab21010
- double tab3577
42Exercices corrigés
43Énoncés des exercices
- Écrire un programme qui demande la saisie dune
matrice carrée A dordre 3 à coefficients entiers
et qui laffiche ensuite, ligne par ligne. - Écrire un programme qui saisit deux matrices
carrées dordre 4, calcule leur somme et leur
produit et affiche les résultats. - Écrire un programme qui saisit une matrice A
dordre (M, N), un vecteur dordre N, calcule le
produit scalaire de A par V et affiche le
résultat.
44Solutions des exercices
- Exercice 1
- includeltstdio.hgt
- define N 3
- main()
- int tabNN
- int i, j
- printf("saisie des coefficients de la matrice
\n") - for(i 0 i lt N i)
- for(j 0 j lt N j)
-
45Solutions des exercices
-
- printf("tabdd ", i, j)
- scanf("d", tabij)
-
- printf("Affichage des coefficients de la
matrice \n") - for(i 0 i lt N i)
- for(j 0 j lt N j)
- printf("d\t", tabij)
- printf("\n")
- getch()
46Solutions des exercices
- Exercice 2
- includeltstdio.hgt
- define N 4
- main()
-
- int aNN, bNN, sNN, pNN
- int i, j, k
- printf("Saisie de la matrice a \n")
47Solutions des exercices
- for(i 0 i lt N i)
- for(j 0 j lt N j)
-
- printf("add ", i, j)
- scanf("d", aij)
-
- printf("Saisie de la matrice b \n")
- for(i 0 i lt N i)
- for(j 0 j lt N j)
48Solutions des exercices
-
- printf("bdd ", i, j)
- scanf("d", bij)
-
- printf("Calcul de s a b \n")
- for(i 0 i lt N i)
- for(j 0 j lt N j)
- sij aij bij
- printf("d\t", sij)
- printf("\n")
49Solutions des exercices
- printf("Calcul de p a b \n")
- for(i 0 i lt N i)
- for(j 0 j lt N j)
- pij 0
- for(k 0 k lt N k)
- pij pij aik bkj
- printf("d\t", pij)
- printf("\n")
- getch()
50Solutions des exercices
- Exercice 3
- includeltstdio.hgt
- define M 4
- define N 3
- main()
- int AMN, VN, RM
- int i, j
- printf("Saisie de la matrice A \n")
- for(i 0 i lt M i)
- for(j 0 j lt N j)
51Solutions des exercices
-
- printf("Add ", i, j)
- scanf("d", Aij)
-
- printf("Saisie du vecteur V \n")
- for(i 0 i lt N i)
-
- printf("Vd ", i)
- scanf("d", Vi)
-
52Solutions des exercices
- printf("Calcul de R A V \n")
- for(i 0 i lt M i)
-
- Ri 0
- for(j 0 j lt N j)
- Ri Aij Vj
- printf("d\n", Ri)
-
- getch()
53Les chaînes de caractères
54Définition
- Une chaîne de caractères est un tableau de
caractères. - Voici un exemple qui déclare une chaîne de
caractères contenant au maximum 19 caractères
char ch19 - On utilise les chaînes de caractères pour traiter
les textes.
55Initialisation des chaînes de caractères
- Lors de la déclaration
- Caractères par caractères
- char ch23 'b', 'o', 'n', 'j', 'o', 'u', 'r',
',', ' ', 't', 'o', 'u', 't', 'l', 'e', 'm', 'o',
'n', 'd', 'e', '!' ? très lourde! - Globalement
- char ch23 "bonjour, tout le monde!"
- ? très pratique!
56Lecture dune chaîne de caractères
- En utilisant les fonctions standards de lecture
- scanf (si la chaîne ne contient pas un caractère
séparateur!) - char ch23
- scanf("s", ch)
- gets (très pratique!)
- char ch23
- gets(ch)
57affichage dune chaîne de caractères
- En utilisant les fonctions standards daffichage
- printf
- char ch23 "Bonjour, tout le monde!"
- printf("ch s", ch)
- puts
- char ch23 "Bonjour, tout le monde!"
- puts(ch)
58Remarque
- Toute chaîne de caractères se termine par le
caractère nul noté '\0' (Attention ce nest pas
le nombre zéro, ni le caractère zéro). - Ainsi, si ch est la chaîne de caractères déclarée
par char ch10 "Bonjour" alors ch sera
représentée en mémoire par
ch
59Fonctions liées aux chaînes de caractères
- Ces fonctions sont définies dans la librairie de
base du langage C ltstring.hgt. - Voici quelques unes de ces fonctions
- strlen(ch) donne la longueur réelle de la
chaîne de caractères contenue dans ch. - strcpy(ch2, ch1) copie la chaîne ch1 dans la
chaîne ch2. Cette fonction retourne ch2. - strcat(ch2, ch1) rajoute la chaîne ch1 à la fin
de la chaîne ch2. Cette fonction retourne ch2.
60Fonctions liées aux chaînes de caractères
- strncpy(ch2, ch1, n) comme strcpy, mais ne
copie quau plus n caractères. - strcmp(ch1, ch2) compare les chaînes ch1 et ch2
en utilisant lordre alphabétique. Elle renvoie
un nombre négatif si ch1 lt ch2, un nombre positif
si ch1 gt ch2 et zéro si ch1 ch2.
61Exercice corrigé 1
- Écrire un programme qui lit un verbe de deuxième
groupe (comme finir) et le conjugue à
limpératif. Voici un exemple de laffichage
souhaité - Donner le verbe finir
- Conjugaison de finir
- Tu finis
- Nous finissons
- Vous finissez
62Solution
- includeltstdio.hgt
- includeltstring.hgt
- main()
-
- char verbe10
- int L
- char radical9 ""
- printf("Donner le verbe ")
- gets(verbe)
63Solution
- printf("Conjugaison de s \n", verbe)
- L strlen(verbe)
- strncpy(radical, verbe, L - 1)
- printf("Tu s", radical)
- printf("s\n")
- printf("Nous s", radical)
- printf("ssons\n")
- printf("Vous s", radical)
- printf("ssez\n")
- getch()
64Exercice corrigé 2
- Écrire un programme qui
- saisit une chaîne de caractères de longueur
maximale 20. - Affiche cette chaîne.
- Calcule sa longueur effective (sans utiliser la
fonction strlen). - Renverse la chaîne dorigine.
65Exercice corrigé 2
- Voici un exemple dexécution
- Donner la chaine mais
- Affichage de la chaine mais
- Longueur de la chaine 4
- La chaine renversee siam
66Solution
- includeltstdio.hgt
- main()
-
- char ch20
- int i, L
- char c
-
- printf("Donner la chaine ")
- gets(ch)
- printf("Affichage de la chaine ")
67Solution
- puts(ch)
- i 0
- while(chi ! '\0')
-
- i
-
- L i
- printf("La longueur de la chaine d\n", L)
68Solution
- for(i 0 i lt L / 2 i)
-
- c chi
- chi chL - i - 1
- chL - i - 1 c
-
- printf("La chaine renverse ")
- puts(ch)
- getch()
69Les fonctions de traitement des caractères
70Les fonctions
- Pour utiliser ces fonctions, il faut inclure le
fichier den-tête ltctype.hgt par un macro
include. - Toutes ces fonctions prennent en paramètre un
seul caractère.
71Les fonctions de test de caractères
- Considérons une variable nommée car de type char.
- islower(car) si car est une lettre minuscule
('a' à 'z'), cette fonction retourne un entier
non nul sinon, elle renvoie 0. - isupper(car) si car est une lettre majuscule
('A' à 'Z'), cette fonction retourne un entier
non nul sinon, elle renvoie 0. - isdigit(car) si car est un chiffre ('0' à '9'),
cette fonction retourne un entier non nul sinon,
elle renvoie 0.
72Les fonctions de test de caractères
- isalpha(car) si car est une lettre (minuscule
ou majuscule), cette fonction retourne un entier
non nul sinon, elle renvoie 0. - isalnum(car) si car est une lettre (minuscule
ou majuscule) ou un chiffre, cette fonction
retourne un entier non nul sinon, elle renvoie
0. - iscntrl(car) si car est un caractère de
contrôle, cette fonction retourne un entier non
nul sinon, elle renvoie 0 (les caractères de
contrôle ont les codes de 0 à 21 et 127).
73Les fonctions de test de caractères
- isgraph(car) si car est un caractère imprimable
(par opposition à un caractère non imprimable,
comme un caractère de contrôle, un caractère
espace, le caractère tabulation, etc.), cette
fonction retourne un entier non nul sinon, elle
renvoie 0 (les caractères imprimables ont leurs
codes de 32 à 126).
74Les fonctions de test de caractères
- isprint(car) si car est un caractère imprimable
(le caractère espace inclus), cette fonction
retourne un entier non nul sinon, elle renvoie
0. - ispunct(car) si car est un caractère imprimable
(à lexception du caractère espace, des lettres
minuscules, des lettres majuscules et des
chiffres), cette fonction retourne un entier non
nul sinon elle renvoie 0.
75Les fonctions de test de caractères
- isspace(car) si car est un caractère blanc
(comme le caractère espace, le caractère nouvelle
ligne, le caractère retour à la ligne, le
caractère arrière), cette fonction retourne un
entier non nul sinon, elle renvoie 0. - isxdigit(car) si car est un chiffre ou un
caractère hexadécimal (lettre de 'a' à 'f' ou de
'A' à 'F').
76Exercices corrigés
- Exercice 1 écrire un programme qui lit un
caractère et qui affiche sa catégorie lettre
minuscule, lettre majuscule, chiffre ou autre. - Exercice 2 écrire un programme qui lit une
chaîne de caractères de longueur maximale 10 et
qui vérifie que cette chaîne peut représenter un
nombre hexadécimal.
77Solution
- Exercice 1
- includeltstdio.hgt
- includeltctype.hgt
- main()
- char c
- printf("Tapez un caractere S.V.P ")
- scanf("c", c)
- if(isupper(c))
- printf("Merci, vous avez tape une lettre
majuscule")
78Solution
- else
- if(islower(c))
- printf("Merci, vous avez tape une lettre
minuscule") - else
- if(isdigit(c))
- printf("Merci, vous avez tape un chiffre")
- else
- printf("Merci, vous avez tape autre chose")
- getch()
79Solution
- Exercice 2
- includeltstdio.hgt
- includeltctype.hgt
- main()
- char ch10
- int i
- int ok 1
- printf("Entrez la chaine ")
- gets(ch)
- i 0
80Solution
- while((chi ! '\0') ok)
- if(isxdigit(chi)) i
- else ok 0
-
- if(ok) printf("Oui")
- else printf("Non")
- getch()
-