Extraire une valeur décimale et l'utiliser ensuite pour calculer une valeur

Résolu
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014 - 9 juil. 2010 à 09:43
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 9 juil. 2010 à 17:01
Bonjour,

Je suis un grand débutant en C++. Dans le cadre de mon stage, je dois faire un programme en C++ pour calculer des paramètres électriques tels que le glissement, ... à partir des données contenues dans un fichier txt.

Je veux extraie les différentes grandeurs (fréquence d'alimentation, fréquence de rotation) et les attribuer à des variables que j'utilise dans ma formule pour le calcule du glissement g du moteur.

J'ai perdu pas mal de temps. J'ai cherché dans les forums mais je trouve que des codes pour lire des lignes et l'afficher sur une console

Please, I need help!!!

Thank you!

20 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juil. 2010 à 15:31
1) N'utilise pas using namespace, jamais ! Il suffit d'écrire std::cout, au lieu de cout.
2) Un nom de variable n'a *jamais* de majuscules, par convention, seul les noms de classes en ont une.
3) Pas de variable globale ! Encore une fois, c'est la pire chose à faire.
4) Il faut vérifier si le fichier a été ouvert correctement.

A noter que les nombres doivent être séparés par des . et non des ,

Fmax 156.25
Falim 50
f(supc{S}) 50
f(supv{S}) 49.4141
N 3200
X Resolution 0.0488281
0.103938 0.068602
0.0612703 0.060891
0.0385554 0.0652896
0.0268127 0.0589976


Correction de ton code:
#include 
#include <fstream>

int main()
{
  std::ifstream file("Données.txt");
  if (!file)
  {
    std::cerr << "Impossible d'ouvrir le fichier" << std::endl;
    return 1;
  }

  std::string ignore;
  double fmax;
  file >> ignore >> fmax;
  double falim;
  file >> ignore >> falim;
  double fsupc;
  file >> ignore >> fsupc;
  double fsupv;
  file >> ignore >> fsupv;
  double n;
  file >> ignore >> n;
  double resolution;
  file >> ignore >> ignore >> resolution;

  std::cout << fmax << std::endl
    << falim << std::endl
    << fsupc << std::endl
    << fsupv << std::endl
    << fsupv << std::endl
    << n << std::endl
    << resolution << std::endl;


  float valeur1;
  float valeur2;
  while (file >> valeur1 >> valeur2)
  {
    std::cout << valeur1 << " " << valeur2 << std::endl;
  }

  float g = (falim - fsupv) / falim;
  std::cout << "Valeur du glissement : " << g << std::endl;
  file.close();

  return 0;
}

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juil. 2010 à 16:19
Ben oui...
L'opérateur >> fonctionne comme ceci:

Il essaie de faire correspondre les variables avec des valeurs séparés par des espaces.

Ex:

int a;
int b;
int c;
file >> a >> b >> c;


Avec:
4 5 6



Il essaiera de le coller:

4 5 6
a b c


Maintenant si tu as un texte:
Frequence d'alimentation = 1


Pour récupérer le 1, il faut coller ta variable sur le "1".
Soit:

Frequence d'alimentation = 1
.....X...........X.......X.X

Donc il faut se débarraser des trois premiers avant de pouvoir stocker le 4eme qui est ce que tu veux.

Ce qui donne:
std::string ignore;
int a;
file >> ignore >> ignore >> ignore >> a;


________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juil. 2010 à 17:01
Ce n'est pas vraiment du C++. Dès le moment ou tu veux dessiner quelque chose, tu dois faire appelle à des bibliothèques externes.
C'est une tout autre question. Donc, si ton problème est résolu, valide la réponse, et ouvre un nouveau sujet sur le forum.

Pour dessiner des courbes, tu peux utiliser gnu plot (facile à utiliser, si tu es sous Linux).
Ou alors prendre QT (avec QTCreator).

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juil. 2010 à 10:07
Quelle est la question *précise* ?

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
9 juil. 2010 à 10:23
Merci de votre réponse,

J'ai une fichier txt qui contient 3200 lignes avec 11 colonnes et avec quelques paramétres: fréquence d'alimentation, fréquence de rotation,..., je voudrais récupérer dans un premier temps la fréquence d'alimentation et la fréquence de rotation que j'affeterai à deux variables que j'utiliserai pour évaluer le glissement g = (falim - frot)/falim.

Je n'arrive pas à extraire ces grandeurs depuis le fichier txt.

Comment faire pour les extraire et comment faire pour les utiliser ensuite pour faire le calcul en C++.

Cordialement, Merci de votre réponse.

Ibrahima
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juil. 2010 à 10:45
Comment les données sont elles écrites dans le fichier ?
Les lignes sont séparés par un délimiteur ?

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
9 juil. 2010 à 10:57
Bonjour,

le format du fichier:

Fmax 156,25
Falim 50
f(supc{S}) 50
f(supv{S}) 49,4141
N 3200
X Resolution 0,0488281

C1 C2 .... C12

Les colonnes sont séparées par des tabulations et les paramètres aussi.

Après ça, je dois tracer des courbes à partir des 11 colonnes et avec colonne 1 l'axe des abscisses. Les données sont des décimales.

Cordialement,

Ibrahima
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juil. 2010 à 11:06
Ok, dans ce cas, c'est très simple à récupérer.

Tu commences par ouvrir le fichier en lecture, via un "std::ifstream".
Ensuite, les données étant séparées par des tabulations, tu peux simplement le faire entrée dans tes variables, grâce à l'opérateur ">>".

Ex:
Soit le fichier:

toto 1 1.5
titi 2 78.5
tutu 3 0.7


Pour récupérer les données, je ferais:
std::ifstream file("fichier.txt");
std::string name;
int nb;
double decimal;

while (file >> name >> nb >> decimal)
  std::cout << name << " " << nb << " " << decimal << std::endl;

file.close();


A toi de comprendre cet exemple, et de l'adapter à ton cas.

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
9 juil. 2010 à 11:13
Merci beaucoup,

Je te tiendrais courant.

Bonne journée

Cordialement,

Ibrahima
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
9 juil. 2010 à 13:35
toto 1 1.5
titi 2 78.5
tutu 3 0.7

name >> nb >> decimal

Bonjour,

Name c'est le nom de la contenant toto, titi, tutu?
nb le nom de la colonne contenant 1, 2, 3?
Decimal le nom de la colonne contenant 1.5, 78.5, 0.7?

Quand on exécute le programme, la valeur de totO par exemple sera 1.5 et ainsi de suite?

J'ai testé le code et il affiche à la console Fmax156. Est ce que cela veut dire Fmax = 156?

Merci.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juil. 2010 à 13:43
Post ton code et une petite partie du fichier d'entrée.

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
9 juil. 2010 à 13:52
Bonjour,

Il n'affiche plus rien à la console à part "Appuyer sur une touche pour continuer"

Voici mon code j'ai juste ajouter es includes:

#include <cstdlib>
#include
#include <fstream>

using namespace std;

int main(int argc, char * argv[])
{
std::ifstream file("fichier.txt");
std::string Param;
double Valeurs;

while (file >> Param >> Valeurs)
std::cout << Param << " " << Valerus << std::endl;

file.close();

system("PAUSE");
return EXIT_SUCCESS;

}

Sais-tu pourquoi il n'affiche rien?

Merci.

Ibrahima
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juil. 2010 à 13:56
Jamais de "using namespace std;", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

Je ne sais pas, tu ne m'a pas donné le fichier d'entrée ! (fichier.txt)

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
9 juil. 2010 à 14:02
Les premières lignes du fichiers d'entrées.

Fmax 156,25
Falim 50
f(supc{S}) 50
f(supv{S}) 49,4141
N 3200
X Resolution 0,0488281

Les 3200 lignes de données et 11 colonnes.
Données1 Données 2 ..... Données11
0,103938 0,068602 .
0,0612703 0,060891
0,0385554 0,0652896
0,0268127 0,0589976 .

Nos messages se sont croisés.

Merci,

Ibrahima.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juil. 2010 à 14:17
C'est normal !
Tu ne peux pas utiliser la même méthode pour récupérer toutes les lignes.
Donc tu ne dois faire ta boucle qu'après.

Pour résumer:
std::string ignore; // En fait, la première colonne est descriptive, et je n'ai pas l'impression que tu t'en serves, donc on va l'appeler "ignore", et elle ne sera là que pour "matcher" ce que l'on veut. On ne s'en reservira pas.

int fmax;
file >> ignore >> fmax;
int supc;
file >> ignore >> supc;

etc... jusqu'à "X Resolution 0,0..."

Puis tu fais une boucle pour récupérer toutes les coordonnées.

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
9 juil. 2010 à 15:17
Bonjour,
Il parait que ma boucle est fausse

G essayé de calculer le glissement en utilisant quelques paramètres mais le résultat obtenu est erroné.

voici mon code:

// Ignore le nom de la colonne des paramétres
// Valeurs le nom de la colonne des valeurs des paramétres


#include <cstdlib>
#include
#include <fstream>
#include <cstdlib>
#include <math.h>
using namespace std;
float g;
int main(int argc, char *argv[])
{
std::ifstream file("Données.txt");
std::string Param;
float Valeurs;
double Fmax;
file >> Ignore >> Valeurs >> Fmax;
double Falim;
file >> Ignore >> Valeurs >> Falim;
double Fsupc;
file >> Ignore >> Valeurs >> Fsupc;
double Fsupv;
file >> Ignore >> Valeurs >> Fsupv;
while(file >> Ignore >> Valeurs )
{
std::cout << Ignore << "" << Fmax << Valeurs << std::endl;
std::cout << Ignore << "" << Falim << Valeurs << std::endl;
std::cout << Ignore << "" << Fsupc << Valeurs << std::endl;
std::cout << Ignore << "" << Fsupv << Valeurs << std::endl;
}
g = (Falim-Fsupv)/Falim;
cout<<"Valeur du glissement : "<<g<<endl;
file.close();
system("PAUSE");
return EXIT_SUCCESS;

}

Est correct mon code?

Merci,

Ibrahima
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
9 juil. 2010 à 15:20
Bonjour,

Quand je supprime le "using namespace std", j'obtiens plusieurs erreurs. Par exmple "cout" undeclared.

J'ai lu étudié le lien que tu m'as donné mais je n'arrive à remplacer le "using namspace std".

Merci,

Ibrahima
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
9 juil. 2010 à 16:10
Bonjour,

J'ai fait du std::cout << "Frequence d'alimentation : "<< falim << std::endl; pour voir la valeur que proramme lise: Frequence d'alimentation = 1. 12398e+292 au lieu de 50.

Sais tu pourquoi?

J'ai changé les virgules avec des points.

Cordialement
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
9 juil. 2010 à 16:42
Bonjour,

Merci beaucoup, je crois je pouvais m'en sortir. J'ai réussi à afficher la bonne valeur (fmax = 15,25) en fasaint: file >> ignore >> ignore >> fmax.

Pour les 4 autres paramètres j'y travaille. Je vais arriver.

Merci merci.

Je te tiendrai courant de mon avancement.

Bon week end!
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
9 juil. 2010 à 16:56
C'est bon, j'ai réussi à obtenir les bonnes valeurs en suivant tes conseils.

Connais tu des tutoriels en C++ pour tracer des courbes toujours depuis un fichier txt avec 12 colonnes.

Colonne1 représente l'axe des abscisses (x) et les autres axes des ordonnées (y1, y2, ... yn).


Merci, j'ai rattrapé le temps que j'avais perdu.

Merci

Bon week end.
0
Rejoignez-nous