[c] probleme boucle while

Fermé
foxnono06 - 29 janv. 2010 à 12:21
garion28 Messages postés 1545 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 - 29 janv. 2010 à 16:10
Bonjour,

je voudrais permettre à l'utilisateur de décider s'il veut recommencer le programme a la fin de son exectution, pour cela, j'ai commencer par mettre en place une fonction while autour de l'ensemble du programme qui test un char et lance le programme si celui est égale à 'o'. avant le while j'initialise ma variable : char restart='o' pour pouvoir lancer le programme
A la fin du programme, je pose donc la question a l'utilisateur s'il désire recommencer, en faisant derriere un scanf du dit char

Le probleme est que ma boucle while est toujours vrai, donc quoique l'utilisateur décide de faire, le programme recommence.
Désolé le code est long mais j'ai tout mis au cas ou mais je pense que le probleme ce trouve au debut et a la fin.

Ce que je ne comprend c'est qu'a l'interieur du programme j'ai d'autre fonction while qui test des char et cela fonctionne correctement.

J'ai essayé de mettre une fonction if(restart=='o') du coup mais le probleme reste le meme

Help !!!


#include <stdio.h>
#include <math.h>
#include <stdlib.h>

static void videBuffer(void) {
   int c;
   while((c=getchar())!='\n' && c!=EOF);
}

int main (void)
{
    int rep2;
    int pan;
    int nblon;
    int nbram;
    int nblon1;
    int nbram1;
    int tot1;
    int tot2;
    int panegm;
    int pose;
    char rep1;
    char restart='o';
    float lon1;
    float R;
    float rampant=0;
    float inc1;
    float h;
    float surface;
    float surfpv;
    float distram;
    float distlon;
    double a;
    double inc2;
    double totram;
    double totlon;
    double totram1;
    double totlon1;
    double P;
    
    if(restart=='o')
    {
    
    printf("Quel est la longeur du rampant en m?\n");
    scanf("%f",&rampant);
    videBuffer();
    printf("\n");
    printf("Cette mesure correspond t elle a la longeur du rampant reel ? \no=oui n=non(longeur au sol)\n");
    scanf("%c", &rep1);
    
    printf("\n");
    printf("\n");
    
    while((rep1!='o') && (rep1!='n'))
    {
    printf("Je n ai pas compris votre saisie !\n");
    videBuffer();
    printf("\n");
    printf("Cette mesure correspond t elle a la longeur du rampant reel ? \no=oui n=non(longeur au sol\n");
    scanf("%c",&rep1);
    }
    
    if(rep1=='n')
    { 
    videBuffer();
    printf("Connaissez vous l'inclinaison en %% ou en degre 1 = %%  2 = degre\n");
    scanf("%d",&rep2);
    
    printf("\n");
    printf("\n");
       
       while((rep2!=1) && (rep2!=2))
       {
        printf("Je n ai pas compris votre saisie !\n");
        videBuffer();
        printf("\n");
        printf("Connaissez vous l'inclinaison en %% ou en degre 1 = %%  2 = degre\n");
        scanf("%d",&rep2);
        printf("\n");
        printf("\n");
       }
       
       if(rep2==1)
       {
        videBuffer(); 
        printf("Inclinaison en %% ?\n");
        scanf("%f",&inc1);
        h=(rampant*inc1)/100;
        R=(rampant*rampant)+(h*h);
        rampant=sqrt(R);
        printf("Le rampant fait %f m\n",rampant);
       }
    
        else if(rep2==2)
       {
        videBuffer();
        printf("Inclinaison en degre ?\n");
        scanf("%lf",&inc2);
        inc2=(inc2*6.28)/360;
        a=cos(inc2);
        rampant=rampant/a;
        printf("Le rampant fait %f m\n",rampant);
       }
    }
    else if(rep1=='o')
    {
    printf("Le rampant fait %f m\n",rampant);
    }
    
    printf("\n");
    printf("\n");
    videBuffer();
    
    printf("Quel type de panneau souhaitez vous utiliser : 1:Roto  2:Biosol  3:EGM \n");
    scanf("%d",&pan);
    
    printf("\n");
    printf("\n");
    
    while((pan!=1) && (pan!=2) && (pan!=3))
       {
        
        printf("Je n ai pas compris votre saisie !\n");
        videBuffer();
        printf("\n");
        printf("Quel type de panneau souhaitez vous utiliser : 1:Roto  2:Biosol  3:EGM \n");
        scanf("%d",&pan);
        printf("\n");
       }
    
    videBuffer();
    
    printf("********************************************************************************\n");
    printf("\n");
    printf("Quel est la longeur de la toiture ?\n");
    scanf("%f",&lon1);
   
    surface=rampant*lon1;
    printf("La surface de la toiture est de %f m2\n",surface);
    printf("\n");
    printf("********************************************************************************\n");
    printf("\n");
    printf("\n");
    
   
    if(pan==1)
       {
        nblon=lon1/1.047;
        nbram=rampant/2.028;
        totram=0.32+0.4+(nbram*2.028)+(0.08*(nbram-1));
        totlon=(nblon*1.047)+0.6;
       
        if(rampant<totram)
        {
         nbram=nbram-1;
         totram=0.32+0.4+(nbram*2.028)+(0.08*(nbram-1));
        }
        
        if(lon1<totlon)
        {
         nblon=nblon-1;
         totlon=(nblon*1.047)+0.6;
        }
        
              
              tot1=nblon*nbram;
              printf("********************************************************************************\n");
              printf("\n");
              printf("__________________________________*Recapitulatif*_______________________________\n");
              printf("\n");
              printf("\n");
              printf("Vous pouvez mettre %d panneaux : %d sur la longeur et %d sur le rampant\n",tot1,nblon,nbram);
              printf("\n");
              distram=(rampant-totram)/2;
              printf("La distance utilise sur le rampant sera de %f, l ecart entre \nl installation et la toiture sera de %f m de chaque cote\n",totram,distram);
              printf("\n");
              distlon=(lon1-totlon)/2;
              printf("La distance utilise sur la longueur sera de %f, l ecart entre \nl installation et la toiture sera de %f m en haut et en bas\n",totlon,distlon);
              P=tot1*0.27;
              printf("\n");
              printf("La puissance totale de l installation est de %f kW \n",P);
              surface=rampant*lon1;
              printf("\n");
              printf("La surface de la toiture est de %f m2\n",surface);
              printf("\n");
              surfpv=totlon*totram;
              printf("\n");
              printf("La surface totale de l installation est de %f m2 \n",surfpv);
              printf("\n");
              printf("********************************************************************************\n");
         
     }
       
    else if(pan==2)
       {
        
        nblon=((lon1-1.682)/1.663)+1;
        nbram=((rampant-0.864)/0.833)+1;
        
        totram=0.47+((nbram-1)*0.833)+0.864;
        totlon=((nblon-1)*1.663)+1.682+0.3;
       
        if(rampant<totram)
        {
         nbram=nbram-1;
         totram=0.47+((nbram-1)*0.833)+0.864;
        }
       
        if(lon1<totlon)
        {
        nblon=nblon-1;
        totlon=((nblon-1)*1.663)+1.682+0.3;
        }      
        
              printf("********************************************************************************\n");
              printf("\n");
              printf("__________________________________*Recapitulatif*_______________________________\n");
              printf("\n");
              printf("\n");
              tot1=nblon*nbram;
              printf("Vous pouvez mettre %d panneaux : %d sur la longeur et %d sur le rampant\n",tot1,nblon,nbram);
              printf("\n");
              distram=(rampant-totram)/2;
              printf("La distance utilise sur le rampant sera de %f, l ecart entre \nl installation et la toiture sera de %f m de chaque cote\n",totram,distram);
              distlon=(lon1-totlon)/2;
              printf("\n");
              printf("La distance utilise sur la longueur sera de %f, l ecart entre \nl installation et la toiture sera de %f m en haut et en bas\n",totlon,distlon);
              P=tot1*0.18;
              printf("\n");
              printf("La puissance totale de l installation est de %f kW \n",P);
              surface=rampant*lon1;
              printf("\n");
              printf("La surface de la toiture est de %f m2\n",surface);
              printf("\n");
              surfpv=totlon*totram;
              printf("\n");
              printf("La surface totale de l installation est de %f m2 \n",surfpv);
              printf("\n");
              printf("********************************************************************************\n");
     
     }
           
       
       else if(pan==3)
       {
        videBuffer(); 
        printf("EGM 180W ou EGM 210W ? 1 : EGM 180W  2 : EGM 210W\n");
        scanf("%d",&panegm);
        
        printf("\n");
        printf("\n");
        
       while((panegm!=1)&&(panegm!=2))
       {
        printf("Je n ai pas compris votre saisie !\n");
        printf("\n");
        videBuffer();
        printf("EGM 180W ou EGM 210W ? 1 : EGM 180W  2 : EGM 210W\n");
        scanf("%d", &panegm);
        printf("\n");
        printf("\n");
       }
        
         if(panegm==1)
         {
          nblon=lon1/1.58;
          nblon1=lon1/0.808;
          
          nbram=rampant/0.808;
          nbram1=rampant/1.58;
          
          totram1=(nbram1*1.58)+((nbram1-1)*0.02);
          totlon1=(nblon1*0.808)+((nblon1-1)*0.02);
          
          totram=(nbram*0.808)+((nbram-1)*0.02);
          totlon=(nblon*1.58)+((nblon-1)*0.02);
          
           if(rampant<totram1)
           {
             nbram1=nbram1-1;
           }
          
          if(rampant<totram)
           {
             nbram=nbram-1;
           }
           
           if(lon1<totlon1)
           {
             nblon1=nblon1-1;
           }
           
           if(lon1<totlon)
           {
             nblon=nblon-1;
           }
           
          tot1=nblon*nbram;
          tot2=nblon1*nbram1;
          
          videBuffer();
          printf("Une pose en portrait donne %d panneaux, %d sur le rampant et %d sur la longueur\n\nUne pose en paysage donne %d panneaux, %d sur le rampant et %d sur la longueur \n\nSouaitez vous faire l etude pour une pose en portrait ou en paysage ?  1:portrait  2:paysage \n",tot2,nblon1,nbram1,tot1,nblon,nbram);
          scanf("%d",&pose);
          
          printf("\n");
          printf("\n");
          
          while((pose!=1) && (pose!=2))
          {
           printf("Je n ai pas compris votre saisie !\n");
           videBuffer();
           printf("\n");
           printf("Souaitez vous faire l etude pour une pose en portrait ou en paysage ?  1:portrait  2:paysage\n");
           scanf("%d",&pose);
           printf("\n");
           printf("\n");
          }
          
           if(pose==1)
           {
            totram=totram1;
            totlon=totlon1;
            nblon=nblon1;
            nbram=nbram1;
            tot1=tot2;
              
              printf("********************************************************************************\n");
              printf("\n");
              printf("__________________________________*Recapitulatif*_______________________________\n");
              printf("\n");
              printf("\n");
              printf("Vous pouvez mettre %d panneaux : %d sur la longeur et %d sur le rampant\n",tot1,nblon,nbram);
              printf("\n");
              distram=(rampant-totram)/2;
              printf("La distance utilise sur le rampant sera de %f, l ecart entre \n l installation et la toiture sera de %f m de chaque cote\n",totram,distram);
              distlon=(lon1-totlon)/2;
              printf("\n");
              printf("La distance utilise sur la longueur sera de %f, l ecart entre \n l installation et la toiture sera de %f m en haut et en bas\n",totlon,distlon);
              P=tot1*0.18;
              printf("\n");
              printf("La puissance totale de l installation est de %f kW \n",P);
              surface=rampant*lon1;
              printf("\n");
              printf("La surface de la toiture est de %f m2\n",surface);
              printf("\n");
              surfpv=totlon*totram;
              printf("\n");
              printf("La surface totale de l installation est de %f m2 \n",surfpv);
              printf("\n");
              printf("********************************************************************************\n");
          }
           
          else
          {   
              printf("********************************************************************************\n");
              printf("\n");
              printf("__________________________________*Recapitulatif*_______________________________\n");
              printf("\n");
              printf("\n");
              printf("Vous pouvez mettre %d panneaux : %d sur la longeur et %d sur le rampant\n",tot1,nblon,nbram);
              distram=(rampant-totram)/2;
              printf("\n");
              printf("La distance utilise sur le rampant sera de %f, l ecart entre \n l installation et la toiture sera de %f m de chaque cote\n",totram,distram);
              distlon=(lon1-totlon)/2;
              printf("\n");
              printf("La distance utilise sur la longueur sera de %f, l ecart entre \n l installation et la toiture sera de %f m en haut et en bas\n",totlon,distlon);
              P=tot1*0.18;
              printf("\n");
              printf("La puissance totale de l installation est de %f kW \n",P);
              surface=rampant*lon1;
              printf("La surface de la toiture est de %f m2\n",surface);
              printf("\n");
              surfpv=totlon*totram;
              printf("\n");
              printf("La surface totale de l installation est de %f m2 \n",surfpv);
              printf("\n");
              printf("********************************************************************************\n");
          }
       
       }
        
        else
        {
          nblon=lon1/1.69;
          nblon1=lon1/0.99;
          
          nbram=rampant/0.99;
          nbram1=rampant/1.69;
          
          totram1=(nbram1*1.69)+((nbram1-1)*0.02);
          totlon1=(nblon1*0.99)+((nblon1-1)*0.02);
          
          totram=(nbram*0.99)+((nbram-1)*0.02);
          totlon=(nblon*1.69)+((nblon-1)*0.02);
          
           if(rampant<totram1)
           {
             nbram1=nbram1-1;
           }
          
          if(rampant<totram)
           {
             nbram=nbram-1;
           }
           
           if(lon1<totlon1)
           {
             nblon1=nblon1-1;
           }
           
           if(lon1<totlon)
           {
             nblon=nblon-1;
           }
           
          tot1=nblon*nbram;
          tot2=nblon1*nbram1;
          
          videBuffer();
          printf("Une pose en portrait donne %d panneaux, %d sur le rampant et %d sur la longueur\n Une pose en paysage donne %d panneaux au total, %d sur le rampant et %d sur la longueur \n Souaitez vous faire l etude pour une pose en portrait ou en paysage ?  1:portrait  2:paysage \n",tot2,nblon1,nbram1,tot1,nblon,nbram);
          scanf("%d",&pose);
          
          printf("\n");
          
          while((pose!=1) && (pose!=2))
          {
           printf("Je n ai pas compris votre saisie !\n");
           videBuffer();
           printf("\n");
           printf("Souaitez vous faire l etude pour une pose en portrait ou en paysage ?  1:portrait  2:paysage\n");
           scanf("%d",&pose);
          }
          
          printf("\n");
          printf("\n");
          
           if(pose==1)
           {
            totram=totram1;
            totlon=totlon1;
            nblon=nblon1;
            nbram=nbram1;
            tot1=tot2;
              
              printf("********************************************************************************\n");
              printf("\n");
              printf("__________________________________*Recapitulatif*_______________________________\n");
              printf("\n");
              printf("\n");
              printf("Vous pouvez mettre %d panneaux : %d sur la longeur et %d sur le rampant\n",tot1,nblon,nbram);
              printf("\n");
              distram=(rampant-totram)/2;
              printf("La distance utilise sur le rampant sera de %f, l ecart entre \nl installation et la toiture sera de %f m de chaque cote\n",totram,distram);
              distlon=(lon1-totlon)/2;
              printf("\n");
              printf("La distance utilise sur la longueur sera de %f, l ecart entre \nl installation et la toiture sera de %f m en haut et en bas\n",totlon,distlon);
              P=tot1*0.21;
              printf("\n");
              printf("La puissance totale de l installation est de %f kW \n",P);
              surface=rampant*lon1;
              printf("\n");
              printf("La surface de la toiture est de %f m2\n",surface);
              surfpv=totlon*totram;
              printf("\n");
              printf("La surface totale de l installation est de %f m2 \n",surfpv);
              printf("\n");
              printf("********************************************************************************\n");
           }
           
           else
           {  
              printf("********************************************************************************\n");
              printf("\n");
              printf("__________________________________*Recapitulatif*_______________________________\n");
              printf("\n");
              printf("\n");  
              printf("Vous pouvez mettre %d panneaux : %d sur la longeur et %d sur le rampant\n",tot1,nblon,nbram);
              distram=(rampant-totram)/2;
              printf("\n");
              printf("La distance utilise sur le rampant sera de %f, l ecart entre \nl installation et la toiture sera de %f m de chaque cote\n",totram,distram);
              distlon=(lon1-totlon)/2;
              printf("\n");
              printf("La distance utilise sur la longueur sera de %f, l ecart entre \nl installation et la toiture sera de %f m en haut et en bas\n",totlon,distlon);
              P=tot1*0.21;
              printf("\n");
              printf("La puissance totale de l installation est de %f kW \n",P);
              surface=rampant*lon1;
              printf("\n");
              printf("La surface de la toiture est de %f m2\n",surface);
              surfpv=totlon*totram;
              printf("\n");
              printf("La surface totale de l installation est de %f m2 \n",surfpv);
              printf("\n");
              printf("********************************************************************************\n");
           }
       
       }
    
    }
    
   printf("\n");
   printf("\n");
   videBuffer();
   printf("Voulez vous continuer ? oui : o  non : n\n");
   scanf("%c",&restart);
   } 
    
system("PAUSE");

}

3 réponses

garion28 Messages postés 1545 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 406
29 janv. 2010 à 14:08
je ne sais pas si tu connais la différence entre une constante et une variable, mais a mon avis l'erreur est a la déclaration de ton restart
char restart='o';
tu déclare et initialise au même endroit, ce qui signifie que c'est une constante
pour une variable tu met
char restart;
restart='o';

si j'ai bon dis moi ^^
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
29 janv. 2010 à 16:04
char restart='o';
tu déclare et initialise au même endroit, ce qui signifie que c'est une constante

Non, après cette déclaration, 'restart' est une variable initialisée de type 'char', donc parfaitement modifiable; par contre, une déclaration telle que: const char restart = 'o';, déclare une variable de type 'const char' et donc obligatoirement initialisée puisque non modifiable par la suite.
char restart='o';
if(restart=='o')
{

Le 'if' est complètement inutile puisque le résultat du test sera forcément toujours le même, en l'occurence, il sera positif.
Quant à la boucle:
  char rep1;
  scanf("%c", &rep1);
  while((rep1!='o') && (rep1!='n'))
  {
    printf("Je n ai pas compris votre saisie !\n");
    videBuffer();
    printf("\nCette mesure .. ? \n");
    scanf("%c", &rep1);
  }
elle doit fonctionner.
Bonne continuation.

Nota:
Le langage 'C', de part la structure qu'il impose, génère un nombre de lignes non négligeable, alors inutile d'en rajouter.
printf("\n");
printf("\n");
printf("La surface est ...de %f m2\n",surface);
est strictement équivalent à:
printf("\n\nLa surface est ...de %f m2\n",surface);
0
garion28 Messages postés 1545 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 406
29 janv. 2010 à 16:10
ah désolé pour le const obligatoire pour une constante, je n'utilise pas le C
0