Programme pour lire une matrice triangulaire inférieure à partir - C++ - Programmation
Marsh Posté le 07-08-2006 à 19:26:27
tu aurais pu continuer sur le même topic plutôt que d'en ouvrir un autre
que donne un truc dans ce genre là :
Code :
|
Marsh Posté le 09-08-2006 à 14:56:19
Bonjour,
Merci pour ton message, je n'ai malheureusement pas pu le lire auparavant,
Le code que tu m'a laissé marche bieb je l'ai testé.
Par contre j'aurais une petite question concercant les lignes suivantes pour les tests car j'aimerai savoir comment ça marche pour pouvoir l'exploiter plus tard :
Code :
|
a quoi sert le setw(10)???
je voudrais utiliser ce qui sort en test dans un fichier c'est pour ça que je te pose la question, j'ai l'impression que c'est assez proche !
Marsh Posté le 09-08-2006 à 14:57:56
iamora a écrit : a quoi sert le setw(10)? |
http://www.cplusplus.com/ref/iostr [...] /setw.html
Marsh Posté le 09-08-2006 à 15:19:35
oui ok c'est l'espace entre les sorties je m'en suis aperçu quad j'ai testé je suis débutant en C++, alors excusez mon manque d'expérience.
Par contre j'ai encore deux petites questions. Je pense que la première est un peu évidente pour vous !
Pensez-vous que cette syntaxe est correcte pour l'écriture du résultat extrait dans un fichier (bien sûr ici il n'a subi aucun traitement, le traitement en question est le sujet de ma deuxième question, c'est juste pour voir si j'arrive à écrie sans problème).
Cette partie de code est à mettre juste après :
Code :
|
Code :
|
Normalement ca devarit marché mais il y a un problème sur l'opérande << que je ne comprend pas!
Ma deuxième question porte plutôt sur le une fonction issu d'une bibliothèque mathématique la fonction est la suivante :
Code :
|
Elle retourne un vecteur colonnes dont les composantes sont des variables normales générés aléatoirment. Pourtant quand j'applique cette fonction à mon code je trouve qu'elle génère toujours les mêmes variables, ce que je ne comprend pas :
voici mon code intégrale :
Code :
|
Merci d'avance pour votre aide
Marsh Posté le 09-08-2006 à 15:37:09
Pour la question 1 :
iamora a écrit :
|
Pour la question 2:
que fait la fonction normal_random() ? D'où sort elle (une bibliothèque, ou bien c'est toi qui l'as programmée) ? Quand tu dis qu'elle génère toujours la même chose, a veut dire que tu obtiens toujours le même vecteur, ou bien que toutes les composantes de ton vecteur sont égales ? Es-tu sûr de l'utiliser correctement ? habituellement, les fonctions qui génèrent des nombres pseudo-aléatoires doivent être initialisées avec une graine (sinon elles renvoient toujours la même suite de nombres)
Marsh Posté le 09-08-2006 à 15:40:43
iamora a écrit : oui ok c'est l'espace entre les sorties je m'en suis aperçu quad j'ai testé je suis débutant en C++, alors excusez mon manque d'expérience. |
Tout les débutants sont excusés à partir du moment où qu'il mettent les mains dans le cambouis, la documentation et google
Marsh Posté le 09-08-2006 à 16:08:18
Tout d'abord merci pour la présicion de tes réponses.
Pour la question1 : Il me manque encore la notion d'initialiser une variable, que cela veut-il dire ?, et pourquoi ne l'a t-on pas fait lors de la lecture du fichier
Pour la question 2:
que fait la fonction normal_random() ? D'où sort elle (une bibliothèque, ou bien c'est toi qui l'as programmée) ?
La fonction normal_random() génére aléatoirement une valeur d'une variable aléatoire. Elle est définie ci-dessus et provient de la bibliothèque newmat
Code :
|
genrand_real1 est défini quant à lui ci-dessus
Code :
|
genrand_int32 est défini quant à lui ci-dessus:
Code :
|
Je crois que ces fonctions partent d'un générateur de nombre aléatoires entre 0 et 1 puis grâce à la fonction de répartition réciproque de la loi normale il permette de générer une variable aléatoire.
Quand tu dis qu'elle génère toujours la même chose, a veut dire que tu obtiens toujours le même vecteur, ou bien que toutes les composantes de ton vecteur sont égales ? Es-tu sûr de l'utiliser correctement ? habituellement, les fonctions qui génèrent des nombres pseudo-aléatoires doivent être initialisées avec une graine (sinon elles renvoient toujours la même suite de nombres)[/quotemsg]
Je veux dire par là que la composante 1 de mon vecteur est toujours la même quand je compile un nouvelle fois ce qui ne devrait pas être le cas normalement. Tout à fait d'accord au sujet de la graine j'ai pensé pareil il faut qu'elle soit intégrer dans le fonction.
Je sais qu'en VB c'est Randomize la graine mais en C++ je n'ai aucune idée???
J'espère que mon problème est un peu plus clair???
Marsh Posté le 09-08-2006 à 16:32:51
iamora a écrit : Pour la question1 : Il me manque encore la notion d'initialiser une variable, que cela veut-il dire ?, et pourquoi ne l'a t-on pas fait lors de la lecture du fichier |
lorsque tu écris
Code :
|
tu es en train de dire à ton compilateur : "je vais utiliser à partir de maintenant une variable ne nom 'vals', de type double". Rien de plus, rien de moins. En particulier, la valeur de la variable vals est indéfinie. Lorsque à la ligne suivante, tu écris :
Code :
|
tu es en train d'écrire dans le fichier la valeur de vals, à savoir n'importe quoi.
Il faut que tu écrives dans la variable avant de l'utiliser. Par exemple:
Code :
|
Ou plus simplement, puisque ici tu n'as pas besoin d'une variable intermédiaire vals :
Code :
|
iamora a écrit : Pour la question 2: |
D'après les commentaires de la fonction genrand_int32, l'initialisation de la graine se fait avec la fonction init_genrand.
Il n'est pas interdit de regarder la documentation de ta bibliothèque non plus. C'est là que tu trouveras toutes les informations utiles pour utiliser les fonctions qu'elle définit
Marsh Posté le 09-08-2006 à 17:45:16
En fait ce que je t'ai envoyé sur la fonction normal_random n'est pas tiré sur une bibliothèque Newmat, je viens de m'en apercevoir, je ne connais pas tellement sa proivenance. En tout cas il a l'aire de foinctionner correctement, je pense que c'est l'un de ces générateurs de nombres utilisés pour les simulations de Monté Carlo!
En tout cas voilà le code
Code :
|
Normalement à chaque fois que je compile je dois tomber sur une nouvelle valeur, mais là c'a à l'aire de garder la même valeur. J'ai remarqué par contre que si je mettai pour autant un :
init_genrand(n) avec n un nombre que je chose à chaque fois avant que je compile, cela change le résultat!
Code :
|
Décidement, c'est bien compliqué le C++
Marsh Posté le 09-08-2006 à 18:16:56
Les méthodes aléatoires c'est pas si compliqué : ce sont en fait des suite récurentes du type
Un+1 = (Un^6) % un grand chiffre premier;
enfin mon exemple est peut être (sûrement ) bidon Mais l'idée c'est que c'est une suite. Donc tu doit d'initialiser a partir d'une certaine valeur et ensuite tu obtient des nombres pseudo aléatoire. C'est pour cela que tu as toujours les même nombres : tu part du même premier terme et les autres sont calculé par récurrence a partir du premier...
L'idée si tu veut avoir des résultats différents a chaque exécution serait de l'initialiser a partir d'un chiffre obtenu a partir de l'horloge de l'ordi. Comme ça a chaque fois que tu exécute ton prog tu a un point de départ différent pour ta suite et donc des résultats différents.
Marsh Posté le 09-08-2006 à 18:36:41
Amonchakai a écrit : Les méthodes aléatoires c'est pas si compliqué : ce sont en fait des suite récurentes du type |
Merci pour ces explications,C'est plus clair maintenant.
Jstement cette fonction qui me permetterait de récuperer l'horloge de l'ordi, je pensais que c'était la fonction init_genrand(n) ais comme elle prend en argument un entier c pas possible.
Une telle fonction doit être sans argument apparamment, non?
Sauras tu quelle fonction utiliser?
Peut être qu'elle figure déjà dans le code que j'ai intégré dans mon dernier message?
Marsh Posté le 09-08-2006 à 19:17:48
c'est justement le n de init_genrand(n) qu'on choisit généralement sur la base de l'horloge de l'ordi.
En général, j'utilise la fonction C time().
man 2 time
Marsh Posté le 10-08-2006 à 10:44:16
franceso a écrit : c'est justement le n de init_genrand(n) qu'on choisit généralement sur la base de l'horloge de l'ordi.
|
Marsh Posté le 10-08-2006 à 10:50:34
"man" c'est pour avoir la doc de quelque chose dans les *nix
Marsh Posté le 10-08-2006 à 10:57:32
iamora a écrit : En fait c'est quoi le site que tu m'as montré ???, il est un peu bizarre à quoi sert la photo et c'est quoi man?? |
Bah la photo, je suppose que c'est pour faire joli
"man", c'est l'abbréviation de "manuel". Il s'agit au départ d'une commande présente dans les unixoides pour donner de la documentation sur les fonctions C et les commandes que tu peux taper dans un terminal. Les pages de man sont toutes écrites de la même façon, et constituent une source centrale de documentation de référence. La plupart des pages de man sont aussi disponible sur internet sur le genre de site que je t'ai montré (donc la prochaine fois que tu te demandes comment utiliser une fonction C, tu peux essayer de taper 'man printf' (par exemple) dans google pour voir ce qui sort).
Marsh Posté le 10-08-2006 à 11:04:54
skelter a écrit : 'man 3 time' plutot ? |
> man 3 time |
Marsh Posté le 10-08-2006 à 11:06:36
OK!
Merci pour ces infos les gars, ça me sera surement utile par la suite.
L'opérateur << est certes puissant dans le code que je vous ai transmis et que tu as corrigé franseco, je voudrais faire une petit changement d'affichage, mais je me rends compte que c'est impossibel :
Code :
|
C'était pour afficher ma matraice de covariance, seulement moi je ne voudrais pas d'espace au début de chaque ligne, alors je me suis dis en faisant ça :
Code :
|
Mais non ça ne marche pas, il le fait bien pour la première ligne mais pas pour les autres lignes qui suivent puisq'ils laissent un espace au début de chaque nouvelle ligne??
Peut être qu'avec l'opérateur << de sortie c'est pas possible de réaliser ce que je veux non?
Marsh Posté le 10-08-2006 à 11:14:28
iamora a écrit : Peut être qu'avec l'opérateur << de sortie c'est pas possible de réaliser ce que je veux non? |
Si si, c'est possible !
Essaie de comprendre le fonctionnement des manipulateurs. En particulier, essaie de comprendre pourquoi tu as un espace en début de chaque ligne, et pourquoi ta solution ne marche pas. Si tu n'y arrives pas, on te proposera une solution, mais il est important que tu arrives à trouver les informations par toi même.
EDIT: Cf le post d'Elmoricq sur les histoires de poissons et de canne à pêche
Marsh Posté le 10-08-2006 à 11:33:17
franceso a écrit : Si si, c'est possible ! |
Marsh Posté le 10-08-2006 à 11:42:59
Code :
|
C'est mieux comme ça non?
Marsh Posté le 10-08-2006 à 14:45:23
ReplyMarsh Posté le 10-08-2006 à 15:07:33
franceso a écrit : C'est effectivement l'une des solutions. Bravo ! |
Je pense que l'énigme suivante est plus diffcile et malgrès que je me suis planché la-dessus assez longtemps je bloque, je pense que j'ai besoin d'aide cette fois.
Voilà le but de mon programme est le suivant :
1) récupérer une matrice de variance-covariance depuis un fichier .txt (étape faite et testée)
Le fichier .txt a la forme suivante:
Code :
|
Code :
|
2) Traiter la matrice récupérée, cette étape se fait sous deux sous-étapes :
2-1) Appliquer une fonction nommée chol (cette fonction réalise la décomposition de Cholesky) Cette fonction c'est moi qui l'ai codée et elle est en annexe en à la fin de mon message (étape faite et testée)
Code :
|
2-2) étape ou je bloque:
2-2-1) Prendre la matrice transformée par la fonction Chol puis la multiplier par un vecteur de variable aléatoire normale généré par la fonction simind, dont mainteant tu connais la fonction:
simind : retourne à partir d'un générateur de nombre entre 0 et 1, la valeur correspondante à une variable normale
(étape ok)
2-2-2) Mon but dans cet étape que je n'arrive pas à réaliser construire dans une matrice de dimension (nombre_simul, dim_vecteur généré) ou bien entendu la ligne i représente le produit de la matrice issue de la fonction chol par un vecteur dont les composantes sont générés aléatoirement.
Bien sur chaque ligne i représente une nouvelle simulation .
voici ce que j'ai codé et qui me semble être un début mais ça bloque pour des raisons que je ne comprend pas !
Code :
|
code pour la fonction simind et chol
Code :
|
Marsh Posté le 10-08-2006 à 15:51:58
plusieurs remarques :
1- il faut initialiser la graine de ton générateur alatoire une seule fois au début du programme (par exemple dans la fonction main()).
2- dans chol(), je ne vois pas trop l'intéret de la variable booléenne temporaire test
3- tu devrais faire une fonction qui affiche une matrice, plutôt que de faire du copier/coller de code
4- tel quel, ton code ne doit sûrement pas compiler : la variable E est locale à la boucle du haut, mais tu demandes de l'afficher en dehors de cette boucle
5- tu as à mon avis un gros problème dans ta première double boucle : tel que tu es en train de le faire, tu génères un nouveau vecteur aléatoire pour chaque couple (i,j), ce qui veut dire qu'au final tu auras généré dim x nbre_simul vecteurs alatoires. Ceci ne semble pas cohérent avec le fait que chaque vecteur aléatoire est censé reprsenter une simulation.
D'après ce que j'ai compris (arrête moi si je me trompe), C est la transformation de Choleski de la matrice correlation. Donc C est de dimension dim.
Une 'simulation' est modélisée par un produit entre la matrice C et un vecteur E de dim variables alatoires indpendantes et identiquement distribues selon une loi normale. Le résultat d'une simulation epsilon_correl est donc un vecteur de dimension dim.
Tu ranges tes nbre_simul résultats de simulation en lignes dans une matrice simul_epsilon, qui est donc de dimension (nbre_simul, dim)
Dans ce cas, ta première double boucle devrait s'écrire :
Code :
|
6- tu as un problème dans les dimensions de tes matrices utilisées pour l'affichage
Marsh Posté le 10-08-2006 à 16:23:03
[quotemsg=1423777,26,383694]plusieurs remarques :
Merci, encore une fois tes indications sont trés clairs, et j'ajouterai que tu connais trés bien le sujet.
Pour le point 5, de ton précédent message, je n'avais pas fait attention effectivement mais j'ai bien redimensionner ma matrice.
Après l'application de tes conseils voilà le code que j'obtiens et qui marche!
Code :
|
Cependant comme tu commence à me donner goût à la rigueur en C++ je suis tout à fait d'accord avec toi pour representer les choses dans une fonction comme réalisée pour chol et simind.
J'arrange cette fonction et si tu n'y voi pas d'incovénient je te la montre pour me dire si c'est ok???
Marsh Posté le 10-08-2006 à 16:54:02
Voilà la fonction que j'ai composé !
Elle s'apelle simcor, je te fournis tout mon fichier ou sont définies mes fonctions
Code :
|
Puis voilà mon fichier principal ou j'utilise la fonction
Code :
|
Normalement ça devrait marcher, mais j'ai un message d'erreur le compilateur me dit que
Code :
|
Ce que je trouve bizarre puisque j'ai bien définie une fonction à trois arguments???
Marsh Posté le 11-08-2006 à 10:56:42
Oui, ce que tu as écrit me semble pas mal. Tu devrais peut-être encapsuler le code d'input de la matrice dans une fonction : ça rendrait les choses plus claires et plus llisibles.
Concernant ton erreur de compilation, tu n'as pas de messages de warnings autour de ton erreur ? As-tu défini les prototypes de tes fonctions dans un fichier d'en-tête ? As-tu inclus le fichier d'en-tête en question dans ton programme principal ?
Marsh Posté le 11-08-2006 à 11:05:57
franceso a écrit : Oui, ce que tu as écrit me semble pas mal. |
En fait voici mon fichier d'en-tête précompilé stadfx.h, je ne sais pas si il faut mettre la dedans comme mis en commentaire les fonctions que j'ai codé dans le fichier correl_simul.cpp.
Mais apparament non puisque ça marche sans ??
Code :
|
Marsh Posté le 11-08-2006 à 11:15:50
Je ne sais pas trop comment marchent les headers précompilés (je suppose que tu es sous VC++ ou quelque chose du genre ?). Essaie peut-être de te documenter dans ce sens la...
Sinon, que contiennent tes headers "essai.h" et "CorrelSimul.h" ?
Marsh Posté le 11-08-2006 à 11:25:27
Ne fait pas attention au début de ce message,regarde la fin c'est peut être la raison de mon erreur,
franceso a écrit : Je ne sais pas trop comment marchent les headers précompilés (je suppose que tu es sous VC++ ou quelque chose du genre ?). Essaie peut-être de te documenter dans ce sens la... |
OK
Je suis sous Visualstudio.net 2003.
Je suis en mode release et dans les proporiétés de mon projet sous entêtes précompilés je compile avec l'option :
Générer automatiquement (/YX)
Normalement ça ne devrait pas posé mon problème .
Un ami me dit que c'est peut être du au fait que ma fonction est définie avec un ReturnMatrix et que j'initialise sortie à Matrix dans le fichier priniicpal, mais je doute que ça soit la raison puisqu'avant ça marchait pour la fonction chol définie avec ReturnMatrix et renvoyant un resultat dans le fichier principal dans une variable déclarée comme Matrix
Matrix C;
C = chol(covariance);
En tout cas voilà le fichier "essai.h"
Code :
|
et le fichier correlsimul.h
Code :
|
Ah oui je ne l'ai pas changé la fdéfinition de ma focntion dans le fichier correlsimul.h, erreur de débutant je la change et je tiens au courant
[code]
Marsh Posté le 11-08-2006 à 11:28:23
C'était ça l'erreur, la preuve que je ne maitrise pas du tout encore le c++.
Merci pour tes réflexions ça m'a mis sur la voie
Marsh Posté le 11-08-2006 à 11:41:53
on est tous passés par là. C'est les erreurs les plus bêtes qui prennent parfois le plus de temps à corriger.
De rien
Marsh Posté le 11-08-2006 à 11:53:56
Franseco, t'es de l'ensta?
Si c'est le cas je peux te demander ton avis sur une question purement technique en mathématiques?
SI ça risque de te gêner t'as qu'à me le dire!
Marsh Posté le 11-08-2006 à 12:02:48
iamora a écrit : Franseco, t'es de l'ensta? |
Marsh Posté le 11-08-2006 à 12:05:29
Donc voilà
Je voudrais comme tu le sais simuler en C++ un vecteur de variables aléatoires normales. Pour cela la méthode conseillée est de générer un vecteur colonne de variables normales, que je noterai [epsilon] puis de le multiplier par la matrice de "Cholesky" qui est une matrice issue de la décomposition de Cholesky de la matrice de variance covariance :
[var-covar]=[chol]*[chol]t
[var-covar]: est la matrice de variance-covariance
[chol]: est la matrice de Cholesky
[chol]t: est la transposée de la matrice de Cholesky
Le problème est que pour que cette décomposition soit juste, il faut que [var-covar] soit définie positive or ce n'est pas toujours mon cas.
Mon objectif est donc de trouver une méthode qui puisse forcer la matrice [var-covar] à devenir une matrice symétrique définie positive.
Pour cela j'ai pensé à diagonaliser [var-covar] puis à remplacer toutes les valeurs propres négatives par des 0 :
[var-covar] = [v]-1*[d]*[v]
ou [d] est une matrice diagonale dont les valeurs>0
ensuite je prends la racine des éléments de [d], donc diag[di]=di^(1/2).
Puis je dis que la matrice de Cholesky est la suivante
chol = [v]-1*[d]^(1/2)*[v].
Je voudrais savoir si mon raisonnemment est correct, car j'ai un doute sur la validité de ma méthode.
Marsh Posté le 11-08-2006 à 13:30:34
Salut !
Bon j'avoue tout de suite je n'y connait rien en matrice de variance-covaiance et Cholesky. Aussi j'ai été voir Google et j'ai trouvé ça :
http://fr.wikipedia.org/wiki/Matri [...] covariance
je sais pas si ce qui est dit dans Wikipedia est juste mais visiblement y'a un soucis : Ils disent que la matrice de variance-covariance est Symétrique positive. Donc y'a comme un soucis si tu trouve des Valeurs propre négatives...
Ensuite ces valeurs propre (négatives...) tu veut les remplacer par des 0. Déja là tu rend ta matrice positive et PAS définie positive (tes valeurs propre doivent être strictement positive...) donc faudrait les remplacer par un nombre positif != de zéro... Mais moi ce qui me turlupine c'est qu'est-ce qui te donne le doit de changer ta matrice comme ça... Si tu change ses valeurs propre elle n'aurra plus rien a voir avec celle initiale (surtout qu'après tu va la multiplier par les matrices diagonalisantes...) Je sais pas ce que ça va donner sûrement qqch qui n'a rien a voir avec tes résultats initiaux...
Et puis juste par curiosité tu fait comment pour trouver les valeurs propres... Moi je chercherai les racines du polynôme caractéristique... Mais c'est du calcul formel : ça se fait bien a la main mais pour le faire faire a un ordinateur... (avec Maple Ok... mais sinon...)
[edit] J'espère que tu prend pas mal ma remarque, je veut pas répondre méchament c'est juste que je comprend pas bien ce que tu veut faire Et si j'ai dit un bêtise excuse moi
Marsh Posté le 11-08-2006 à 13:59:26
Amonchakai a écrit : je sais pas si ce qui est dit dans Wikipedia est juste mais visiblement y'a un soucis : Ils disent que la matrice de variance-covariance est Symétrique positive. Donc y'a comme un soucis si tu trouve des Valeurs propre négatives... |
+1
c'est ce qui me paraît être la plus grande faille dans le raisonnement. Tu ne peux pas comme ça décider de changer ta matrice pour qu'elle vérifie les propriétés dont tu as besoin.
Il y a aussi un autre problème dans les dernières lignes : à mon avis tu ne peux pas te passer de calculer la décomposition de choleski de ta matrice "transformée". Ton histoire à base de "racine carrée" de la matrice diagonale ne marche pas à mon avis (il suffit de calculer le C x Ct avec l'expression que tu proposes pour voir qu'on ne retombe pas sur la matrice de départ)
Amonchakai a écrit : Et puis juste par curiosité tu fait comment pour trouver les valeurs propres... Moi je chercherai les racines du polynôme caractéristique... Mais c'est du calcul formel : ça se fait bien a la main mais pour le faire faire a un ordinateur... (avec Maple Ok... mais sinon...) |
Il existe plein de méthodes numériques pour déterminer des valeurs approchées des valeurs propres d'une matrice (par exemple l'algorithme de Jacobi pour les matrices symétriques)
Marsh Posté le 11-08-2006 à 14:06:43
Citation : |
ha tien je connais pas.... Merci pour l'info je vais voir ça pour ma culture....
Marsh Posté le 07-08-2006 à 18:25:24
Bonjour,
Je voudrais lire une matrice inférieure à partir d'un fichier .txt.
La forme de la matrice en question est la suivante :
Le premier élément de cette matrice qui est 4 représente la dimension, le reste des éléments constituent la matrice.
N'étant pas expert en c++ je suis passé par deux codes différents mais aucun ne me donne un réusltat satisfaisant.
code 1 :
code 2 :
[code]
#include "essai.h"
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
ifstream FichierMatrice("c:\\test1.txt",ios::in);
if (!FichierMatrice)
{
cerr << "Ouverture du fichier impossible" << endl;
exit(1);
}
int val1;
int j = 0;
double* valf;
double val;
FichierMatrice >> val1;
ArrayLengthSpecifier dimension(val1);
SymmetricMatrix covariance(dimension);
cout << val1 << endl;
int dime = (val1*(val1+1))/2;
valf = new double [dime];
do
{
i = i + 1;
FichierMatrice >> valf[j];
cout << valf[j] <<endl;
//cout << valf[1]<<endl;
//cout << covariance (1,2) <<endl;
//cout << covariance (2,1) <<endl;
//cout << covariance (3,2) <<endl;
}
while (!FichierMatrice.eof());
return 0;
}
[code]
La classe SymmetricMatrix et la matrice covariance sont correctement définis à l'aide de la bibliothèque Newmat.
Je suis vraiment bloqué parceque je n'arrive pas à traiter le fichier de donnée. Pourriez-vous m'aider sur ce point en me conseillant laquelle des deux voies d'abord suivre puis comment écire ce code???
Merci d'avance