Pb de scanf ...

Fermé
foxnono06 - 27 janv. 2010 à 15:12
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 28 janv. 2010 à 22:46
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");

}
A voir également:

7 réponses

flolarajasse Messages postés 103 Date d'inscription jeudi 12 novembre 2009 Statut Membre Dernière intervention 23 juin 2011 14
27 janv. 2010 à 15:21
scanf("%c", &rep1);
essaye de mettre un espace mais je doute que cela change grand chose...
0
effectivement ça ne change rien, mais merci quand même ;)
0
flolarajasse Messages postés 103 Date d'inscription jeudi 12 novembre 2009 Statut Membre Dernière intervention 23 juin 2011 14
27 janv. 2010 à 15:29
attends je vais me plonger dans ton programme...
0
merci merci :)
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
27 janv. 2010 à 16:05
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
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
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
Merci ça marche ;) j'ai du mal à bien comprendre ces problèmes de scanf ....
0
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842 > foxnono06
27 janv. 2010 à 20:05
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
27 janv. 2010 à 20:00
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
28 janv. 2010 à 09:11
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
28 janv. 2010 à 13:02
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
28 janv. 2010 à 13:02
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
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
28 janv. 2010 à 22:46
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