Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1562 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Programmation en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programmation en C

n°2125348
lecycliste​60
Posté le 08-02-2012 à 11:28:56  profilanswer
 

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

mood
Publicité
Posté le 08-02-2012 à 11:28:56  profilanswer
 

n°2125376
gilou
Modérateur
Modzilla
Posté le 08-02-2012 à 13:00:25  profilanswer
 

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é!  --
n°2125517
lecycliste​60
Posté le 08-02-2012 à 23:20:16  profilanswer
 

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

n°2125526
gilou
Modérateur
Modzilla
Posté le 08-02-2012 à 23:37:16  profilanswer
 

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é!  --
n°2125571
lecycliste​60
Posté le 09-02-2012 à 11:00:50  profilanswer
 

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.

n°2125622
Terminapor
I'll see you rise.
Posté le 09-02-2012 à 13:20:34  profilanswer
 

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
n°2125672
gilou
Modérateur
Modzilla
Posté le 09-02-2012 à 15:20:25  profilanswer
 

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é!  --
n°2125767
lecycliste​60
Posté le 09-02-2012 à 23:37:42  profilanswer
 

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.

n°2125776
gilou
Modérateur
Modzilla
Posté le 10-02-2012 à 01:07:58  profilanswer
 

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é!  --
n°2125802
lecycliste​60
Posté le 10-02-2012 à 10:24:50  profilanswer
 

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?

mood
Publicité
Posté le 10-02-2012 à 10:24:50  profilanswer
 

n°2125841
gilou
Modérateur
Modzilla
Posté le 10-02-2012 à 12:25:04  profilanswer
 

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é!  --
n°2126780
lecycliste​60
Posté le 16-02-2012 à 10:41:07  profilanswer
 

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 +

n°2126798
gilou
Modérateur
Modzilla
Posté le 16-02-2012 à 12:19:53  profilanswer
 

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é!  --
n°2126880
lecycliste​60
Posté le 16-02-2012 à 23:32:53  profilanswer
 

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

n°2126882
gilou
Modérateur
Modzilla
Posté le 17-02-2012 à 01:29:47  profilanswer
 

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é!  --
n°2127345
lecycliste​60
Posté le 20-02-2012 à 17:55:44  profilanswer
 

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+
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Programmation en C

 

Sujets relatifs
Aide programmation C !!!Probleme en Programmation C :(
Programmation Java/C sous Linux/Windows^^Programmation en C, besoin d'aide
programmation réseau C++ multiplateformeAide Programmation C Arguments
[C#][DirectInput] Programmation d'un joystickprogrammation wifi linux en C
Programmation C++ p4programmation en C: les matrices
Plus de sujets relatifs à : Programmation en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR