Programmation en C

Programmation en C - C - Programmation

Marsh Posté le 08-02-2012 à 11:28:56    

Bonjour,
 
je dois pour un projet numérique réaliser la fonction norme d’une Matrice Infinie.
|||A|||∞ = maxi(∑nj=1 |ai,j|)
 
le but étant de faire la somme de chaque ligne de la matrice et de ressortir la valeur maximale.
 
pour cela, j’ai créé deux fichier header
LectureMatrice.h

Code :
  1. #ifndef __LectureMatrice_H__
  2. #define __LectureMatrice_H__
  3. #include "TypedefMatrice.h"
  4. MATfloat LectureMATfloat(char *InputFileName, char *NomMatrice);
  5. MATdouble LectureMATdouble(char *InputFileName, char *NomMatrice);
  6. MATint LectureMATint(char *InputFileName, char *NomMatrice);
  7. #endif


NormeMatriceInfinie.h

Code :
  1. #ifndef __NormeMatriceInfinie_H__
  2. #define __NormeMatriceInfinie_H__
  3. #include "TypedefMatrice.h"
  4. float NormeMatriceInfine( MATfloat A);
  5. #endif


 
et enfin un .c :
NormeInfinieMatrice.c

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "LectureMatrice.h"
  4. #include "NormeMatriceInfinie.h"
  5. int main ()
  6. {
  7. int i,j,n;
  8. char Matrice;
  9. MATfloat A;
  10. A=LectureMATfloat("A.dat",&Matrice);/*Lecture de la matrice désignée par l'utilisateur*/
  11. for (i=0;i<n;i++)
  12. {
  13.  for (j=0;j<n;j++)
  14. }


 
je n’arrive pas à créer la fonction somme de chaque ligne et le max des sommes.
merci d’avance pour votre aide.
 
Mathieu

Reply

Marsh Posté le 08-02-2012 à 11:28:56   

Reply

Marsh Posté le 08-02-2012 à 13:00:25    

Un truc dans ce gout la devrait aller, non?

Code :
  1. unsigned long norme = 0;
  2. unsigned long max;
  3. for (i = 0; i < n; ++i) {
  4.     max = abs(matrice[i][0]);
  5.     for (j = 1; j < n; ++j) {
  6.         if (max < abs(matrice[i][j])) {
  7.             max = abs(matrice[i][j]);
  8.         }
  9.     }
  10.     norme += max;
  11. }


avec bien sur abs défini comme  
unsigned long abs(long i) { return (i<0)?-i:i;}
A+,

Message cité 1 fois
Message édité par gilou le 08-02-2012 à 13:36:40

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-02-2012 à 23:20:16    

gilou a écrit :

Un truc dans ce gout la devrait aller, non?

Code :
  1. unsigned long norme = 0;
  2. unsigned long max;
  3. for (i = 0; i < n; ++i) {
  4.     max = abs(matrice[i][0]);
  5.     for (j = 1; j < n; ++j) {
  6.         if (max < abs(matrice[i][j])) {
  7.             max = abs(matrice[i][j]);
  8.         }
  9.     }
  10.     norme += max;
  11. }


avec bien sur abs défini comme  
unsigned long abs(long i) { return (i<0)?-i:i;}
A+,


merci d’avoir répondu aussi vite.
voici le code avec les rajouts recommandés :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "LectureMatrice.h"
  4. #include "NormeMatriceInfinie.h"
  5. int main ()
  6. {
  7. int i,j,n;
  8. char Matrice;
  9. unsigned long abs(long i);
  10. MATfloat A;
  11. A=LectureMATfloat("A.dat",&Matrice);/*Lecture de la matrice désignée par l'utilisateur*/
  12. unsigned long norme = 0;
  13. unsigned long max;
  14. for (i=0;i<n;i++)
  15. {
  16. max = abs (Matrice[i][0]);
  17.  for (j=0;j<n;j++)
  18.  {
  19.  if max (max < abs(Matrice[i][j]))
  20.   {
  21.   max = abs(Matrice[i][j]);
  22.   }
  23.  }
  24.  }
  25. norme += max;
  26. }
  27. return (i<0?-i:i);


 
cependant j’ai pas mal de messages d’erreurs :  
NormeMatriceInfinie.c: In function ‘main’:
NormeMatriceInfinie.c:11:16: erreur: conflicting types for ‘abs’
NormeMatriceInfinie.c:18:20: erreur: subscripted value is neither array nor pointer nor vector
NormeMatriceInfinie.c:21:6: erreur: expected ‘(’ before ‘max’
NormeMatriceInfinie.c:21:10: erreur: called object ‘max’ is not a function
NormeMatriceInfinie.c:22:4: erreur: expected ‘;’ before ‘{’ token
NormeMatriceInfinie.c:12:11: attention : variable ‘A’ set but not used [-Wunused-but-set-variable]
NormeMatriceInfinie.c: Hors de toute fonction :
NormeMatriceInfinie.c:29:1: erreur: expected identifier or ‘(’ before ‘return’
NormeMatriceInfinie.c: In function ‘main’:
NormeMatriceInfinie.c:28:1: attention : contrôle a atteint la fin non void de la fonction [-Wreturn-type]
 
merci d'avance

Reply

Marsh Posté le 08-02-2012 à 23:37:16    

Je t'ai indiqué comment faire, je t'ai certes pas donné du code que tu pouvais employer sans l'adapter à tes besoins.
Si tu comprends ce qui est fait dans ce que j'ai écrit, tu pourras sans peine corriger ce qui doit l'être au lieu de bêtement copier coller.
Rien qu'a lire ton énoncé, ça a l'air faux ce que tu as écrit:
char Matrice;
si ta matrice est une matrice de nombres réels, cette déclaration va surement pas aller.
A+,


Message édité par gilou le 08-02-2012 à 23:40:05

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-02-2012 à 11:00:50    

mais le char Matrice est là pour appeler la matrice A.
je ne suis début dans le code et j’ai beaucoup de mal à comprendre ce que veut dire certaine ligne.

Reply

Marsh Posté le 09-02-2012 à 13:20:34    

lecycliste60 a écrit :


merci d’avoir répondu aussi vite.
voici le code avec les rajouts recommandés :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "LectureMatrice.h"
  4. #include "NormeMatriceInfinie.h"
  5. int main ()
  6. {
  7. int i,j,n;
  8. char Matrice;
  9. unsigned long abs(long i);
  10. MATfloat A;
  11. A=LectureMATfloat("A.dat",&Matrice);/*Lecture de la matrice désignée par l'utilisateur*/
  12. unsigned long norme = 0;
  13. unsigned long max;
  14. for (i=0;i<n;i++)
  15. {
  16. max = abs (Matrice[i][0]);
  17.  for (j=0;j<n;j++)
  18.  {
  19.  if max (max < abs(Matrice[i][j]))
  20.   {
  21.   max = abs(Matrice[i][j]);
  22.   }
  23.  }
  24.  }
  25. norme += max;
  26. }
  27. return (i<0?-i:i);


 
cependant j’ai pas mal de messages d’erreurs :  
NormeMatriceInfinie.c: In function ‘main’:
NormeMatriceInfinie.c:11:16: erreur: conflicting types for ‘abs’
NormeMatriceInfinie.c:18:20: erreur: subscripted value is neither array nor pointer nor vector
NormeMatriceInfinie.c:21:6: erreur: expected ‘(’ before ‘max’
NormeMatriceInfinie.c:21:10: erreur: called object ‘max’ is not a function
NormeMatriceInfinie.c:22:4: erreur: expected ‘;’ before ‘{’ token
NormeMatriceInfinie.c:12:11: attention : variable ‘A’ set but not used [-Wunused-but-set-variable]
NormeMatriceInfinie.c: Hors de toute fonction :
NormeMatriceInfinie.c:29:1: erreur: expected identifier or ‘(’ before ‘return’
NormeMatriceInfinie.c: In function ‘main’:
NormeMatriceInfinie.c:28:1: attention : contrôle a atteint la fin non void de la fonction [-Wreturn-type]
 
merci d'avance


 
Non, tu t'es mal servi de ce qu'à dit Gilou, abs() est une fonction, qui renvoi un unsigned long et prend en paramètre un long, tu dois donc faire une nouvelle fonction avant ton main, et essais de la comprendre au lieu de juste copier-coller :D  


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 09-02-2012 à 15:20:25    

lecycliste60 a écrit :

mais le char Matrice est là pour appeler la matrice A.
je ne suis début dans le code et j’ai beaucoup de mal à comprendre ce que veut dire certaine ligne.

Ben alors si c'est A ta matrice, c'est elle qu'il faut employer dans mon code, hein.
Et si tu travailles avec des floats et pas des ints ou des longs, il faut aussi remplacer les types employés dans mon code.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-02-2012 à 23:37:42    

gilou a écrit :

Ben alors si c'est A ta matrice, c'est elle qu'il faut employer dans mon code, hein.
Et si tu travailles avec des floats et pas des ints ou des longs, il faut aussi remplacer les types employés dans mon code.
A+,


 
vous parler dans un autre langage que moi...
je suis un débutant.
je reformule ma question.
je sais ce que je dois faire pour arriver à la fonction voulu : faire la somme de chaque et ligne et ressortir la valeur max. soit un réel.
cependant je ne connais pas les outils et fonction pour y arriver en C.
sachant que des bibliothèques me sont imposées de lectureMATfloat
code source :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "LectureMatrice.h"
  4. int main()
  5. {
  6. int  i,j;
  7. char  NomMatrice;
  8. MATfloat A;
  9. A=LectureMATfloat("mat1.dat",&NomMatrice);
  10. if (A.Mat==NULL)
  11. {
  12.  printf("Probleme d'initialisation de la matrice\n" );
  13.  exit(-1);
  14. }
  15. else
  16. {
  17.  printf("Affichage Matrice %c(%d,%d)\n", NomMatrice, A.NbrLig, A.NbrCol);
  18.  for(i=0;i<A.NbrLig;i++)
  19.  {
  20.    for(j=0;j<A.NbrCol;j++)
  21.    printf("%c[%d,%d]=%+f ", NomMatrice, i+1, j+1, A.Mat[i][j]);
  22.   printf("\n" );
  23.  }
  24.  exit(0);
  25. }
  26. }


 
je ne suis donc pas libre d’utiliser n’importe qu’elle fonction.

Reply

Marsh Posté le 10-02-2012 à 01:07:58    

Bon ben déjà, il nous faudrait la définition du type MATfloat pour qu’on sache exactement la structure de cet objet.
Bref, il y a quoi dans TypedefMatrice.h

Citation :

cependant je ne connais pas les outils et fonction pour y arriver en C.

Manifestement, le but de votre projet est de vous pousser à en apprendre les bases.

Citation :

je sais ce que je dois faire pour arriver à la fonction voulu : faire la somme de chaque et ligne et ressortir la valeur max. soit un réel.

Déjà si vous arrivez pas à énoncer ça clairement en français, vous aller avoir des difficultés à l'énoncer en un autre langage, fut il informatique.
A+,

Message cité 1 fois
Message édité par gilou le 10-02-2012 à 01:13:21

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-02-2012 à 10:24:50    

gilou a écrit :

Bon ben déjà, il nous faudrait la définition du type MATfloat pour qu’on sache exactement la structure de cet objet.
Bref, il y a quoi dans TypedefMatrice.h

Citation :

cependant je ne connais pas les outils et fonction pour y arriver en C.

Manifestement, le but de votre projet est de vous pousser à en apprendre les bases.

Citation :

je sais ce que je dois faire pour arriver à la fonction voulu : faire la somme de chaque et ligne et ressortir la valeur max. soit un réel.

Déjà si vous arrivez pas à énoncer ça clairement en français, vous aller avoir des difficultés à l'énoncer en un autre langage, fut il informatique.
A+,


 
Bonjour,
 
Voici le Code du TypedefMatrice.h :

Code :
  1. #ifndef __TypedefMatrice_H__
  2. #define __TypedefMatrice_H__
  3. typedef struct
  4. {
  5. int  NbrLig;
  6. int  NbrCol;
  7. float  **Mat;
  8. } MATfloat;
  9. typedef struct
  10. {
  11. int  NbrLig;
  12. int  NbrCol;
  13. double  **Mat;
  14. } MATdouble;
  15. typedef struct MATint
  16. {
  17. int  NbrLig;
  18. int  NbrCol;
  19. int  **Mat;
  20. } MATint;
  21. #endif


 
La norme d’une Matrice infinie est bien la valeur maximale de la norme de chaque ligne?

Reply

Marsh Posté le 10-02-2012 à 10:24:50   

Reply

Marsh Posté le 10-02-2012 à 12:25:04    

Citation :

typedef struct
{
int  NbrLig;
int  NbrCol;
float  **Mat;
} MATfloat;

Donc à priori, c'est pas un tableau à deux dimensions.
 
LectureMATfloat alloue Mat comment? un malloc par ligne, un malloc global?
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-02-2012 à 10:41:07    

gilou a écrit :

Citation :

typedef struct
{
int  NbrLig;
int  NbrCol;
float  **Mat;
} MATfloat;

Donc à priori, c'est pas un tableau à deux dimensions.
 
LectureMATfloat alloue Mat comment? un malloc par ligne, un malloc global?
 
A+,


 
voici le code de LectureMATfloat :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "LectureMatrice.h"
  4. int main()
  5. {
  6. int  i,j;
  7. char  NomMatrice;
  8. MATfloat A;
  9. A=LectureMATfloat("mat1.dat",&NomMatrice);
  10. if (A.Mat==NULL)
  11. {
  12.  printf("Probleme d'initialisation de la matrice\n" );
  13.  exit(-1);
  14. }
  15. else
  16. {
  17.  printf("Affichage Matrice %c(%d,%d)\n", NomMatrice, A.NbrLig, A.NbrCol);
  18.  for(i=0;i<A.NbrLig;i++)
  19.  {
  20.    for(j=0;j<A.NbrCol;j++)
  21.    printf("%c[%d,%d]=%+f ", NomMatrice, i+1, j+1, A.Mat[i][j]);
  22.   printf("\n" );
  23.  }
  24.  exit(0);
  25. }
  26. }


 
Merci
 
A +

Reply

Marsh Posté le 16-02-2012 à 12:19:53    

Non, ce n'est pas le code de LectureMATfloat, mais l'appel à LectureMATfloat, ce qui ne me dit absolument pas comment LectureMATfloat procède, en particulier pour gérer l'allocation de mémoire de A.
Déjà rien que cette ligne:  
A=LectureMATfloat("mat1.dat",&NomMatrice);
ça me semble un peu douteux, on procède en, général par pointeurs en retour de fonction et non pas en copie de structure, quand on fait du C. Bon, c'est pas interdit, mais pas particulièrement efficace.
 
A+,

Message cité 1 fois
Message édité par gilou le 16-02-2012 à 12:22:22

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-02-2012 à 23:32:53    

gilou a écrit :

Non, ce n'est pas le code de LectureMATfloat, mais l'appel à LectureMATfloat, ce qui ne me dit absolument pas comment LectureMATfloat procède, en particulier pour gérer l'allocation de mémoire de A.
Déjà rien que cette ligne:  
A=LectureMATfloat("mat1.dat",&NomMatrice);
ça me semble un peu douteux, on procède en, général par pointeurs en retour de fonction et non pas en copie de structure, quand on fait du C. Bon, c'est pas interdit, mais pas particulièrement efficace.
 
A+,


 
Ca y est j’ai réussi !!! :pt1cable:  
 
voici le code :
[cpp]#include <stdio.h>
#include <stdlib.h>
#include "LectureMatrice.h"
#include "NormeMatriceInfinie.h"
 
 
int main ()
 
{
 int i;/*nombre de colonne*/
 int j;/*nombre de ligne*/
 float S=0;/*S est la somme des lignes*/
 float M=0;/*M est la valeur maximun des sommes des lignes*/
 char Matrice;
 MATfloat A;
 A=LectureMATfloat("A.dat",&Matrice);/*Lecture de la matrice désignée par l'utilisateur*/
 for(i=0;i<A.NbrLig;i++)/*boucle de la somme des lignes*/
 {
  for(j=0;j<A.NbrCol;j++)
 
  {
   S=S+A.Mat[i][j];
   
  }
 if (S>M) /*Si la somme de la ligne i+1 est supérieure à celle d'avant alors la valeur est enregistrer dans M*/
 (M=S);
 }
 printf ("La Valeur de la norme Infinie de la Matrice est %f\n", M);
 return S;
 
}/cpp]
 
Merci Gilou ;)

Reply

Marsh Posté le 17-02-2012 à 01:29:47    

Ce que tu fais compile, mais c'est pas la norme infinie...
Suffit de prendre la matrice 1x1 (-1) pour voir que ton calcul donne -1, et une valeur négative pour une norme, euh...
D'autre part,  
int i;/*nombre de colonne*/  
...
for(i=0;i<A.NbrLig;i++)/*boucle de la somme des lignes*/ :whistle:
et
return S;  
S est un float, et main retourne un int, bref, c'est pas terrible.
 
Bref, tu y es presque, mais pas tout à fait.
(Bon je vois que j'avais pas compris ta définition de norme infinie au début du topic, j'avais compris à ton énoncé que c'était la somme du max en valeur absolue pour chaque ligne, alors que c'est le max des somme en valeur absolue pour chaque ligne)
 

Spoiler :

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#include "LectureMatrice.h"
#include "NormeMatriceInfinie.h"
 
 
int main () {
    int l, c;
    double somme, norme;
    char Matrice;
    MATfloat A;
 
    A = LectureMATfloat("A.dat", &Matrice);
 
    norme = 0;
    // pour chaque ligne
    for (l = 0; l < A.NbrLig; ++l) {
        somme = 0;
        // on fait la somme des valeurs absolues des elements de la ligne
        for (c = 0; c < A.NbrCol; ++c) {
            somme += fabs(A.Mat[l][c]);
        }
        // et on compare le résultat avec la norme courante
        norme = (norme > somme)?norme:somme;
    }
 
    printf ("La Valeur de la norme Infinie de la Matrice est %f\n", norme);
    return 0;
}


 
 
A+,

Message cité 1 fois
Message édité par gilou le 17-02-2012 à 02:05:22

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-02-2012 à 17:55:44    

gilou a écrit :

Ce que tu fais compile, mais c'est pas la norme infinie...
Suffit de prendre la matrice 1x1 (-1) pour voir que ton calcul donne -1, et une valeur négative pour une norme, euh...
D'autre part,  
int i;/*nombre de colonne*/  
...
for(i=0;i<A.NbrLig;i++)/*boucle de la somme des lignes*/ :whistle:
et
return S;  
S est un float, et main retourne un int, bref, c'est pas terrible.
 
Bref, tu y es presque, mais pas tout à fait.
(Bon je vois que j'avais pas compris ta définition de norme infinie au début du topic, j'avais compris à ton énoncé que c'était la somme du max en valeur absolue pour chaque ligne, alors que c'est le max des somme en valeur absolue pour chaque ligne)
 

Spoiler :

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#include "LectureMatrice.h"
#include "NormeMatriceInfinie.h"
 
 
int main () {
    int l, c;
    double somme, norme;
    char Matrice;
    MATfloat A;
 
    A = LectureMATfloat("A.dat", &Matrice);
 
    norme = 0;
    // pour chaque ligne
    for (l = 0; l < A.NbrLig; ++l) {
        somme = 0;
        // on fait la somme des valeurs absolues des elements de la ligne
        for (c = 0; c < A.NbrCol; ++c) {
            somme += fabs(A.Mat[l][c]);
        }
        // et on compare le résultat avec la norme courante
        norme = (norme > somme)?norme:somme;
    }
 
    printf ("La Valeur de la norme Infinie de la Matrice est %f\n", norme);
    return 0;
}


 
 
A+,


 
j’ai essayé comme ça :  

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "LectureMatrice.h"
  4. #include "NormeMatriceInfinie.h"
  5. #include "math.h"
  6. int main ()
  7. {
  8. int i;/*nombre de colonne*/
  9. int j;/*nombre de ligne*/
  10. float S=0;/*S est la somme des lignes*/
  11. float M=0;/*M est la valeur maximun des sommes des lignes*/
  12. char Matrice;
  13. MATfloat A;
  14. A=LectureMATfloat("A.dat",&Matrice);/*Lecture de la matrice désignée par l'utilisateur*/
  15. for(i=0;i<A.NbrLig;i++)/*boucle de la somme des colones*/
  16. {
  17.  for(j=0;j<A.NbrCol;j++)
  18.  {
  19.   S=S+A.Mat[i][j];
  20.  }
  21. if (S>M) /*Si la somme de la ligne i+1 est supérieure à celle d'avant alors la valeur est enregistrer dans M*/
  22. (M=fabs (S));
  23. }
  24. printf ("La Valeur de la norme Infinie de la Matrice est %f\n", M);
  25. return S;
  26. }


 
ça fonctionne. par contre je viens seulement de voir en répondant à ton message le spoiler. je vais étudier ça.
Merci
A+
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed