Pb de scanf ...

foxnono06 -  
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

alors mon problème est le suivant :
Je souhaite poser une question à l'utilisateur et celui doit taper o ou n pour oui ou non mais mon programme s'arrête après le scanf, je ne comprends pas ... J'ai essayé de faire un printf de la dite variable et ce n'est même pas la variable que j'ai rentré...

Merci d'avance !!
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main (void)
{
    int rep2;
    int inc2;
    char rep1;
    float R;
    float rampant=0;
    float inc1;
    float h;
    
    printf("Quel est la longeur du rampant en m?\n");
    scanf("%f",&rampant);
    
    printf("Cette mesure correspond t elle a la longeur au sol ? o=oui n=non\n");
    scanf("%c",&rep1);
    
    if(rep1=='o')
    { 
    printf("Connaissez vous l'inclinaison en %% ou en degre 1 = %%  2 = degre\n");
    scanf("%d",&rep2);
       
       if(rep2==1)
       {
        printf("Inclinaison en %% ?\n");
        scanf("%f",&inc1);
        h=(rampant*inc1)/100;
        printf("h : %f\n",h);
        R=(rampant*rampant)+(h*h);
        printf("R : %f\n",R);
        rampant=sqrt(R);
        printf("Le rampant fait %f m\n",rampant);
       }
    
        else if(rep2==2)
       {
        printf("Inclinaison en degre ?\n");
        scanf("%d",&inc1);
        rampant=rampant/cos(inc1);
        printf("Le rampant fait %d m\n",rampant);
       }
    }
    else if(rep1=='n')
    {
    printf("Le rampant fait %d m\n",rampant);
    }
    
system("PAUSE");

}

7 réponses

flolarajasse Messages postés 115 Statut Membre 14
 
scanf("%c", &rep1);
essaye de mettre un espace mais je doute que cela change grand chose...
0
foxnono06
 
effectivement ça ne change rien, mais merci quand même ;)
0
flolarajasse Messages postés 115 Statut Membre 14
 
attends je vais me plonger dans ton programme...
0
foxnono06
 
merci merci :)
0
loupius Messages postés 789 Statut Membre 148
 
Quand tu fais des copié-collé, tu arrives à des contradictions:
printf("Le rampant fait %f m\n",rampant);
printf("Le rampant fait %d m\n",rampant);

et
scanf("%f",&inc1);
scanf("%d",&inc1);

Choisis la bonne écriture ;-)
Bonne continuation.
0
foxnono06
 
Exact merci ! en fait j'ai changé la définition des variables au dernier moment et j'ai fait des oublis ....
Mais ça ne règle pas mon problème mais merci.
0
douze12
 
Bonjour,

déjà il faudrait que tu indiques les bons types dans tes scanf/printf.

genre :
float inc1;

et
scanf("%d",&inc1);


ça va pas trop ensemble.

Sinon avant de faire ton scanf de caractère, essaye un fflush(stdin), ça résoudra peut-être ton problème...

Bonne chance
0
foxnono06
 
Merci ça marche ;) j'ai du mal à bien comprendre ces problèmes de scanf ....
0
foxnono06
 
O fait j'ai aussi un problème avec ma fonction cos ... J'ai changé la variable que j'utilisais dans le cos en double et le résultat est incohérent ! aurais tu une idée ?
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > foxnono06
 
Bonjour,
Il faut mieux utiliser des double que les float. D'ailleurs que ce soit sqrt() ou cos(), elles prennent un double en paramètre. Donc en mettant ta variable en double, il n'y a pas de soucis.
En revanche, il ne faut pas oublier de mettre des %lf (au lieu de %f) dans tes scanf (il faut bien laisser %f dans les printf).
Cdlt,
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Non, pas de fflush(stdin). Cela a un comportement indéfini.
Il faut se faire la fonction soit-même.
static videBuffer(void) {
   int c;
   while((c=getchar())!='\n' && c!=EOF);
}

Cdlt,
0
foxnono06 > fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention  
 
Salut fiddy, tout d'abord merci pour tes réponses.
J'ai essayé de changer mes variables en doubles dans ma fonction cos et ça ne marche toujours pas ... j'ai une valeur négative de cos pour 15° ...
et par rapport à la fonction que tu m'as donnée pour vider le buffer je ne sais pas comment l'utiliser !
Voilà mon code actuellement :
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main (void)
{
    int rep2;
    int pan;
    int lon1;
    int nblon;
    int nbram;
    int surface;
    int tot1;
    int P;
    char rep1;
    float R;
    float rampant=0;
    float inc1;
    float h;
    double a;
    double inc2;
    
    printf("Quel est la longeur du rampant en m?\n");
    scanf("%f",&rampant);
    fflush(stdin);
    printf("Cette mesure correspond t elle a la longeur au sol ? o=oui n=non\n");
    scanf("%c", &rep1);
    
    
    if(rep1=='o')
    { 
    fflush(stdin);
    printf("Connaissez vous l'inclinaison en %% ou en degre 1 = %%  2 = degre\n");
    scanf("%d",&rep2);
       
       if(rep2==1)
       {
        fflush(stdin);
        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)
       {
        fflush(stdin);
        printf("Inclinaison en degre ?\n");
        scanf("%lf",&inc2);
        printf("inc2 : %f\n",inc2);
        a=cos(inc2);
        printf("a: %f\n",a);
        rampant=rampant/a;
        printf("Le rampant fait %f m\n",rampant);
       }
    }
    else if(rep1=='n')
    {
    printf("Le rampant fait %f m\n",rampant);
    }
    
    fflush(stdin);
    printf("Quel type de panneau souhaitez vous utiliser : 1:Roto  2:Biosol  3:EGM \n");
    scanf("%d",&pan);
    fflush(stdin);
    printf("Quel est la longeur de la toiture ?\n");
    scanf("%d",&lon1);
   
    if(pan==1)
       {
        fflush(stdin);
        surface=rampant*lon1;
        printf("La surface de la toiture est de %d m\n",surface);
        nblon=lon1/1.047;
        nbram=rampant/2.028;
        tot1=nblon*nbram;
        printf("Vous pouvez mettre %d panneaux : %d sur la longeur et %d sur le rampant\n",tot1,nblon,nbram);
        P=270*tot1;
        printf("La puissance de l installation est : %d kW\n",P);
       }
       
      else if(pan==2)
       {
           nblon=lon1/1.047;
       }
    
system("PAUSE");

}

0

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

Posez votre question
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Salut,
j'ai une valeur négative de cos pour 15°
As-tu pensé à convertir 15° en radian ? Car lorsque tu calcules cos(x), le x doit être en radian.
Ainsi lorsque tu calcules cos(15), tu calcules non pas cos(15°) mais cos(15rad) ce qui donne bel et bien un nombre négatif. A toi donc de réaliser la conversion.

et par rapport à la fonction que tu m'as donnée pour vider le buffer je ne sais pas comment l'utiliser !

A la place de fflush(stdin), tu mets videBuffer();
Et tu définis la fonction videBuffer avant la fonction main() ou alors tu déclares la fonction.
static void videBuffer(void) {
   int c;
   while((c=getchar())!='\n' && c!=EOF);
}

Et enfin n'oublie pas de mettre return 0; à la fin de la fonction puisque la fonction main() renvoie un int.

Cdlt,
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Salut,
j'ai une valeur négative de cos pour 15°
As-tu pensé à convertir 15° en radian ? Car lorsque tu calcules cos(x), le x doit être en radian.
Ainsi lorsque tu calcules cos(15), tu calcules non pas cos(15°) mais cos(15rad) ce qui donne bel et bien un nombre négatif. A toi donc de réaliser la conversion.

et par rapport à la fonction que tu m'as donnée pour vider le buffer je ne sais pas comment l'utiliser !

A la place de fflush(stdin), tu mets videBuffer();
Et tu définis la fonction videBuffer avant la fonction main() ou alors tu déclares la fonction.
static void videBuffer(void) {
   int c;
   while((c=getchar())!='\n' && c!=EOF);
}

Et enfin n'oublie pas de mettre return 0; à la fin de la fonction puisque la fonction main() renvoie un int.

Cdlt,
0
foxnono06
 
Merci fiddy c'est super ! pour le cos c'est bon finalement j'avais trouvé...

Si ça t'embête pas, peux tu m'explique l'avantage de passer par la fonction que tu m'as donnée plutôt que fflush ?
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
peux tu m'explique l'avantage de passer par la fonction que tu m'as donnée plutôt que fflush ?
Ce n'est pas un avantage. C'est surtout la seule façon de faire. fflush() a un comportement indéfini sur les périphériques d'entrée. Ainsi fflush(stdin) ne doit jamais être utilisé dans un programme. Sinon c'est une erreur.
0