UNIVERSITE IBN ZOHR – AGADIR Année Universitaire : 2024-
2025
Ecole Nationale des Sciences Appliquées Filière : AP 2
Prof. Abenaou A.
TP N4
Programmation C
Exercice
Ecrire un programme qui permet de manipuler les matrices (tableau
bidimensionnel). Le programme doit contenir les fonctions suivantes :
Manipulation 1
-allouerMatrice(int nl, int nc): pour allouer dynamiquement un
tableau 2D en utilisant un pointeur double (int**).
-remplirMatrice(int** matrice, int nl, int nc): pour lire
les valeurs à partir du clavier.
-afficherMatrice(int** matrice, int nl, int nc): pour
afficher la matrice sous forme de tableau.
-libererMatrice(int** matrice, int nl): pour libère la mémoire
allouée.
Manipulation 2
Exploiter les fonctions élaborées dans la manipulation 1 pour créer un
programme contenant une nouvelle fonction somMatrice(int**
matrice1, int** matrice2, nl, int nc) qui permet de calculer la
somme de deux matrices.
Corrigé
// Manipulation 1
#include <stdio.h>
#include <stdlib.h>
// Fonction pour allouer dynamiquement une matrice de taille nl x nc
int** allouerMatrice(int nl, int nc) {
int** matrice = (int**)malloc(nl * sizeof(int*));
if (matrice == NULL) {
printf("Erreur d'allocation !\n");
exit(EXIT_FAILURE);
}
for (int i = 0; i <nl; i++) {
matrice[i] = (int*)malloc(nc * sizeof(int));
// *(matrice+i)= (int*)malloc(nc * sizeof(int));
if (matrice[i] == NULL) {
printf("Erreur d'allocation !\n");
exit(EXIT_FAILURE);
}
}
return matrice;
}
// Fonction pour la lecture des valeurs à partir du clavier
void remplirMatrice(int** matrice, int nl, int nc) {
for (int i = 0; i < nl; i++) {
for (int j = 0; j < nc; j++) {
printf("matrice[%d][%d]=",i,j);
scanf("%d",*(matrice+i)+j);
// scanf("%d",matrice[i]+j);
}
}
}
// Fonction pour afficher la matrice
void afficherMatrice(int** matrice, int nl, int nc) {
for (int i = 0; i < nl; i++) {
for (int j = 0; j < nc; j++) {
printf("matrice[%d][%d]=%d ",i,j,*(*(matrice+i)+j));
// printf("matrice[%d][%d]=%d ",i,j,matrice[i][j]);
}
printf("\n");
}
}
// Fonction pour libérer la mémoire allouée
void libererMatrice(int** matrice, int nl) {
for (int i = 0; i < nl; i++) {
free(matrice[i]);
}
free(matrice);
}
int main() {
int ligne, colonne;
printf("Entrez le nombre de lignes : ");
scanf("%d", &ligne);
printf("Entrez le nombre de colonnes : ");
scanf("%d", &colonne);
// Allocation dynamique
int** matrice = allouerMatrice(ligne, colonne);
// Lecture des valeurs et affichage de la matrice
remplirMatrice(matrice, ligne, colonne);
printf("\nMatrice générée :\n");
afficherMatrice(matrice, ligne, colonne);
// Libération de la mémoire
libererMatrice(matrice, ligne);
return 0;
}
// Manipulation 2
#include <stdio.h>
#include <stdlib.h>
// Fonction pour allouer dynamiquement une matrice de taille nl x nc
int** allouerMatrice(int nl, int nc) {
int** matrice = (int**)malloc(nl * sizeof(int*));
if (matrice == NULL) {
printf("Erreur d'allocation !\n");
exit(EXIT_FAILURE);
}
for (int i = 0; i <nl; i++) {
matrice[i] = (int*)malloc(nc * sizeof(int));
// *(matrice+i)= (int*)malloc(nc * sizeof(int));
if (matrice[i] == NULL) {
printf("Erreur d'allocation !\n");
exit(EXIT_FAILURE);
}
}
return matrice;
}
// Fonction pour la lecture des valeurs à partir du clavier
void remplirMatrice(int** matrice, int nl, int nc) {
for (int i = 0; i < nl; i++) {
for (int j = 0; j < nc; j++) {
printf("matrice[%d][%d]=",i,j);
scanf("%d",*(matrice+i)+j);
// scanf("%d",matrice[i]+j);
}
}
}
// Fonction pour afficher la matrice
void afficherMatrice(int** matrice, int nl, int nc) {
for (int i = 0; i < nl; i++) {
for (int j = 0; j < nc; j++) {
printf("matrice[%d][%d]=%d ",i,j,*(*(matrice+i)+j));
// printf("matrice[%d][%d]=%d ",i,j,matrice[i][j]);
}
printf("\n");
}
}
int ** somMatrice(int** matrice1, int** matrice2, int nl, int nc) {
int i,j;
int **matrice3 = allouerMatrice(nl,nc);
for(i=0;i<nl;i++)
for(j=0;j<nc;j++)
*(*(matrice3+i)+j)=*(*(matrice1+i)+j)+*(*(matrice2+i)+j);
return matrice3;
}
// Fonction pour libérer la mémoire allouée
void libererMatrice(int** matrice, int nl) {
for (int i = 0; i < nl; i++) {
free(matrice[i]);
}
free(matrice);
}
int main() {
int ligne, colonne;
printf("Entrez le nombre de lignes : ");
scanf("%d", &ligne);
printf("Entrez le nombre de colonnes : ");
scanf("%d", &colonne);
// Allocation dynamique
int** matrice1 = allouerMatrice(ligne, colonne);
int** matrice2 = allouerMatrice(ligne, colonne);
int** matrice3;
// Lecture des matrices
printf("\n Remplir la matrice 1\n");
remplirMatrice(matrice1, ligne, colonne);
printf("\n Remplir la matrice 2\n");
remplirMatrice(matrice2, ligne, colonne);
printf("\n Calcul de la somme des matrices :\n");
matrice3=somMatrice(matrice1,matrice2,ligne,colonne);
printf("\n Affichage du résultat :\n");
afficherMatrice(matrice3, ligne, colonne);
// Libération de la mémoire
libererMatrice(matrice1, ligne);
libererMatrice(matrice2, ligne);
libererMatrice(matrice3, ligne);
return 0;
}