[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
Bonjour tout le monde,

j'utilise le c et non le c++.

Mes matrices sont des matrices carrés allant de 2 a 10.

j'arrive à bien rentrer les nombres dedant avec :


void entrermatcarre(int *pmat,int p) {
/*Matrice*/
int i,j;
/*j : colonne*/
/*i : ligne*/
printf("\n\nEntrez les composantes de votre matrice : ");
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+i);
printf("\nVotre composante %d de la colonne %d : %d",(i+1),(j+1),*(pmat+i));
}
}
return;
}


mais j'ai un gros problème pour afficher tout simplement les matrices en entier , voici mes essais :


void ecrirematcarre(int *mat,int p)
{
if (p==2)
{
/*affichage d'une matrice carre d'ordre 2*/
printf("\n\nValeur de votre matrice : ");
for (i=0;i<(p-1);i++)

for(j=0;j<(p-1);j++)
{

{
printf("\n%d %d",*(mat+j),*(mat+j+1));

}
}
}

ou encore

void ecrirematcarre(int *mat[i][j],int p)
{
/* affichage ligne par ligne*/
int i,j;
if (p==2)
{
/*affichage d'une matrice carre d'ordre 2*/
printf("\n\nValeur de votre matrice : ");

for(i=0;i<(p-1);i++)
{
for(j=0;j<(p-1);j++)
{
printf("\n%d",*mat[i][j]);
}
}
}
}


je sais utiliser convenablement un main et appeler les fonctions!
Es-ce que quelqu'un peut me débloquer facilement ?

Merci d'avance !

ps : j'utilise grasp sous linux.

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
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
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");
}
} 
0
Utilisateur anonyme
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 ;-)
0
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
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 :)
0
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
ton main n'est pas correct c'est pour ç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;
}
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
ç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.
0

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
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...
0
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
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
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;
} 
0
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
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;
}
0
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
jpense que c'est bon...
pour quoi ça marche pas ? quelle erreur ?
poste ton main aussi le probleme doit venir de là
0
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
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;
}
0
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
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...
0
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
surement un problème de comptabilité avec mon logiciel, j'utilise "grasp" sous linux...
0
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
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 ?!
0
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
ben si...
0
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
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
0
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
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; 
0
felicittation les gas
0