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 :

problème boucle while


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut problème boucle while
    Salut,

    Ne sachant plus quoi faire devant mon PC, je me suis dit un jour "pourquoi pas essayer de programmer et pourquoi pas en C++ " Quel gros naif!!!.

    Enfin bref, je me suis mis en tête d'essayer de faire une application console à deux balle de conversion d'unités.(il faut bien commencer par quelque chose)

    Mis à part une syntaxe ou l'autre que vous trouverez foireuse, voici mon problème:

    Le code dispose de deux niveaux de menus.
    Le premier est le choix du type de conversion.
    Le deuxième est le choix de l'unité à convertir (pour le moment je n'ai fait que les distances en attendant que ça fonctionne comme je souhaite.
    Dans ce menu,en option 7 je souhaite revenir au menu principal.
    Au mieux je sais retourner au deuxième menu pour l'instant.
    J'ai essayé avec GOTO, ça marche, mais suite à tout le mal que j'en ai lu je n'ai pas envie d'être maudit sur 7 générations.
    Voici le code et merci d'avance

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
    #include <iostream>
    #include <iomanip>
     
    using namespace::std;
     
    void ShowMainMenu (void);//menu principal
    void ShowDistMenu (void);//menu distances
    void ShowDistTable (double);//Calcul et affichage de tableau de solution
     
    int main()
    {
     
        float valeur=0;// pour le type de conversion
        short choix=0;// pour cl'unité à convertir
     
        cout<<setw(50)<<right<<"Conversion d'unites\n";
        cout<<setw(51)<<right<<"___________________\n\n";
     
        ShowMainMenu(); // affiche le menu principal
        cin>>valeur;// selectionne le sous menu
        cout<<"\n";
     while (valeur!=EOF)
    {     
        if (valeur==1)// conversion des distances
        {
           ShowDistMenu (); 
           cin>>choix;
           double interm=0.0;
     
          while (choix!=EOF)
          {
                      if (choix==1)
                      { 
                      cout<<setw(30)<<left<<"Entrez le nombre de NM : ";
                      cin>>interm;/*fournit une valeur intermediaire (basée sur le mètre) pour pouvoir utiliser la fonction "ShowDistTable" valable
                      indépendament de l'unité choisie*/ 
    		  ShowDistTable (interm*1852);//donne le facteur d'adaptation selon l'unité calculée.
    		  system("PAUSE");
    		  ShowDistMenu ();//Affiche à nouveau le menu distances pour redemarrer la boucle 
                      cin>>choix;
                      cout<<"\n";
    		  }
     
                      else if (choix==2)
    		  {		
      		  cout<<setw(30)<<left<<"Entrez le nombre de KM : ";
    		  cin>>interm;
    		  ShowDistTable (interm*1000);
    		  system("PAUSE");
    		  ShowDistMenu ();
                      cin>>choix;
                      cout<<"\n";
    		  }
     
                      else if (choix==3)
    		  {		
    		  cout<<setw(30)<<left<<"Entrez le nombre de SM : ";
    		  cin>>interm;
    		  ShowDistTable (interm*1609.344);
    		  system("PAUSE");
    		  ShowDistMenu ();
                      cin>>choix;
                      cout<<"\n";
    		  }
     
                      else if (choix==4)
    		  {		
    		  cout<<setw(30)<<left<<"Entrez le nombre de Ft : ";
    		  cin>>interm;
    		  ShowDistTable (interm*0.3048);
    		  system("PAUSE");
    		  ShowDistMenu ();
                      cin>>choix;
                      cout<<"\n";
    		  }
     
                      else if (choix==5)
    		  {		
    		  cout<<setw(30)<<left<<"Entrez le nombre de Mtr : ";
    		  cin>>interm;
    		  ShowDistTable (interm);
    		  system("PAUSE");
    		  ShowDistMenu ();
                      cin>>choix;
                      cout<<"\n";
    		  }
     
                      else if (choix==6)
    		  {		
    		  cout<<setw(30)<<left<<"Entrez le nombre de Yds : ";
    		  cin>>interm;
    		  ShowDistTable (interm*0.9144);
    		  system("PAUSE");
    		  ShowDistMenu ();
                      cin>>choix;
                      cout<<"\n";
    		          }
     
    		  else if (choix==7)
    		  {
                      ShowMainMenu(); // affiche le menu principal
                      cin>>valeur;
                      cout<<"\n";               
                      }  
                      else if (choix<1 || choix>7)
                      {
                      cout<< "Erreur de saisie.\n";
                      cout<<"Veuillez entrer votre choix\n";
    		          cin>>choix; 
                      }
                      else if( ! ( cin >> choix ) )
    		   {
                      cerr << "Erreur de saisie.\n";
                      cin.clear(); // effacer les bits d'erreurs
                      cin.ignore( numeric_limits<streamsize>::max(), '\n' ); // supprimer la ligne erronée dans le buffer
    		   cout<<"Veuillez entrer votre choix\n";
    		   cin>>choix;
       		   } 
                   }         
              }
     
    }
      system("PAUSE");      
      return 0;
    }
     
    void ShowMainMenu (void)//menu racine
    {
        cout<<"Distances\t\t1"<<endl;
        cout<<"Volumes\t\t\t2"<<endl;
        cout<<"Masses\t\t\t3"<<endl;
        cout<<"Masse/Volumes liquides\t4"<<endl;
        cout<<"Pressions\t\t5"<<endl;
        cout<<"Altitudes\t\t6\n"<<endl;
        }
    void ShowDistMenu (void)//menu distances
    {
         cout<<"Pour convertir des NM     1\n";
         cout<<"Pour convertir des KM     2\n";
         cout<<"Pour convertir des SM     3\n";
         cout<<"Pour convertir des Feet   4\n";
         cout<<"Pour convertir des Metres 5\n";
         cout<<"Pour convertir des Yards  6\n";
         cout<<"Pour revenir au menu principal entrez  7\n\n";
         }
    void ShowDistTable (double value)
    {
          double NM,KM,SM,Ft,Mtr,Yds; 
          NM=value*0.0005399568;//calcul des distances 
          KM=value*0.001;
          SM=value*0.0006213710;
          Ft=value*3.2808333333;
          Mtr=value;
          Yds=value*1.093613298;
          cout<<"\n\n";
          cout<<"     ********************************************"<<endl;//affichage du résultat
          cout<<"     **"<<setw(15)<<right<<setprecision(6)<<NM<<" NM **"<<setw(15)<<right<<setprecision(6)<<Ft<<" Ft **"<<endl;
          cout<<"     ********************************************"<<endl;
          cout<<"     **"<<setw(15)<<right<<setprecision(6)<<KM<<" KM **"<<setw(15)<<right<<setprecision(6)<<Mtr<<" Mtr**"<<endl;
          cout<<"     ********************************************"<<endl;
          cout<<"     **"<<setw(15)<<right<<setprecision(6)<<SM<<" SM **"<<setw(15)<<right<<setprecision(6)<<Yds<<" Yds**"<<endl;
          cout<<"     ********************************************"<<endl;
          cout<<"\n\n";
    }

  2. #2
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Bonjour,

    Utilise la balise code pour qu'on puisse avoir la coloration syntaxique.
    Aussi, indente ton code pour qu'on y voit mieux (ça aussi, ça fait partie des bons réflexes en programmation !).

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut suite..
    Voila, j'espère que c'est mieux comme ça

  4. #4
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Oui, c'est plus agréable, merci

    Effectivement, goto, c'est le mal

    Pourquoi pas quelque chose dans le 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    int main()
    {
    	const unsigned int DOLLAR_EURO_CONVERSION_CODE = 1;
    	const unsigned int YARD_METER_CONVERSION_CODE = 2;
    	const unsigned int MENU2_CODE = 3;
    	const unsigned int EXIT_CODE = 99;
     
    	unsigned int code = 0;
    	bool exit = false;
     
    	while(!exit)
    	{
    		//afficher un menu
    		//lire le choix et l'écrire dans la variable code
     
    		switch(code)
    		{
    			case DOLLAR_EURO_CONVERSION_CODE:
    				dollar_euro_conversion();
    				break;
    			case YARD_METER_CONVERSION_CODE:
    				yard_meter_conversion(); 
    				break;
    			case MENU2_CODE:
    				display_menu2(exit);
    				break;
    			case EXIT_CODE:
    				exit = true;
    				break;
    		}
    	}
    }
     
    void display_menu2(bool& parent_exit)
    {
    	const unsigned int AUTRE_CHOSE_CODE = 1;
    	const unsigned int ENCORE_AUTRE_CHOSE_CODE = 2;
    	const unsigned int RETURN_CODE = 98;
    	const unsigned int EXIT_CODE = 99;
     
    	unsigned int code = 0;
    	bool exit = false;
     
    	while(!exit)
    	{
    		//afficher un menu
    		//lire le choix et l'écrire dans la variable code
     
    		switch(code)
    		{
    			case AUTRE_CHOSE_CODE:
    				autre_chose();
    				break;
    			case ENCORE_AUTRE_CHOSE_CODE:
    				encore_autre_chose(); 
    				break;
    			case RETURN_CODE:
    				exit = true;
    				break;
    			case EXIT_CODE:
    				exit = true;
    				parent_exit = true;
    				break;
    		}
    	}
    }

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Merci Bcp
    Oh joie, ca marche.

    J'ai intégré ton conseil à mon code (j'ai quand même ramé)et ca fonctionne.

    Ca va paraitre abruti comme ca mais j'en étais emmerveillé

    N'étant même pas familier avec bool exit = false(pour te dire comme ma marge de progression possible immense) ca m'a pris un certain temps avant de comprendre ta réponse.

    Je ne sais toujours pas les effets de l'appel de fonction avec (exit)
    ainsi que la partie fonction(bool&parent_exit).

    Encore merci.

    voici ce que ca a donné. Il n'y a plus qu'a faire les autres conversions.

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    #include <iostream>
    #include <iomanip>
     
    using namespace::std;
     
    void ShowMainMenu (void);//menu principal
    void ShowDistMenu (void);//menu distances
    void DistComp (double);//Calcul et affichage de tableau de solution
    void Dist(bool& parent_exit);
     
    int main()
    {
        const unsigned int DISTANCE_CODE=1;//parametres du menu principal
        const unsigned int VOLUME_CODE=2;
        const unsigned int WEIGHT_CODE=3;
        const unsigned int WEIGHT_LIQUID_CODE=4;
        const unsigned int ALTITUDE_CODE=5;
        const unsigned int PRESSURE_CODE=6;
        const unsigned int SPEED_CODE=7;
        const unsigned int WIND_CODE=8;
        const unsigned int FUEL_CODE=9;
        const unsigned int VNAV_CODE=10;
        const unsigned int HOLDING_PATTERN_CODE=11;
        const unsigned int EXIT_CODE=99;
     
        unsigned int code = 0;
        bool exit = false;
     
        cout<<setw(50)<<right<<"E-6B\n";
        cout<<setw(51)<<right<<"____\n\n"; //titre
     
        while (!exit)
        {
     
              ShowMainMenu ();
              cout<<"\nEnter your choice : ";
              cin>>code;
              cout<<endl;
     
              switch(code)
              {
                          case DISTANCE_CODE:
                          Dist(exit);
                          break;
     
                          case EXIT_CODE:
                               exit=true;
                               break;
              }
        }
     
     
      return 0;                    
    }
     
    void Dist(bool& parent_exit)
    {
    const unsigned int NM_CODE=1;//parametres du menu distances
    const unsigned int KM_CODE=2;
    const unsigned int SM_CODE=3;
    const unsigned int FT_CODE=4;
    const unsigned int MTR_CODE=5;
    const unsigned int YRD_CODE=6;
    const unsigned int MAIN_MENU_CODE=98;
    const unsigned int EXIT_CODE=99;
    unsigned int code = 0;
    bool exit = false;
    double interm=0.0;
     
         while (!exit)
         {
               ShowDistMenu ();
               cin>>code;
               cout<<"\n";
     
               switch (code)
               {
                      case NM_CODE:
                           cout<<setw(30)<<left<<"How much NM : ";
                           cin>>interm;/*fournit une valeur intermediaire (basée sur le mètre) pour pouvoir utiliser la fonction "ShowDistTable" valable
                           indépendament de l'unité choisie*/ 
    		               DistComp(interm*1852);//donne le facteur d'adaptation selon l'unité calculée.
    		               system("PAUSE");		                           
                      break;
     
                      case KM_CODE:
      		               cout<<setw(30)<<left<<"How much KM : ";
    		               cin>>interm;
    	                   DistComp (interm*1000);
    	                   system("PAUSE");
    		          break;
     
                      case SM_CODE:
    		               cout<<setw(30)<<left<<"How much SM : ";
    		               cin>>interm;
    		               DistComp (interm*1609.344);
    		               system("PAUSE");
    		          break;
     
                      case FT_CODE:
    		               cout<<setw(30)<<left<<"How much Feet : ";
    		               cin>>interm;
    		               DistComp (interm*0.3048);
    		               system("PAUSE");		          
    		          break;
     
                      case MTR_CODE:
    		               cout<<setw(30)<<left<<"How much Meter : ";
    		               cin>>interm;
    		               DistComp (interm);
    		               system("PAUSE");		          
    		          break;
     
                      case YRD_CODE:
    		               cout<<setw(30)<<left<<"How much Yards : ";
    		               cin>>interm;
    		               DistComp (interm*0.9144);
    		               system("PAUSE");		          
    		          break;
     
    		          case MAIN_MENU_CODE:
    		               exit=true;
                      break;
     
                      case EXIT_CODE:               
                           exit=true;
                           parent_exit=true;
                      break;
     
                      }
            }
    }  
     
     
    void ShowMainMenu (void)//menu racine
    {
        cout<<"Distance        1"<<endl;
        cout<<"Volume          2"<<endl;
        cout<<"Weight          3"<<endl;
        cout<<"Weight          4"<<endl;
        cout<<"Altitude        5"<<endl;
        cout<<"Pressure        6"<<endl;
        cout<<"Speed           7"<<endl;
        cout<<"Wind            8"<<endl;
        cout<<"Fuel            9"<<endl;
        cout<<"VNav            10"<<endl;
        cout<<"Holding pattern 11"<<endl;
        cout<<"Exit            99\n"<<endl;
    }
     
     
    void ShowDistMenu (void)//menu distances
    {
         cout<<"NM conversion    1"<<endl;
         cout<<"KM conversion    2"<<endl;
         cout<<"SM conversion    3"<<endl;
         cout<<"Feet conversion  4"<<endl;
         cout<<"Meter conversion 5"<<endl;
         cout<<"Yards conversion 6"<<endl;
         cout<<"Main menu       98"<<endl;
         cout<<"Exit            99\n"<<endl;
    }
    void DistComp (double value)
    {
     
          double NM,KM,SM,Ft,Mtr,Yds; 
          NM=value*0.0005399568;//calcul des distances 
          KM=value*0.001;
          SM=value*0.0006213710;
          Ft=value*3.2808333333;
          Mtr=value;
          Yds=value*1.093613298;
          cout<<"\n\n";
          cout<<"     ********************************************"<<endl;//affichage du résultat
          cout<<"     **"<<setw(15)<<right<<setprecision(6)<<NM<<" NM **"<<setw(15)<<right<<setprecision(6)<<Ft<<" Ft **"<<endl;
          cout<<"     ********************************************"<<endl;
          cout<<"     **"<<setw(15)<<right<<setprecision(6)<<KM<<" KM **"<<setw(15)<<right<<setprecision(6)<<Mtr<<" Mtr**"<<endl;
          cout<<"     ********************************************"<<endl;
          cout<<"     **"<<setw(15)<<right<<setprecision(6)<<SM<<" SM **"<<setw(15)<<right<<setprecision(6)<<Yds<<" Yds**"<<endl;
          cout<<"     ********************************************"<<endl;
          cout<<"\n\n";
    }

  6. #6
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Oups, j'avais fait une petite erreur dans mon code (j'ai mis deux fois RETURN_CODE dans le deuxième switch). Je viens de corriger

    Je ne sais toujours pas les effets de l'appel de fonction avec (exit)
    ainsi que la partie fonction(bool&parent_exit).
    type& variable est une référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main()
    {
        bool exit = true;
        fonction(exit);
        //maintenant, exit vaut false
    }
     
    void fonction(bool& parent_exit)
    {
        parent_exit = false;
    }
    Si tu es plus familier avec les pointeurs, c'est équivalent à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main()
    {
        bool exit = true;
        fonction(&exit);
        //maintenant, exit vaut false
    }
     
    void fonction(bool* parent_exit)
    {
        *parent_exit = false;
    }
    Je te conseille de lire un bon cours sur le C++ ! Ça peut être une bonne chose d'apprendre sur le tas, mais il est quand même bon de partir avec certaines bases indispensables.
    En voilà un : http://bruce-eckel.developpez.com/li...on/ticpp2vol1/

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    La cervelle commence à me couler par les oreilles, je vais me coucher...puis bouquiner.

    Encore merci, j'ai deja pas mal de doc mais je ne suis pas encore très loin car c'est pas quelque chose qu'on peut lire pendant une semaine et laisser sur le coté 2 mois.

    Alors j'essaie d'alterner entre bouquin et apprentissage sur le tas pour rester motivé.

    C'est ce qui a fait défaut à chaque fois que j'ai commencé avec le c++.

    A bientot

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

Discussions similaires

  1. Problème boucle while
    Par Peedro dans le forum Langage
    Réponses: 4
    Dernier message: 07/10/2008, 15h09
  2. Problème boucle while
    Par chuko dans le forum C
    Réponses: 7
    Dernier message: 04/07/2008, 17h12
  3. Problème boucle while
    Par fred33 dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2008, 20h16
  4. [MySQL] Problème boucle WHILE
    Par Adlack dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/02/2007, 20h30
  5. Problème boucle while et evenement
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 30/03/2006, 19h11

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