projprog/CP12.8.c

117 lines
2.5 KiB
C

#include <stdio.h>
#include <stdlib.h>
int** zerosMat(int h, int w){
int** arr = (int**)malloc(h*sizeof(int*)+1);
if(arr==NULL)return NULL;
for(int i=0;i<h;i++){
arr[i] = (int*) calloc(w,sizeof(int));
if(arr[i]==NULL)return NULL;
}
arr[h] = NULL; // Pour indiquer la fin du tableau
return arr;
}
void redimMat(int** mat, int nh, int nw){
// 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]);
// Lignes
int** narr = (int**)realloc(mat, nh*sizeof(int*)+1);
if(narr==NULL){
free(mat);
return;
}
int nulled = 0;
for(int i=0;i<nh;i++){
if(narr[i]==NULL)
nulled = 1; // À partir de maintenant, on alloue.
if(nulled){
narr[i] = calloc(nw,sizeof(int));
if(narr[i]==NULL)return;
} else {
narr[i] = (int*) realloc(narr[i], nw*sizeof(int));
if(narr[i]==NULL){
free(mat[i]);
return;
}
}
}
narr[nh] = NULL;
}
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;
}