Produit_Matriciel Programmation En C

Fermé
reda4211 Messages postés 3 Date d'inscription vendredi 6 janvier 2012 Statut Membre Dernière intervention 7 janvier 2012 - 6 janv. 2012 à 23:31
 jenaimarre2fr - 7 janv. 2012 à 16:27
Bonjour,
Svp je veux faire un programme qui calcule le produit matriciel de deux matrices on utilisant les pointeurs voila le prototype de la fonction
int **produit(int l1,int c1,int **m1,int l2,int c2,int **m2)
et voila le programme que j'ai tapé sur code blocks ,mais ça marche pas



#include <stdio.h>
#include <stdlib.h>

int **produit(int l1,int c1,int **m1,int l2,int c2,int **m2)
{
int **m,i,j,k,s;
m=(int **)malloc(l1*sizeof(int*));
for(i=0;i<l1;i++)
{
*(m+i)=(int *)malloc(c2*sizeof(int));
}
for(i=0;i<l1;i++)
for(j=0;j<c2;j++)
{
s=0;
for(k=0;k<c1;k++)
{
s=s+m1[i][k]*m2[k][j];
}
*(*(m+i)+j)=s;

}
return m;
}

int main()
{
int a[3][3],b[3][3];
int **res;
int l1=3,c1=3,l2=3,c2=3,i,j;

for(i=0;i<l1;i++)
for(j=0;j<c1;j++)
{
printf("donnez a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);
}
for(i=0;i<l1;i++)
for(j=0;j<c1;j++)
{
printf("donnez b[%d][%d]=",i,j);
scanf("%d",&b[i][j]);
}
res=produit(l1,c1,a,l2,c2,b);
return 0;
}
A voir également:

5 réponses

alaa_xavi Messages postés 1 Date d'inscription samedi 7 janvier 2012 Statut Membre Dernière intervention 7 janvier 2012
7 janv. 2012 à 01:28
mais ca marche pas ????? resultat pas vrais ou n'execute rien???? expliqué??
0
reda4211 Messages postés 3 Date d'inscription vendredi 6 janvier 2012 Statut Membre Dernière intervention 7 janvier 2012
7 janv. 2012 à 02:40
Le programme se plante "dépassement de mémoire" un truc de ce genre
0
jenaimarre2fr
7 janv. 2012 à 12:52
BONJOUR,
voici un programme qui fonctionne bien, par contre il n'utilise pas d'allocation dynamique de mémoire

#include<stdio.h>
void main(void)
{
int nbrcol1,nbrcol2,nbrlign1,nbrlign2=1,i,j,k=1,som=0;
int A[10][10], B[10][10],C[10][10];
while(nbrcol1!=nbrlign2)
{
printf("donner le nombre de ligne de la matrice A\n");
scanf("%d",&nbrlign1);
printf("donner le nombre de colonne de la matrice A\n");
scanf("%d",&nbrcol1);
printf("donner le nombre de ligne de la matrice B\n");
scanf("%d",&nbrlign2);
printf("donner le nombre de colonne de la matrice B\n");
scanf("%d",&nbrcol2);
if(nbrcol1!=nbrlign2)
{
printf("ATTENTION: le nombre de colonne de la matricr A doit etre egale au nombre de ligne de la matrice B\n");
}
}

/*saisie des matrices*/
printf("A= \n");
for(i=0;i<nbrlign1;i++)
{
for(j=0;j<nbrcol1;j++)
{
printf("Entrer le %d element de la matrice A\n",k++);
scanf("%d",&A[i][j]);
}
}
k=1;
for(i=0;i<nbrlign2;i++)
{
for(j=0;j<nbrcol2;j++)
{
printf("Entrer le %d element de la matrice B\n",k++);
scanf("%d",&B[i][j]);
}
}

/* Affichage des matrices */
printf("A= \n");
for(i=0;i<nbrlign1;i++)
{
for(j=0;j<nbrcol1;j++)
{
printf(" %d ",A[i][j]);
}
printf("\n");
}
printf("B= \n");
for(i=0;i<nbrlign2;i++)
{
for(j=0;j<nbrcol2;j++)
{
printf(" %d ",B[i][j]);
}
printf("\n");
}
//Produit matriciel A*B

for(i=0;i<nbrcol2;i++)
{
for(j=0;j<nbrlign1;j++)
{
for(k=0;k<nbrcol1;k++)
{
som=som+A[j][k]*B[k][i];
}
C[j][i]=som;
som=0;
}
}
printf("C= \n");
for(i=0;i<nbrlign1;i++)
{
for(j=0;j<nbrcol2;j++)
{
printf(" %d ",C[i][j]);
}
printf("\n");
}
}
0
jenaimarre2fr
7 janv. 2012 à 13:25
RE,

en version un peu plus pro (en utilisant des fonctions)ça donnerait ça:
#include<stdio.h>

void affiche_matrice(int*,int,int);
void produit_matriciel(int*,int*,int*,int,int,int,int);
void saisie_matrice(int*,char*,int,int);
void main(void)
{
int nbrcol1,nbrcol2,nbrlign1,nbrlign2=1,i,j,k=1,som=0;
int A[10][10], B[10][10],C[10][10];
while(nbrcol1!=nbrlign2)
{
printf("donner le nombre de ligne de la matrice A\n");
scanf("%d",&nbrlign1);
printf("donner le nombre de colonne de la matrice A\n");
scanf("%d",&nbrcol1);
printf("donner le nombre de ligne de la matrice B\n");
scanf("%d",&nbrlign2);
printf("donner le nombre de colonne de la matrice B\n");
scanf("%d",&nbrcol2);
if(nbrcol1!=nbrlign2)
{
printf("ATTENTION: le nombre de colonne de la matricr A doit etre egale au nombre de ligne de la matrice B\n");
}
}

/*saisie des matrices*/
saisie_matrice(A,'A',nbrlign1,nbrcol1);
saisie_matrice(B,'B',nbrlign2,nbrcol2);
/* Affichage des matrices */
printf("A=\n");
affiche_matrice(A,nbrlign1,nbrcol1);
printf("B=\n");
affiche_matrice(B,nbrlign2,nbrcol2);
produit_matriciel(A,B,C,nbrlign1,nbrcol1,nbrlign2,nbrcol2);
printf("C=\n");
affiche_matrice(C,nbrlign1,nbrcol2);
}
// Debut de la fonction saisie_matrice
void saisie_matrice(int*Mat,char* c,int nbrl,int nbrc)
{
int i,j,k=1;
for(i=0;i<nbrl;i++)
{
for(j=0;j<nbrc;j++)
{
printf("Entrer le %d element de la matrice %c\n",k++,c);
scanf("%d",(Mat+i*10+j));
}
}
}






//Début de la fonction afficche_matrice

void affiche_matrice(int* Mat,int nbrl,int nbrc)
{
int i,j;
for(i=0;i<nbrl;i++)
{
for(j=0;j<nbrc;j++)
{
printf(" %d ",*(Mat+i*10+j));
}
printf("\n");
}
}

//Début de la fonction produit_matriciel
void produit_matriciel(int*A,int*B,int*C,int nbrlign1,int nbrcol1,int nbrlign2,int nbrcol2)
{
int i,j,k,som=0;
for(i=0;i<nbrcol2;i++)
{
for(j=0;j<nbrlign1;j++)
{
for(k=0;k<nbrcol1;k++)
{
som=som+(*(A+j*10+k))*(*(B+k*10+i));
}
*(C+j*10+i)=som;
//printf("%d \n",som);
som=0;
}
}
}
0
reda4211 Messages postés 3 Date d'inscription vendredi 6 janvier 2012 Statut Membre Dernière intervention 7 janvier 2012
7 janv. 2012 à 13:59
Oui ça je l'ai compris Mais ce que je demande c'est le programme qui fait le produit de deux matrice on utilisant l'allocation dynamique Bah voila avec cette méthode ça marche (si vous avez d'autre solution n'hésitez pas à les mettre ici Merci d avance ) LES VALEURS des deux matrices sont initialisé à 2


#include <stdio.h>
#include <stdlib.h>

int **produit(int l1,int c1,int **m1,int l2,int c2,int **m2)
{
int i,j,k;
int **m=(int **)malloc(l1*sizeof(int*));
for(i=0;i<l1;i++)
{
*(m+i)=(int *)malloc(c2*sizeof(int));
}
for(i=0;i<l1;i++)
for(j=0;j<c2;j++)
{
*(*(m+i)+j)=0;
for(k=0;k<c1;k++)
*(*(m+i)+j)+=*(*(m1+i)+k)*(*(*(m2+k)+j));
}
return (m);
}

void affich(int**t,int l,int c){
int i,j;
for(i=0;i<l;i++){
for (j=0;j<c;j++)
printf("%d\t",*(*(t+i)+j));
printf("\n");
}}

main(){
int l1,c1,l2,c2,**mat1,**mat2,**pro,i,j;
printf("donner l1\n");
scanf("%d",&l1);
printf("donner c1\n");
scanf("%d",&c1);
printf("donner lé\n");
scanf("%d",&l2);
printf("donner c2\n");
scanf("%d",&c2);
mat1=(int**)malloc(l1*sizeof(int*));
for(i=0;i<l1;i++)
*(mat1+i)=(int*)malloc(c1*sizeof(int));
for(i=0;i<l1;i++)
for(j=0;j<c1;j++)
*(*(mat1+i)+j)=2;
mat2=(int**)malloc(l2*sizeof(int*));
for(i=0;i<l2;i++)
*(mat2+i)=(int*)malloc(c2*sizeof(int));
for(i=0;i<l2;i++)
for(j=0;j<c2;j++)
*(*(mat2+i)+j)=2;
affich(mat1,l1,c1);
printf("\n");
printf("\n");
affich(mat2,l2,c2);
printf("le produit est :\n");
printf("\n");
printf("\n");
pro=produit(l1,c1,mat1,l2,c2,mat2);
affich(pro,l1,c2);
system("pause");
return(0);
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jenaimarre2fr
7 janv. 2012 à 16:27
RE
voici ma version de programme avec allocation dynamique

#include<stdio.h>
#include<stdlib.h>

void affiche_matrice(int*,int,int);
void produit_matriciel(int*,int*,int*,int,int,int,int);
void saisie_matrice(int*,char*,int,int);
void main(void)
{
int nbrcol1,nbrcol2,nbrlign1,nbrlign2=1,i,j,k=1,som=0;
//int A[10][10], B[10][10],C[10][10];
int *A,*B,*C;
while(nbrcol1!=nbrlign2)
{
printf("donner le nombre de ligne de la matrice A\n");
scanf("%d",&nbrlign1);
printf("donner le nombre de colonne de la matrice A\n");
scanf("%d",&nbrcol1);

//allaocation dynamique pour A
A=(char*)malloc(nbrlign1*nbrcol1*sizeof(char) );
if ( A == NULL )
{
fprintf(stderr,"Allocation impossible \n");
exit(EXIT_FAILURE);
}


printf("donner le nombre de ligne de la matrice B\n");
scanf("%d",&nbrlign2);
printf("donner le nombre de colonne de la matrice B\n");
scanf("%d",&nbrcol2);

//allaocation dynamique pour B
B=(char*)malloc(nbrlign2*nbrcol2*sizeof(char) );
if ( B == NULL )
{
fprintf(stderr,"Allocation impossible \n");
exit(EXIT_FAILURE);
}


//allaocation dynamique pour C
C=(char*)malloc(nbrlign2*nbrcol2*sizeof(char) );
if ( C == NULL )
{
fprintf(stderr,"Allocation impossible \n");
exit(EXIT_FAILURE);
}


if(nbrcol1!=nbrlign2)
{
printf("ATTENTION: le nombre de colonne de la matricr A doit etre egale au nombre de ligne de la matrice B\n");
//liberer les mémoire
free(A);
free(B);
free(C);
}

}
/*saisie des matrices*/
saisie_matrice(A,'A',nbrlign1,nbrcol1);
saisie_matrice(B,'B',nbrlign2,nbrcol2);
/* Affichage des matrices */
printf("A=\n");
affiche_matrice(A,nbrlign1,nbrcol1);
printf("B=\n");
affiche_matrice(B,nbrlign2,nbrcol2);
produit_matriciel(A,B,C,nbrlign1,nbrcol1,nbrlign2,nbrcol2);
printf("C=\n");
affiche_matrice(C,nbrlign1,nbrcol2);
//liberation des mémoires
free(A);
free(B);
free(C);

}
// Debut de la fonction saisie_matrice
void saisie_matrice(int*Mat,char* c,int nbrl,int nbrc)
{
int i,j,k=1;
for(i=0;i<nbrl;i++)
{
for(j=0;j<nbrc;j++)
{
printf("Entrer le %d element de la matrice %c\n",k++,c);
scanf("%d",(Mat+i*10+j));
}
}
}






//Début de la fonction afficche_matrice

void affiche_matrice(int* Mat,int nbrl,int nbrc)
{
int i,j;
for(i=0;i<nbrl;i++)
{
for(j=0;j<nbrc;j++)
{
printf(" %d ",*(Mat+i*10+j));
}
printf("\n");
}
}

//Début de la fonction produit_matriciel
void produit_matriciel(int*A,int*B,int*C,int nbrlign1,int nbrcol1,int nbrlign2,int nbrcol2)
{
int i,j,k,som=0;
for(i=0;i<nbrcol2;i++)
{
for(j=0;j<nbrlign1;j++)
{
for(k=0;k<nbrcol1;k++)
{
som=som+(*(A+j*10+k))*(*(B+k*10+i));
}
*(C+j*10+i)=som;
//printf("%d \n",som);
som=0;
}
}
}
0