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 :

Probleme avec les signes < >


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Par défaut Probleme avec les signes < >
    Bonjour à tous,

    Je viens à vous pour un problème tout bête, mais qui commence à me rendre fou.

    Voici mon programme :

    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
     
    #define	WR								(9.58)
    #define	One_of_the_Best_Perf				(10.00)
    #define	Finalist_Time						(10.27)
     
     
    int main(int argc, char* argv[])
    {		
    	double time = 0.00; 
     
    	printf("Veuillez entrer votre temps ici : ");
    	scanf_s("%lf", &time);
     
    if (time < WR)
    	{
    		printf("NEW WORLD RECORD\n");
    	}
    	else if (WR < time < One_of_the_Best_Perf)
    	{
    		printf("One of the best performance in history\n");
    	}
    	else if (One_of_the_Best_Perf < time < Finalist_Time)
    	{
    		printf("You're finalist\n");
    	}
    	else if (Finalist_Time < time)
    	{
    		printf("You're not finalist\n");
    	}
     
    	system("pause");
    }
    les signes < et > ne semble pas bien fonctionner car je n'arrive pas, en fonction de mon temps, afficher la phrase que je veux. Je trouve ça assez bizarre mias je n'ai pas d'autres explications.
    J'utilise Visual Studio 2017.

    J'en reviens donc à vous pour m'aider.
    Merci par avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    < et > sont des opérateurs binaires, ils s'appliquent aux opérandes à gauche et droite et ne sont pas du tout chaînables.
    Donc WR < time < One_of_the_Best_Perf ne fait certainement pas ce que tu attends, vu qu'une fois que le premier est exécuté (si tenté qu'il soit le premier exécuté), tu auras 0 ou 1 qui sera ensuite utilisé et comparé au dernier opérande.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Bousk Voir le message
    < et > sont des opérateurs binaires, ils s'appliquent aux opérandes à gauche et droite et ne sont pas du tout chaînables.
    En fait si, ils sont chainables comme tous les opérateurs binaires (ex 2+3+4 pour chainer le "+"). Et effectivement ça produit bien le comportement que tu décris (la première comparaison renvoie 0/1 qui est ensuite comparé avec la suite).
    Je le mettais parfois dans mes interrogations quand j'étais prof...

    Citation Envoyé par Blazz78 Voir le message
    emixam16 : en lisant ton programme je vois bien les différences et pourquoi il marche maintenant. Mais ce que je ne comprend pas c'est pour quoi par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    else if (time < One_of_the_Best_Perf)
    		{
    			printf("One of the best performance in history\n");
    		}
    n'affiche pas aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("NEW WORLD RECORD\n");
    car il répond aussi à la condition vu qu'il est inférieur à One_of_the_Best_Perf
    Chaque "if" est une alternative exclusive. Soit le résultat est vrai et c'est le cas "then" qui s'exécute, soit il ne l'est pas et c'est le cas "else". Mais pas les deux.
    Ainsi dans ce code
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (time < WR)
    {
        printf("NEW WORLD RECORD\n");
    }
    else {
        if (time < One_of_the_Best_Perf)
        {
            printf("One of the best performance in history\n");
        }
    }
    Si "time" est inférieur à "WR" alors le cas "else" ne sera pas exécuté et le second "if" ne sera pas évalué même s'il est inférieur à "One_of_the_Best_Perf".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    En fait si, ils sont chainables comme tous les opérateurs binaires (ex 2+3+4 pour chainer le "+"). Et effectivement ça produit bien le comportement que tu décris (la première comparaison renvoie 0/1 qui est ensuite comparé avec la suite).
    L'addition n'est pas un opérateur booléen, une addition d'entiers retourne un entier. L'opération < est une opération booléenne et retourne un entier (enfin un booléen mais en C il me semble que c'est kifkif). Donc non chaîner <, à fortiori avec des double, bien que syntaxiquement correcte, ne l'est dans les faits pas et n'a pas du tout le résultat espéré. D'où mon raccourci.
    En C++ avec gcc tu peux avoir des erreurs type warning: comparisons like 'X<=Y<=Z' do not have their mathematical meaning [-Wparentheses] mais faut probablement activer des options supplémentaires.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bousk Voir le message
    L'addition n'est pas un opérateur booléen
    Tu ne m'as pas bien compris. Tu as dit "ils sont binaires donc pas chainables". Je te donne alors un contre-exemple d'un autre opérateur binaire parfaitement chainable pour te montrer que le fait d'être binaire n'est pas une raison suffisante. Et là tu reviens en disant "oui mais ils sont booléens". Et ben non, ça ne suffit toujours pas.
    En informatique il ne faut jamais avoir "d'à priori". Et c'est encore plus vrai en C où on peut écrire vraiment tout et n'importe quoi. Donc "être binaire" ou "être booléen" n'empêche pas le chainage. Même si ce chainage te choque (avec raison), il reste autorisé. Ensuite, ce qui en ressort là c'est une autre affaire.

    Citation Envoyé par Bousk Voir le message
    Donc non chaîner <, à fortiori avec des double, bien que syntaxiquement correcte, ne l'est dans les faits pas et n'a pas du tout le résultat espéré.
    Je suis bien d'accord avec cette partie (comme je l'ai déjà dit dans mon post précédent). En C, comme dans tous les langages, il y a ce qu'on veut faire, comment on le traduit et comment on l'écrit. Et malheureusement parfois, ce qu'on écrit n'est pas traduit par le compilateur par la façon dont on le voudrait...

    Citation Envoyé par Bousk Voir le message
    En C++ avec gcc tu peux avoir des erreurs type warning: comparisons like 'X<=Y<=Z' do not have their mathematical meaning [-Wparentheses] mais faut probablement activer des options supplémentaires.
    Je veux bien te croire. Et en Python tu as parfaitement le droit d'écrire if 5<n<10 pour vérifier que "n" est compris entre 5 et 10 et Python comprend parfaitement cette instruction (je veux dire qu'il la comprend dans le même sens que toi et moi). Mais bon, ici on est en C donc on fait avec ce qu'il permet de faire (généralement quasiment tout) et comment il le comprend (tout mais selon sa propre logique qui, généralement, ne correspond pas souvent avec l'idée que tu t'en fais)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Par défaut
    Merci à tous pour vos explications

  7. #7
    Membre émérite
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 335
    Par défaut
    Bonjour,

    Ton code contient plusieurs erreurs, dont une assez intéressante.

    - Dans ton code tu écris WR < time < One_of_the_Best_Perf. Je comprends ce que tu veux vérifier mais l'opérateur < ne fonctionne pas comme ça en C. Je te montre comment ça marche sur un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(3<2<1) /* Tu t'attends à avoir faux*/
    -> if((3<2)<1) /* En C l'opération est prioritaire à gauche donc je met les parenthèses pour expliciter l'ordre de calcul*/
    -> if((FALSE)<1 /*3<2 est FAUX donc FALSE*/
    -> if(0<1) /*en C TRUE=1, FALSE=0 donc je remplace FALSE par 0*/
    -> if(TRUE) /*0 est bien inférieur à 1*/
    -> TRUE /*Contradiction: On s'attendait à avoir faux avec ta logique mais on a vrai!*/
    Conclusion: En C tu ne peux pas comparer 3 choses comme tu l'as fait. Si c'est ce que tu veux faire, tu peux faire if(a<b && b<c), qui lui fonctionne bien

    Si je corrige ce point, on arrive à une structure de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(t<x)
      doStg();
    else if(x<t && t<y)
      doStgElse();
    /*...*/
    Il te reste alors deux problèmes (en rouge)
    -Tu utilise des bornes strictes: Tu ne gère pas le cas de l'égalité (essaye avec 10.27 par exemple)
    -Tes tests sont redondants (si tu es dans le else tu n'est pas besoin de vérifier la condition du if, tu sais déjà qu'elle est fausse!)

    Allez, je suis de bonne humeur, je te donne un code corrigé (ne pompe pas juste mon code, essaye de comprendre mes remarques):

    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
     
    #include <stdio.h>
    #define    WR                                (9.58)
    #define    One_of_the_Best_Perf                (10.00)
    #define    Finalist_Time                        (10.27)
     
     
    int main(int argc, char* argv[])
    {        
        double time = 0.00; 
     
        printf("Veuillez entrer votre temps ici : ");
        scanf("%lf", &time);
     
        if (time < WR)
        {
            printf("NEW WORLD RECORD\n");
        }
        else if (time < One_of_the_Best_Perf)
        {
            printf("One of the best performance in history\n");
        }
        else if (time < Finalist_Time)
        {
            printf("You're finalist\n");
        }
        else
        {
            printf("You're not finalist\n");
        }
    }
    - Petite remarque annexe, par convention on note les #define tout en MAJUSCULE.

    Edit: grillé

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Par défaut
    Merci beaucoup pour vos réponses et vos conseils.
    Je m'en étais mis à douter jusqu'à aller voir des cours de primaires sur internet pour etre sur de pas me tromper entre < et >
    Vous m'en avez aprris beaucoup, et vous avez réglé mon probleme

    emixam16 : en lisant ton programme je vois bien les différences et pourquoi il marche maintenant. Mais ce que je ne comprend pas c'est pour quoi par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    else if (time < One_of_the_Best_Perf)
    		{
    			printf("One of the best performance in history\n");
    		}
    n'affiche pas aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("NEW WORLD RECORD\n");
    car il répond aussi à la condition vu qu'il est inférieur à One_of_the_Best_Perf

    Encore une fois merci, et en espérant que tu puisses m'éclairer

  9. #9
    Membre émérite
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 335
    Par défaut
    Car tu utilises else if(littéralement "sinon si") et pas juste if.

    Essaye de revoir les bases tu as des bons cours sur developpez

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

Discussions similaires

  1. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  2. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  3. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32
  4. Problem avec les *.AVI sur les panels
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/08/2003, 22h50
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18

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