Vous êtes sur la page 1sur 7

L2 mention Sciences du Vivant Universit e Louis Pasteur

Programmation 3 2007/08

TD 5 : Tableaux (statiques)
Exercice 1 Ecrire des fonctions de manipulation des vecteurs de R3 : initialisation dun vecteur (en donnant pr ealablement les coordonn ees et par lecture au clavier) ; addition ; produit scalaire ; produit vectoriel ; multiplication par un scalaire ; normes N1 , N2 , N ; achage ; ad lib . . . Corrig e
#include <stdio.h> #include <math.h> void initialisation(float x,float y,float z, float res[3]) { res[0]=x; res[1]=y; res[2]=z; return; } void initialisation_clavier(float res[3]) { int i; float x,y,z; for(i=0;i<3;i++) { printf("coordonne [%d] : ",i); scanf("%f",&res[i]); } return; } void addition(float A[3],float B[3],float res[3]) { int i; for(i=0;i<3;i++) { res[i]=A[i]+B[i]; }

return; } float produit_scalaire(float A[3],float B[3]) { int i; float res; res=0.0; for(i=0;i<3;i++) { res+=A[i]*B[i]; } return res; } void produit_vectoriel(float A[3],float B[3],float res[3]) { int i; for(i=0;i<3;i++) { res[i]=A[(i+1)%3]*B[(i+2)%3]-A[(i+2)%3]*B[(i+1)%3]; } return; } void multiplication(float k,float A[3],float res[3]) { res[0]=A[0]*k; res[1]=A[1]*k; res[2]=A[2]*k; return; } float norme1(float A[3]) { int i; float res; res=0.0; for(i=0;i<3;i++) { res+=sqrtf(A[i]*A[i]); } return res; } float norme2(float A[3]) { int i; float res; res=0.0; for(i=0;i<3;i++) { res+=A[i]*A[i]; }

res=sqrtf(res); return res; } float normeI(float A[3]) { int i; float res; res=sqrtf(A[0]*A[0]); for(i=1;i<3;i++) { if (res<sqrtf(A[i]*A[i])) { res=sqrtf(A[i]*A[i]); } } return res; } void affichage(float A[3]) { int i; printf("[ "); for(i=0;i<3;i++) { printf("%f ",A[i]); } printf("]\n"); return; }

Exercice 2 Ecrire des fonctions de manipulation des matrices 3 3 ` a valeurs dans R : initialisation dune matrice (par lecture au clavier) ; addition ; produit avec une matrice ; puissance (positive) ; produit avec un vecteur (` a gauche et ` a droite) ; multiplication par un scalaire ; d eterminant ; trace ; achage ; ad lib . . . Corrig e
#include <stdio.h> #include <math.h> void initialisation(float res[3][3]) { int i,j; for(i=0;i<3;i++)

{ for(j=0;j<3;j++) { printf("coordonne [i][j] : "); scanf("%f",&res[i][j]); } } return; } void addition(float A[3][3],float B[3][3],float res[3][3]) { int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) { res[i][j]=A[i][j]+B[i][j]; } } return; } void produit_matrice(float A[3][3],float B[3][3],float res[3][3]) { int i,j,k; for(i=0;i<3;i++) { for(j=0;j<3;j++) { res[i][j]=0.0; for(k=0;k<3;k++) { res[i][j]+=(A[i][k]*B[k][j]); } } } return; } void puissance(float A[3][3],int n,float res[3][3]) { int i,j; float temp[3][3]; if (n==0) { for(i=0;i<3;i++) { for(j=0;j<3;j++) { if (i==j) { res[i][j]=1.0; }

else { res[i][j]=0.0; } } } } else { puissance(A,n-1,temp); produit_matrice(A,temp,res); } return; } void produit_d(float A[3][3],float V[3],float res[3]) { int i,j; for(i=0;i<3;i++) { res[i]=0.0; for(j=0;j<3;j++) { res[i]+=(A[i][j]*V[j]); } } return; } void produit_g(float V[3],float A[3][3],float res[3]) { int i,j; for(i=0;i<3;i++) { res[i]=0.0; for(j=0;j<3;j++) { res[i]+=(V[j]*A[j][i]); } } return; } void multiplication(float A[3][3],float k,float res[3][3]) { int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) { res[i][j]=k*A[i][j]; } } return;

} float determinant(float A[3][3]) { int i,j; float t; float res; res=0.0; for(i=0;i<3;i++) { t=1.0; for(j=0;j<3;j++) { t*=A[(i+j)%3][j]; } res+=t; } for(i=0;i<3;i++) { t=1.0; for(j=0;j<3;j++) { t*=A[(i-j+3)%3][j]; } res-=t; } return res; } float trace(float A[3][3]) { int i,j; float res; res=0.0; for(i=0;i<3;i++) { res+=A[i][i]; } return res; } void affichage(float A[3][3]) { int i,j; for(i=0;i<3;i++) { printf("[ "); for(j=0;j<3;j++) { printf("%f ",A[i][j]); } printf("]\n"); } printf("\n");

return; }

Exercice 3 Comment peut-on mod eliser un tableau bidimensionnel par un tableau monodimensionnel ? Comment peut-on mod eliser un tableau n-dimensionnel par un tableau monodimensionnel ? Corrig e
Cas bidimensionnel. Un tableau bidimensionnel est de la forme A[dim1 ][dim2 ]. Un tableau monodimen` condition que dim = dim1 .dim2 , on a la bijection sionnel est de la forme B [dim]. A de [0, dim 1] dans [0, dim1 1] [0, dim2 1] : f2 : [0, dim 1] i [0, dim1 1] [0, dim2 1] , (i/dim2 , i%dim2 )

dont la fonction inverse est :


1 : f2

[0, dim1 1] [0, dim2 1] (i, j )

[0, dim 1] . i.dim2 + j

On a donc les correspondances : A[i][j ] = B [i.dim2 + j ] B [i] = A[i/dim2 ][i%dim2 ] Cas g en eral (n-dimensionnel). Un tableau n-dimensionnel est de la forme A[dim1 ][dim2 ]...[dimn ] (n Q > 0). Un tableau ` condition que dim = n dimk , on a monodimensionnel est de la forme B [ dim ]. A k=1 Q la bijection de [0, dim 1] dans n k=1 [0, dimk 1] : Qn fn : [0, dim 1] Qn k=1 [0, dimk 1] n , i ((i/( t=k+1 dimt ))%dimk )k=1 dont la fonction inverse est : Qn 1 fn : k=1 [0, dimk 1] (ik )n k=1

Pn

k=1 (ik .

[0, dim Q 1]
n t=k+1

dimt )