Rechercher : dans
Par :

[c] matrice débutant

Dernière réponse le 4 jun 2008 à 17:51:47 Flow31-, le 20 mai 2008 à 16:49:55 
 Signaler ce message aux modérateurs

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.

Configuration: Linux Debian
Firefox 1.0.4

1

mype, le 20 mai 2008 à 17:32:23

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");
}
} 

Répondre à mype

2

=[Cvrd]=Tassin, le 20 mai 2008 à 17:38:45

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 ;-) -- Alex pour vous servir --

-- N'oubliez pas de mettre vos sujets en "Résolu" lorsque vous avez la réponse ;-) --

Répondre à =[Cvrd]=Tassin

3

Flow31-, le 22 mai 2008 à 09:55:24

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 :)

Répondre à Flow31-

4

mype, le 22 mai 2008 à 16:17:11

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;
}

Répondre à mype

5

Flow31-, le 23 mai 2008 à 16:47:39

ç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.

Répondre à Flow31-

6

Flow31-, le 26 mai 2008 à 16:47:37

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...

Répondre à Flow31-

7

mype, le 26 mai 2008 à 17:34:45

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;
} 

Répondre à mype

8

Flow31-, le 27 mai 2008 à 10:06:43

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;
}

Répondre à Flow31-

9

mype, le 27 mai 2008 à 17:13:41

Jpense que c'est bon...
pour quoi ça marche pas ? quelle erreur ?
poste ton main aussi le probleme doit venir de là

Répondre à mype

10

Flow31-, le 27 mai 2008 à 17:25:05

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;
}

Répondre à Flow31-

11

mype, le 27 mai 2008 à 17:47:28

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...

Répondre à mype

12

Flow31-, le 27 mai 2008 à 17:58:30

Surement un problème de comptabilité avec mon logiciel, j'utilise "grasp" sous linux...

Répondre à Flow31-

13

Flow31-, le 27 mai 2008 à 18:17:35

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 ?!

Répondre à Flow31-

14

mype, le 27 mai 2008 à 18:20:11

Ben si...

Répondre à mype

15

Flow31-, le 4 jun 2008 à 17:32:20

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

Répondre à Flow31-

16

 mype, le 4 jun 2008 à 17:51:47

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; 

Répondre à mype
Collection CommentÇaMarche.net