[c] matrice débutant
Résolu/Fermé
Flow31-
Messages postés
84
Date d'inscription
mardi 20 mai 2008
Statut
Membre
Dernière intervention
10 avril 2013
-
20 mai 2008 à 16:49
kanabson - 28 mai 2011 à 01:53
kanabson - 28 mai 2011 à 01:53
11 réponses
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
20 mai 2008 à 17:32
20 mai 2008 à 17:32
deja sa m'etonne que ta fonction entrematcarre() fonctionne tu dis que tu utilise des matrice carré et tu lui donnes pas en argument un tableau 2D...
moi je verrais plutot ta fonction comme ça
moi je verrais plutot ta fonction comme ça
void entrermatcarre(int **pmat,int p) { /*Matrice*/ int i,j; /*j : colonne*/ /*i : ligne*/ printf("\n\nEntrez les composantes de votre matrice : "); for(i=0;i<p;i++) { for (j=0;j<p;j++) { printf("\n\nSaisissez la composante (nombre entier) %d de la colonne X %d : ",(i+1),(j+1)); scanf("%d",&pmat[i][j]); printf("\nVotre composante %d de la colonne %d : %d",(i+1),(j+1),pmat[i][j]); } } }et pour ecrire ta matrice
void ecrirematcarre(int **mat,int p) { int i,j; printf("\n\nValeur de votre matrice : "); for (i=0;i<p;i++) { for(j=0;j<p;j++) { printf("%d ",pmat[i][j]; } printf("\n"); } }
Utilisateur anonyme
20 mai 2008 à 17:38
20 mai 2008 à 17:38
Tu peux aussi gérer une matrice par un simple tableau comme suit :
#include <stdio.h> #include <stdlib.h> void entrermatcarre(int *pmat,int p) { int i, j, cpt; printf("\n\nEntrez les composantes de votre matrice : "); cpt = 0; for(j=0;j<p;j++){ for (i=0;i<p;i++){ printf("\n\nSaisissez la composante (nombre entier) %d de la colonne X %d : ",(i+1),(j+1)); scanf("%d",&pmat[cpt++]); printf("\nVotre composante %d de la colonne %d : %d\n",(i+1),(j+1),*(pmat+i)); } } } void ecrirematcarre(int *mat,int p) { int i, j; printf("Affichage \n"); for(i=0; i<p-1;i+=2) printf("%d\t", mat[i]); printf("\n"); for(j=1;j<p;j+=2) printf("%d\t", mat[j]); printf("\n"); } int main(int argc, char *argv[]) { int *mat; mat = (int *)calloc(4, sizeof(int)); entrermatcarre(mat, 2); ecrirematcarre(mat, 4); system("PAUSE"); return 0; }A toi de choisir ;-)
Flow31-
Messages postés
84
Date d'inscription
mardi 20 mai 2008
Statut
Membre
Dernière intervention
10 avril 2013
10
22 mai 2008 à 09:55
22 mai 2008 à 09:55
et hop, encore un long message.... pour mype, voici ce qu'il me dit et ce que j'ai fait :
void entrermatcarre(int *pmat[10][10],int p)
{
/*Matrice*/
int i,j;
/*j : colonne*/
/*i : ligne*/
printf("\n\nEntrez les composantes de votre matrice : ");
for(i=0;i<p;i++)
{
for (j=0;j<p;j++)
{
printf("\n\nSaisissez la composante (nombre entier) %d de la colonne X %d : ",(i+1),(j+1));
scanf("%d",&pmat[i][j]);
printf("\nVotre composante %d de la colonne %d : %d",(i+1),(j+1),pmat[i][j]);
}
}
}
void ecrirematcarre(int *mat[10][10],int p)
{
int i,j;
printf("\n\nValeur de votre matrice : ");
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
printf("%d",*mat[i][j]);
}
printf("\n");
}
}
avec ce main ;
int main (void) /*Prototype de la fonction main*/
{
/*Declaration des variables */
int n,re;
int *M[10][10];
/*Declaration les fonctions utilisees (prototype) par la fonction main */
int taillematrice(void);
void entrermatcarre(int *pmat[10][10],int p);
void ecrirematcarre(int *mat[10][10],int p);
/*Initialisation des variables*/
/*saisie par scanf et verification des variables*/
do
{
n=taillematrice();
entrermatcarre(&M[0][0],n);
ecrirematcarre(&M[0][0],n);
/*traitement des donnees - calcul divers*/
/*edition des donnees par printf*/
do
{
printf("\n\nVoulez vous relancez le programme ?");
printf("\ntappez 1 pour oui et 0 pour non : ");
scanf("%d",&re);
}
while(re<0||re>1);
}
while(re==1);
return 0;
}
il me met : passage de l'argument 1 "ecrirematcarre" d'un type pointeur incompatible. meme erreur pour entrermatcarre
et Tassin, je vais bientôt tester ton message :), je suis un peu long je sais! je vous tien au courant :)
void entrermatcarre(int *pmat[10][10],int p)
{
/*Matrice*/
int i,j;
/*j : colonne*/
/*i : ligne*/
printf("\n\nEntrez les composantes de votre matrice : ");
for(i=0;i<p;i++)
{
for (j=0;j<p;j++)
{
printf("\n\nSaisissez la composante (nombre entier) %d de la colonne X %d : ",(i+1),(j+1));
scanf("%d",&pmat[i][j]);
printf("\nVotre composante %d de la colonne %d : %d",(i+1),(j+1),pmat[i][j]);
}
}
}
void ecrirematcarre(int *mat[10][10],int p)
{
int i,j;
printf("\n\nValeur de votre matrice : ");
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
printf("%d",*mat[i][j]);
}
printf("\n");
}
}
avec ce main ;
int main (void) /*Prototype de la fonction main*/
{
/*Declaration des variables */
int n,re;
int *M[10][10];
/*Declaration les fonctions utilisees (prototype) par la fonction main */
int taillematrice(void);
void entrermatcarre(int *pmat[10][10],int p);
void ecrirematcarre(int *mat[10][10],int p);
/*Initialisation des variables*/
/*saisie par scanf et verification des variables*/
do
{
n=taillematrice();
entrermatcarre(&M[0][0],n);
ecrirematcarre(&M[0][0],n);
/*traitement des donnees - calcul divers*/
/*edition des donnees par printf*/
do
{
printf("\n\nVoulez vous relancez le programme ?");
printf("\ntappez 1 pour oui et 0 pour non : ");
scanf("%d",&re);
}
while(re<0||re>1);
}
while(re==1);
return 0;
}
il me met : passage de l'argument 1 "ecrirematcarre" d'un type pointeur incompatible. meme erreur pour entrermatcarre
et Tassin, je vais bientôt tester ton message :), je suis un peu long je sais! je vous tien au courant :)
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
22 mai 2008 à 16:17
22 mai 2008 à 16:17
ton main n'est pas correct c'est pour ça...
essaye comme ça
essaye comme ça
void entrermatcarre(int **pmat,int p) { /*Matrice*/ int i,j; /*j : colonne*/ /*i : ligne*/ printf("\n\nEntrez les composantes de votre matrice : "); for(i=0;i<p;i++) { for (j=0;j<p;j++) { printf("\n\nSaisissez la composante (nombre entier) %d de la colonne X %d : ",(i+1),(j+1)); scanf("%d",&pmat[i][j]); printf("\nVotre composante %d de la colonne %d : %d",(i+1),(j+1),pmat[i][j]); } } } void ecrirematcarre(int **mat,int p) { int i,j; printf("\n\nValeur de votre matrice : "); for (i=0;i<p;i++) { for(j=0;j<p;j++) { printf("%d ",pmat[i][j]; } printf("\n"); } } int main (void) /*Prototype de la fonction main*/ { /*Declaration des variables */ int n,re; int M[10][10]; /*Declaration les fonctions utilisees (prototype) par la fonction main */ int taillematrice(void); void entrermatcarre(int pmat[10][10],int p); void ecrirematcarre(int mat[10][10],int p); /*Initialisation des variables*/ /*saisie par scanf et verification des variables*/ do { n=taillematrice(); entrermatcarre(M,n); ecrirematcarre(M,n); /*traitement des donnees - calcul divers*/ /*edition des donnees par printf*/ do { printf("\n\nVoulez vous relancez le programme ?"); printf("\ntappez 1 pour oui et 0 pour non : "); scanf("%d",&re); } while(re<0||re>1); } while(re==1); return 0; }
Flow31-
Messages postés
84
Date d'inscription
mardi 20 mai 2008
Statut
Membre
Dernière intervention
10 avril 2013
10
23 mai 2008 à 16:47
23 mai 2008 à 16:47
ça marche!! Merci Mype et Tassin :)
je ne mets pas ce sujet "résolu" car je vais bientôt avoir d'autres questions, merci de votre compréhension les modos.
je ne mets pas ce sujet "résolu" car je vais bientôt avoir d'autres questions, merci de votre compréhension les modos.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Flow31-
Messages postés
84
Date d'inscription
mardi 20 mai 2008
Statut
Membre
Dernière intervention
10 avril 2013
10
26 mai 2008 à 16:47
26 mai 2008 à 16:47
Bonjour,
mon new problème est de multiplier 2 matrices entre elles. (toujours en c)
voici mon début :
void matcarparmatcar(int mat[10][10],int pat[10][10], int rat[10][10],int p)
{
int i,j;
printf("\n\nMultiplication de deux matrices carres ");
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
rat[i][j]=(mat[i][j]*pat[i][j]);
}
return;
}
mais là je n'ai que la premiere composante du produit matriciel sur les 3 (je fais mes tests avec un ordre 3)
mon ancienne ligne était : rat[i][j]=(mat[i][j]*pat[i][j]+mat[i+1][j+1]*pat[i+1][j+1]+mat[i+2][j+2]*pat[i+2][j+2]) et elle est fausse mais je n'arrive pas à trouver la réponse ;
j'ai vu sur le forum des allusions à des alloc( ou des m_alloc() , pourrai-ton m'expliquer? Merci d'avance...
mon new problème est de multiplier 2 matrices entre elles. (toujours en c)
voici mon début :
void matcarparmatcar(int mat[10][10],int pat[10][10], int rat[10][10],int p)
{
int i,j;
printf("\n\nMultiplication de deux matrices carres ");
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
rat[i][j]=(mat[i][j]*pat[i][j]);
}
return;
}
mais là je n'ai que la premiere composante du produit matriciel sur les 3 (je fais mes tests avec un ordre 3)
mon ancienne ligne était : rat[i][j]=(mat[i][j]*pat[i][j]+mat[i+1][j+1]*pat[i+1][j+1]+mat[i+2][j+2]*pat[i+2][j+2]) et elle est fausse mais je n'arrive pas à trouver la réponse ;
j'ai vu sur le forum des allusions à des alloc( ou des m_alloc() , pourrai-ton m'expliquer? Merci d'avance...
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
26 mai 2008 à 17:34
26 mai 2008 à 17:34
pas besoin d'utiliser des malloc puisse que tu as déclaré tes matrices en statique il faut que tu utilise une troisieme boucle et ne pas oublié d'initialisé la matrice du resultat aussi avant
essaye ça
essaye ça
void matcarparmatcar(int mat[10][10],int pat[10][10], int rat[10][10],int p) { int i,j,k; for(i=0;i<p;i++) for(i=0;i<p;i++) rat[i][j]=0; printf("\n\nMultiplication de deux matrices carres "); for (i=0;i<p;i++) { for(j=0;j<p;j++) { for(k=0;k<p;k++){ rat[i][j]+=mat[i][k]*pat[k][j];} } } return; }
Flow31-
Messages postés
84
Date d'inscription
mardi 20 mai 2008
Statut
Membre
Dernière intervention
10 avril 2013
10
27 mai 2008 à 10:06
27 mai 2008 à 10:06
RE bonjour,
oui j'ai vu l'idée c'est génial mais je ne comprends pas pourquoi ça ne marche pas, j'ai fait le test à la main en bougeant les variables et ça devrait marcher mais je n'y arrive toujours pas :/
void matcarparmatcar(int mat[10][10],int pat[10][10], int rat[10][10],int p)
{
int i,j,k;
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
rat[i][j]=0;
}
}
printf("\n\nMultiplication de vos deux matrices carres :A*B ");
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
for(k=0;k<p;k++)
{
/* += : additionne 2 valeurs et la stocke dans la variable de gauche */
rat[i][j]+=mat[i][k]*pat[k][j];
}
}
}
return;
}
oui j'ai vu l'idée c'est génial mais je ne comprends pas pourquoi ça ne marche pas, j'ai fait le test à la main en bougeant les variables et ça devrait marcher mais je n'y arrive toujours pas :/
void matcarparmatcar(int mat[10][10],int pat[10][10], int rat[10][10],int p)
{
int i,j,k;
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
rat[i][j]=0;
}
}
printf("\n\nMultiplication de vos deux matrices carres :A*B ");
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
for(k=0;k<p;k++)
{
/* += : additionne 2 valeurs et la stocke dans la variable de gauche */
rat[i][j]+=mat[i][k]*pat[k][j];
}
}
}
return;
}
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
27 mai 2008 à 17:13
27 mai 2008 à 17:13
jpense que c'est bon...
pour quoi ça marche pas ? quelle erreur ?
poste ton main aussi le probleme doit venir de là
pour quoi ça marche pas ? quelle erreur ?
poste ton main aussi le probleme doit venir de là
Flow31-
Messages postés
84
Date d'inscription
mardi 20 mai 2008
Statut
Membre
Dernière intervention
10 avril 2013
10
27 mai 2008 à 17:25
27 mai 2008 à 17:25
en fait, la fonction suivante marche, allé savoir pourquoi :/ ...
void matcarparmatcar(int mat[10][10],int pat[10][10], int rat[10][10],int p)
{
int i,j,k;
int s;
printf("\n\nMultiplication de vos deux matrices carres :A*B ");
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
s=0;
for(k=0;k<p;k++)
{
/* += : additionne 2 valeurs et la stocke dans la variable de gauche */
s+=mat[i][k]*pat[k][j];
}
rat[i][j]=s;
}
}
return;
}
void matcarparmatcar(int mat[10][10],int pat[10][10], int rat[10][10],int p)
{
int i,j,k;
int s;
printf("\n\nMultiplication de vos deux matrices carres :A*B ");
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
s=0;
for(k=0;k<p;k++)
{
/* += : additionne 2 valeurs et la stocke dans la variable de gauche */
s+=mat[i][k]*pat[k][j];
}
rat[i][j]=s;
}
}
return;
}
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
27 mai 2008 à 17:47
27 mai 2008 à 17:47
ben tout est bon jpense que tu te trompe dans ton calcul...
j'ai testé avec le premier exemple de ce site et j'obtiens le bon resultat...
j'ai testé avec le premier exemple de ce site et j'obtiens le bon resultat...
Flow31-
Messages postés
84
Date d'inscription
mardi 20 mai 2008
Statut
Membre
Dernière intervention
10 avril 2013
10
27 mai 2008 à 17:58
27 mai 2008 à 17:58
surement un problème de comptabilité avec mon logiciel, j'utilise "grasp" sous linux...
Flow31-
Messages postés
84
Date d'inscription
mardi 20 mai 2008
Statut
Membre
Dernière intervention
10 avril 2013
10
27 mai 2008 à 18:17
27 mai 2008 à 18:17
je veux multiplier 3 matrices entre elles :
void produit3matcar (int mat[10][10],int pat[10][10], int rat[10][10],int qat[10][10],int p)
{
int i,j,k,s;
int r[10][10];
void matcarparmatcar(int mat[10][10],int pat[10][10], int rat[10][10],int p);
matcarparmatcar(mat,pat,r,p);
matcarparmatcar(r,rat,qat,p);
return;
}
je n'ai pas le droit d'utiliser des fonctions dans des fonctions ?!
void produit3matcar (int mat[10][10],int pat[10][10], int rat[10][10],int qat[10][10],int p)
{
int i,j,k,s;
int r[10][10];
void matcarparmatcar(int mat[10][10],int pat[10][10], int rat[10][10],int p);
matcarparmatcar(mat,pat,r,p);
matcarparmatcar(r,rat,qat,p);
return;
}
je n'ai pas le droit d'utiliser des fonctions dans des fonctions ?!
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
27 mai 2008 à 18:20
27 mai 2008 à 18:20
ben si...
Flow31-
Messages postés
84
Date d'inscription
mardi 20 mai 2008
Statut
Membre
Dernière intervention
10 avril 2013
10
4 juin 2008 à 17:32
4 juin 2008 à 17:32
Tout marche merci
une question : j'ai un petit problème à propos d'un if
en fait je veux comparer 2 matrices : une matrice et sa transposée pour pouvoir vérifier si elle est symétrique (il faut que A^-1=A.
voici ma fonction :
void matcarsym (int mat[10][10],int p)
{
printf("\n\nVerification de la symetrie de la matrice ");
int pat[10][10],i,j;
void transposecar(int mat[10][10],int pat[10][10],int p);
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
pat[i][j]=0;
}
}
transposecar(mat,pat,p);
if ( for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
pat[i][j]=0;
||
}
}
)
{
printf("\n\nVotre matrice est symetrique : A-1 = A ");
}
else
{
printf("\n\nVotre matrice n'est pas symetrique. ");
}
return;
}
merci d'avance xd
une question : j'ai un petit problème à propos d'un if
en fait je veux comparer 2 matrices : une matrice et sa transposée pour pouvoir vérifier si elle est symétrique (il faut que A^-1=A.
voici ma fonction :
void matcarsym (int mat[10][10],int p)
{
printf("\n\nVerification de la symetrie de la matrice ");
int pat[10][10],i,j;
void transposecar(int mat[10][10],int pat[10][10],int p);
for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
pat[i][j]=0;
}
}
transposecar(mat,pat,p);
if ( for (i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
pat[i][j]=0;
||
}
}
)
{
printf("\n\nVotre matrice est symetrique : A-1 = A ");
}
else
{
printf("\n\nVotre matrice n'est pas symetrique. ");
}
return;
}
merci d'avance xd
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
4 juin 2008 à 17:51
4 juin 2008 à 17:51
tu peux utiliser un booleen pour voir si t'es matrice sont identique ensuite tu l'utilise dans le if
int symetrique=1; for(i=0;i<p;i++) { for(j=0;j<p;j++) { if(mat[i][j]!=pat[i][j]) symetrique=0; } } if(symetrique==1) { printf("\n\nVotre matrice est symetrique : A-1 = A "); } else { printf("\n\nVotre matrice n'est pas symetrique. "); } return;