projprog/CP12.8.c
2021-11-12 17:15:53 +01:00

129 lines
2.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
void freeMat(int** mat);
int** zerosMat(int h, int w){
int** arr = (int**)malloc((h+1)*sizeof(int*));
if(arr==NULL)return NULL;
for(int i=0;i<h;i++){
arr[i] = (int*) calloc(w,sizeof(int));
if(arr[i]==NULL){
freeMat(arr);
return NULL;
}
}
arr[h] = NULL; // Pour indiquer la fin du tableau
return arr;
}
void redimMat(int*** matp, int nh, int nw){
int** mat = *matp;
// Récupération de la hauteur pour libération en cas de rétrécissement.
int h=0;
while(mat[h]!=NULL)h++;
if(nh<h)for(int i=nh;i<h;i++){free(mat[i]); mat[i] = NULL;};
// Lignes
mat = (int**)realloc(mat, (1+nh)*sizeof(int*));
if(mat==NULL){
freeMat(*matp); // On libère la matrice originelle pour que l'appelant soit au courant.
return;
}
*matp = mat;
int nulled = 0;
for(int i=0;i<nh;i++){
if(mat[i]==NULL)
nulled = 1; // À partir de maintenant, on alloue.
if(nulled){
mat[i] = calloc(nw,sizeof(int));
if(mat[i]==NULL){
freeMat(mat);
return;
}
} else {
int* a = (int*) realloc(mat[i], nw*sizeof(int));
if(a==NULL){
freeMat(mat);
return;
}
mat[i] = a;
}
}
mat[nh] = NULL; // Normalement déjà fait
}
void freeMat(int** mat){
for(int i=0;mat[i]!=NULL;i++)
free(mat[i]);
free(mat);
}
int main(){
int** mamatrice;
int h,w;
char c;
int p1, p2, p3;
// Bon, j'ai mal lu le sujet, j'ai fait des matrices rectangulaires ...
printf("Quelle taille initiale à votre matrice ? ");
scanf("%d %d",&h,&w);getchar();
mamatrice = zerosMat(h,w);
printf("Votre matrice a été initialisée avec des zéros !\n");
printf("'r # #' pour redimenssionner, 'g # #' pour récupérer la valeur, 's # # #' pour la définir, 'q' pour quitter\n");
while(1){
printf("Commande ? ");
c = getchar();
getchar();// On bouffe l'espace
switch(c){
case 'r':
scanf("%d %d",&p1,&p2);
redimMat(&mamatrice, p1, p2);
h = p1;
w = p2;
printf("La matrice a été redimensionnée à la taille %d x %d\n",p1, p2);
break;
case 'g':
scanf("%d %d",&p1,&p2);
if(0<=p1 && p1<h && 0<=p2 && p2<w)
printf("La valeur de la matrice en [%d,%d] est %d\n",p1, p2, mamatrice[p1][p2]);
else
printf("L'entrée est mal formée, les coordonées sont hors de la matrice\n");
break;
case 's':
scanf("%d %d %d",&p1,&p2,&p3);
mamatrice[p1][p2] = p3;
if(0<=p1 && p1<h && 0<=p2 && p2<w){
printf("La valeur de la matrice en [%d,%d] a été définie en %d\n",p1, p2, p3);
}else
printf("L'entrée est mal formée, les coordonées sont hors de la matrice\n");
break;
break;
case 'q':
goto fend;
}
getchar();
}
fend: freeMat(mamatrice);
return 0;
}