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

Algorithmes et structures de données Discussion :

Question sur l'algorithme d'un programme


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Cuisinier
    Inscrit en
    Août 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Cuisinier

    Informations forums :
    Inscription : Août 2021
    Messages : 4
    Par défaut Question sur l'algorithme d'un programme
    Bonjour,

    Je devais, comme exercice, réaliser le programme suivant :
    Code C# : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    using System;
     
    namespace exFonction3
    {
        class Program
        {
            // fonction utilisé dans le programme
            static string gestionSaisie(string message, string valide1, string valide2)
            {
                string choix = "";
                bool correct = false;
                while (correct != true || choix != valide1 && choix != valide2)
                {
                    try
                    {
                        Console.WriteLine(message);
                        choix = Console.ReadLine();
                        correct = true;
                    }
                    catch
                    {
                        Console.WriteLine("Entrez un \"O\" pour oui ou un \"N\" pour non");
                    }
                }
                return choix;
            }
            static void Main(string[] args)
            {
                int prix = 0, somme = 0;
                string choixLocal = "";
                string valide1 = "O";
                string valide2 = "N";
     
                choixLocal = gestionSaisie("Avez-vous un prix à saisir ? \"O\" : oui | \"N\" : non ", valide1, valide2);
     
                while (choixLocal == "O")
                {
                    Console.WriteLine("Entrez votre prix : ");
                    prix = int.Parse(Console.ReadLine());
                    somme = somme + prix;
     
                    choixLocal = gestionSaisie("Voulez vous resaisir un prix ? \"O\" : oui | \"N\" : non", valide1, valide2);
                }
                if (somme != 0)
                {
                    Console.WriteLine("La somme des prix est : " + somme);
                    Console.WriteLine("Fin du programme");
                }
                else
                {
                    Console.WriteLine("Fin du programme");
                }
                Console.ReadLine();
            }
        }
    }
    Et un problème est apparu à ce niveau :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
               string choix = "";
               bool correct = false;
               while (correct != true || choix != valide1 && choix != valide2)
    Pour moi, ce qu'il aurait été logique de faire, ça serait :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
               string choix = "";
               bool correct = false;
               while (correct != true || choix != valide1 || choix != valide2)

    Avec un "||" dans la boucle while. Or avec le "ou", mon programme ne marche pas mais avec le "&&" tout marche... Je ne comprends pas...

    Pour moi, avec le "ou", je traduisais comme : "tant que "correct" n'est pas vrai OU que choix n'est pas "O" OU que choix n'est pas "N"".

    Avec le "&&", pour moi, ça donne "tant que "correct" n'est pas vrai " OU que choix n'est pas "O" ET que choix n'est pas "N"". Or, comment choix peut-il être "O" et "N" ?

    Merci pour votre aide

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 215
    Par défaut
    Dans la dernière proposition, tu écris : choix != valide1 || choix != valide2 ; choix ne peux pas être égal à la fois à valide1 et à valide2. Donc on a toujours choix différent de valide1 , ou choix différent de valide2.
    Ce test est donc toujours vérifié.
    Et donc, tu as une boucle 'infinie'.

    Dans la proposition précédente, j'ajouterais des parenthèses, pour être certain que les opérateurs s'exécutent dans l'ordre que l'on veut.
    Personnellement, je devrais savoir, mais je ne sais pas si ce qui est écrit correspond à :

    while ((correct != true || choix != valide1) ​&& choix != valide2 )
    ou
    while (correct != true || (choix != valide1 && choix != valide2) )

    Et ce n'est pas pareil !

    Pour mieux répondre à ta question, dans la 2ème proposition, on ne teste pas si choix est égal à l'un OU à l'autre ... mais si choix est différent de l'un ET différent de l'autre.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Cuisinier
    Inscrit en
    Août 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Cuisinier

    Informations forums :
    Inscription : Août 2021
    Messages : 4
    Par défaut
    Bonjour tbc92, Merci pour ta réponse !

    En fait, j'ai enlevé la variable "correct" qui correspondait à l'exercice précédent. Du coup, il ne me reste plus que :
    -while (choix != valide1 && choix != valide2)

    Mais le problème se pose toujours pour moi, le programme marche mais je ne comprends pas comment ^^"

    Je comprends ton explication mais, pour moi, il devrait s'appliquer quand l'opération booléenne est "&&"... je suis pas très clair je débute en programmation mais en gros, je comprends les choses comme ça :
    - while (choix != valide1 && choix != valide2) = "Tant que choix est différent de valide1 ET choix différent de valide2, recommence" -- > ici, je reprends ton explication, la variable "choix" ne pourra jamais être égal à "valide1" et "valide2" en même temps, le programme va boucler indéfiniment
    - while (choix != valide1 || choix != valide2) = "Tant que choix est différent de valide1 OU choix différent de valide2, recommence" --> pour moi, cette traduction semble juste ; je dis au programme, SI jamais, il y a un des deux choix qui est valide (donc choix == valide1 ou choix == valide2), alors tu peux sortir de la boucle... mais c'est elle qui bug et je n'arrive pas à faire la traduction

    Je n'arrive pas à assimiler les opérateurs booléens

    Encore merci pour ton aide !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Cuisinier
    Inscrit en
    Août 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Cuisinier

    Informations forums :
    Inscription : Août 2021
    Messages : 4
    Par défaut
    Je pense avoir compris le truc finalement ! Tout vient d'une erreur de traduction de ma part ! En fait :

    - Quand j'utilise le "&&", je veux que les deux conditions soient vrai (tant que choix != reponse1(vrai) ET tant que choix != réponse2(vrai), tu boucles), Donc quand je rentre un "O" ou un "N", l'une des deux variables devient faux (soit choix == reponse1, soit choix == reponse2), de ce fait, j'ai un "vrai" et un "faux" et dans ce cas, le programme arrête de boucler

    - Quand j'utilise le "||", je veux que l'une des deux conditions soit vrai (tant que choix != reponse1 (vrai) OU que choix != réponse2 (vrai), tu boucle), lorsque je rentre un "O" ou un "N", la boucle reste toujours valide car l'une des deux variable reste toujours "vrai" et donc mon programme va boucler indéfiniment. Là, je comprends mtn ce que tu voulais dire, ma variable choix ne pourra jamais être égal à "O" et "N" en même temps (condition pour arrêter la boucle)

    Je ne sais pas si j'ai bien traduit, mais c'est ce que j'ai compris de mon cours :
    ET = && = a &&b = vrai si a et b sont tous les deux vrais, faux dans les autres cas
    OU = || = a || B = vrai si a ou b sont vrai, faux si les deux sont faux

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 215
    Par défaut
    Dans ton message de 18h56, il y a ceci qui n'est pas bon :
    - while (choix != valide1 && choix != valide2) = "Tant que choix est différent de valide1 ET choix différent de valide2, recommence" -- > ici, je reprends ton explication, la variable "choix" ne pourra jamais être égal à "valide1" et "valide2" en même temps, le programme va boucler indéfiniment

    L'instruction que tu écris, c'est : Tant que choix est différent de valide1 ET choix différent de valide2, recommence
    Mais l'instruction que tu commentes ou que tu analyses, c'est : Tant que choix est égal à valide1 ET choix égal à valide2, recommence
    Et tu refais la même choses juste en dessous.


    A priori, dans ton dernier message, tu as compris ce qui n'allait pas.

    On peut le redire avec des choses plus concrètes ; un dé par exemple. On lance un dé et on le relance tant que le nombre obtenu est 1 2 3 ou 4.

    En d'autres mots :
    Tant que le dé ne donne ni 5 ni 6, continuer
    Tant que dé != 5 et dé != 6, continuer

    La difficulté est qu'il y a plein de négations partout... Il faut bien lire, en mettant un temps mort entre certains mots...

    Si tu n'es pas à l'aise, il y a d'autres façons d'obtenir le même résultat :

    TANTQUE PAS (choix=valide1 ou choix=Valide2) // Tu vois l'importance des parenthèses.
    demander le choix

    ou encore :

    REPETER
    demander le choix
    JUSQU'A CE QUE (choix=Valide1 ou Choix=Valide2) // Mais à l'usage, le UNTIL est rarement utilisé par les développeurs,

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Dans un premier temps, je voudrais souligner l'extraordinaire dissymétrie de ... || ... && ... . En l'absence de priorité claire, on effectue les opération de gauche à droite. Les parenthèses implicites sont donc les suivantes : ( (... || ...) && ...) . Il y a un poids énorme sur le dernier test. On boucle si on ne tape pas "N". Donc en tapant "N", on sort tout de suite. Si "N" n'a pas été tapé, on voit : si "O" n'a pas été tapé ou si correct est toujours faux, on boucle. Les conditions sont à égalité de pouvoir. Voilà pourquoi cela marche.
    Pourquoi remplacer par un || ne marche plus ? Parce que si on tape quelque chose différent de "N", un "V" par exemple, on va boucler à cause de la dernière condition prépondérante. Mais "O" n'est pas "N", non plus. Et ça ne marche pas. On va boucler en tapant "O".

    Citation Envoyé par Ryugin019 Voir le message
    - Quand j'utilise le "||", je veux que l'une des deux conditions soit vrai (tant que choix != reponse1 (vrai) OU que choix != réponse2 (vrai), tu boucle), lorsque je rentre un "O" ou un "N", la boucle reste toujours valide car l'une des deux variable reste toujours "vrai" et donc mon programme va boucler indéfiniment. Là, je comprends mtn ce que tu voulais dire, ma variable choix ne pourra jamais être égal à "O" et "N" en même temps (condition pour arrêter la boucle)
    Il faut que tu considères l'inverse d'une proposition booléenne.
    INV(A && B) = INV(A) || INV(B)
    INV(A || B) = INV(A) && INV(B)
    On pourrait résumer par "l'inverse d'un OU est le ET des inverses" et "l'inverse d'un ET est le OU des inverses".

    Dès lors, les 2 propositions suivantes sont équivalentes :
    while ((pas "O") et (pas "N"))
    while (pas ("O" ou "N"))

    Ton programme corrigé adopte la première syntaxe; et toi, tu voudrais la seconde syntaxe.
    Pour finir, je crois que tu te trompes d'objectif dans ton raisonnement : tu cherches quand arrêter alors que le while cherche quand continuer. Du coup, tu veux exprimer l'inverse. Tout est normal. Un "pas" apparaît. En C++ ou java, c'est le point d'exclamation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ( ! fini )
    {
     
    }

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Cuisinier
    Inscrit en
    Août 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Cuisinier

    Informations forums :
    Inscription : Août 2021
    Messages : 4
    Par défaut
    Bonsoir! Du coup, je comprends beaucoup mieux grâce à vos explications ! Merci à vous deux d'avoir pris le temps pour cela, c'est vraiment sympa !

Discussions similaires

  1. Question sur les algorithmes génétiques
    Par dinocs dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 14/11/2015, 20h29
  2. Question sur les algorithmes génétiques
    Par TristanL dans le forum Intelligence artificielle
    Réponses: 4
    Dernier message: 14/05/2011, 22h04
  3. [buffer] Question sur l'algorithme breada
    Par lichman dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 14/10/2010, 22h13
  4. Question sur l'algorithme et la cryptologie
    Par Ramdoulou dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 01/03/2009, 16h20
  5. Questions sur les algorithmes génétiques
    Par ziad.shady dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 03/01/2009, 22h14

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