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 :

Proposition d'optimisation programme


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Proposition d'optimisation programme
    Bonjour, étant étudiant et travaillant sur la programmation depuis peu je voulais savoir s'il était possible d'optimiser mon programme (sans compter l'aspect esthétique)

    Il permet à l'utilisateur d'entrer le mois de naissance puis le jour, et une phrase en retour lui dira "la personne née le (jour) (mois) est du signe (signe).
    Il fonctionne bien mais je suis curieux de connaître une version améliorée :p

    Voici le code :

    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
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    using System;
     
    namespace Exercice_54
    {
        class Program
        {
            public struct TabSignes
            {
                public string signe;
                public int jour;
                public string mois;
            }
            static char saisie(string message, char lettre1, char lettre2)
            {
                char reponse;
                do
                {
                    Console.WriteLine();
     
                    Console.Write(message + " (" + lettre1 + "/" + lettre2 + ") ");
                    reponse = Console.ReadKey().KeyChar;
     
                    if (reponse != lettre1 && reponse != lettre2)
                    {
                        Console.WriteLine();
                        Console.WriteLine("Veuillez saisir un caractère valide!");
                    }
     
                } while (reponse != lettre1 && reponse != lettre2);
     
                return reponse;
            }
     
            static void Main(string[] args)
            {
                //Création du tableau
                TabSignes[] tabAstro = new TabSignes[12];           
     
                //Remplissage en fonction du mois
     
                tabAstro[0].signe = "Verseau";
                tabAstro[0].jour = 20;
                tabAstro[0].mois = "janvier";
     
                tabAstro[1].signe = "Poissons";
                tabAstro[1].jour = 50; //(Ici 50 indique le 50ème jour de l'année)
                tabAstro[1].mois = "février";
     
                tabAstro[2].signe = "Bélier";
                tabAstro[2].jour = 80;
                tabAstro[2].mois = "mars";
     
                tabAstro[3].signe = "Taureau";
                tabAstro[3].jour = 111;
                tabAstro[3].mois = "avril";
     
                tabAstro[4].signe = "Gémeaux";
                tabAstro[4].jour = 141;
                tabAstro[4].mois = "mai";
     
                tabAstro[5].signe = "Cancer";
                tabAstro[5].jour = 173;
                tabAstro[5].mois = "juin";
     
                tabAstro[6].signe = "Lion";
                tabAstro[6].jour = 204;
                tabAstro[6].mois = "juillet";
     
                tabAstro[7].signe = "Vierge";
                tabAstro[7].jour = 235;
                tabAstro[7].mois = "août";
     
                tabAstro[8].signe = "Balance";
                tabAstro[8].jour = 266;
                tabAstro[8].mois = "septembre";
     
                tabAstro[9].signe = "Scorpion";
                tabAstro[9].jour = 296;
                tabAstro[9].mois = "octobre";
     
                tabAstro[10].signe = "Sagittaire";
                tabAstro[10].jour = 326;
                tabAstro[10].mois = "novembre";
     
                tabAstro[11].signe = "Capricorne";
                tabAstro[11].jour = 351;
                tabAstro[11].mois = "décembre";
     
     
                //Déclarations nécessaires à la boucle
                string mois, signe;
                int jour = 0, saveJour, position;
                char rep;
     
                do
                {
                    bool verif = false;
                    jour = 0;
                    Console.Clear();
     
                    do
                    {
                        //Saisie du mois et vérification de son existence
                        Console.Write("Veuillez saisir le mois de naissance : ");
                        mois = Console.ReadLine();
     
                        position = 0;
                        while (position < 11 && tabAstro[position].mois != mois)
                        {
                            position++;
                        }
     
                        if (tabAstro[position].mois == mois)
                        {
                            verif = true;
                        }
     
                        else
                        {
                            Console.WriteLine("Ce mois est inexistant!");
                        }                                        
                    } while (verif == false);
     
                    //Avancée dans l'année en fonction du numéro du mois indiqué
                    switch (position)
                    {
                        case 0:
                            break;
                        case 1:
                            jour = 31;
                            break;
                        case 2:
                            jour = 59;
                            break;
                        case 3:
                            jour = 90;
                            break;
                        case 4:
                            jour = 120;
                            break;
                        case 5:
                            jour = 151;
                            break;
                        case 6:
                            jour = 181;
                            break;
                        case 7:
                            jour = 212;
                            break;
                        case 8:
                            jour = 243;
                            break;
                        case 9:
                            jour = 273;
                            break;
                        case 10:
                            jour = 304;
                            break;
                        case 11:
                            jour = 334;
                            break;
                    }
     
                    //Saisie du jour de naissance
                    Console.Write("Veuillez entrer le jour de naissance : ");
                    saveJour = int.Parse(Console.ReadLine());
                    jour += saveJour;
     
                    //Calcul du signe
                    if (jour > 19)
                    {
                        position = 0;
                        while (position < 11 && jour < tabAstro[position].jour)
                        {
                            position++;
                        }
     
                        signe = tabAstro[position].signe;
                    }
                    else
                    {
                        signe = tabAstro[11].signe;
                    }
     
                    Console.Clear();
     
                    //Mise en page et affichage du message final
                    Console.WriteLine();
                    Console.WriteLine("La personne né le " + saveJour + " " + mois + " est du signe " + signe);
                    Console.WriteLine();
                    Console.WriteLine();
     
                    rep = saisie("Souhaitez-vous saisir une autre date de naissance ?", 'O', 'N');
     
                } while (rep == 'O');
            }
        }
    }
    Merci d'avance!

    (EDIT : j'ai remarqué que le programme avait un problème avec le signe verseau, je reposte le programme corrigé)

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il y a différentes sortes d'optimisation à faire dans du code (performances, maintenabilité, temps de développement ...) on choisit selon plusieurs critères

    pour une méthode appelée rarement et dont le temps d'exécution n'est pas crucial il est inutile de perdre du temps à gagner en performances
    pour quelque chose qui est appelé souvent ou dont il faut aller le plus vite possible là on peut se permettre de perdre un peu en lisibilité et temps de développement pour écrire du code performant (et en ajoutant des commentaires)

    pour optimiser les performances il faut avoir un bon algo et utiliser les bonnes classes (par exemple il y a plusieurs types de collections qui ont des performances différentes selon les add/insert/delete ..., donc on choisit en fonction de ce qu'on en fait)

    là ton code doit prendre dans le pire des cas 1 ou 2 millisecondes donc on s'embête rarement à optimiser ça
    par contre tu as 200 lignes de code, alors que ca peut tenir en une trentaine je pense, et du coup on peut gagner en lisibilité/maintenabilité
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse, en effet j'ai fait beaucoup de mise en page car cela m'aide pas mal à m'y repérer en tant que débutant

    Selon toi, est-ce que l'algo de mon programme est bon?

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    des numéros de jour annuels c'est moins parlant que des dates, et des boucles ca prend moins de place que des switch
    après je ne connais pas l'astrologie donc je ne pourrais pas plus statuer
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    ok merci du conseil!

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Est tu sur que compter le nombre de jour est fiable ?
    Je pense aux années bissextiles entre autre.

    Pareille pour l'utilisation de date sachant que l'on ne la connait pas.

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Finalement pour les dates ce n'était pas une mauvaise idées

    Juste pour l'exercice voici comment je ferais, même si il y a beaucoup à redire.

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    static void Main(string[] args)
    {
        // Tableau des signes et dates de fin correspondantes (utilisation d'une année bisextile : 2020)
        TabSignes[] tabAstro = new TabSignes[13];
        tabAstro[0] = new TabSignes() { signe = "Capricorne", date = new DateTime(2020, 1, 19) };
        tabAstro[1] = new TabSignes() { signe = "Verseau", date = new DateTime(2020, 2, 19) };
        tabAstro[2] = new TabSignes() { signe = "Poissons", date = new DateTime(2020, 3, 20) };
        tabAstro[3] = new TabSignes() { signe = "Bélier", date = new DateTime(2020, 4, 19) };
        tabAstro[4] = new TabSignes() { signe = "Taureau", date = new DateTime(2020, 5, 20) };
        tabAstro[5] = new TabSignes() { signe = "Gémeaux", date = new DateTime(2020, 6, 20) };
        tabAstro[6] = new TabSignes() { signe = "Cancer", date = new DateTime(2020, 7, 22) };
        tabAstro[7] = new TabSignes() { signe = "Lion", date = new DateTime(2020, 8, 23) };
        tabAstro[8] = new TabSignes() { signe = "Vierge", date = new DateTime(2020, 9, 22) };
        tabAstro[9] = new TabSignes() { signe = "Balance", date = new DateTime(2020, 10, 22) };
        tabAstro[10] = new TabSignes() { signe = "Scorpion", date = new DateTime(2020, 11, 21) };
        tabAstro[11] = new TabSignes() { signe = "Sagittaire", date = new DateTime(2020, 12, 21) };
        tabAstro[12] = new TabSignes() { signe = "Capricorne", date = new DateTime(2020, 12, 31) };
     
        while (true)
        {
            Console.Clear();
            TabSignes monAstro = new TabSignes() { date = new DateTime(2020, 1, 1) };
     
            // Permet la saisie du mois 1 à 12
            string reponse = saisie("Veuillez saisir le mois de naissance : ", Enumerable.Range(1, 12).Select(x => x.ToString()).ToArray(), "Ce mois est inexistant!");
            monAstro.date = new DateTime(2020, int.Parse(reponse), 1);
     
            // Permet la saisie du jour de 1 jusqu'au dernier en fonction du mois
            int jourMaxDuMois = DateTime.DaysInMonth(monAstro.date.Year, monAstro.date.Month);
            reponse = saisie("Veuillez entrer le jour de naissance : ", Enumerable.Range(1, jourMaxDuMois).Select(x => x.ToString()).ToArray(), "Ce jour est inexistant!");
            monAstro.date = new DateTime(2020, monAstro.date.Month, int.Parse(reponse));
     
            // Trouve le signe correspondant
            monAstro.signe = tabAstro.First(a => a.date >= monAstro.date).signe;
     
            // Affichage du signe
            Console.Clear();
            Console.WriteLine("La personne né le " + monAstro.date.Day + "/" + monAstro.date.Month + " est du signe " + monAstro.signe + "\r\n\r\n");
     
            // Demande si on continue
            reponse = saisie("Souhaitez-vous saisir une autre date de naissance ? ($StrValidation) ", new string[] { "O", "N" });
            if (string.Compare(reponse, "N", true) == 0)
                break;
        }
    }
     
    public struct TabSignes
    {
        public string signe;
        public DateTime date; // Date limite max du signe
    }
     
    static string saisie(string message, string[] StrValidation, string messageErr)
    {
        // Remplace $StrValidation par les chaines de validation séparé par un /
        message = message.Replace("$StrValidation", string.Join("/", StrValidation));
        messageErr = messageErr.Replace("$StrValidation", string.Join("/", StrValidation));
     
        while (true)
        {
            Console.Write(message);
            string reponse = Console.ReadLine();
            if (StrValidation.Contains(reponse, StringComparer.InvariantCultureIgnoreCase))
                return reponse;
            Console.WriteLine(messageErr);
        }
    }
     
    static string saisie(string message, string[] StrValidation)
    {
        return saisie(message, StrValidation, "\r\nVeuillez saisir une chaine valide!");
    }

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

Discussions similaires

  1. Optimisation programmation Interface
    Par christophe_halgand dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 28/02/2008, 18h49
  2. Optimisation programme ::
    Par scolopendra dans le forum Langage
    Réponses: 5
    Dernier message: 16/04/2007, 17h53
  3. Optimiser programme (D7)
    Par mario9 dans le forum Delphi
    Réponses: 2
    Dernier message: 18/08/2006, 17h36

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