Menu

Somme et produit de deux matrices carrées [Résolu/Fermé]

Messages postés
7
Date d'inscription
samedi 17 janvier 2015
Statut
Membre
Dernière intervention
4 avril 2015
-
bonjour,
j'ai un souci avec l'éxécution de mon programme.
Lorsque je compile, j'ai pas d'erreur mais quand j'éxécute, ça plante! J'aimerai un éclaircissement sur ce problème. Je vous passe le code:

#include <stdio.h>
#include <stdlib.h>
#define NL 50
#define NC 50

//* Déclaration des sous programmes *//
void AfficheMatrice(int n, int **A)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        printf("\n");
        for(j=0;j<n;j++)
        {
            printf("%d \t",A[i][j]);
        }
    }
}
void SommeDeMatrices(int n, int **A, int **B, int **D)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;i<n;j++)
        {
            D[i][j] = A[i][j]+B[i][j];
        }
    }
    AfficheMatrice(n,D);
}
int scalaire(int n, int i, int j, int **A, int **B)
{
    int S,k;
    S=0;
    for(k=0;k<n;k++)
    {
        S=S+A[i][k]*B[k][j];
    }
    return S;
}
void ProduitDeMatrices(int n, int **A, int **B, int **C)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            C[i][j]=scalaire(n,i,j,A,B);
        }
    }
    AfficheMatrice(n,C);
}
void LectureMatrice(int n, int **A)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        printf("entrez les elements de la %d ieme ligne\n",i);
        for(j=0;j<n;j++)
        {
           scanf("%d ",&A[i][j]);
        }
    }
}
int main()
{
    int **A[NL][NC];
    int **B[NL][NC];
    int **D[NL][NC];
    int **C[NL][NC];
    int n;
    printf("entrez la taille des deux matrices carrees\n");
    scanf("%d",&n);
    LectureMatrice(n,**A);
    LectureMatrice(n,**B);
    SommeDeMatrices(n,**A,**B,**D);
    ProduitDeMatrices(n,**A,**B,**C);
    return 0;
}


EDIT: Ajout de la coloration syntaxique.
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1586
3
Merci
Bonsoir,

Remarques de fond :
int **A[NL][NC];
Tu veux une matrice, donc tu as besoin de 2 dimensions. Pourquoi faire un tableau de pointeur sur pointeur ?
Donc, mets plutôt :
int A[NL][NC];

De même pour B et C.

LectureMatrice(n,**A);
Vu la remarque précédente, il faut corriger en A.
De même pour B et C.
Idem pour : SommeDeMatrices(n,**A,**B,**D); et ProduitDeMatrices(n,**A,**B,**C);

N'oublie pas de mettre un '\n' juste avant le return 0; final pour flusher la sortie écran.

Sinon la vraie erreur vient probablement d'ici :
void LectureMatrice(int n, int **A)
Il faut préciser la taille des colonnes à minima.
Donc plutôt : <code c>void LectureMatrice(int n, int A[][NC]);
Note : tu peux préciser le nombre de lignes aussi, mais c'est facultatif.
Même remarque pour le prototype des autres fonctions.

Cdlt,

Dire « Merci » 3

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 54723 internautes nous ont dit merci ce mois-ci

Arnaud3198
Messages postés
7
Date d'inscription
samedi 17 janvier 2015
Statut
Membre
Dernière intervention
4 avril 2015
-
merci beaucoup mais je comprends pas ce que tu appelles "flusher la sortie écran" et j'aimerai avoir un code c pour flusher
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1586 -
Flusher signifie purger. L'idée est de s'assurer que tout soit afficher. Tu peux mettre printf("\n");
-
merci beaucoup pour cette solution
Messages postés
611
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
35
0
Merci
Bonjour,
En plus des remarques de @fiddy, ton programme n'a besoin en réalité que de deux matrices la troisième, est optionnel car pour moi, elle ne sert pas à grand-chose ( uniquement pour le résultat, ce qui justifie également la conservation des données de la première matrice).
Plus encore, tu n'as pas besoin de définir une valeur pour la colonne et une valeur pour la ligne
#define NL 50
#define NC 50

une seule constante de la variable suffit
 #define MAX 50 
pour être utilisé a la fois comme colonne & ligne.
Et pour finir, suit les remarques de @fiddy comme il te la indiquer, utilise les syntaxes simples comme dans sont exemple et si tu comptes utilises les pointeurs cela te donnera l'exemple suivant:
#include <stdio.h>
#include <stdlib.h>

#if defined(WIN32) && !defined(UNIX)
	#define CLEAR system("cls")
#elif defined(UNIX) && !defined(WIN32)
	#define CLEAR printf("\033[H\033[2J")
#else
	#define CLEAR printf("\033[H\033[2J")
#endif

#define	MAX	8
#define NBR_A	2
#define NBR_B	4

void f_Reset( void ){

	printf( "\t<taper sur entrer>" );
	while( getchar() !='\n' )
		;
	CLEAR;
}

void f_AffchMatrice( int **p, const char *x ){

	unsigned int i = 0;
	unsigned int j = 0;
	printf( "\t*MATRICE( %s )\n\n", x );
	for( i = 0; i < MAX ; i++){
		printf( "%4d|\t",i );
		for( j = 0; j < MAX; j++ ){
			printf( "%d\t", (*(*(p+i)+j)) );
		}
		printf( "\n" );
	}
	f_Reset();
}

int *pf_Alloc( const size_t size ){

	int *p = NULL;
	p = (int*)calloc( size, sizeof(int) );
	if( p == NULL ){
		return ( p );
	}
	return ( p );
}

void f_ProduitMatrice_2( int **p ){

	unsigned int i = 0;
	unsigned int j = 0;
	for( i = 0; i < MAX; i++ ){
		for( j = 0; j < MAX; j++ ){
			(*(*(p+i)+j)) *= (*(*(p+i)+j));
		}
	}
}

void f_ProduitMatrice( int **p1, int **p2 ){

	unsigned int i = 0;
	unsigned int j = 0;
	for( i = 0; i < MAX; i++){
		for( j = 0; j < MAX; j++ ){
			(*(*(p1+i)+j)) = ( (*(*(p1+i)+j)) * (*(*(p2+i)+j)) );
		}
	}
}

unsigned long f_Scalaire( int **p1, int **p2 ){

	unsigned int i = 0;
	unsigned int j = 0;
	unsigned long s = 0;
	#define UL unsigned long
	for( i = 0; i < MAX; i++ ){
		for( j = 0; j <MAX; j++ ){
			s += (UL)( (*(*(p1+i)+j)) * (*(*(p2+i)+j)) );
		}
	}
	return ( s );
}

void f_SommeMatrice( int **p1, int **p2, const char *x ){
	unsigned int i = 0;
	unsigned int j = 0;
	for( i = 0; i < MAX; i++ ){
		for( j = 0; j < MAX; j++ ){
			( (p1[i][j]) += (p2[i][j]) );
		}
	}
	f_AffchMatrice(p1,x);
}


void f_RemplirMatrice( int **p , const int x, const char *y ){

	unsigned int i = 0;
	unsigned int j = 0;
	printf( "\t( %s ) = %d\n\n", y, x );
	for( i = 0; i < MAX; i++ ){
		for( j = 0; j < MAX; j++ ){
			( (p[i][j]) = x );
		}
	}
	f_AffchMatrice(p,y);
}

/*	Free memoire	*/
void f_FreeMatrice( int **p ){

	unsigned int i = 0;
	for( i = 0; i < MAX; i++ ){
		free( *(p+i) );
	}
	free( p );
}

int main( void ){

	unsigned int i = 0;
	static int **pM_A = NULL;
	static int **pM_B = NULL;

	pM_A = (int**)calloc( MAX, sizeof(int*) );
	pM_B = (int**)calloc( MAX, sizeof(int*) );
	for( i = 0; i < MAX; i++ ){
		*(pM_A+i) = pf_Alloc( MAX );
		*(pM_B+i) = pf_Alloc( MAX );
	}

	CLEAR;
	printf("\tINIT (pM_A & pM_B) = ( 0 )\n");
	f_Reset();
	f_AffchMatrice( pM_A, "pM_A" );
	f_AffchMatrice( pM_B, "pM_B" );

	f_RemplirMatrice( pM_A, NBR_A , "pM_A" );
	f_RemplirMatrice( pM_B, NBR_B , "pM_B" );

	printf( "\tSCALAIRE (pM_A & pM_B) = %6ld\n", f_Scalaire( pM_A, pM_B) );
	f_Reset();

	printf( "\t SOMME (pM_A + pM_B)\n" );
	f_Reset();
	f_SommeMatrice( pM_A, pM_B, "pM_A" );

	f_RemplirMatrice( pM_A, NBR_A , "pM_A" );
	printf( "\tPRODUIT pM_A & pM_B\n" );
	f_ProduitMatrice( pM_A, pM_B );
	f_AffchMatrice( pM_A, "pM_A" );

	f_RemplirMatrice( pM_A, MAX , "pM_A" );
	printf( "\tMATRICE² (pM_A)²\n" );
	f_ProduitMatrice_2( pM_A );
	f_AffchMatrice( pM_A, "pM_A" );

	printf( "\tFREE MATRICE\n" );
	f_FreeMatrice( pM_A );
	f_FreeMatrice( pM_B );
	f_Reset();

	return( EXIT_SUCCESS );
}


à bientôt
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1586 -
Ca ne limite pas le tableau au fichier... Tu confonds certainement avec l'utilisation de static devant les noms de fonction...
Là, ton tableau est limité au main().
Arnaud3198
Messages postés
7
Date d'inscription
samedi 17 janvier 2015
Statut
Membre
Dernière intervention
4 avril 2015
> fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
Fiddy merci vraiment pour ton aide la compilation est sans erreur mais mon gros problème c'est l'éxécution! ça plante toujours! :(
ma procédure LectureMatrice donne bien mais après ça plante je sais pas pourquoi?!

#include <stdio.h>
#include <stdlib.h>
#define NL 50
#define NC 50

//* Déclaration des sous programmes *//
void AfficheMatrice(int n, int C[][NC])
{
int i,j;
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<n;j++)
{
printf("%d \t",C[i][j]);
}
}
}
void SommeDeMatrices(int n, int A[][NC], int B[][NC], int D[][NC])
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;i<n;j++)
{
D[i][j] = A[i][j]+B[i][j];
}
}
}
void ProduitDeMatrices(int n, int A[][NC], int B[][NC], int C[][NC])
{
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
C[i][j]=0;
for(k=0;k<n;k++)
{
C[i][j]=C[i][j]+A[i][k]*B[k][j];
}
}
}
}
void LectureMatrice(int n, int E[][NC])
{
int i,j;
for(i=0;i<n;i++)
{
printf("entrez les elements de la %d ieme ligne\n",i);
for(j=0;j<n;j++)
{
scanf("%d",&E[i][j]);
}
}
}
int main()
{
int X[NL][NC];
int Y[NL][NC];
int Z[NL][NC];
int U[NL][NC];
int n;
printf("entrez la taille des deux matrices carrees\n");
scanf("%d",&n);
//* Première Matrice *//
LectureMatrice(n,X);
//* Deuxième Matrice *//
LectureMatrice(n,Y);
SommeDeMatrices(n,X,Y,Z);
ProduitDeMatrices(n,X,Y,U);
printf("la somme des deux matrices donne: \n");
AfficheMatrice(n,Z);
printf("le produit des deux matrices donne: \n");
AfficheMatrice(n,U);
printf("\n");
return 0;
}
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1586 > Arnaud3198
Messages postés
7
Date d'inscription
samedi 17 janvier 2015
Statut
Membre
Dernière intervention
4 avril 2015
-
Arnaud3198,
Tu as oublié d'utiliser la balise "code c" (cf. mon premier post).
Sinon, l'erreur vient probablement de :
for(j=0;i<n;j++) 
dans SommeDeMatrices().
Tu as mis i au lieu de j => j<n
Arnaud3198
Messages postés
7
Date d'inscription
samedi 17 janvier 2015
Statut
Membre
Dernière intervention
4 avril 2015
> fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
Grand merci!!
tout donne :)
sambia39
Messages postés
611
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
35 -
au tant pour moi ;)