SlideShare une entreprise Scribd logo
IUT de Villetaneuse
TD8 : Tableaux à deux dimensions (Corrigé)
Exercice 1 : Manipulations de tableaux*
Soit un tableau à deux dimensions de 5 par 5 entiers complètement initialisé :
6 2 3 5 6
4 6 2 6 1
1 3 6 7 9
1 6 3 6 8
6 0 1 4 6
Question 1.1 : Effectuer les actions suivantes :
– afficher le tableau
– afficher le tableau constitué uniquement des lignes d’indice pair
– afficher le tableau constitué uniquement des éléments d’indice impair de chaque ligne
Correction :
� �
1 int tab[5][5]={{6,2,3,5,6},{4,6,2,6,1},{1,3,6,7,9},{1,6,3,6,8},{6,0,1,4,6}};
2 int i,j;
3 for (i=0; i<5; i++)
4 {
5 for (j=0; j<5; j++)
6 printf ("%d ", tab[i][j]);
7 printf ("n");
8 }
9
10 for (i=0; i<5; i+=2)
11 {
12 for (j=0; j<5; j++)
13 printf ("%d ", tab[i][j]);
14 printf ("n");
15 }
16
17 for (i=0; i<5; i++)
18 {
19 for (j=1; j<5; j+=2)
20 printf ("%d ", tab[i][j]);
21 printf ("n");
22 }
� �
�
Question 1.2 : Écrire un algorithme qui permet premièrement d’afficher la diagonale (de gauche
à droite), puis la 2e diagonale
Correction :
� �
1 int tab[5][5]={{6,2,3,5,6},{4,6,2,6,1},{1,3,6,7,9},{1,6,3,6,8},{6,0,1,4,6}};
2 int i=0 ;
3 while (i< 5)
4 {
5 printf ("%d", tab[i][i]);
6 i++;
7 }
� �
Langage C
�
�
�
�152 1ère année (2013/2014)
Département informatique
�
Correction :
� �
1 int tab[5][5]={{6,2,3,5,6},{4,6,2,6,1},{1,3,6,7,9},{1,6,3,6,8},{6,0,1,4,6}};
2
3 int i=0 ;
4 int k=4;
5 while (i < 5)
6 {
7 printf ("%d", tab[i][k]);
8 i++;
9 k--;
10 }
� ��
Question 1.3 : Tester si les nombres qui apparaissent dans les deux diagonales sont tous égaux
à une seule et même valeur. Le programme affichera "OUI" ou "NON" en fonction du résultat.
Correction :
� �
1 int tab[5][5]={{6,2,3,5,6},{4,6,2,6,1},{1,3,6,7,9},{1,6,3,6,8},{6,0,1,4,6}};
2 int val = tab[0][0];
3
4 int i=0 ;
5 int k=4;
6
7 while ((i < 5) && (tab[i][i] == val) && (tab[i][k] == val)) // garder l’ordre des conditions
8 {
9 i++;
10 k++;
11 }
12 if (i==5)
13 printf ("OUI");
14 else
15 printf ("NON");
� ��
Exercice 2 : Échange de triangles**
Écrire l’algorithme qui échange le triangle inférieur avec le triangle supérieur dans un tableau à
deux dimensions. C’est donc le tableau obtenu en faisant une symétrie par rapport à la diagonale
principale.
Exemple :
10 11 45 78 10 23 56 47
23 44 12 56 --- 11 44 90 78
56 90 67 89 ---/ 45 12 67 55
47 78 55 34 78 56 89 34
Correction :
� �
1 int tab[4][4]={{10, 11, 45, 78},{23, 44, 12, 56}, {56, 90, 67, 89},{47, 78, 55, 34}};
2 int nbLigEff=4;
3 int nbColEff=4;
4
5 int temp;
6 int i=0;
7 while (i<nbLigEff)
1ère année (2013/2014)
�
�
�
�153 Langage C
IUT de Villetaneuse
8 {
9 j=i+1;
10 while (j<nbColEff)
11 {
12 temp = tab[i][j];
13 tab[i][j] = tab[j][i];
14 tab[j][i] = temp;
15 j=j+1;
16 }
17 i=i+1;
18 }
� ��
Exercice 3 : Allocation dynamique**
Refaire les exercices précédant en déclarant à chaque fois des tableaux 2d dynamiques, où la
saisie de la taille et des éléments du tableau se fait par l’utilisateur.
Langage C
�
�
�
�154 1ère année (2013/2014)
Département informatique
TP8 : Tableaux à deux dimensions (Corrigé)
Exercice 4 : Manipulation des matrices en dynamique**
Question 4.1 : Écrire un programme qui permet de construire une matrice nulle de taille lignes×
colonnes.
Correction :
� �
1 int nblignes;
2 int nbcolones;
3
4 printf ("combien de lignes : ");
5 scanf("%d", &nbligne);
6
7 ntf("combien de colonnes : ");
8 scanf("%d", &nbcolones);
9
10 I = (int**) malloc(nblignes*sizeof(int*));
11
12 int i;
13 int j ;
14 for (i=0 ; i<nblignes ; i++)
15 {
16 I[i]=(int*) malloc(nbcolonnes*sizeof(int));
17
18 }
19 for (i=0; i<nblignes; i++)
20 {
21 for (j=0; j<nbcolonnes; j++)
22 I[i][j]=0;
23 }
� ��
Question 4.2 : Modifier le programme pour construire la matrice carrée identité I (tous les
éléments de la diagonale sont égaux à 1, les autres valent 0).
Correction :
Demander seulement une dimension (matrice carrée). Même initialisation, puis
� �
1 for (i=0; i<nblignes; i++)
2 {
3 I[i][i]=1;
4 }
� ��
Question 4.3 : Écrire une fonction qui calcule la trace d’une matrice carrée, c’est-à-dire la somme
des coefficients diagonaux de cette matrice.
Correction :
� �
1 int trace(int **A, int nblignes, int nbcolonnes)
2 {
3 if (nblignes != nbcolonnes)
4 {
5 printf ("Le calcul est impossible");
6 return -1;
7 }
1ère année (2013/2014)
�
�
�
�155 Langage C
IUT de Villetaneuse
8 else
9 {
10 int tr=0;
11 for (i=0; i<nblignes; i++)
12 tr=tr+A[i][i];
13
14 return tr;
15 }
16 }
� ��
Question 4.4 : Écrire une fonction qui teste si un élément x appartient à une matrice A.
Correction :
� �
1 int appartenance(int **A, int nblignes, int nbcolonnes, int x)
2 {
3 int i;
4 int j;
5 for (i=0; i<nblignes; i++)
6 {
7 for (j=0; j<nbcolonnes; j++)
8 if (A[i][j] == x)
9 return 1;
10 }
11 return 0;
12 }
� ��
Question 4.5 : Écrire une fonction qui permute deux colonnes d’une matrice.
Correction :
� �
1 void permutationColonnes(int **A, int nblignes, int k, int l)
2 {
3 int i=0;
4 int tempo;
5 while (i<nblignes)
6 {
7 tempo=A[i][k];
8 A[i][k] = A[i][l];
9 A[i][l] = tempo;
10 i++;
11 }
12 }
� ��
Question 4.6 : Écrire une fonction qui permute deux lignes d’une matrice.
Correction :
� �
1 void permutationLignes(int **A, int k, int l)
2 {
3 int *tempo;
4 tempo=A[k];
5 A[k] = A[l];
6 A[l] = tempo;
7 }
� ��
Langage C
�
�
�
�156 1ère année (2013/2014)
Département informatique
Question 4.7 : Écrire une fonction qui remplace dans une matrice A toutes les occurrences de x
par y.
Correction :
� �
1 int remplace(int **A, int nblignes, int nbcolonnes, int x, int y)
2 {
3 int i, j;
4 for (i=0, i<nblignes, i++)
5 {
6 for (j=0, j<nbcolonnes, j++)
7 {
8 if (A[i][j] == x)
9 A[i][j] = y;
10 }
11 }
12 }
� ��
Exercice 5 : Addition de matrices***
Le but de cet exercice est de permettre la multiplication de matrice de flottants, ainsi que la
lecture et l’écriture de matrices dans des fichiers.
Question 5.1 : Définir la fonction alloueMatrice prenant en paramètre un nombre de lignes et
un nombre de colonnes et retournant une matrice de flottants allouée dynamiquement.
Correction :
� �
1 float ** alloueMatrice(int n, int m)
2 {
3 float ** mat = malloc(sizeof(float*) * n);
4 int i;
5 for (i = 0 ; i < n ; i++)
6 mat[i] = malloc(sizeof(float) * m);
7 return mat;
8 }
� ��
Question 5.2 : Définir la fonction libereMatrice prenant en paramètre une matrice allouée
dynamiquement ainsi que son nombre de lignes et libérant la mémoire prise par cette matrice.
Correction :
� �
1 void libereMatrice(float **mat,int n)
2 {
3 int i;
4 for (i = 0 ; i < n ; i++)
5 free (mat[i]);
6 free (mat);
7 }
� ��
Question 5.3 : Définir la fonction lireMatrice prenant en paramètre deux pointeurs d’entiers
et un nom de fichier. Cette fonction ouvrira le fichier dont le nom est passé en paramètre. Ce
fichier doit contenir le nombre de lignes, le nombre de colonnes ainsi que les valeurs d’une matrice.
La fonction utilisera ces informations pour allouer dynamiquement une matrice et l’initialiser avec
les valeurs du fichier. La fonction modifiera les deux pointeurs d’entiers pour qu’ils contiennent
respectivement le nombre de lignes et de colonnes de la matrice et retournera l’adresse mémoire
de la matrice (ou NULL en cas d’erreur).
Correction :
1ère année (2013/2014)
�
�
�
�157 Langage C
IUT de Villetaneuse
� �
1 float ** lireMatrice(int *n, int *m, char nomF[])
2 {
3 FILE * f = fopen(nomF,"rt");
4 if (f==NULL)
5 return NULL;
6
7 //Lecture du nombre de lignes et de colonnes de la matrice
8 fscanf (f,"%d",n);
9 fscanf (f,"%d",m);
10
11 //Allocation de la matrice
12 float ** matrice = alloueMatrice(*n,*m);
13 if (matrice==NULL)
14 return NULL;
15
16 //On lit les valeurs
17 int i,j;
18 for (i = 0 ; i < *n ; i++)
19 for (j = 0 ; j < *m ; j++)
20 fscanf (f,"%f",&matrice[i][j]);
21
22 if (fclose(f))//En cas de problème lors de la fermeture
23 {
24 libereMatrice (matrice,*m);//On libère la mémoire
25 return NULL;
26 }
27 return matrice;
28 }
� ��
Question 5.4 : Définir la fonction ecrireMatrice prenant en paramètre une matrice, son nombre
de lignes et de colonnes et le nom d’un fichier et écrivant dans ce fichier les informations de la
matrice.
Correction :
� �
1 int ecrireMatrice (float ** mat, int n, int m, char nomF[])
2 {
3 FILE * f = fopen(nomF,"wt");
4 if (f==NULL)
5 return 0;
6
7 fprintf (f,"%d n %d n",n,m);
8 int i,j;
9 for (i = 0 ; i < n ; i++)
10 {
11 for (j = 0 ; j < m ; j++)
12 fprintf (f,"%6f",mat[i][j]);
13 fprintf (f,"n");
14 }
15 return !fclose(f);
16 }
� ��
Question 5.5 : Écrire une fonction addition_mat qui permet de faire l’addition de deux matrices
de même dimension.
Correction :
� �
Langage C
�
�
�
�158 1ère année (2013/2014)
Département informatique
1 float **addition_mat(float **mat1, float **mat2, int nblignes, int nbcolonnes)
2 {
3 float ** mat3 = alloueMatrice(nblignes,nbcolonnes);
4 int i,j;
5 for (i=0 ; i<nblignes ; i++)
6 {
7 for (j=0 ; j<nbcolonnes ; j++)
8 mat3[i][j] = mat1[i][j] + mat2[i][j];
9 }
10 return mat3;
11 }
� �
�
Question 5.6 : Écrire un programme principal permettant de créer deux matrices à partir des
fichiers de données mat1.txt et mat2.txt, de calculer la somme de ces deux matrices et d’écrire
ce résultat dans le fichier mat3.txt. Les 3 matrices seront également affichées à l’écran.
Correction :
� �
1 int main()
2 {
3 int n1,m1;
4 float ** mat1 = lireMatrice(&n1,&m1,"m1.txt");
5 printf ("Premiere matrice : n");
6 afficheMatrice (mat1,n1,m1);
7 printf ("nn");
8
9 int n2,m2;
10 float ** mat2 = lireMatrice(&n2,&m2,"m2.txt");
11 printf ("Deuxieme matrice : n");
12 afficheMatrice (mat2,n2,m2);
13 printf ("nn");
14
15 if (n1==n2 && m1==m2)//Si les matrices ont les mêmes dimensions
16 {
17 float **mat3 = addition_mat(mat1,mat2,n1,m1);
18 printf ("Somme des deux matrices :n");
19 afficheMatrice (mat3,n1,m1);
20 ecrireMatrice (mat3,n1,m1,"m3.txt");
21 libereMatrice (mat3,n1);
22 mat3 = NULL;
23 }
24 libereMatrice (mat1,n1);
25 mat1 = NULL;
26 libereMatrice (mat2,n2);
27 mat2 = NULL;
28 return 0;
29 }
� �
�
Exercice 6 : Carré magique***
Un carré (tableau d’entiers de N lignes et N colonnes initialisées) est dit magique lorsque
la somme d’une ligne, d’une colonne ou d’une diagonale quelconque est toujours égale au même
nombre. Voici un exemple de carré magique :
1ère année (2013/2014)
�
�
�
�159 Langage C
IUT de Villetaneuse
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11
Question 6.1 : Concevoir une fonction créant une matrice carrée dont les coefficients sont des
entiers positif saisi par l’utilisateur.
Question 6.2 : Concevoir une fonction qui vérifie si un carré est magique.
Correction :
� �
1 int carre_magique(int **tabMag, int nblignes)
2 {
3 int OK = 1;
4 int i;
5 int j;
6 int somme = 0;
7 int sommeSuiv = 0;
8 int taille = nblignes;
9
10 //initialisation de la somme pour la première ligne
11 for (j=0; j< taille ; j++)
12 somme += tabMag[0][j];
13
14 //comparaison avec les autres lignes
15 i= 1;
16 while (OK && i < taille)
17 {
18 sommeSuiv = 0;
19 for (j=0 j< taille ; j++)
20 sommeSuiv += tabMag[i][j];
21
22 if (sommeSuiv != somme)
23 OK = 0;
24 i++;
25 }
26
27 // comparaison avec les colonnes
28 j = 0;
29
30 while (OK && j < taille)
31 {
32 sommeSuiv = 0;
33 for (i=0; i< taille ; i++)
34 sommeSuiv += tabMag[i][j];
35
36 if (sommeSuiv != somme)
37 OK = 0;
38 j++;
39 }
40
41 // comparaison avec les deux diagonales
42 // la premiere
43 if (OK)
44 {
45 sommeSuiv = 0;
46 for (i=0; i< taille ; i++)
47 sommeSuiv += tabMag[i][i];
48
Langage C
�
�
�
�160 1ère année (2013/2014)
Département informatique
49 if (sommeSuiv != somme)
50 OK = 0;
51 }
52
53 //la seconde
54 if (OK)
55 {
56 sommeSuiv = 0;
57 for (i=0; i< taille ; i++)
58 sommeSuiv += tabMag[i][taille -1 -i];
59
60 if (sommeSuiv != somme)
61 OK = 0;
62
63 return OK;
64 }
65 }
� ��
1ère année (2013/2014)
�
�
�
�161 Langage C

Contenu connexe

Tendances

Exercices_Python_Fenni_2023 -corrigé.pdf
Exercices_Python_Fenni_2023 -corrigé.pdfExercices_Python_Fenni_2023 -corrigé.pdf
Exercices_Python_Fenni_2023 -corrigé.pdf
salah fenni
 
Exercice 1 java Héritage
Exercice 1 java HéritageExercice 1 java Héritage
Exercice 1 java Héritage
NadaBenLatifa
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
ECAM Brussels Engineering School
 
Chapitre iv algorithmes de tri
Chapitre iv algorithmes de triChapitre iv algorithmes de tri
Chapitre iv algorithmes de triSana Aroussi
 
Chapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régnerChapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régnerSana Aroussi
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
ECAM Brussels Engineering School
 
Sujets de preparation bac tp (sayari)
Sujets de preparation bac tp (sayari)Sujets de preparation bac tp (sayari)
Sujets de preparation bac tp (sayari)mohamed_SAYARI
 
Les algorithmes d'arithmetique
Les algorithmes d'arithmetiqueLes algorithmes d'arithmetique
Les algorithmes d'arithmetiquemohamed_SAYARI
 
Chapitre 2 complexité
Chapitre 2 complexitéChapitre 2 complexité
Chapitre 2 complexité
Sana Aroussi
 
Serie tri revision_3si
Serie tri revision_3siSerie tri revision_3si
Serie tri revision_3siRiadh Harizi
 
Cours complet Base de donne Bac
Cours complet Base de donne Bac Cours complet Base de donne Bac
Cours complet Base de donne Bac
Amri Ossama
 
Fonctions chaine
Fonctions chaineFonctions chaine
Fonctions chaineAfef Ilahi
 
Algorithmique et Structures de Données II
Algorithmique et Structures de Données IIAlgorithmique et Structures de Données II
Algorithmique et Structures de Données II
Riadh Bouslimi
 
Chap04 les-algorithme-de-tri-et-de-recherche
Chap04 les-algorithme-de-tri-et-de-rechercheChap04 les-algorithme-de-tri-et-de-recherche
Chap04 les-algorithme-de-tri-et-de-recherche
Riadh Harizi
 
Merise+ +exercices+mcd+-+corrigés
Merise+ +exercices+mcd+-+corrigésMerise+ +exercices+mcd+-+corrigés
Merise+ +exercices+mcd+-+corrigésMajid CHADAD
 
TP N°1 sketchup.ppt
TP N°1 sketchup.pptTP N°1 sketchup.ppt
TP N°1 sketchup.ppt
PROFPROF11
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
slimyaich3
 
Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018
salah fenni
 
Exercices en turbo pascal sur les nombres
Exercices en turbo pascal sur les nombresExercices en turbo pascal sur les nombres
Exercices en turbo pascal sur les nombres
salah fenni
 

Tendances (20)

Exercices_Python_Fenni_2023 -corrigé.pdf
Exercices_Python_Fenni_2023 -corrigé.pdfExercices_Python_Fenni_2023 -corrigé.pdf
Exercices_Python_Fenni_2023 -corrigé.pdf
 
Exercice 1 java Héritage
Exercice 1 java HéritageExercice 1 java Héritage
Exercice 1 java Héritage
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
Chapitre iv algorithmes de tri
Chapitre iv algorithmes de triChapitre iv algorithmes de tri
Chapitre iv algorithmes de tri
 
Chapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régnerChapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régner
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
 
Sujets de preparation bac tp (sayari)
Sujets de preparation bac tp (sayari)Sujets de preparation bac tp (sayari)
Sujets de preparation bac tp (sayari)
 
Les enregistrements
Les enregistrements Les enregistrements
Les enregistrements
 
Les algorithmes d'arithmetique
Les algorithmes d'arithmetiqueLes algorithmes d'arithmetique
Les algorithmes d'arithmetique
 
Chapitre 2 complexité
Chapitre 2 complexitéChapitre 2 complexité
Chapitre 2 complexité
 
Serie tri revision_3si
Serie tri revision_3siSerie tri revision_3si
Serie tri revision_3si
 
Cours complet Base de donne Bac
Cours complet Base de donne Bac Cours complet Base de donne Bac
Cours complet Base de donne Bac
 
Fonctions chaine
Fonctions chaineFonctions chaine
Fonctions chaine
 
Algorithmique et Structures de Données II
Algorithmique et Structures de Données IIAlgorithmique et Structures de Données II
Algorithmique et Structures de Données II
 
Chap04 les-algorithme-de-tri-et-de-recherche
Chap04 les-algorithme-de-tri-et-de-rechercheChap04 les-algorithme-de-tri-et-de-recherche
Chap04 les-algorithme-de-tri-et-de-recherche
 
Merise+ +exercices+mcd+-+corrigés
Merise+ +exercices+mcd+-+corrigésMerise+ +exercices+mcd+-+corrigés
Merise+ +exercices+mcd+-+corrigés
 
TP N°1 sketchup.ppt
TP N°1 sketchup.pptTP N°1 sketchup.ppt
TP N°1 sketchup.ppt
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
 
Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018
 
Exercices en turbo pascal sur les nombres
Exercices en turbo pascal sur les nombresExercices en turbo pascal sur les nombres
Exercices en turbo pascal sur les nombres
 

Similaire à Ch8 correction exercices (1)

Lecture 3: Visualization and Programming
Lecture 3: Visualization and ProgrammingLecture 3: Visualization and Programming
Lecture 3: Visualization and Programming
Smee Kaem Chann
 
Slide matlab
Slide matlab Slide matlab
Slide matlab
Smee Kaem Chann
 
Matlab by Prof.Keang Sè Pouv
Matlab by Prof.Keang Sè PouvMatlab by Prof.Keang Sè Pouv
Matlab by Prof.Keang Sè Pouv
Thim Mengly(ម៉េងលី,孟李)
 
courstic2.pptx
courstic2.pptxcourstic2.pptx
courstic2.pptx
YosraBOUCHOUCHA2
 
Les Fonctions de référence.pptx
Les Fonctions de référence.pptxLes Fonctions de référence.pptx
Les Fonctions de référence.pptx
rezgui10
 
Introduction a Matlab Introduction a Matlab
Introduction a Matlab Introduction a MatlabIntroduction a Matlab Introduction a Matlab
Introduction a Matlab Introduction a Matlab
MarouaneMyyara2
 
La programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCamlLa programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCaml
Stéphane Legrand
 
Chapitre3 tableauxcpp
Chapitre3 tableauxcppChapitre3 tableauxcpp
Chapitre3 tableauxcpp
Aziz Darouichi
 
Cours de Matlab
Cours de MatlabCours de Matlab
Mat lab1
Mat lab1Mat lab1
Mat lab1fouadDD
 
Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de données
ECAM Brussels Engineering School
 
Chapitre3TableauxEnCppV2019
Chapitre3TableauxEnCppV2019Chapitre3TableauxEnCppV2019
Chapitre3TableauxEnCppV2019
Aziz Darouichi
 
Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)
Hichem Kemali
 
Cours 4 dessin de graphs 2eme annees
Cours 4   dessin de graphs 2eme anneesCours 4   dessin de graphs 2eme annees
Cours 4 dessin de graphs 2eme anneesTarik Taleb Bendiab
 
Tp01
Tp01Tp01
Chapitre 3 tableaux et pointeurs en C
Chapitre 3 tableaux et pointeurs en CChapitre 3 tableaux et pointeurs en C
Chapitre 3 tableaux et pointeurs en C
Abdelouahed Abdou
 
Chapitre05 : Les tableaux
Chapitre05 : Les tableauxChapitre05 : Les tableaux
Chapitre05 : Les tableaux
L’Université Hassan 1er Settat
 
Initiation r
Initiation rInitiation r

Similaire à Ch8 correction exercices (1) (20)

Lecture 3: Visualization and Programming
Lecture 3: Visualization and ProgrammingLecture 3: Visualization and Programming
Lecture 3: Visualization and Programming
 
Slide matlab
Slide matlab Slide matlab
Slide matlab
 
Matlab by Prof.Keang Sè Pouv
Matlab by Prof.Keang Sè PouvMatlab by Prof.Keang Sè Pouv
Matlab by Prof.Keang Sè Pouv
 
courstic2.pptx
courstic2.pptxcourstic2.pptx
courstic2.pptx
 
Les Fonctions de référence.pptx
Les Fonctions de référence.pptxLes Fonctions de référence.pptx
Les Fonctions de référence.pptx
 
Introduction a Matlab Introduction a Matlab
Introduction a Matlab Introduction a MatlabIntroduction a Matlab Introduction a Matlab
Introduction a Matlab Introduction a Matlab
 
La programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCamlLa programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCaml
 
Chapitre3 tableauxcpp
Chapitre3 tableauxcppChapitre3 tableauxcpp
Chapitre3 tableauxcpp
 
Cours de Matlab
Cours de MatlabCours de Matlab
Cours de Matlab
 
Mat lab1
Mat lab1Mat lab1
Mat lab1
 
Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de données
 
Tp 2 vecteur et matrice
Tp 2 vecteur et matriceTp 2 vecteur et matrice
Tp 2 vecteur et matrice
 
Chapitre3TableauxEnCppV2019
Chapitre3TableauxEnCppV2019Chapitre3TableauxEnCppV2019
Chapitre3TableauxEnCppV2019
 
Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)
 
Cours 4 dessin de graphs 2eme annees
Cours 4   dessin de graphs 2eme anneesCours 4   dessin de graphs 2eme annees
Cours 4 dessin de graphs 2eme annees
 
Tp01
Tp01Tp01
Tp01
 
Chapitre 3 tableaux et pointeurs en C
Chapitre 3 tableaux et pointeurs en CChapitre 3 tableaux et pointeurs en C
Chapitre 3 tableaux et pointeurs en C
 
Matlab
MatlabMatlab
Matlab
 
Chapitre05 : Les tableaux
Chapitre05 : Les tableauxChapitre05 : Les tableaux
Chapitre05 : Les tableaux
 
Initiation r
Initiation rInitiation r
Initiation r
 

Ch8 correction exercices (1)

  • 1. IUT de Villetaneuse TD8 : Tableaux à deux dimensions (Corrigé) Exercice 1 : Manipulations de tableaux* Soit un tableau à deux dimensions de 5 par 5 entiers complètement initialisé : 6 2 3 5 6 4 6 2 6 1 1 3 6 7 9 1 6 3 6 8 6 0 1 4 6 Question 1.1 : Effectuer les actions suivantes : – afficher le tableau – afficher le tableau constitué uniquement des lignes d’indice pair – afficher le tableau constitué uniquement des éléments d’indice impair de chaque ligne Correction : � � 1 int tab[5][5]={{6,2,3,5,6},{4,6,2,6,1},{1,3,6,7,9},{1,6,3,6,8},{6,0,1,4,6}}; 2 int i,j; 3 for (i=0; i<5; i++) 4 { 5 for (j=0; j<5; j++) 6 printf ("%d ", tab[i][j]); 7 printf ("n"); 8 } 9 10 for (i=0; i<5; i+=2) 11 { 12 for (j=0; j<5; j++) 13 printf ("%d ", tab[i][j]); 14 printf ("n"); 15 } 16 17 for (i=0; i<5; i++) 18 { 19 for (j=1; j<5; j+=2) 20 printf ("%d ", tab[i][j]); 21 printf ("n"); 22 } � � � Question 1.2 : Écrire un algorithme qui permet premièrement d’afficher la diagonale (de gauche à droite), puis la 2e diagonale Correction : � � 1 int tab[5][5]={{6,2,3,5,6},{4,6,2,6,1},{1,3,6,7,9},{1,6,3,6,8},{6,0,1,4,6}}; 2 int i=0 ; 3 while (i< 5) 4 { 5 printf ("%d", tab[i][i]); 6 i++; 7 } � � Langage C � � � �152 1ère année (2013/2014)
  • 2. Département informatique � Correction : � � 1 int tab[5][5]={{6,2,3,5,6},{4,6,2,6,1},{1,3,6,7,9},{1,6,3,6,8},{6,0,1,4,6}}; 2 3 int i=0 ; 4 int k=4; 5 while (i < 5) 6 { 7 printf ("%d", tab[i][k]); 8 i++; 9 k--; 10 } � �� Question 1.3 : Tester si les nombres qui apparaissent dans les deux diagonales sont tous égaux à une seule et même valeur. Le programme affichera "OUI" ou "NON" en fonction du résultat. Correction : � � 1 int tab[5][5]={{6,2,3,5,6},{4,6,2,6,1},{1,3,6,7,9},{1,6,3,6,8},{6,0,1,4,6}}; 2 int val = tab[0][0]; 3 4 int i=0 ; 5 int k=4; 6 7 while ((i < 5) && (tab[i][i] == val) && (tab[i][k] == val)) // garder l’ordre des conditions 8 { 9 i++; 10 k++; 11 } 12 if (i==5) 13 printf ("OUI"); 14 else 15 printf ("NON"); � �� Exercice 2 : Échange de triangles** Écrire l’algorithme qui échange le triangle inférieur avec le triangle supérieur dans un tableau à deux dimensions. C’est donc le tableau obtenu en faisant une symétrie par rapport à la diagonale principale. Exemple : 10 11 45 78 10 23 56 47 23 44 12 56 --- 11 44 90 78 56 90 67 89 ---/ 45 12 67 55 47 78 55 34 78 56 89 34 Correction : � � 1 int tab[4][4]={{10, 11, 45, 78},{23, 44, 12, 56}, {56, 90, 67, 89},{47, 78, 55, 34}}; 2 int nbLigEff=4; 3 int nbColEff=4; 4 5 int temp; 6 int i=0; 7 while (i<nbLigEff) 1ère année (2013/2014) � � � �153 Langage C
  • 3. IUT de Villetaneuse 8 { 9 j=i+1; 10 while (j<nbColEff) 11 { 12 temp = tab[i][j]; 13 tab[i][j] = tab[j][i]; 14 tab[j][i] = temp; 15 j=j+1; 16 } 17 i=i+1; 18 } � �� Exercice 3 : Allocation dynamique** Refaire les exercices précédant en déclarant à chaque fois des tableaux 2d dynamiques, où la saisie de la taille et des éléments du tableau se fait par l’utilisateur. Langage C � � � �154 1ère année (2013/2014)
  • 4. Département informatique TP8 : Tableaux à deux dimensions (Corrigé) Exercice 4 : Manipulation des matrices en dynamique** Question 4.1 : Écrire un programme qui permet de construire une matrice nulle de taille lignes× colonnes. Correction : � � 1 int nblignes; 2 int nbcolones; 3 4 printf ("combien de lignes : "); 5 scanf("%d", &nbligne); 6 7 ntf("combien de colonnes : "); 8 scanf("%d", &nbcolones); 9 10 I = (int**) malloc(nblignes*sizeof(int*)); 11 12 int i; 13 int j ; 14 for (i=0 ; i<nblignes ; i++) 15 { 16 I[i]=(int*) malloc(nbcolonnes*sizeof(int)); 17 18 } 19 for (i=0; i<nblignes; i++) 20 { 21 for (j=0; j<nbcolonnes; j++) 22 I[i][j]=0; 23 } � �� Question 4.2 : Modifier le programme pour construire la matrice carrée identité I (tous les éléments de la diagonale sont égaux à 1, les autres valent 0). Correction : Demander seulement une dimension (matrice carrée). Même initialisation, puis � � 1 for (i=0; i<nblignes; i++) 2 { 3 I[i][i]=1; 4 } � �� Question 4.3 : Écrire une fonction qui calcule la trace d’une matrice carrée, c’est-à-dire la somme des coefficients diagonaux de cette matrice. Correction : � � 1 int trace(int **A, int nblignes, int nbcolonnes) 2 { 3 if (nblignes != nbcolonnes) 4 { 5 printf ("Le calcul est impossible"); 6 return -1; 7 } 1ère année (2013/2014) � � � �155 Langage C
  • 5. IUT de Villetaneuse 8 else 9 { 10 int tr=0; 11 for (i=0; i<nblignes; i++) 12 tr=tr+A[i][i]; 13 14 return tr; 15 } 16 } � �� Question 4.4 : Écrire une fonction qui teste si un élément x appartient à une matrice A. Correction : � � 1 int appartenance(int **A, int nblignes, int nbcolonnes, int x) 2 { 3 int i; 4 int j; 5 for (i=0; i<nblignes; i++) 6 { 7 for (j=0; j<nbcolonnes; j++) 8 if (A[i][j] == x) 9 return 1; 10 } 11 return 0; 12 } � �� Question 4.5 : Écrire une fonction qui permute deux colonnes d’une matrice. Correction : � � 1 void permutationColonnes(int **A, int nblignes, int k, int l) 2 { 3 int i=0; 4 int tempo; 5 while (i<nblignes) 6 { 7 tempo=A[i][k]; 8 A[i][k] = A[i][l]; 9 A[i][l] = tempo; 10 i++; 11 } 12 } � �� Question 4.6 : Écrire une fonction qui permute deux lignes d’une matrice. Correction : � � 1 void permutationLignes(int **A, int k, int l) 2 { 3 int *tempo; 4 tempo=A[k]; 5 A[k] = A[l]; 6 A[l] = tempo; 7 } � �� Langage C � � � �156 1ère année (2013/2014)
  • 6. Département informatique Question 4.7 : Écrire une fonction qui remplace dans une matrice A toutes les occurrences de x par y. Correction : � � 1 int remplace(int **A, int nblignes, int nbcolonnes, int x, int y) 2 { 3 int i, j; 4 for (i=0, i<nblignes, i++) 5 { 6 for (j=0, j<nbcolonnes, j++) 7 { 8 if (A[i][j] == x) 9 A[i][j] = y; 10 } 11 } 12 } � �� Exercice 5 : Addition de matrices*** Le but de cet exercice est de permettre la multiplication de matrice de flottants, ainsi que la lecture et l’écriture de matrices dans des fichiers. Question 5.1 : Définir la fonction alloueMatrice prenant en paramètre un nombre de lignes et un nombre de colonnes et retournant une matrice de flottants allouée dynamiquement. Correction : � � 1 float ** alloueMatrice(int n, int m) 2 { 3 float ** mat = malloc(sizeof(float*) * n); 4 int i; 5 for (i = 0 ; i < n ; i++) 6 mat[i] = malloc(sizeof(float) * m); 7 return mat; 8 } � �� Question 5.2 : Définir la fonction libereMatrice prenant en paramètre une matrice allouée dynamiquement ainsi que son nombre de lignes et libérant la mémoire prise par cette matrice. Correction : � � 1 void libereMatrice(float **mat,int n) 2 { 3 int i; 4 for (i = 0 ; i < n ; i++) 5 free (mat[i]); 6 free (mat); 7 } � �� Question 5.3 : Définir la fonction lireMatrice prenant en paramètre deux pointeurs d’entiers et un nom de fichier. Cette fonction ouvrira le fichier dont le nom est passé en paramètre. Ce fichier doit contenir le nombre de lignes, le nombre de colonnes ainsi que les valeurs d’une matrice. La fonction utilisera ces informations pour allouer dynamiquement une matrice et l’initialiser avec les valeurs du fichier. La fonction modifiera les deux pointeurs d’entiers pour qu’ils contiennent respectivement le nombre de lignes et de colonnes de la matrice et retournera l’adresse mémoire de la matrice (ou NULL en cas d’erreur). Correction : 1ère année (2013/2014) � � � �157 Langage C
  • 7. IUT de Villetaneuse � � 1 float ** lireMatrice(int *n, int *m, char nomF[]) 2 { 3 FILE * f = fopen(nomF,"rt"); 4 if (f==NULL) 5 return NULL; 6 7 //Lecture du nombre de lignes et de colonnes de la matrice 8 fscanf (f,"%d",n); 9 fscanf (f,"%d",m); 10 11 //Allocation de la matrice 12 float ** matrice = alloueMatrice(*n,*m); 13 if (matrice==NULL) 14 return NULL; 15 16 //On lit les valeurs 17 int i,j; 18 for (i = 0 ; i < *n ; i++) 19 for (j = 0 ; j < *m ; j++) 20 fscanf (f,"%f",&matrice[i][j]); 21 22 if (fclose(f))//En cas de problème lors de la fermeture 23 { 24 libereMatrice (matrice,*m);//On libère la mémoire 25 return NULL; 26 } 27 return matrice; 28 } � �� Question 5.4 : Définir la fonction ecrireMatrice prenant en paramètre une matrice, son nombre de lignes et de colonnes et le nom d’un fichier et écrivant dans ce fichier les informations de la matrice. Correction : � � 1 int ecrireMatrice (float ** mat, int n, int m, char nomF[]) 2 { 3 FILE * f = fopen(nomF,"wt"); 4 if (f==NULL) 5 return 0; 6 7 fprintf (f,"%d n %d n",n,m); 8 int i,j; 9 for (i = 0 ; i < n ; i++) 10 { 11 for (j = 0 ; j < m ; j++) 12 fprintf (f,"%6f",mat[i][j]); 13 fprintf (f,"n"); 14 } 15 return !fclose(f); 16 } � �� Question 5.5 : Écrire une fonction addition_mat qui permet de faire l’addition de deux matrices de même dimension. Correction : � � Langage C � � � �158 1ère année (2013/2014)
  • 8. Département informatique 1 float **addition_mat(float **mat1, float **mat2, int nblignes, int nbcolonnes) 2 { 3 float ** mat3 = alloueMatrice(nblignes,nbcolonnes); 4 int i,j; 5 for (i=0 ; i<nblignes ; i++) 6 { 7 for (j=0 ; j<nbcolonnes ; j++) 8 mat3[i][j] = mat1[i][j] + mat2[i][j]; 9 } 10 return mat3; 11 } � � � Question 5.6 : Écrire un programme principal permettant de créer deux matrices à partir des fichiers de données mat1.txt et mat2.txt, de calculer la somme de ces deux matrices et d’écrire ce résultat dans le fichier mat3.txt. Les 3 matrices seront également affichées à l’écran. Correction : � � 1 int main() 2 { 3 int n1,m1; 4 float ** mat1 = lireMatrice(&n1,&m1,"m1.txt"); 5 printf ("Premiere matrice : n"); 6 afficheMatrice (mat1,n1,m1); 7 printf ("nn"); 8 9 int n2,m2; 10 float ** mat2 = lireMatrice(&n2,&m2,"m2.txt"); 11 printf ("Deuxieme matrice : n"); 12 afficheMatrice (mat2,n2,m2); 13 printf ("nn"); 14 15 if (n1==n2 && m1==m2)//Si les matrices ont les mêmes dimensions 16 { 17 float **mat3 = addition_mat(mat1,mat2,n1,m1); 18 printf ("Somme des deux matrices :n"); 19 afficheMatrice (mat3,n1,m1); 20 ecrireMatrice (mat3,n1,m1,"m3.txt"); 21 libereMatrice (mat3,n1); 22 mat3 = NULL; 23 } 24 libereMatrice (mat1,n1); 25 mat1 = NULL; 26 libereMatrice (mat2,n2); 27 mat2 = NULL; 28 return 0; 29 } � � � Exercice 6 : Carré magique*** Un carré (tableau d’entiers de N lignes et N colonnes initialisées) est dit magique lorsque la somme d’une ligne, d’une colonne ou d’une diagonale quelconque est toujours égale au même nombre. Voici un exemple de carré magique : 1ère année (2013/2014) � � � �159 Langage C
  • 9. IUT de Villetaneuse 15 8 1 24 17 16 14 7 5 23 22 20 13 6 4 3 21 19 12 10 9 2 25 18 11 Question 6.1 : Concevoir une fonction créant une matrice carrée dont les coefficients sont des entiers positif saisi par l’utilisateur. Question 6.2 : Concevoir une fonction qui vérifie si un carré est magique. Correction : � � 1 int carre_magique(int **tabMag, int nblignes) 2 { 3 int OK = 1; 4 int i; 5 int j; 6 int somme = 0; 7 int sommeSuiv = 0; 8 int taille = nblignes; 9 10 //initialisation de la somme pour la première ligne 11 for (j=0; j< taille ; j++) 12 somme += tabMag[0][j]; 13 14 //comparaison avec les autres lignes 15 i= 1; 16 while (OK && i < taille) 17 { 18 sommeSuiv = 0; 19 for (j=0 j< taille ; j++) 20 sommeSuiv += tabMag[i][j]; 21 22 if (sommeSuiv != somme) 23 OK = 0; 24 i++; 25 } 26 27 // comparaison avec les colonnes 28 j = 0; 29 30 while (OK && j < taille) 31 { 32 sommeSuiv = 0; 33 for (i=0; i< taille ; i++) 34 sommeSuiv += tabMag[i][j]; 35 36 if (sommeSuiv != somme) 37 OK = 0; 38 j++; 39 } 40 41 // comparaison avec les deux diagonales 42 // la premiere 43 if (OK) 44 { 45 sommeSuiv = 0; 46 for (i=0; i< taille ; i++) 47 sommeSuiv += tabMag[i][i]; 48 Langage C � � � �160 1ère année (2013/2014)
  • 10. Département informatique 49 if (sommeSuiv != somme) 50 OK = 0; 51 } 52 53 //la seconde 54 if (OK) 55 { 56 sommeSuiv = 0; 57 for (i=0; i< taille ; i++) 58 sommeSuiv += tabMag[i][taille -1 -i]; 59 60 if (sommeSuiv != somme) 61 OK = 0; 62 63 return OK; 64 } 65 } � �� 1ère année (2013/2014) � � � �161 Langage C