Labo II : Tableaux et pointeurs Démo : INF3105 Structures de données et algorithmes Groupe : 40 Moniteur : Stéphane HENRY Courriel : Notes de Kerlyne Fostiné
Plan de la démonstration Les tableaux Tableaux à une dimension Tableaux à deux dimensions Tableaux comme chaîne de caractères Les pointeurs Introduction Tableaux et pointeurs Arithmétiques des pointeurs Pointeur sur char comme chaîne de caractères Allocation dynamique de la mémoire 2
Les tableaux Un ensemble indexé d’objets de même type Déclaration de tableaux Type nom_tableau[nombre_element]; int tab[10]; int tab[5] = {5, 2, 10, 8, 3}; Référence des éléments dans un tableau Nom_tableau[index] 0<=index<nombre_element; int tab[4] tab[0], tab[1], tab[2], tab[3] 3
Tableau à un dimension Exercice 1 Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entrées au clavier et affiche le tableau. Ranger ensuite les éléments du tableau T dans l'ordre inverse sans utiliser de second tableau. Afficher le tableau résultant. Idée: Echanger les éléments du tableau à l'aide de deux indices qui parcourent le tableau en commençant respectivement au début et à la fin du tableau et qui se rencontrent en son milieu. 4
Tableau à deux dimensions Exercice 2 Ecrire un programme qui lit les dimensions L et C d'un tableau T à deux dimensions du type int (dimensions maximales: 50 lignes et 50 colonnes). Remplir le tableau par des valeurs entrées au clavier et afficher le tableau ainsi que la somme de chaque ligne et de chaque colonne en n'utilisant qu'une variable d'aide pour la somme. 5
Tableau comme chaîne de caractères Un tableau de caractères dont le dernier caractère a pour code 0 char nom[20]; nom = ''matin''; nom ={‘m’, ‘a’, ‘t’, ‘i’, ‘n’, ‘\0’}; Lecture d’une chaîne de caractère avec cin. Lecture jusqu’à la rencontre d’espace, tabulation, fin de ligne, etc. Caractères en trop rangés dans la mémoire a la suite du tableau. 6
Tableaux comme chaine de caractères (Suite) Exercice 3 Ecrire un programme sans utiliser de fonction de <string>, qui vérifie si une chaîne CH introduite au clavier est un palindrome en utilisant uniquement le formalisme tableau Rappel: Un palindrome est un mot qui reste le même qu'on le lise de gauche à droite ou de droite à gauche. Ex: radar, kayak 7
Les pointeurs Variable destinée à contenir une adresse Déclaration d’un pointeur Type *nom_variable; int *p; Opérateurs utilisés avec les pointeurs & Adresse de * contenu de 8
Les pointeurs (Suite) Exercice 4 main() { int A = 1; int B = 2; int C = 3; int *P1, *P2; P1=&A; P2=&C; *P1=(*P2)++; P1=P2; P2=&B; *P1-=*P2; ++*P2; *P1*=*P2; A=++*P2**P1; *P2=*P1/=*P2; return 0; } Copiez le tableau suivant et complétez-le pour chaque instruction du programme ci-dessus. A B C P1 P2 Init. 1 2 3 / P1=&A &A P2=&C *P1=(*P2)++ P1=P2 P2=&B *P1-=*P2 ++*P2 *P1*=*P2 A=++*P2**P1 *P2=*P1/=*P2 9
Tableaux et pointeurs Le nom d’un tableau est un pointeur constant sur le premier élément du tableau. int a[5]; int *p; p = a p = &a[0] P + 1 = &a[1]; *(p + 1) = a[1] ; 10
Tableaux et pointeurs Exercice 5 Ecrire un programme qui lit deux tableaux A et B et leurs dimensions N et M au clavier et qui ajoute les éléments de B à la fin de A. Utiliser le formalisme pointeur à chaque fois que cela est possible. 11
Arithmétiques de pointeurs Affectation par un pointeur du même type int *p1, *p2; p1 = p2; Addition et soustraction d’un nombre entier Int tab[i], *p; p = &tab[i]; p+n = &tab[i+n] p – n = &tab[i-n] Incrémentation et décrémentation d’un pointeur P++ & tab[i+1] P-- &tab[i-1] 12
Arithmétiques de pointeurs (Suite) Soustraction de deux pointeurs int *p1, *p2; p1 = & tab[2] p2 = & tab[5] p1 – p2 fournit le nombre de composants comprises entre p1 et p2 Négatif si p1 précède p2 Zéro si p1 = p2 Positif si p2 précède p1 Indéfini si p1 et p2 ne pointe pas dans le même tableau. 13
Arithmétiques des pointeurs (Suite) Exercice 6 Soit P un pointeur qui 'pointe' sur un tableau A: int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90}; int *P; P = A; Quelles valeurs ou adresses fournissent ces expressions: a) *P+2 b) *(P+2) c) &P+1 d) &A[4]-3 e) A+3 f) &A[7]-P g) P+(*P-10) h) *(P+*(P+8)-A[7]) 14
Tableaux et pointeurs Exercice 7 Ecrire un programme qui range les éléments d'un tableau A du type int dans l'ordre inverse. Le programme utilisera des pointeurs P1 et P2 et une variable numérique AIDE pour la permutation des éléments. 15
Pointeur sur char comme chaîne de caractères Déclaration char *nom; Initialisation nom = '' Baptiste '' Affectation On ne peut pas affecter une chaîne de caractère à une autre, il faut utiliser la fonction strcpy de la bibliothèque string. 16
Chaine de caractères (Suite) Exercice 8 Ecrire un programme qui lit une chaîne de caractères CH et détermine la longueur de la chaîne à l'aide d'un pointeur P. Le programme n'utilisera pas de variables numériques. 17
Allocation dynamique de la mémoire Allocation de la mémoire Déclaration de pointeur Utilisation de l’opérateur new int *p = new int[5]; Libération de la mémoire delete p; 18
Allocation dynamique de la mémoire Exercice 9 Écrire un programme qui lit 10 mots au clavier (longueur maximale: 50 caractères) et attribue leurs adresses à un tableau de pointeurs MOT. Effacer les 10 mots un à un, en libérant leur espace en mémoire. Afficher à chaque fois les mots restants en attendant l’appui de la touche validation par l'utilisateur. 19