IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Comment calculer la moyenne avec des nombres sélectionnés dans un fichier?


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut Comment calculer la moyenne avec des nombres sélectionnés dans un fichier?
    Bonjour à tous,
    j'ai un soucis pour calculer la moyenne de nombres que je sélectionne dans un fichier.
    Je vous envoie mon code pour mieux comprendre mon problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    float Buf;
     
    	for (int i = 3; i <= Fichier->Strings [i]; i++) {
     
    		AnsiString Ligne = Fichier->Strings [i];
    		AnsiString PH = strtok(Ligne.c_str()," ");
     
    		Buf = (PH [i]+ PH [i-1])/2;
     
     
    	}
     
    	FormClient->EditPH->Text = Buf;
    Le fichier se présente comme ceci :

    8,2 4,9 37 0
    8,9 4,9 37 0
    9,2 4,9 37 0
    8,2 4,8 37 0
    7,0 4,9 37 0
    8,2 4,9 37 0
    8,2 4,8 37 0
    8,2 4,8 37 0


    Ce sont les nombres qui sont en rouge avec lesquels je veux faire une moyenne.

    Merci d'avance pour vos réponses, à bientôt !


  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Pour moi il y a plusieurs problème, tout d'abord la condition d'arrêt de ta boucle for est a revoir, ensuite, il faut que tu stock toutes tes valeurs dans un vecteur pour faire ensuite ta moyenne, cela donnerai un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    float moyenne;
    vector<float> tabValeur;
     
    for (int i = 3; i <= Fichier->Strings [i]; i++) //Condition à revoir
    {
       AnsiString Ligne = Fichier->Strings [i];
       AnsiString PH = strtok(Ligne.c_str()," ");
       tabValeur.push_back(PH.ToDouble());
    }
    moyenne = 0;
    for(int i=0;i<tabValeur.size();i++)
    {
      moyenne += tabValeur[i];
    }
    moyenne = moyenne / tabValeur.size();
     
    FormClient->EditPH->Text = AnsiString(moyenne);

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    On suppose le nom complet du fichier dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AnsiString Filename;
    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    if(FileExists(Filename))
        {
        TStringList *Fichier = new TStringList;
        Fichier->LoadFromFile(Filename);
        AnsiString Chaine;
        AnsiString Nombre;
        int p;
        double s = 0.0;
        for(int j = 0; j < Fichier->Count; j++)
            {
            Chaine = Fichier->Strings[j];
            p = Chaine.Pos(" ");
            if(p != 0) Nombre = Chaine.SubString(1, p);
            s = s + Nombre.ToDouble();
            }
        s = s / Fichier->Count;
        //Echo dans un label
        Label1->Caption = FloatToStr(s);
        //Libération de la mémoire
        Fichier->Clear();
        delete Fichier;
        }
    }
    Si on devait faire la moyenne pour l'ensemble des colonnes, dans ce cas il faudrait travailler en profondeur.

    On suppose un tableau :

    Et une méthode supplémentaire (qu'il suffit de déclarer dans la classe de la form, en public):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    void __fastcall TForm1::Colonnes(AnsiString Chaine)
    {
    Chaine.Trim();
    AnsiString Nombre;
    int d = 0;
    //Pour faire sans goto... 
    int p = Chaine.Pos(" ");
    while(p != 0)
        {
        Nombre = Chaine.SubString(1, p);
        Tab[d] += Nombre.ToDouble();
        d++;
        Chaine = Chaine.SubString(p+1, Chaine.Length());
        p = Chaine.Pos(" ");
        }
    Tab[d] += Chaine.ToDouble();
    }
    La méthode principale devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
    {
    if(FileExists(Filename))
        {
        TStringList *Fichier = new TStringList;
        Fichier->LoadFromFile(Filename);
        //RAZ du tableau
        ZeroMemory(Tab, sizeof(double) * 4);
        //ligne par ligne
        for(int j = 0; j < Fichier->Count; j++)
            {
            Colonnes(Fichier->Strings[j]);
            }
        //Moyenne des colonnes
        for(int j = 0; j < 4; j++)
            {
            Tab[j] = Tab[j] / Fichier->Count;
            }
        //Echo dans mes labels
        Label1->Caption = FloatToStr(Tab[0]);
        Label2->Caption = FloatToStr(Tab[1]);
        Label3->Caption = FloatToStr(Tab[2]);
        Label4->Caption = FloatToStr(Tab[3]);
        //Libération de la mémoire
        Fichier->Clear();
        delete Fichier;
        }
    Peut-être peut-on faire plus simple... (???)

    A plus !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Merci POTTIEZ, mais là je doit te dire que j'ai rien compris ...

  5. #5
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Désolé, j'avais oublié de supprimer une ligne de ton ancien code et le code que j'ai présenté n'été pas optimisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    float moyenne = 0;
    int nbValeur = 0;
     
    for (int i = 3; i <= Fichier->Strings [i]; i++) //Condition à revoir
    {
       AnsiString Ligne = Fichier->Strings [i];
       AnsiString PH = strtok(Ligne.c_str()," ");
       moyenne += PH.ToDouble();
       nbValeur++;
    }
    moyenne = moyenne / nbValeur;
     
    FormClient->EditPH->Text = AnsiString(moyenne);
    Sinon le code de henderson est directement optimisé

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    OK d'accord, merci à tous les deux.
    Par contre comment je fais henderson si mes données dans le fichier ne commence qu'à la 4ème ligne jusqu'à la fin?

  7. #7
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Simplement en initialisant j à 3 au lieu de 0 dans la boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int j = 3; j < Fichier->Count; j++)

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    C'est bon ça fonctionne, encore merci


  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Excuse moi encore henderson mais lorsque j'exécute le code pour calculer la moyenne de plusieurs colonnes, il me met un message d'erreur :

    " n'est pas une valeur à virgule flottante !

    Quel est le problème ?


  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    J'ai testé avec le tableau que tu as donné et je n'ai pas eu de problèmes !
    On est bien d'accord que chaque nombre est séparé par un espace ?
    Si on devait se trouver avec un formatage différent, dans ce cas il suffirait d'en tenir compte !

    Le fait qu'une expression ne soit pas une valeur décimale correcte montre qu'il y a des caractères non valides !

    A plus !

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Tu as raison henderson, ça fonctionne.
    Mais j'ai un soucis avec mes premières lignes du fichier : le calcul doit commencer à la 4ème ligne :

    TYPE F: ST
    ratp
    1071208
    8,2 4,9 37 0
    8,2 4,9 37 0
    8,2 4,9 37 0

    Donc j'ai modifié le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    // Ligne par ligne
    		for(int i = 3; i < Fichier->Count ; i++) {
     
    			Colonnes(Fichier->Strings[i]);
     
    		}
     
    		// Moyenne des colonnes
    		for(int i = 0; i < 3; i++) {
     
    			Tab[i] = Tab[i] / Fichier->Count;
     
    		}
     
     
    		FormClient->EditPH->Text = FloatToStr(Tab[0]);
    Le problème est que pour la moyenne de la premiere colonne je doit avoir en résultat 8,2 , mais là j'ai 4,1 en résultat.

    D'où vient le soucis ?


  12. #12
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Déjà tu ne doit plus divisé par Fichier->Count, mais par (Fichier->Count - 3) puisque tu ne prend pas les 3 premières lignes

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Pas folle la bête, je suis vraiment idiot quelques fois

    Encore une fois merci henderson !


  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Oh pardon : grand merci à toi aussi POTTIEZ

  15. #15
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    de rien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Calcul de moyenne avec des colonnes contenant des formules
    Par filsdepub dans le forum Excel
    Réponses: 20
    Dernier message: 03/08/2012, 16h36
  2. [XL-2003] calcul de moyenne avec des jours fériés
    Par arnest dans le forum Excel
    Réponses: 3
    Dernier message: 22/11/2009, 18h06
  3. Réponses: 6
    Dernier message: 26/05/2008, 20h08
  4. Calculer une moyenne avec des jours absents
    Par guidav dans le forum Langage SQL
    Réponses: 7
    Dernier message: 25/01/2008, 09h35
  5. total des nombres générés dans un fichier.xls?
    Par loukoulouk dans le forum Modules
    Réponses: 4
    Dernier message: 22/06/2006, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo