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 :

votre avis sur mon programme


Sujet :

C++

  1. #1
    Membre actif
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    Points : 204
    Points
    204
    Par défaut votre avis sur mon programme
    Bonjour a tous ! Suite a cette veille discussion, http://www.developpez.net/forums/sho...d.php?t=266993
    j'ai tres nettement amelioré mon programme. Maintenant qu'il est termine, j'aimerais avoir votre avis (chose a chager, a modifier...)
    Merci d'avance !
    Voici le programme en question :
    Fichiers attachés Fichiers attachés

  2. #2
    Membre actif
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    Points : 204
    Points
    204
    Par défaut
    Certains nomd de variables ont ete choisi au hasard !

  3. #3
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    Salut,

    d'un point de vue structure, j'aurais deja documenter le code de manière plus rigoureuse (à la doxygen par exemple) et surtout j'aurais éclaté la fonction main plus que ca car la elle est beaucoup trop grosse -> illisible

  4. #4
    Membre actif
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    Points : 204
    Points
    204
    Par défaut
    Merci beaucoup pour ces conseils. Je vais essayer d'ameliorer ca !

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 689
    Points
    30 689
    Par défaut
    Salut,

    D'abord, il faut prendre l'habitude de se servir des possiblités qui nous sont offertes pour ce à quoi elles servent effectivement...

    Ainsi, un fichier n'a un intérêt que pour permettre la persistance des informations entre deux lancements distincts de l'application...

    Tu dois donc prendre l'habitude de n'avoir recours au fichier que:
    • au début de l'application, pour récupérer les élèves que tu as encodés
    • à la fin de l'application pour enregistrer (s'il échoit) les modifications apportées à la liste des élèves

    Entre ces deux moments bien précis, il n'y a absolument pas lieu d'avoir acces au fichiers (d'autant plus qu'on envisage mal un classe de 100.000 élèves ou plus )

    Ensuite, il faut prendre les bonnes habitudes de codages:
    • une fonction doit avoir une responsabilité unique, et faire correctement ce dont elle est responsable...S'il arrive que sa responsabilité sous-entende plusieurs autres "sous responsabilités", il peut parraitre cohérent de prévoir autant d'autres fonctions que de sous responsabilités
    • Autant que faire se peut, il est largement préférable de limiter le nombre de lignes d'une fonction à maximum une cinquantaine (+/- 2 pages écran "DOS") et chaque ligne à 80 colones (la largeur d'un écran "DOS")... Au delà, le code devient parfaitement illisible
    • S'il y a moyen, il est préférable, pour la visibilité, de s'arranger pour modifier une succession de if...else if par un switch case... Mais cela signifie, dans ton cas, de réenvisager la manière dont tu va introduire le choix de ce que tu veux faire


    Accessoirement, à défaut de réenvisager l'introduction du choix (je te présenterai plus loin comment t'y prendre), tu peux peut etre envisager d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if(choix==...)
    {
    //...
    }
    else if(choix==...)
    {
    //...
    }
    else if(choix==...)
    {
    //...
    }
    qui sera quand meme plus lisible (car moins indenté) que le code dans sa version actuelle

    Du point de vue des responsabilités des différentes fonctions, *idéalement* celles de la fonction main() devraient se limiter à trois choses:
    • provoquer l'initialisation de l'application (si nécessaire)
    • provoquer le travail de l'application
    • provoquer la libération des ressources (si nécessiare)avant de quitter

    ou, comme il n'y a pas réellement d'initialisation,
    • provoquer l'affichage d'un menu
    • provoquer, selon le choix de l'utilisateur, l'appel de la fonction correspondant au choix


    On peut donc envisager une fonction "menu" qui serait du genre 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    /* fonction qui affiche un menu pour proposer plusieurs choix à l'utilisateur
     * @in: rien
     * @out: un entier représentant le choix
     */
    int menu()
    {
        int choix=-1;
        // on boucle sur le choix tant qu'il n'est pas valide
        do
        {
             cout<<"Menu principal"<<endl
                 <<endl
                 <<"1- Creation d'un profil"<<endl
                 <<"2- Modification d'un profil"<<endl
                 <<"3- Creation d'une nouvelle classe"<<endl
                 <<"4- Enregistrer la classe"<<endl
                 <<"5- Charger une classe"<<endl
                 <<"6- Ajouter un eleve dans la classe"<<endl
                 <<"7- Supprimer un eleve de la classe"<<endl
                 <<"8- modifier un eleve de la classe"<<endl
                 <<"9- choisir un eleve a interroger"<<endl
                 <<"10- voir les eleves de la classe"<<endl
                 <<"0- Quitter"<<endl
                 <<endl
                 <<"Introduisez votre choix :";
                 //on boucle jusqu'à ce que l'introduction du choix soi effective
                 while(!(cin>>choix))
                     cout<<"veuillez introduire uniquement des chiffres"<<endl
                         <<"Introduisez votre choix :"
                 //un message si le choix n'est pas compris entre 0 et 8
                 if(choix<0 || choix >9)
                     cout<<"veuilez introduire une valeur comprise entre 0 et 9"
                         <<endl;
        }while(choix<0 || choix >9);
        //renvoie la valeur du choix effectue
        return choix;
    }
    (certains choix de gestion de profil peuvent etre utilement ajoutés )
    La fonction main deviendrait:
    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
     
    int main()
    {
        //il nous faut un tableau d'éleves
        vector<string> eleves;
        //un "flag" pour savoir si la liste a été modifiée
        bool modifie=false;//par defaut, elle ne l'a pas ete ;)
        //le nom du profil en cours
        string profile;
        //le nom du fichier d'enregistrement de la classe
        string classename;
        //et une valeur pour récupérer le choix
        int choix;
        //on va boucler jusqu'à ce que l'utilisateur choisisse de quitter
        do
        {
            //on récupère le choix de l'utilisateur grace à la fonction menu
            choix=menu();
            //Chacun des choix possible provoquera l'appel d'une fonction
            // différente
            switch(choix)
            {
                case 1://crée le profil utilisateur
                    profile=CreeProfil();//à implémenter ;)
                    break;
                case 2://modifie le profil utilisateur
                    ModifProfil(profile);//à implémenter ;)
                    break;
                case 3://crée une nouvelle classe
                    /* la fonction verifiera si la classe en cours a ete modifiée
                     * et en proposera l'enregistrement avant de la vider
                     */
                    CreerClasse(eleves,classename,modifie);//à implémenter
                    modifie=false;//Une classe à peine créée n'a d'office pas été 
                                  //modifiée ;)
                    break;
                case 4:
                   EnregistreClasse(eleves,classename);//à implémenter
                    modifie=false;//tout de suite apres enregistrement, la classe
                                  //du fichier et celle qui est en mémoire sont
                                  //identiques ;)             
                    break;
                case 5://charger une autre classe
                    /* propose d'enregistrer la classe si elle a été modifée
                     * avant de charger la nouvelle classe
                     */
                    ChargerClasse(eleves,classename,modifie);//a implementer
                    modifier=false;// tout de suite apres chargement d'une
                                   // nouvelle classe, la classe du fichier et
                                   // celle qui est en mémoire sont identiques ;)
                    break;
                case 6:
                    /* l'utilisation peut, pour une série de raisons, décider de
                     * ne pas ajouter un élève apres avoir demandé à le faire
                     * ou l'insertion peut échouer ...
                     * la fonction renvoie donc vrai si l'ajout a eu lieu et false
                     * sinon...
                     * si le flag était à vrai avant la tentative d'ajout, il doit
                     * etre vrai apres, mais, s'il était à faux avant, il doit
                     * changer en fonction du résultat de la fonction ;)
                     */
                     bool recup=AjoutEleve(eleves);//à implementer
                     modifie=modifie || recup;
                    break;
                case 7: //supprime un  éleve de la classe
                    /* il faut suivre le meme raisonnement pour la suppression
                     * d'un éleve que pour son ajout ;)
                     */
                    bool recup=SuppressEleve(eleves);//à implémenter
                    modifie=modifie||recup;
                    break;
                case 8://Permet de modifier les données d'un élève ;)
                    /* Encore une fois, le flag doit etre modifé en fonction de la
                     * réussite de la fonction ;)
                     */
                    bool recup=ModifieEleve(eleves);//à implémenter ;)
                    break;
                case 9: //choisi un éleve à interroger
                    /* Il ne semble pas logique de supprimer un eleve de la classe
                     * quand il a été interrogé
                     */
                     InterrogerEleve(eleves);//à implémenter ;)
                    /* plus loin, je proposerai une strucutre pour les éleves...
                     * si elle t'agrée, il sera intéressant de signaler que
                     * la classe a été modifiée ;)
                     */
                case 10://affiche la liste des élèves de la classe
                     AfficheClasse(eleves);
                     break;
                default://correspond à choix==0;)
                    Quitter(eleves,classename,profile,modifie);//à implémenter
            }
        }while(choix != 0)
        return 0;
    }
    Le fait d'écrire le code, on se rend compte que la simple utilisation du nom de l'élève est insuffisante...

    En effet, chaque éleve devrait etre responsable du fait qu'il a été interrogé récemment ou non...
    Il semblerait donc utile de prévoir une strucutre du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct Eleve
    {
        string nom;
        bool interroge;
    };
    ou de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct Eleve
    {
        string nom;
        Date interro;//Date est une structure à choisir pour la bonne gestion
                     //des dates ;)
    };
    et donc:
    1. d'utilser un vector<Eleve> pour maintenir la classe en mémoire
    2. de modifier la valeur signifiant que l'éleve a été interrogé dans la fonction InterrogerEleve
    3. de considérer la modification en [2] comme une modification de la classe (au meme titre que l'ajout, la suppression ou la modification d'un élève )


    Prototypes responsabilités et principes de fonctionnement des différentes fonctions apparues dans main()
    La fonction CreeProfile()
    La fonction ModifProfile()

    La fonction CreerClasse()
    • Vérifie si la classe en cours a été modifiée (si oui, propose son enregistrement et appelle EnregistreClasse)
    • Vide la classe
    • Crée éventuellement directement un fichier pour la nouvelle classe (en demande le nom)
    • pourrait appeler la fonction ModfProfile
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      void CreeClasse(vector<Eleves>&cl, string & nom, bool mod);

    La fonction ChargerClasse:
    • Vérifie si la classe en cours a été modifiée (si oui, propose son enregistrement et appelle EnregistreClasse)
    • Vide la classe en cours
    • demande le nom du fichier à charger
    • rempli le vecteur avec les infos trouvées dans le fichier
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      void ChargerClasse(vector<Eleve>& cl,bool modif);

    La fonction EnregistreClasse

    La fonction AjoutEleve

    La fonction ModifEleve
    • propose éventuellement d'afficher la liste des élèves (par appel à AfficheClasse)
    • demande de choisir l'éleve à modifer (affiche les info le concernant)
    • demande les modifications à apporter
    • apporte les modifications si elles sont jugées valides
    • renvoi le fait que des modifications ont eu lieu ou non
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      bool ModifieEleve(vector<Eleve>& cl);

    La fonction InterrogerEleve
    • propose éventuellement l'affichage de la classe (par appel à AfficheClasse)
    • Selectionne l'éleve à interroger et affiche ses informations
    • modifie le fait que l'éleve sélectionné a été interrogé récemment
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      void InterrogerEleve(vector<Eleve>& cl);

    La fonction Quitter enfin:
    [LIST][*]vérifie s'il faut enregistrer la classe, avec modification éventuelle du profile (ou création s'il n'y en a pas de défini) (appel de ModifProfile et de EnregistrerClasse)[*]vide le tableau[*]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Quitter(vector<Eleve>& cl, str& classe, str& profile, bool mod);
    Je précise que ce n'est là que la manière dont je travaillerais personnellement... et que d'autres organisations pourraient très bien faire l'affaire

    Mais,l'énorme avantage est que, au lieu de te trouver face à une fonction unique qui fait, à elle seule, un nombre incroyable de lignes, tu te retrouvera, certes, avec beaucoup de petites fonctions, mais bien plus facilement lisibles

  6. #6
    Membre actif
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    Points : 204
    Points
    204
    Par défaut
    Je te remercie pour tous ces conseiles pratiques. Je vais suivre tes conseils et encore merci pour ton aide !

  7. #7
    Membre actif
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    Points : 204
    Points
    204
    Par défaut
    J'ai modifie le programme grace a vos conseils mais qu'en pensez-vous de mon cryptage ? Si vous avez des idees pour le renforcer, pourriez-vous me montrer ?
    Merci d'avance !

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/08/2009, 17h17
  2. Votre avis sur mon programme
    Par grinder59 dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 19/09/2008, 11h05
  3. votre avis sur mon premier site
    Par hajmainou dans le forum Mon site
    Réponses: 6
    Dernier message: 21/06/2006, 00h59
  4. [Mémoire Licence] Votre avis sur mon titre
    Par soad029 dans le forum Stages
    Réponses: 8
    Dernier message: 23/05/2006, 19h21

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