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

Correction tp3 PDF

Transféré par

Fop Mopp
Copyright
© Attribution Non-Commercial (BY-NC)
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)
271 vues7 pages

Correction tp3 PDF

Transféré par

Fop Mopp
Copyright
© Attribution Non-Commercial (BY-NC)
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 emoire

Programmation en C (LC4) Semaine du 11 f evrier 2008

Pendant lex ecution dun programme, une zone de la m emoire de lordinateur contient les donn ees dont le programme a besoin pour sex ecuter, et qui peut etre agrandie au cours de lex ecution. Lallocation dynamique de la m emoire consiste donc ` a etendre, pendant lex ecution dun programme, la m emoire qui lui est attribu ee. Les principales fonctions dallocation dynamiques sont : malloc pour allouer un bloc de m emoire calloc pour allouer un bloc de m emoire et linitialiser ` a0 realloc pour agrandir la taille dun bloc de m emoire free pour liberer un bloc de m emoire Ces fonctions se trouvent dans la biblioth` eque 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 emoire allou ee. Le contenu de la zone de m emoire nest pas initialis e. void * calloc (size_t nmemb, size_t size) : alloue la m emoire n ecessaire pour un tableau de nmemb el ements, chacun deux repr esentant size octets, et renvoie un pointeur vers la m emoire allou ee. Cette zone est remplie avec des z eros. void * realloc (void * ptr, size_t size) : modie la taille du bloc de m emoire point e par ptr pour lamener ` a une taille de size octets. realloc()r ealloue une nouvelle zone m emoire et recopie lancienne dans la nouvelle sans initialiser le reste. void free (void * ptr) : lib` ere lespace m emoire point e par ptr, qui a et e obtenu lors dun appel ant erieur ` a malloc(), calloc() ou realloc(). Le type size t est equivalent au type unsigned long int. Exercice 1 Ecrire les fonctions dachage dun vecteur dentiers de taille dimension, void affiche_vecteur(int * vecteur, int dimension) et dune matrice dentiers de taille lignes*colonnes , void affiche_matrice(int ** matrice, int lignes, int colonnes) . Exercice 2 void ache vecteur(int vecteur, int dimension) { int i; printf(( ); for(i=0;i<dimension;i++) printf(%d ,vecteur[i]); printf()\n); } void ache matrice(int matrice, int lignes,int colonness) { int i; for(i=0;i<lignes;i++) 1

ache vecteur(matrice[i],colonnes); printf(\n); }

Exercice 3 Ecrire la fonction qui alloue la m emoire dun vecteur de taille dimension, puis qui linitialise ` a la valeur val, int * alloue_vecteur(int dimension, int val) . Ecrire la fonction void libere_vecteur(int * vecteur) , qui lib` ere le vecteur vecteur. Acher ce vecteur pour tester vos fonctions. Exercice 4 int alloue vecteur(int dimension, int val) { int i; int vecteur = malloc(dimensionsizeof(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 emoire dune matrice de taille lignes*colonnes , puis qui linitialise ` a la valeur val, int ** alloue_matrice(in t lignes,int colonnes, int val) . Ecrire la fonction void libere_matrice(int ** matrice, int n) , qui lib` ere la matrice matrice. Acher cette matrice pour tester vos fonctions. Exercice 6 int alloue matrice (int lignes, int colonnes,int val) { int i,j; int matrice = malloc(lignessizeof(int )); for (i=0;i<lignes;i++) matrice[i]= malloc(colonnessizeof(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 en` ere une matrice identit e en utilisant une simple boucle int ** genere_matrice_identite(int dimension) . 2

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; ache matrice(identite,dimension,dimension); return identite; } Exercice 9 Le triangle de Pascal : En math ematiques, le triangle de Pascal est un arrangement g eom etrique qui stocke les coefi ` la lignes i et cients du developpement de (x + y )i qui sont les coecients binomiaux j .A i colonnes j (0 j i) est plac e le coecient binomial j , dont voici la repr esentation : (vous trouverez plus de detail sur la page http://fr.wikipedia.org/wiki/Triangle_de_Pascal)

1) Ecrire la fonction qui alloue la m emoire dune matrice triangulaire inf erieure carr ee int ** alloue_matrice_pascal(int dimension) . 2) Ecrire une foction int ** remplit_matrice_pascal(int dimension) qui stocke les coecients binomiaux dun polyn ome de taille n (matrice de Pascal de taille n). 3) Ecrire une fonction void affiche_matrice_pascal(int dimension) qui ache une matrice de pascal de taille n.

Exercice 10 3

int alloue matrice pascal(int dimension) { int i,j; int matrice = malloc(dimensionsizeof(int )); for (i=0;i<dimension;i++) matrice[i]= malloc(isizeof(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[i1][j1]+ matrice[i1][j]; } return matrice; }

void ache matrice pascal(int matrice, int dimension) { int i; for(i=0;i<dimension;i++) ache vecteur(matrice[i],i+1); printf(\n); } La fonction int scanf (const char * format, ...) ; permet de lire les caract` eres de lentr ee standard. Sil sagit dentier, il faut utiliser le format %d, puis indiquer ` a quelle adresse m emoire stocker cet entier.Cette fonction se trouve dans la biblioth` eque standard <stdio.h>. Exemple : pour r ecuperer un caract` ere de lentr ee 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 ecup` ere cons ecutivement n entiers depuis lentr ee standard et les stocke dans un tableau de taille n. 2) Ecrire une fonction int * recupere_entiers(int n,int taille_max) qui apr` es avoir allou e un tableau tab de taille n, r ecup` ere cons ecutivement des entiers depuis lentr ee standard. Lorsque plus de n entiers sont r ecup er es, cette fonction augmente la taille du tableau tab de n jusqu` a ce que la taille de tab soit egale ` a taille_max . Pour tester la fonction, on prendra n=5 et taille_max=20 4

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 emoire dun tableau 3D de taille longueur*largeur*hauteur , int *** alloue_tableau_3D(int longueur ,int largeur,int hauteur) . Ecrire la fonction void libere_tableau_3D(int *** tableau_3D) , qui lib` ere le tableau tableau. Apr` es avoir ecrit la fonction dachage void affiche_tableau_3D(int *** tableau_3D, int longueur, int largeur,int hauteur) , achez ce tableau 3D pour tester vos fonctions. Remarque : essayer dallouer la m emoire de ce tableau 3D de telle fa con que la fonction void libere_tableau(int *** tableau_3D) nutilise aucune boucle. 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 ache 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==largeur1) printf() ); else printf()\n ); } printf()\n\n ); } }

int main(int argc, char argv) { int int int int int int int int dimension=6; lignes =5; colonnes =4; n=5; taille max=20; longueur=4; largeur=6; hauteur=3;

int int int int int int int int

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

ache ache ache ache

ache ache ache ache libere libere libere libere libere libere libere

matrice pascal(matrice pascal,dimension); tableau 3D(tableau, longueur, largeur, hauteur); vecteur(tableau1,n); vecteur(tableau2,taille max); vecteur( vecteur); matrice(matrice,lignes); matrice(matrice zero,lignes); matrice(matrice identite,dimension); tableau 3D(tableau); vecteur(tableau1); vecteur(tableau2);

return 1; }

Vous aimerez peut-être aussi