0
votes

Ne pas être capable d'imprimer un résultat simple de la condition de la condition sur la console

Ceci est un programme de test simple où j'essaie d'obtenir le résultat "12 hommes en colère" indiqués sur la console après avoir terminé de prendre des entrées pour entrer dans le sous-genre du 2e printf code> de la programme. Qu'est-ce que j'ai mal fait ici? S'il vous plaît, n'essayez pas de trouver la pertinence avec quoi que ce soit ici. La console posera simplement à l'utilisateur d'appuyer sur 1 pour l'action, alors qu'elle poserait humoristique / autre, lorsque l'humour montrerait 12 hommes en colère après avoir pris l'entrée comme 1.1.

int main()
{
    int action=1,comedy=2;
    float humorous=1.1, other=1.2,input1;
    int input;
    printf("Which Movies You Want to See\n");
    printf("Action/Comedy");
    scanf("%d",&input);
    if(input==1)
    {
        printf("Humorous/Other");
        scanf("%f",&input1);

        if(input1==1.1)
        {
            printf("12 angry men");    
        }
    }

    return 0 ;
}

c

1 commentaires

Utiliser des points flottants pour l'entrée ici semble être un plan vraiment mauvais comme Valeurs de point flottant peut être vraiment étrange . Vous voudrez également utiliser commutateur (n'oubliez pas la pause ; ) pour casser des choix au lieu d'une chaîne longue et convoluée de si déclarations.


3 Réponses :


0
votes

Comme les autres en ont mentionné, ce n'est pas une bonne pratique de comparer directement des flotteurs comme si vous essayez de faire. Par exemple, si vous définissez int entrée1 = 1.1 puis essayez d'utiliser printf ("% f", entrée1) , la sortie est 1.10000 1.10000 ou quelque chose de similaire. Cela ne retournera pas vrai pour 1.1 == 1.10000 en C au moment de l'exécution, ce qui cause le problème.

Vous pouvez simplement utiliser différents entiers pour casse dans ce que vous voulez arriver en fonction de l'entrée ou (si vous devez vraiment vraiment) vous pouvez comparer à l'aide du << / code> et > < / code> opérateurs. Ie si (INPUT1> 1.09 && INPUT1 <1.11) .

Cela vous donnera le résultat souhaité.


6 commentaires

Sauf que 1.1 et 1.10000 sont égaux . Donc, alors que votre point est valide, votre explication n'est pas convaincante.


Intuitivement, oui, ils sont égaux mais pas en C au moment de l'exécution qui était le point.


Non, ils sont les mêmes. Il y a une différence entre 1,1 et 1,1f, ce qui se passe ici. Vous confondez probablement comment une fonction telle que PrintF présente des valeurs de points flottantes et la valeur stockée réelle. Deux Différentes mais que des valeurs de fermeture peuvent être présentées comme la même valeur. Je comprends ce que vous essayez de dire, mais c'est inexact et déroutant, alors ne rend pas votre argument bien.


De plus, le spécificateur de format% F sans pré-impressionnera les zéros de fin. Le problème ici est que la conversion implicite de la valeur du flotteur 1.1 et doubler ne génère pas nécessairement la même valeur que le double 1,1 littéral 1.1. Printf ("% .15F% .15F", (Double) Input1, 1.1) pourrait produire un exemple plus convaincant.


Je comprends comment la conversion d'une valeur de flotteur vers la constante de 1.1 n'est pas exactement la même valeur et provoque des problèmes lorsque vous essayez de les comparer primitivement, mais n'expliquait pas cela très bien et peut avoir causé ma réponse à l'impression. merci pour une bonne explication!


Le test J'ai suggéré des rendements 1.100000023841858 1.100000000000000. Le flotteur a environ 6 chiffres significatifs (décimales) de précision, tandis que le double est bon pour 15.



0
votes

Vous ne devez jamais tester un binaire em> le numéro de point flottant pour EXACT em> égalité à un décimal em> valeur réelle. Un flotteur 32 bits peut représenter un nombre fini de valeurs discrètes dont peu de coïncident avec une valeur décimale exacte sur le codage de point flottant binaire plutôt décimal.

C'est probablement une mauvaise idée de flotter des valeurs de points pour " Sélection du menu "Dans tout événement, mais si vous insistez, votre code peut être corrigé ainsi: P>

if( input1 == 1.1f )


0 commentaires

0
votes

Vous voulez comparer des flotteurs, vous souhaitez donc faire ce qui suit: xxx

et non xxx


3 commentaires

aurait également besoin de modifier Scanf vers scanf ("%. 1f", et entrée1); aussi si cet itinéraire est pris


Travaille pour moi sans changer le scanf @jamie Taylor San allemand


@Glitchinthematrix: "Travailler" ne fait pas une bonne idée - vous devez vraiment comprendre pourquoi cela a fonctionné, pour comprendre les limites de la solution et pourquoi vous voudrez peut-être l'éviter. flottant-point-gui.de