Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question sur l'algorithme d'un programme

Anonyme
    1 novembre 2021 à 16:25:31

    Bonjour, 

    Je devais, comme exercice, réaliser le programme suivant : 

    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 apparue à ce niveau :

     string choix = "";
                bool correct = false;
                while (correct != true || choix != valide1 && choix != valide2)

    Pour moi, ce qu'il aurait été logique de faire, ça serait 

     string choix = "";
                bool correct = false;
                while (correct != true || choix != valide1 || choix != valide2)

    Avec un "||" dans la boucle while. Or avec le "ou", mon programme de 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 




    • Partager sur Facebook
    • Partager sur Twitter
      2 novembre 2021 à 1:40:12

      > 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
      Tu mélanges les OU et les ET
      C'est possible (je suppose) que choix soit différent de 'O' et de 'N'
      Si choix vaut par exemple 'Z'
      correct != true && choix != 'O' && choix != 'N'
      correct n'est pas vrai ET choix n'est pas 'O' ET choix n'est pas 'N'
      tu vas boucler tant que correct sera faux et que choix ne sera pas 'O' ou 'N'
      En algèbre booléenne: non (A ou B) == non A et non B
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        2 novembre 2021 à 6:26:53

        Bonjour,

        C'est quel langage? Du C#?

        N'hésite pas à faire un tableau tableau de vérité (algèbre booléenne aussi). Ça te permettra de bien visualiser sous quelle condition ton expression est vraie, et donc de savoir quand tu sors de la boucle.

        Quelques remarques d'algo:

        • Une condition (comme celle d'un tant que ou d'un si) donne un booléen en retour. Nulle besoin d'écrire:
        Si var_bool == false
        Alors faire X
        Fin Si

        pour évaluer la valeur d'une variable de type booléen. Tu peux tout simplement écrire:

        Si non var_bool
        Alors faire X
        Fin Si

        C'est une erreur de logique très commune quand on débute, rassure-toi! ^^

        • À quoi sert la variable correct? Est-elle utile dans l'algo? Je ne crois pas. En fait, ton try catch est mal utilisé.

        Tu arrives dans le catch si une exception a été levée, par exemple si il est impossible de lire le flux l'entrée de la console ou d'écrire sur le flux de sortie. En bref, tu as des erreurs.

        Le message que tu affiches dans le catch n'est pas pertinent et ne traite pas l'erreur. D'ailleurs, le message viole même le principe de ta fonction vu qu'il ne prend pas les chaînes de caractère valide1 et valide2 en compte.

        • C'est un peu dommage de ne pas avoir écris gestionSaisie() du manière qui te permettrai de la réutiliser lorsque tu demandes les prix. Autre point sur cette partie: que se passe-t-il si l'utilisateur rentre autre chose qu'un entier? Rien ne traite ce cas, pas de try catch justement car je suppose que int.Parse() lève une exception dans le cas où ce n'est pas un entier.

        Si je devais réécrire ton programme en tenant compte de ces remarques, ça donnerait:

        using System;
        
        namespace exFonction3
        {
            class Program
            {
                // Permet d'afficher un message
                // Retourne la saisie d'un utilisateur ensuite
                static string saisie(string message) {
                    string choix = "";
                    try {
                        Console.WriteLine(message);
                        choix = Console.ReadLine();
                    // Gestion des erreurs d'entrée/sortie uniquement, les autres sont fatales au programme.
                    } catch (IOException e) {
                        Console.WriteLine("Erreur d'entrée/sortie.");
                        Console.WriteLine(e);
                    }
                    return choix;
                }
        
                // Affiche un message
                // Retourne un entier saisie par l'utilisateur
                static int saisieEntier(string message) {
                  string entree = null;
                  int n = null;
                  while (entree == null) {
                    entree = saisie(message);
                    try {
                      n = int.Parse(entree);
                    } catch (FormatException e) {
                      Console.WriteLine("Veuillez entrer un entier.");
                      entree = null;
                    }
                  }
                  return n;
                }
        
                // Permet à l'utilisateur de faire un choix entre deux possibilités
                static string faireChoix(string message, string valide1, string valide2) {
                  string choix = null;
                  while (choix != valide1 && choix != valide2) {
                    choix = saisie(message)
                  }
                  return choix;
                }
        
                static void Main(string[] args) {
                    int prix = null, somme = null;
        
                    string choix = "", valide1 = "O", string valide2 = "N";
                    string message = "Avez-vous un prix à saisir ? \"" + valide1 + "\" (Oui) | \"" + valide2 + "\" (Non)"
        
                    choix = faireChoix(message, valide1, valide2);
        
                    while (choix == valide) {
                        prix = saisieEntier("Entrez votre prix: ");
                        somme = somme + prix
        
                        choix = faireChoix(message, valide1, valide2);
                    }
                    if (somme != null) {
                        Console.WriteLine("La somme des prix est: " + somme);
                    }
                    Console.WriteLine("Fin du programme");
                }
            }
        }

        Je ne connais pas C#, donc il y a peut-être de petites erreurs. Les idées sont là cependant.

        Idéalement, quand tu programmes, essaie d'écrire des fonctions courtes, si une fonction, une méthode ou un main fait plus de 15 lignes, demande toi si tu n'as pas la possibilité de le découper en plus petites fonctions.

        Je trouve que pour apprendre à programmer, il faut éviter ce genre de petit programme avec IHM (Interface Homme Machine) parce que ça rajoute beaucoup de chose qui n'avance pas ton apprentissage (des affichages à droites à gauche, de la vérification et des boucles tant que dans des boucles tant que....). C'est souvent prise de tête pour un programme au final qui calcule juste la somme des entiers entrés par un utilisateur.

        -
        Edité par KoaTao 2 novembre 2021 à 6:31:28

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          24 novembre 2021 à 19:22:03

          Bonjour à tous, 

          Je vous prie de m'excusez de ne pas avoir donné de nouvelle, j'avais complètement oublié que j'avais posté un message... et avec les études + le travail, j'ai totalement oublié de répondre puis comme j'ai fini par trouver la réponse dans mon cours, je n'y ai plus pensé...

          Cependant, j'ai regardé vos messages (merci pour vos retours d'ailleurs) et oui, @KoaTao, la variable "correct" était bien inutile, de mémoire, j'avais fini par l'enlever ! En fait, j'avais fait ce programme à partir d'un autre programme, ou les consignes ne nous demandaient pas de vérifier les saisies, du coup j'ai fait avec une variable booléenne^^ mais dans le nouvel exo, ils nous demandaient de vérifier les saisies 

          Du coup, à la fin de ton message, tu dis que ce type d'exercice n'est pas adapté pour l'apprentissage de la programmation ? Que me conseillerais tu alors ? Je pense que ces petits exercices sont bien pour comprendre tous les concepts de base, genre, les boucles, les conditions, etc... mais on en a vite fait le tour et c'est vrai qu'elles deviennent vite ennuyante ces exos... dans mon cours, on est passé à de la programmation évènementielle, avec Visual Studio Entreprise, mais toujours sur le même principe, des petits exos assez répétitif à force, ou on apprend finalement pas grand chose

          Même si je suis en option SISR (Réseau) j'ai toujours été intéressé par la programmation, c'est pour ça que je voudrais travailler un peu plus dessus de mon côté, tu me conseillerais quel voie ? j'ai pensé à faire quelque chose qui m'intéresse, par exemple, ma mère, qui consulte assez régulièrement des sites de voyage pour trouver de bon offre, je pourrais m'entrainer à coder un BOT qui lui enverrais une notif lorsqu'un voyage à, par exemple, -150e apparait 

          • Partager sur Facebook
          • Partager sur Twitter
            26 novembre 2021 à 3:20:43

            Je ne sais pas quels exercices on te donne.
            Normalement, les exercices sont faits pour bien maîtriser le langage et la programmation en général.
            Avant de te lancer sur un BOT, essaies des choses légèrement plus difficiles que ce que tu fais maintenant.
            Sais-tu lire des fichiers ou analyser des chaînes de caractères?
            Saurais-tu comment écrire un service (ou serveur) et un client?
            (utilisation des sockets)
            Connais-tu un peu de html ou autre langage similaire?
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

            Anonyme
              27 novembre 2021 à 9:44:44

              Salut, 

              Les exercices que j'ai actuellement à faire sont en CSharp et en Python, on travaille principalement sur de petit exercices, comme coder le jeu "c'est plus c'est moins" mais avec une interface graphique, je pense que les exercices plus compliqué viendront en fin d'année ou l'année prochaine, mais j'ai l'impression de ne pas progresser assez vite avec ce genre d'exercice.. 

              Pour la lecture de fichier et l'analyse des chaines de caractère, oui nous avons vu ça en début de cours sur le Csharp et je commence tout juste le html/css et PHP

              Par contre, pour l'utilisation des sockets, je n'en ai pas encore fait, ni en CSharp ni en Python

              • Partager sur Facebook
              • Partager sur Twitter
                27 novembre 2021 à 14:16:42

                Bonjour,

                > ce type d'exercice n'est pas adapté pour l'apprentissage de la programmation

                En fait, tout ce traitement de la valeur saisie par l'utilisateur et d'affichage est longue est fastidieuse.

                T'as un programme qui doit calculer la somme de nombres, et au final, tu te retrouves avec 80% du programme qui sert uniquement à gérer la saisie des utilisateurs et l'affichage, ce qui est fastidieux. Ça alourdi inutilement le programme et le rend moins lisible. Tout le temps que tu passes à coder une petite interface pour la console, peu utile en réalité lorsque tu vas coder de vraie programme, c'est autant de temps que tu aurais pu passer sur des exercices d'algorithmie et sur l'apprentissage du langage en lui-même (type de variable, structure de données, etc...) au travers de ces exercices.

                > Que me conseillerais tu alors ?

                Si tu veux progresser plus rapidement, je te conseille d'aller sur des plateformes comme france-ioi.org qui se focalise plus sur de la résolution de problème par la conception d'algorithme et son implémentation.

                > consulte assez régulièrement des sites de voyage pour trouver de bon offre, je pourrais m'entrainer à coder un BOT

                Le scraping web, c'est vraiment pas le plus évident. C'est formateur, mais tu vas vite te confronter à différents problème (plus ou moins intéressant à solutionner):

                • Tous les sites web sont fait plus ou moins différemment, ce qui implique de développer de devoir adapter le scrap selon le site web
                • Certaines pages web sont conçues pour être rendues dynamiquement par un navigateur
                • Les sites web évoluent et donc il faut s'adapter à ces évolutions car certaines «casseront» ton bot
                • Certains sites web ont des dispositifs en place pour empêcher des bots de parcourir leur site, il faut donc penser mettre en place des contre-mesures.
                Bref, pour s'amuser oui, c'est un beau projet, à maintenir ça risque d'être chronophage.

                -
                Edité par KoaTao 27 novembre 2021 à 14:18:03

                • Partager sur Facebook
                • Partager sur Twitter

                Question sur l'algorithme d'un programme

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown