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 :

Syntaxe pour conditions C++


Sujet :

C++

  1. #1
    Membre tr�s actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    263
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 263
    Par d�faut Syntaxe pour conditions C++
    Bonjour les amis,
    J'essaie de traduire, en Xojo et Delphi, un programme (Algorithm 493: Zeros of a Real Polynomial) �crit au d�part en Fortran et que j'ai trouv� en C++ aussi.

    Je voulais vous demander si cette condition pouvait avoir un sens en C++?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
               fflag = 1;
     
                do {
     
                    if ((fflag && ((fflag = 0) == 0)) && ((spass) && (!vpass || (tss < tvv))))
     
                ...
    fflag est d�clar� comme entier et n'intervient ni avant ni apr�s ce bout de code.
    Si cette condition est logique, pourriez-vous me dire comment l'interpr�ter?

  2. #2
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Si tu veux comprendre ce test, il faut appliquer les priorit�s impos�es par les diff�rentes paires de parenth�ses,

    Le plus facile est sans doute donc de commencer par s�parer les diff�rentes expressions, et de les "indenter" en fonction du "niveau" auquel se trouve la parenth�se ouvrante qui s'y rapporte.
    on a donc ((fflag && ((fflag = 0) == 0)) && ((spass) && (!vpass || (tss < tvv)))) qui est compos� de
    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
    (                                 // 1
        (                             // 2
            fflag 
            && 
            (                         // 3
                (                     // 4
                    fflag = 0
                )                     // 4 
                == 0
            )                         // 3
        )                             // 2
        && 
        (                             // 5
            (                         // 6
                spass
            )                         // 6
            && 
            (                         // 7
                !vpass 
                ||     
                (                     // 8
                    tss < tvv
                )                     // 8
            )                         //7
        )                             // 5
    )                                 // 1
    Les chiffres que j'ai plac�s en commentaires permettent de retrouver la parenth�se correspondante qui permet d'avoir une paire compos�e d'une parenth�se ouvrante et une parenth�se fermante .
    Les �l�ments qui se trouvent au m�me niveau d'indentation et qui sont inclus dans la m�me paire de parenth�se devront au final �tre �valu�s ensembles.

    Cependant, chaque terme devra �tre �valu�, du moins, le r�sultat de cette �valuation risque encore de changer le r�sultat final, car && et || sont des op�rateurs logiques dits "optimis�s" : l'expression se trouvant � droite de ces op�rateurs n'�tant �valu�e que si elle peut encore changer le r�sultat.
    C'est � dire que l'expression se trouvant � droite de l'op�rateur && ne sera �valu�e que si le r�sultat de l'expression se trouvant � gauche est �quivalent � true et que l'expression se trouvant � droite de l'op�rateur ||ne sera �valu�e que si le r�sultat de l'expression se trouvant � gauche est �quivalent � false.

    Commencons donc par comprendre les diff�rents termes de cette expression :
    • fflag est en fait �quivalent � fflag != 0, car, pour convertir n'importe quelle valeur en bool�en, on part du principe que 0 vaut false, et que n'importe quelle autre valeur vaut 1
    • fflag = 0 assigne la valeur 0 � flag
    • ==0 v�rifie que le r�sultat de l'assignation est �gal � 0
    • spass est �quivalent � spass != 0
    • !vpass est �quivalent � [c]!(pass[ !=0)/c], autrement dit, inverse l'�valuation bool�enne de vpass : si vpass vaut 0, son �valuation d'origne est �quivalente � false et devient true, si vpass est diff�rent de 0, son �valuation d'origine est �quivalente � true et devient false
    • tss <tvv �value le fait que tss soit plus petit que tvv

    La suite va �tre plus joyeuse, car il va s'agir de regrouper les diff�rents termes en fonction des pairs de parenth�ses.

    La plus imple � expliquer est la paire num�ro 8 : cette paire de parenth�ses ne sert normalement � rien. Elle n'est l� que pour indiquer que l'on prend bel et bien le r�sultat de l'�valuation de tss < tvv (autrement dit: vrai ou faux selon que tss est plus petit que tvv ou non)

    Et comme j'ai commenc� avec la paire num�ro 8, autant continuer avec la paire num�ro 7, qui fait une expression bas�e sur la 8 ( !vpass || (tss < tvv):
    Si !vpass est �valu� � false, alors on utilise le r�sultat de tss < tvv comme r�sultat de cette expression.

    Et, tant qu'on y est, on peut terminer avec les paires de parenth�ses 5 et 6 (spass && (!vpass || (tss <tvv) ) ):
    Si spass est diff�rent de z�ro,alors il faut soit que !vpass (autrement dit que vpass soit �gal � 0 ) soit vrai, soit que tss soit plus petit que tvv.

    Ne restent plus que les paires de parenth�ses 2, 3 et 4 ...

    La paire de parenth�ses num�ro 4 va avoir un effet de bord : si fflag est diff�rent de z�ro, sa valeur sera chang�e pour qu'il soit �gal � 0

    La paire de parenth�se num�ro 3 va utiliser la valeur true si on a du changer la valeur de fflag et ... ne sera pas utilis�e si fflag �tait �gal � 0 � l'origine

    Au final, on a donc un test bool�en dont le r�sultat est vrai si fflag n'est pas �gal � 0 et faux si fflag est �gal � 0

    Si fflag n'est pas �gal � 0 � l'origine, il faut aussi v�rifier la valeur de spass, qui doit elle aussi �tre diff�rente de 0
    Et si spass est diff�rent de 0, alors il faut aussi s'assurer que soit vpass est �gal � z�ro soit que tss est plus petit que tvv

    Les op�rateurs utilis�s permettent d'�viter les v�rifications "inutiles", � savoir que:
    on ne testera si tss est plus petit que tvv que si on a test� vpass et qu'il n'est pas �gal � 0
    on ne testera vpass que si fflag n'est pas �gal � 0 ET que si n'est pas non plus �gal � 0

    Mais attention: quoi qu'il arrive, fflag faudra 0 apr�s ce test.

    On pourrait donc r��crire cette boucle sous une forme "plus lisible" qui serait proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    do{
        if(fflag != 0){
            if(spass != 0){
                if (vpass == 0 || (tss < tvv)){
                    fflag=0; // effet de bord de la parenthèse 4
                    // tout ce qui doit être fait dans la boucle
                }
            }
        }
    } // il y a surement une condition while ici (
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  3. #3
    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
    Est-ce que ce ne serait pas plut�t
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    do{
        if(fflag != 0){
            fflag=0; // effet de bord de la parenthèse 4
            if(spass != 0){
                if (vpass == 0 || (tss < tvv)){
                    // tout ce qui doit être fait dans la boucle
                }
            }
        }
    } // il y a surement une condition while ici (
    Les op�rations �tant effectu�es dans l'ordre de gauche � droite, fflag sera assign� d�s qu'il sera non nul en entr�e
    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.

  4. #4
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par Bousk Voir le message
    Est-ce que ce ne serait pas plut�t
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    do{
        if(fflag != 0){
            fflag=0; // effet de bord de la parenthèse 4
            if(spass != 0){
                if (vpass == 0 || (tss < tvv)){
                    // tout ce qui doit être fait dans la boucle
                }
            }
        }
    } // il y a surement une condition while ici (
    Tu as tout � fait raison, je me suis tromp� sur ce point...

    Et c'est d'autant plus emb�tant que, dans la version correspondante que je donne, fflag pourrait ne pas �tre remis � z�ro lorsque fflag est diff�rent de z�ro, mais que l'une ou l'autre des deux condition suivante n'est pas respect�e.

    Ta version corrig�e s'assure que fflag sera syst�matiquement remis � z�ro si il a une valeur diff�rente, alors que, dans le code que je pr�sentais, il y a au moins deux cas dans lesquels ce ne serait pas fait, alors que l'on s'attend � ce que ce le soit.

    Merci pour l'attention port�e � ma r�pose
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  5. #5
    Membre tr�s actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    263
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 263
    Par d�faut
    Hol�! Merci Koala pour ce cours de C++.
    Donc on peut attribuer une valeur � une variable dans une condition.
    Je n'invente pas grand chose, je traduis la plupart du temps des programmes �crits dans diff�rents langages mais le C++ a une syntaxe difficile je trouve, toutes sortes de signes cabalistiques,..., ce qui ne m'a jamais donn� envie de m'y mettre.
    Je sais que c'est une question d'habitude mais quand m�me.
    Et merci aussi Bousk pour ta contribution sinon je serais toujours en train de traduire cette ligne de code en fran�ais.
    Tch�ss

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Syntaxe pour conditions
    Par bry01 dans le forum G�n�ral Python
    R�ponses: 5
    Dernier message: 30/03/2018, 19h59
  2. Syntaxe pour condition sur macrovariable
    Par Fran�oise_ dans le forum Macro
    R�ponses: 4
    Dernier message: 17/03/2016, 15h14
  3. [PHP 5.0] Autre syntaxe pour condition if
    Par goofyto8 dans le forum Langage
    R�ponses: 2
    Dernier message: 13/08/2014, 11h48
  4. Bonne syntaxe pour condition dans une requete
    Par cedlannoy dans le forum Requ�tes
    R�ponses: 3
    Dernier message: 16/03/2007, 15h24
  5. R�ponses: 8
    Dernier message: 02/05/2006, 16h07

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