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++ Discussion :

Boucle for avec nombre décimaux


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2018
    Messages : 15
    Par défaut Boucle for avec nombre décimaux
    Bonjour, j'ai un problème avec une boucle FOR en C++

    je veux incrementer des variables de 0.5 à 6(exclu) comme suit : {0.5 0.6 0.7 0.8 0.9 1 2 3 4 5 } avec une boucle for
    donc pour les chiffres < 1 un pas de 0.1
    et un pas de 1 pour le schiffres de 1 à 6

    par exemple si nb1 = 0.9 et nb2 = 2 j'e devrait avoir {0.9 et 1} soit 2 boucles

    Comment faire ???

    voici mon debut de 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <iostream>
    #include <iomanip> // pour setprecision()
    using namespace std;
     
    int main()
    {
      // Réduire le format d'affichage
      cout << setprecision(4);
     
      // Paramètres
     
    	double debut_for =0;
    	double fin_for =0;
     
    	cout << " Saisir nb1 ? (entre 0.5 et 6) ? " <<endl;;
    	cin >> debut_for;
     
    	cout << " Saisir nb2 ? (entre nb1 et 6) ? " <<endl;;
    	cin >> fin_for;
     
     
    		for (debut_for ; debut_for < fin_for ; ++debut_for) 
    		{
    		cout << debut_for <<endl;
    		}
     
     
     
     
          /*******************************************
       * Ne rien modifier après cette ligne.
       *******************************************/
     
      return 0;
    }
    qui ne fonctionne pas evidemment..


    merci d'avance pour ceux qui peuvent me depanner...

  2. #2
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Citation Envoyé par 00-Pegasus-00 Voir le message
    soit 2 boucles
    C'est bien ça, deux boucles.
    La première pour les valeur inférieur à 1 et la deuxième pour celle supérieur ou égal à 1

    La boucle for :
    for(initialisation; condition; expression)
    La zone initialisation sert à initialiser une variable, toi tu n'initialises rien du tout (tu mets juste le nom de la variable).
    Dans ton cas la variable est déjà initialisée lors de la saisie (cin) donc tu ne mets rien du tout.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Oui deux boucles;

    Tu peux aussi avoir une unique boucle avec le pas d'avancée qui change.

    Dans les deux cas, il y a un risque potentiel : est-ce que 0.5 plus 5 fois 0.1 fait exactement 1.0? C'est loin d'être sûr!
    D'où l'exemple douteux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double  pas = 0.1;
    for ( double nb = debut_for ; nb <= fin_for ; nb += pas ) {
        if ( nb >= 1.0 )  // mais ce test n'est pas fiable!! (après 0.99999999 il devrait y avoir 2.0)
            pas = 1.0;    // pour tout ce qui est supérieur à 1.0 c'est un pas de 1.0
        std::cout << nb << ' ';
    }

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par dalfab Voir le message
    Oui deux boucles;

    Tu peux aussi avoir une unique boucle avec le pas d'avancée qui change.

    Dans les deux cas, il y a un risque potentiel : est-ce que 0.5 plus 5 fois 0.1 fait exactement 1.0? C'est loin d'être sûr!
    D'où l'exemple douteux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    double  pas = 0.1;
    for ( double nb = debut_for ; nb <= fin_for ; nb += pas ) {
        if ( nb >= 1.0 )  // mais ce test n'est pas fiable!! (après 0.99999999 il devrait y avoir 2.0)
            pas = 1.0;    // pour tout ce qui est supérieur à 1.0 c'est un pas de 1.0
        std::cout << nb << ' ';
    }
    Dans les deux cas, il y a un risque potentiel : est-ce que 0.5 plus 5 fois 0.1 fait exactement 1.0? C'est loin d'être sûr!
    Ceci étant dit, il y a quand même une alternative potentielle dans le fait de travailler avec des entiers "le plus longtemps possible". Je m'explique:

    Au lieu de partir avec des valeurs réelles comprises entre 0.1 et 1 (par pas de 0.1) d'une part et des valeurs entières comprises entre 1 et 5 (par pas de 1) de l'autre, rien n'empêche de baser la logique sur des valeurs ... entières dix fois supérieures.

    Nous baserions donc cette logique sur des valeurs comprises entre 1 et 10 (par pas de 1) pour la première partie et entre 10 et 50 (par pas de 10) pour la deuxième et nous ferions le "calcul final" -- à savoir la division par 10 (avec conversion en réel au passage) qu'une fois que ... cette valeur finale est nécessaire.
    Cela pourrait prendre une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     int step{1};
        for(int i = 1; i<=50; i+=step){
            if(i==10)
                step=10;
            double value = static_cast<double>(i)/10.;
            std::cout<<value <<" ";
        }
    Cela aurait -- au moins -- l'avantage d'éviter les problèmes liés à la comparaison de réels et à leur imprécision potentielle
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 624
    Par défaut
    Bonjour,

    Pour éviter toute incertitude sur le comportement du cumul des erreurs en flottants, il y a une solution simple. Ne pas en avoir. Ici c'est simple car finalement c'est une boucle entière de 1/10 .

    On peut donc écrire un truc du genre :
    Code C++ : 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
    #include <iostream>
    #include <iomanip>                               // Pour setprecision()
    using namespace std;
     
    int main() {
       cout << setprecision(4);                      // Réduire le format d'affichage
       double debut_for = 0.0, fin_for = 0.0;
       cout << " Saisir nb1 ? (entre 0.5 et 6) ? " << endl;
       cin >> debut_for;
       cout << " Saisir nb2 ? (entre nb1 et 6) ? " << endl;
       cin >> fin_for;
       int isup = static_cast<int>(fin * 10.0), di = 5;
       for(int i = static_cast<int>(debut_for * 10.0); i < isup ; i += di) {
          cout << i * 0.1 << endl;
          if(i == 10) di = 10;
       }
       return 0;
    }

    Si on a le moindre doute sur la conversion en entier qui pourrait avoir le même type de problème, il suffit de remplacer 10.0 par 10.0001 pour être certain que le résultat entier ne soit jamais inférieur avec ce qu'il devrait être sans pour autant risquer une surévaluation.

    Remarque : les entrées sont limitées mais ces limitations ne sont pas contrôlées.

    Salutations

  6. #6
    Membre averti
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2018
    Messages : 15
    Par défaut Merci
    Messieurs,

    Merci pour toutes vos réponses, c'est très enrichissant et j'ai appris des choses...

    Je met en résolu...

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

Discussions similaires

  1. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 16h07
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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