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 :

Avis programme C# [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant en informatique
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Avis programme C#
    Bonjour tout le monde,

    j'ai crée un programme et j'aimerais avoir votre avis, si je pourrais améliorer des trucs/simplifier etc... Voici le programme: (str, i, dbl, ... = prof qui oblige)

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace Roulette
    {
        class Program
        {
            const string NOM_PROG = "Roulette";
            const string VERSION = "1.0.1";
            const int NB_MIN = 0;
            const int NB_MAX = 10;
            const int SOLDE = 1000;
            const int SOLDE_MIN = 1;
            static void Main(string[] args)
            {
                int iSolde = 1000, iSoldeMiser, iNombre, iNombreTire;
                int compteur;
                for (compteur = 0; compteur < 50; compteur++)
                {
                    Random r = new Random();
                    iNombreTire = r.Next(NB_MAX + 1);
     
                    Console.Write(" ----------------------------------------\n| Bienvenue dans {0} version {1}  |\n ----------------------------------------\n", NOM_PROG, VERSION);
                    if (iSolde < 0)
                    {
                        iSolde *= -1;
                    }
                    Console.WriteLine("Votre solde est de {0}.-", iSolde);
                    Console.WriteLine("Entrer un nombre entre {0} et {1}", NB_MIN, NB_MAX);
                    iNombre = Convert.ToInt32(Console.ReadLine());
                    while (!(iNombre <= NB_MAX && iNombre >= NB_MIN))
                    {
                        if (iNombre >= NB_MAX | iNombre <= 0)
                        {
                            Console.WriteLine("Le nombre entré n'est pas valide");
                            iNombre = Convert.ToInt32(Console.ReadLine());
                        }
                    }
                    Console.WriteLine("Entrer le montant que vous voulez miser entre 1 et {0}", iSolde);
                    iSoldeMiser = Convert.ToInt32(Console.ReadLine());
                    while (!(iSoldeMiser <= iSolde && iSoldeMiser >= SOLDE_MIN))
                    {
                        if (!(iSoldeMiser >= iSolde && iSoldeMiser <= SOLDE_MIN))
                        {
                            Console.WriteLine("Le nombre entré n'est pas valide");
                            iSoldeMiser = Convert.ToInt32(Console.ReadLine());
                        }
                    }
     
                    if (iNombre == iNombreTire)
                    {
                        Console.WriteLine("Bravo, vous avez gagné {0}.- !!", iSoldeMiser * 10);
                        iSolde = iSoldeMiser * 10 + iSolde - iSoldeMiser;
                    }
                    else
                    {
                        Console.WriteLine("Vous avez perdu {0}.- !!, le nombre était {1}", iSoldeMiser, iNombreTire);
                        iSolde = iSoldeMiser - iSolde;
                    }
                    if (iSolde != 0)
                    {
                        Console.WriteLine("Voulez-vous rejouer ? o/n");
                        Console.ReadKey();
                        Console.Clear();
                    }
                    else
                    {
                        Console.WriteLine("Vous avez tout perdu. Au revoir");
                        Console.WriteLine("\nPresser une touche pour terminer le programme ... ");
                        Console.ReadKey();
                        return;
                    }
                }
            }
        }
    }

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 639
    Points : 2 148
    Points
    2 148
    Par défaut
    Bonsoir,

    Alors :

    Tes if dans les while sont inutiles , tu peux très bien faire :
    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
     
                    while (!(iNombre <= NB_MAX && iNombre >= NB_MIN))
                    {
                            Console.WriteLine("Le nombre entré n'est pas valide");
                            iNombre = Convert.ToInt32(Console.ReadLine());
                    }
     
                    Console.WriteLine("Entrer le montant que vous voulez miser entre 1 et {0}", iSolde);
                    iSoldeMiser = Convert.ToInt32(Console.ReadLine());
     
                    while (!(iSoldeMiser <= iSolde && iSoldeMiser >= SOLDE_MIN))
                    {
                            Console.WriteLine("Le nombre entré n'est pas valide");
                            iSoldeMiser = Convert.ToInt32(Console.ReadLine());
                    }
    Sinon a part ça , ça va.

    Juste des petites choses , du genre , le choix de ne pas rejouer n'est pas pris en compte et la variable SOLDE ne sert a rien.

    Aussi , bon dans ton cas ce n'est pas grave du tout mais il faut faire gaffe et prendre de bonnes habitudes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                for (compteur = 0; compteur < 50; compteur++)
                {
                    Random r = new Random();
    Cela peut être extrêmement problématique si tu instancie a chaque tour de boucle un nouveau Random.Autant le remonté un peu plus haut (hors de la boucle), ca marchera tout aussi bien

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Mes remarques dans le code :

    Citation Envoyé par iCaRBon_Gold Voir le message
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace Roulette
    {
        class Program
        {
            // NOM_PROG et VERSION sont des éléments qu'on trouve dans le fichier généré automatiquement par Visual Studio "Assembly.cs".
            // Il vaut mieux se servir de ce qui est offert en standard. Mais bon, après ça peut venir du prof donc on va pas chipoter.
            const string NOM_PROG = "Roulette";
            const string VERSION = "1.0.1";
     
            // Là, y'a des jolies constantes... En général, ça sert à éviter les "MagicNumbers" dans le code...
            const int NB_MIN = 0;
            const int NB_MAX = 10;
            const int SOLDE = 1000;
            const int SOLDE_MIN = 1;
            static void Main(string[] args)
            {
                // Alors il sort d'où ce MagicNumber ? Utilise la constante SOLDE à la place.
                int iSolde = 1000, iSoldeMiser, iNombre, iNombreTire;
                int compteur;
                // Encore un MagicNumber, c'est quoi ce 50 ?
                for (compteur = 0; compteur < 50; compteur++)
                {
                    // Si tu redéclare Random() à chaque itération, tu vas générer toujours les mêmes séries de nombres aléatoires. Il y a mieux comme aléatoire...
                    Random r = new Random();
                    // Ok, et si NB_MIN passe à 1 ? Utilise r.Next(NB_MIN, NB_MAX + 1) à la place.
                    iNombreTire = r.Next(NB_MAX + 1);
     
                    Console.Write(" ----------------------------------------\n| Bienvenue dans {0} version {1}  |\n ----------------------------------------\n", NOM_PROG, VERSION);
                    // Euh... Si j'ai une dette, la banque, non seulement me l'efface, mais m'offre la valeur absolue de ma dette ?
                    if (iSolde < 0)
                    {
                        iSolde *= -1;
                    }
                    // Accessoirement, pour gérer de la monnaie avec la bonne locale, on peut utiliser {0:C}
                    Console.WriteLine("Votre solde est de {0}.-", iSolde);
                    Console.WriteLine("Entrer un nombre entre {0} et {1}", NB_MIN, NB_MAX);
                    // Si je tapes "toto va à la plage", il se passe quoi ? Utilise plutôt int.TryParse()
                    iNombre = Convert.ToInt32(Console.ReadLine());
                    while (!(iNombre <= NB_MAX && iNombre >= NB_MIN))
                    {
                        // Euh... C'est quoi ce if ? Et ce MagicNumber ? Mauvais copier/coller de l'écran de ton voisin, non ? Accessoirement, le OU LOGIQUE c'est || pas | qui est le OU BINAIRE et qui fait pas trop la même chose...
                        if (iNombre >= NB_MAX | iNombre <= 0)
                        {
                            Console.WriteLine("Le nombre entré n'est pas valide");
                            // int.TryParse()
                            iNombre = Convert.ToInt32(Console.ReadLine());
                        }
                    }
                    Console.WriteLine("Entrer le montant que vous voulez miser entre 1 et {0}", iSolde);
                    // int.TryParse()
                    iSoldeMiser = Convert.ToInt32(Console.ReadLine());
                    while (!(iSoldeMiser <= iSolde && iSoldeMiser >= SOLDE_MIN))
                    {
                        // Et donc le if il sert à quoi ?
                        if (!(iSoldeMiser >= iSolde && iSoldeMiser <= SOLDE_MIN))
                        {
                            Console.WriteLine("Le nombre entré n'est pas valide");
                            // int.TryParse()
                            iSoldeMiser = Convert.ToInt32(Console.ReadLine());
                        }
                    }
     
                    // Juste comme ça, parce que moi j'aime bien faire les choses dans l'ordre : on choisi un nombre PUIS on lance la roulette. Pas l'inverse. Donc le r.Next(int, int) devrait ête lancé ici et non en début de boucle.
                    if (iNombre == iNombreTire)
                    {
                        // Pourquoi faire deux-fois le même calcul quand on peut passer par une variable intermédiaire "iGain" ?
                        Console.WriteLine("Bravo, vous avez gagné {0}.- !!", iSoldeMiser * 10);
                        iSolde = iSoldeMiser * 10 + iSolde - iSoldeMiser;
                    }
                    else
                    {
                        Console.WriteLine("Vous avez perdu {0}.- !!, le nombre était {1}", iSoldeMiser, iNombreTire);
                        // Ah, ok, j'ai compris le coup de la dette... t'as pas l'impression qu'elle est à l'envers ta soustraction ? et -= c'est pour les chèvres ?
                        iSolde = iSoldeMiser - iSolde;
                    }
                    // Perso, je préfère un test sur > 0 car on sait jamais... Mais bon, vu le bug 2 lignes plus haut, je comprends ton test...
                    if (iSolde != 0)
                    {
                        // Alors, je répond "n", et... bah faut jouer quand même ? Et si je tapes "x" ?
                        Console.WriteLine("Voulez-vous rejouer ? o/n");
                        Console.ReadKey();
                        Console.Clear();
                    }
                    else
                    {
                        Console.WriteLine("Vous avez tout perdu. Au revoir");
                        Console.WriteLine("\nPresser une touche pour terminer le programme ... ");
                        Console.ReadKey();
                        return;
                    }
                }
            }
        }
    }
    Bon, sinon, sorti de ça, ça à l'air de marchouiller un peu, c'est déjà pas mal
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    J'oubliais... Et niveau using... Si tu laisses que System comme référence, ça doit suffit...
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Etudiant en informatique
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Merci pour tes conseils.. Je vais mieux étudier tout ça ce soir. J'ai fait quelque truc bizarre parce que a la base on était juste censé dire si on gagné ou perdu. Les while /for j'ai essayé plusieurs truc et quand j'ai réussi j'ai préféré ne plus y toucher... En tout cas merci!
    Citation Envoyé par StringBuilder Voir le message
    J'oubliais... Et niveau using... Si tu laisses que System comme référence, ça doit suffit...

  6. #6
    Membre à l'essai
    Homme Profil pro
    Etudiant en informatique
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Ah et j'ai une question sur la boucle for. Est-ce qu'on peut faire une boucle qui ne s'arrête jamais ? Il faut mettre quoi à la place du < 50 ?
    Merci d'avance

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Plusieurs solutions :
    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
     
    while (true)
    {
         // DoSomething
         if (sortir)
         {
              break;
         }
    }
     
    for (;;)
    {
         // DoSomething
         if (sortir)
         {
              break;
         }
    }
     
    for (int i = 0; true; i++)
    {
         // DoSomething
         if (sortir)
         {
              break;
         }
    }
     
    // Mais la solution propre (et de loin, les autres devraient te valoir un zéro pointé si le prof est exigeant)
    bool bContinuerAJouer = true;
    while (bContinuerAJouer)
    {
         // DoSomething
         if (sortie)
         {
              bContinuerAJouer = false;
         }
    }
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 218
    Points : 493
    Points
    493
    Par défaut
    Bonjour

    Citation Envoyé par StringBuilder Voir le message
    Plusieurs solutions :
    [code=c#]
    while (i++) // i vaut 1 à la première boucle
    Non, ça, ça marche en C, mais pas en C# (pas de conversion implicite int => bool).
    Beaucoup trop d'hommes viennent au monde : l'Etat a été inventé pour ceux qui sont superflus. (Friedrich Nietzsche)

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Oups, corrigé
    On ne jouit bien que de ce qu’on partage.

  10. #10
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Le code n'est pas mal comme ça mais pour ma part je préconise de scinder le code en petites fonctions dont les noms forment une documentation implicite (lire à ce sujet Coder Proprement de Robert Martin).

    J'aurais donc essayé d'avoir un code de haut niveau ressemblant à :

    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
    void Jouer()
    {
        do
        {
             SaisirNombre();
             SaisirMise();
             Tirer();
        }
        while(VérifierSolde() && OffrirDeContinuer());
    }
     
    Roulette(int iSolde)
    {
        this.iSolde = iSolde;
    }
     
    static void Main(string[] args)
    {
        new Roulette(iSolde: 1000).Jouer()
    }


    PS : cela dit un prof qui t'impose des préfixes de types est peut-être de la vieille école et pourrait préférer des fonctions de 1200 lignes incompréhensibles avec des identifiants cryptiques de cinq caractères, et un affichage en vert sur fond noir et 80 colonnes.

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

Discussions similaires

  1. Avis programme Java
    Par -The_Reaper- dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 20/09/2010, 16h30
  2. Avis : Programmation avec jbuilder
    Par makker73 dans le forum JBuilder
    Réponses: 2
    Dernier message: 15/12/2009, 13h38
  3. [Avis] Les meilleurs programmes Java ?
    Par christopheJ dans le forum ImageJ
    Réponses: 69
    Dernier message: 07/10/2008, 02h12
  4. Avis programmation Servlet/JSP
    Par Seth77 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 08/08/2006, 19h20
  5. [] Utiliser AVI d'une DLL dans mon programme
    Par seb.49 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/05/2003, 15h52

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