0% ont trouvé ce document utile (0 vote)
199 vues7 pages

Correction tp3 PDF

Transféré par

anas
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
199 vues7 pages

Correction tp3 PDF

Transféré par

anas
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 7

TP 3 : Allocation dynamique de mémoire

Programmation en C (LC4)

Semaine du 11 février 2008

Pendant l’exécution d’un programme, une zone de la mémoire de l’ordinateur contient les données
dont le programme a besoin pour s’exécuter, et qui peut être agrandie au cours de l’exécution.
L’allocation dynamique de la mémoire consiste donc à étendre, pendant l’exécution d’un pro-
gramme, la mémoire qui lui est attribuée. Les principales fonctions d’allocation dynamiques sont :
– malloc pour allouer un bloc de mémoire
– calloc pour allouer un bloc de mémoire et l’initialiser à 0
– realloc pour agrandir la taille d’un bloc de mémoire
– free pour liberer un bloc de mémoire

Ces fonctions se trouvent dans la bibliothèque standard <stdlib.h>


Les prototypes de ces quatres fonctions sont les suivant :
« void * malloc (size_t size) » : alloue size octets, et renvoie un pointeur sur la mémoire
allouée. Le contenu de la zone de mémoire n’est pas initialisé.
« void * calloc (size_t nmemb, size_t size) » : alloue la mémoire nécessaire pour un ta-
bleau de nmemb éléments, chacun d’eux représentant size octets, et renvoie un pointeur vers la
mémoire allouée. Cette zone est remplie avec des zéros.
« void * realloc (void * ptr, size_t size) » : modifie la taille du bloc de mémoire pointé
par ptr pour l’amener à une taille de size octets. realloc()réalloue une nouvelle zone mémoire
et recopie l’ancienne dans la nouvelle sans initialiser le reste.
« void free (void * ptr) » : libère l’espace mémoire pointé par ptr, qui a été obtenu lors d’un
appel antérieur à malloc(), calloc() ou realloc().
Le type size t est equivalent au type unsigned long int.

Exercice 1 Ecrire les fonctions d’affichage d’un vecteur d’entiers de taille dimension, « void
affiche_vecteur(int * vecteur, int dimension) » et d’une matrice d’entiers de taille
« lignes*colonnes », « void affiche_matrice(int ** matrice, int lignes, int co-
lonnes) ».

I Exercice 2

void affiche vecteur(int ∗ vecteur, int dimension)


{
int i;
printf(”( ”);
for(i=0;i<dimension;i++)
printf(”%d ”,vecteur[i]);
printf(”)\n”);
}

void affiche matrice(int ∗∗ matrice, int lignes,int colonness)


{
int i;
for(i=0;i<lignes;i++)

1
affiche vecteur(matrice[i],colonnes);
printf(”\n”);
}

Exercice 3 Ecrire la fonction qui alloue la mémoire d’un vecteur de taille dimension, puis qui
l’initialise à la valeur val, « int * alloue_vecteur(int dimension, int val) ». Ecrire la
fonction « void libere_vecteur(int * vecteur) », qui libère le vecteur vecteur. Afficher
ce vecteur pour tester vos fonctions.

I Exercice 4

int ∗ alloue vecteur(int dimension, int val)


{
int i;
int ∗ vecteur = malloc(dimension∗sizeof(int));
for(i=0;i<dimension;i++)
vecteur[i]=val;
return vecteur;
}

void libere vecteur(int ∗ vecteur)


{
free(vecteur);
}

Exercice 5 Ecrire la fonction qui alloue la mémoire d’une matrice de taille « lignes*colonnes »,
puis qui l’initialise à la valeur val, « int ** alloue_matrice(in t lignes,int colonnes,
int val) ». Ecrire la fonction « void libere_matrice(int ** matrice, int n) », qui li-
bère la matrice matrice. Afficher cette matrice pour tester vos fonctions.

I Exercice 6

int ∗∗ alloue matrice (int lignes, int colonnes,int val)


{
int i,j;
int∗∗ matrice = malloc(lignes∗sizeof(int ∗));
for (i=0;i<lignes;i++)
matrice[i]= malloc(colonnes∗sizeof(int));
for (i=0;i<lignes;i++)
for(j=0;j<colonnes;j++)
matrice[i][j]=val;
return matrice;
}

void libere matrice(int ∗∗ matrice,int lignes)


{
int i;
for (i=0;i<lignes;i++)
free((int ∗)matrice[i]);
}

Exercice 7 Ecrire une fonction qui génère une matrice identité en utilisant une simple boucle
« int ** genere_matrice_identite(int dimension) ».

2
I Exercice 8

int ∗∗ alloue matrice zero(int lignes, int colonnes)


{
int i;
int∗∗ matrice = calloc(lignes,sizeof(int ∗));
for (i=0;i<lignes;i++)
matrice[i]= calloc(colonnes,sizeof(int));
return matrice;
}

int ∗∗ genere matrice identite(int dimension)


{
int i;
int ∗∗ identite = alloue matrice zero(dimension,dimension);
for (i=0;i<dimension;i++)
identite[i][i]=1;
affiche matrice(identite,dimension,dimension);
return identite;
}

Exercice 9 Le triangle de Pascal :


En mathématiques, le triangle de Pascal est un arrangement géométrique qui  stocke les coef-
ficients du developpement de (x + y)i qui sont les coefficients binomiaux ji . À la lignes i et
colonnes j (0 6 j 6 i) est placé le coefficient binomial ji , dont voici la représentation : (vous


trouverez plus de detail sur la page http://fr.wikipedia.org/wiki/Triangle_de_Pascal)

1) Ecrire la fonction qui alloue la mémoire d’une matrice triangulaire inférieure carrée « int
** alloue_matrice_pascal(int dimension) ».
2) Ecrire une foction « int ** remplit_matrice_pascal(int dimension) » qui stocke les
coefficients binomiaux d’un polynôme de taille n (matrice de Pascal de taille n).
3) Ecrire une fonction « void affiche_matrice_pascal(int dimension) » qui affiche une
matrice de pascal de taille n.

I Exercice 10

3
int ∗∗ alloue matrice pascal(int dimension)
{
int i,j;
int∗∗ matrice = malloc(dimension∗sizeof(int ∗));
for (i=0;i<dimension;i++)
matrice[i]= malloc(i∗sizeof(int));
return matrice;
}

int ∗∗ remplit matrice pascal(int dimension)


{
int i,j;
int∗∗ matrice = alloue matrice pascal(dimension);
for (i=0;i<dimension;i++)
{
matrice[i][0]=1;
matrice[i][i]=1;
}
for (i=2;i<dimension;i++)
for(j=1;j<i;j++)
{
matrice[i][j]= matrice[i−1][j−1]+ matrice[i−1][j];

return matrice;
}

void affiche matrice pascal(int ∗∗ matrice, int dimension)


{
int i;
for(i=0;i<dimension;i++)
affiche vecteur(matrice[i],i+1);
printf(”\n”);
}

La fonction « int scanf (const char * format, ...) ; » permet de lire les caractères de l’en-
trée standard. S’il s’agit d’entier, il faut utiliser le format %d, puis indiquer à quelle adresse mémoire
stocker cet entier.Cette fonction se trouve dans la bibliothèque standard <stdio.h>.
Exemple : pour récuperer un caractère de l’entrée standard et le mettre dans la variable car

char recupere caractere()


{
char car;
scanf(”%c”,&car);
}

Exercice 11 1) Ecrire une fonction « int * recupere_n_entiers(int n) » qui récupère


consécutivement n entiers depuis l’entrée standard et les stocke dans un tableau de taille
n.
2) Ecrire une fonction « int * recupere_entiers(int n,int taille_max) » qui après avoir
alloué un tableau tab de taille n, récupère consécutivement des entiers depuis l’entrée stan-
dard. Lorsque plus de n entiers sont récupérés, cette fonction augmente la taille du tableau
tab de n jusqu’à ce que la taille de tab soit égale à « taille_max ». Pour tester la fonction,
on prendra « n=5 » et « taille_max=20 »

4
I Exercice 12

int∗ recupere n entier(int n)


{
int i;
int ∗ tableau = alloue vecteur(n,0);
for(i=0;i<n;i++)
scanf(”%d”,&tableau[i]);
return tableau;
}

int ∗ recupere entiers(int n,int taille max)


{
int i;
int ∗ tableau = alloue vecteur(n,0);
for(i=0;i<taille max;i++)
{
if(i == n)
{
n+=n;
tableau= realloc((void ∗)tableau, sizeof(int) ∗ n);
}
scanf(”%d”,&tableau[i]);
}
return tableau;
}

Exercice 13 Ecrire la fonction qui alloue la mémoire d’un tableau 3D de taille « longueur*largeur*hauteur »,
« int *** alloue_tableau_3D(int longueur ,int largeur,int hauteur) ». Ecrire la fonc-
tion « void libere_tableau_3D(int *** tableau_3D) », qui libère le tableau tableau.
Après avoir ecrit la fonction d’affichage « void affiche_tableau_3D(int *** tableau_3D,
int longueur, int largeur,int hauteur) », affichez ce tableau 3D pour tester vos fonc-
tions.
Remarque : essayer d’allouer la mémoire de ce tableau 3D de telle façon que la fonction « void
libere_tableau(int *** tableau_3D) » n’utilise aucune boucle.

I Exercice 14

int ∗∗∗ alloue tableau 3D(int longueur, int largeur, int hauteur)
{
int ∗∗∗ tableau;
int i, j;
tableau = malloc (longueur ∗ sizeof (int ∗∗));
tableau[0] = malloc (longueur ∗ largeur ∗ sizeof (int ∗));
tableau[0][0] = malloc (longueur ∗ largeur ∗ hauteur ∗ sizeof (int));
for (i = 0; i < longueur; i++)
{
tableau[i] = tableau[0] + i ∗ largeur;
for (j = 0; j < largeur; j++)
tableau[i][j] = tableau[0][0] + i ∗ largeur ∗ hauteur + j ∗ hauteur;
}
return tableau;
}

void libere tableau 3D(int ∗∗∗ tableau)


{

5
free(tableau[0][0]);
free(tableau[0]);
free(tableau);
}

void affiche tableau 3D(int ∗∗∗ tableau,int longueur, int largeur, int hauteur)
{
int i,j,k;
for(i=0;i<longueur;i++)
{
printf(”( ”);
for(j=0;j<largeur;j++)
{
printf(”( ”);
for(k=0;k<hauteur;k++)
{
printf(”%d ”,tableau[i][j][k]);
}
if(j==largeur−1)
printf(”) ”);
else
printf(”)\n ”);

}
printf(”)\n\n ”);
}
}

int main(int argc, char ∗∗ argv)


{

int dimension=6;
int lignes =5;
int colonnes =4;
int n=5;
int taille max=20;
int longueur=4;
int largeur=6;
int hauteur=3;

int ∗ vecteur=alloue vecteur(dimension, 18);


int ∗∗ matrice =alloue matrice (lignes,colonnes,33);
int ∗∗ matrice zero= alloue matrice zero(lignes,colonnes);
int ∗∗ matrice identite= genere matrice identite(dimension);
int ∗∗ matrice pascal= remplit matrice pascal(dimension);
int ∗∗∗ tableau =alloue tableau 3D( longueur, largeur, hauteur);
int ∗ tableau1= recupere n entier(n);
int ∗ tableau2= recupere entiers(n, taille max);

affiche vecteur(vecteur,dimension);
affiche matrice(matrice,lignes, colonnes);
affiche matrice(matrice zero,lignes, colonnes);
affiche matrice(matrice identite,dimension,dimension);

6
affiche matrice pascal(matrice pascal,dimension);
affiche tableau 3D(tableau, longueur, largeur, hauteur);
affiche vecteur(tableau1,n);
affiche vecteur(tableau2,taille max);

libere vecteur( vecteur);


libere matrice(matrice,lignes);
libere matrice(matrice zero,lignes);
libere matrice(matrice identite,dimension);
libere tableau 3D(tableau);
libere vecteur(tableau1);
libere vecteur(tableau2);

return 1;
}

Vous aimerez peut-être aussi