129 lines
2.8 KiB
C
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;
|
|
|
|
}
|