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 :

Appel a la critique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut Appel a la critique
    Bonjour,


    Je débute en C++ et je me base sur le fait que pour apprendre il faut essayer, car c'est en forgent que l'on deviens forgerons , donc je ne lis pas de livre , et me suis fixé aucun site a lire en entier. Mais bien sur, vous vous douterez que je me reseigne pour mes différent probleme.
    Donc je voulais savoir si ma vision des choses est correctes ?



    De plus j'ai crée un petit jeu ( dont j'ai tiré l'idée d'un site ) , et je voulais avoir une critique de professionel / passioné sur ma syntaxe ,sur des ajouts possible.
    J'avoue avoir fait un retour grossier mais je n'arrivais pas a exploiter la commande "void" qui d'apres se que j'ai compris une sous fonction


    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
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
      #include <iostream>
     #include <cstdlib>
     #include <ctime>
     #include <time.h> 
     
     using namespace std;
     
     
     
     
    int games ( )
    {
     int nombre;
     int nombremyst;
     int game ;
     int choix;
     int vie=10 ;
     
     
     cout << " ----------------- Merci de rejouer ----------------- \n\n " ;
     cout << "\n --- Que veux tu refaire ? --- \n\n";
     cout << " 1. Mode facil (1-10) \n"; 
     cout << " 2. Mode normal(1-100)\n";
     cout << " 3. Mode difficil (1-1 000)\n";
     cout << " 4. Mode extra-difficil (1-10 000)\n";
     cout << " 5. Mode 2 Joueurs\n\n ";
     
     cin >> game ;
     system("cls") ;
     
     
         if (game==1)
    {  
     cout << "\n---------------------Notice---------------------\n " ;
     cout <<  "\nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 10 \n" ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (10.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    } 
     
         else if (game==2)
    {  
     cout << "\n---------------------Notice---------------------\n " ;
     cout <<  "\nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 100 \n" ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (100.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    } 
     
     
         else if (game==3)
    {
     cout << "\n---------------------Notice---------------------\n " ;
     cout <<  "\nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 1 000 \n  " ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (1000.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    }
     
     
         else if (game==4)
    {
     cout << "\n---------------------Notice---------------------\n " ;
     cout << " \nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 10 000 \n" ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (10000.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    }
     
        else if (game==5)
    {  
     cout << "\n---------------------Notice---------------------\n " ;
     cout << "\nLe joueur n.1 doit entrer un nombre parmit 1 a 100 " ;
     cout << "\n\nLe joueur n.2 doit le deviner \n" ;
     cout << "\n Veuillez entrer le nombre secret:\n\n " ;
     cin >> nombremyst ;
     system("cls");
    }
     
     
         else 
    {
     cout << "Vous n'avez pas compris, redemarrez le jeu vous l'avez fais planter \n Espece de naze \n inutile !! incapable ! \n\n" ; 
     system("pause");
     return 0;
    }
     
     
     
     cout << " \n----------------------Trouve le nombre-------------------\n " ; 
     
     
     
        do
    { 
     cin >> nombre ;
     
        if (nombre < nombremyst)
    {
     
     cout << "C'est plus !\n" ;
    }
       else if(nombre > nombremyst)
    { 
     
     cout << " C'est moins !\n"; 
    } 
       else if(nombre == nombremyst) 
    { 
     cout << "  \n\n -------Bravo ! ------\n" ; 
     break ;
    }
     
     vie = vie - 1;
     cout << "Il vous reste " << vie  << " vie . \n" ;
     
        if (vie==0)
    {
     cout << " \n\n -------Vous avez perdu !------\n " ;
    }
    }  
       while ( vie > 0);
     
     
     cout << " \n\n--------------Maintenant, voulais vous rejouer ? -------------" ;
     cout << " \n1) oui ";
     cout << " \n2) non " ;
     cout << "\n";
     cin >> choix;
     system("cls");
     
      do 
    {     
    if (choix==1) 
    { 
     return games( ) ;
     
    }
    }
    while ( choix!=2) ;
     
     
    system("pause");
    }
     
     
     
     
     
     
     
     
     // Entre game , et main . 
     // --------------------------------------------------------------------------
     // Entre main , et game . 
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     int main ( )
    {
     
     int nombre;
     int nombremyst;
     int game ;
     char speudo[10];
     int choix;
     int vie=10 ; 
     
     
     cout << "------------------Bonjour -------------\n " ;
     cout << "\nJe suis Snok, et vous quel est votre prenom ??\n\n " ;
     cin >> speudo ;
     system("cls");
     
     
     
     cout << "\n --- Que veux tu faire "<< speudo << " ? --- \n\n";
     cout << " 1. Mode facil (1-10) \n"; 
     cout << " 2. Mode normal(1-100)\n";
     cout << " 3. Mode difficil (1-1 000)\n";
     cout << " 4. Mode extra-difficil (1-10 000)\n";
     cout << " 5. Mode 2 Joueurs\n\n ";
     cin >> game ;
     system("cls") ;
     
     
     
         if (game==1)
    {  
     cout << "\n---------------------Notice---------------------\n " ;
     cout <<  "\nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 10 \n" ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (10.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    } 
     
     
        else if (game==2)
    {  
     cout << "\n---------------------Notice---------------------\n " ;
     cout <<  "\nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 100 \n" ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (100.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    } 
     
     
         else if (game==3)
    {
     cout << "\n---------------------Notice---------------------\n ";
     cout <<  "\nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 1 000 \n  " ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (1000.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    }
     
     
         else if (game==4)
    {
     cout << "\n---------------------Notice---------------------\n ";
     cout << " \nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 10 000 \n" ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (10000.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    }
     
     
        else if (game==5)
    {  
     cout << "\n---------------------Notice---------------------\n ";
     cout << "\nLe joueur n.1 doit entrer un nombre parmit 1 a 100 " ;
     cout << "\n\nLe joueur n.2 doit le deviner \n" ;
     cout << "\n Veuillez entrer le nombre secret:\n\n " ;
     cin >> nombremyst ;
     system("cls");
    }
     
     
         else 
    {
     cout << "Vous n'avez pas compris, redemarrez le jeu vous l'avez fais planter \n Espece de naze \n inutile !! incapable ! \n\n" ; 
     system("pause");
     return 0;
    }
     
     
     
     cout << " \n----------------------Trouve le nombre-------------------\n " ; 
     
     
     
     
        do
    { 
     cin >> nombre ;
     
     
    if (nombre < nombremyst)
    {cout << "C'est plus !\n" ;}
     
     
    else if(nombre > nombremyst)
    {cout << "C'est moins !\n"; } 
     
     
    else if(nombre == nombremyst) 
    { cout << "\n\n -------Bravo ! ------\n" ; 
     break ;}
     
     
     vie = vie - 1;
     cout << "Il vous reste " << vie  << " vie . \n" ;
     
     
    if (vie==0)
    {cout << " \n\n -------Vous avez perdu !------\n " ;}
     
    }  
    while ( vie > 0);
     
     
     
     cout << " \n\n--------------Maintenant, voulais vous rejouer ? -------------" ;
     cout << " \n1) oui ";
     cout << " \n2) non " ;
     cout << "\n";
     cout << " \n\n-- Snok --\n\n ";
     cin >> choix;
     system("cls");
     
     
     
     
    do 
    {  
     
    if (choix==1) 
    { return games( ) ;}
     
    }
    while (choix!=2) ;
     
     
     
    system("pause");
    }

    Le lien pour le jeu compiler : http://www.megaupload.com/fr/?d=R30SFHF7

  2. #2
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    (note je ne suis pas pro mais je me permet de participer à la réponse!)

    Tout d'abord sache que ce que tu fais, mis a part les affichages écran faits avec "cout <<", c'est du C et non vraiment du C++.

    Je trouve que ça manque de décomposition en fonction pour lire.
    Et surtout ça manque d*indentations* :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (int i=0; i<10; ++i)
       faireqqchose;
     
    if (age > 10) {
       cout << "Vous avez moins de 10 ans";
       autretrucs;
    }
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int i=0; i<10; ++i)
    faireqqchose
    if (age > 10) {
    cout << "Vous avez moins de 10 ans";
    autretrucs;
    }

    mais peut etre l'as tu fait a cause du copier collé sur le forum, les "Tabulations" ne marchent pas.


    et sinon c'est sympa, tu as appris les bases de la programmation linéaire (boucles, if, variables de base.).




    Il y a quand même un souci niveau fonction, ça doit etre la prochaine chose qu'il faut que tu apprennes :

    toute fonction en c++ DOIT avoir un certain type, à l'exception de main qui peut etre declarée sans type de retour, mais c'est plus propre de le faire (int main() au lieu de main() ). Par exemple tu te fiches du type de game, mais tu as dû quand même le mettre "int" pour que ça compile.

    C'est dans ces conditions qu'on utilise le type void qui est un type pour dire qu'il n'y a pas de type de retour (void veut dire vide, à peu près en anglais).

    Comment appeler une fonction :

    SOIT si on s'intéresse à la valeur de retour qqchose comme :

    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
    int mafonctionint() {
      blablabla;
      blabla;
      return UnNombreInt; // une fonction "int" DOIT se terminer en retournant un int à la fonction qui l'a appelée (main par exemple)
    }
     
    void mafonctionvoid() {
      blabla;
      // PAS de return pour infir une fonction void
    }
    main() {
      int monint;
      void monvoid;  // absurde : seuls les fonctions peuvent etre void, pas une variable
      mavariable = mafonctionint();
      monvoid = mafonctionvoid(); // ici ça ne veut toujours rien dire
     
      // on utilise les valeurs de retour avec qqchose
      if (monint==2) ...
     
      // ou directement sans passer par la variable monint:
      if (mafonction() == 2) ...
      // mais dans ce dernier cas la valeur de retour de la fonction est utisée une fois avec le if et pas sauvegardées, simplement jetée comme un kleenex.
    }
    SOIT si on NE s'interesse PAS à la valeur de retour de la fonction, on peut directement lancer les instructions de la fonction :

    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
    int mafonctionint() {
      blablabla;
      blabla;
      return UnNombreInt; // une fonction "int" DOIT se terminer en retournant un int à la fonction qui l'a appelée (main par exemple)
    }
     
    void mafonctionvoid() {
      blabla;
      // PAS de return dans une fonction void
    }
     
    main() {
      ...
      mafonctionvoid(); // correct, le code de la fonction mafonctionvoid() sera exécuté ici
      ...
      mafonctionint(); // correct aussi. le code de la fonction mafonctionint() sera exécuté ici. Par contre la valeur de retour (le int) est simplement et purement ignorée
     
     
     
    }

  3. #3
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Pourquoi est-ce que j'insiste autant sur ces "types de retour" de fonctions ?

    Tout d'abord car les fonction permettent d'aider énormément à faire un code clair (par exemple pour le montrer à d'autres gens, ou travailler à plusieurs) et un code clair avec des fonctions pour chaque tache evite de devoir toujours faire 10 changements dans ton code !. Par exemple dans tes if () où tu choisis la difficulté du jeu, finalement tu affiches et fait le meme calcul, il y a juste une valeur qui change c'est 10, 100, 1000 ou 10000.


    Voila typiquement qqchose qui pourrait etre fait avec une fonction. (mais avec quelques adaptations, si tu veux je te montrerai, mais tout de suite aujourd'hui je n'ai pas le courage dsl )



    Et je dis cela aussi car tu as fait une vraie erreur de programmation, bien que ça compile :

    Ton programme ne se termine jamais (j'ai l'impression)! Pire il relance tout le temps une nouvelle fonction : ça ne se voit pas mais chaque fois que tu recommences la partie un peu d'espace mémoire est mangé de plus en plus. Si tu pouvais recommencer ta partie des milliers de fois le programme ferai une erreur au bout d'un moment (qu'on appelle un débordement). d'ailleurs tu peux tester ce programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // ce n'est pas une simple boucle infinie : si tu laisses le programme tourner ainsi quelques secondes, main appelle games, qui appelle games, qui appelle  games, qui appelle games, qui .... résultat : un "empilement" de milliers de fonction dans la "pile" (une mémoire pour les appels de fonction). Cette pile ne peut pas etre infinie, elle est grande mais a un moment le nombre maximum d'appel de fonction imbriqué sera atteint : Erreur de débordement de pile (stack overflow).
    int games () {
      return games();
    }
     
    int main() {
      return games();
    }


    Je m'explique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    main() {
     
      ...
      do
        return games();
      while...
    }
    ce n'est pas comme ça qu'on appelle la fonction game.

    Là en fait tu dis que main() doit se terminer et retourner (au système d'exploitation) la valeur renvoyée par games.

    Car main est de type int, meme si tu ne le marque pas. (d'ailleurs IL FAUT le marquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main() {
    ...
      return 0; // quitte main(), donc le programme, et renvoie la valeur 0 au système d'exploitation, valeur qui indique habituellement que l'application s'est terminée sans erreur
     }
    c'est plus propre, ça évite de ne pas s'en rendre compte).



    Et games pareil, à la fin le "return games()" indique de recommencer une nouvelle fonction games, puis de rendre le controle à main() en retournant cette valeur... mais games appelle pour cela games, etc...

    en fait tu peux appeler ta fonction games ainsi simplement :

    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
     
     
    main() {
     
      ...
     
      do {
        cout << blabla
        cin >> choix;
     
        if (choix==1)
          games();  // appeler la fonction games si le choix est 1.
      } while (choix!=2);
     
    } // fin de main


    Et il faudrait trouver une manière de faire pour supprimer le code de main() qui est exactement pareil que games(). Ce genre de chose écrites deux fois est très mauvais en programmation : non seulement tu perd du temps qaund tu dois modifier ton code, mais en plus tu pourrais oublier un petit détail et ça cause des erreurs. Et je te parle pas des relecteurs... (comme moi : j'ai commencé à lire pour vérifier si c'était bien pareil mais franchement j'ai abandonné avant la fin )



    voila, j'espère ne pas avoir trop écrit et j'espère que c'est compréhensible. si tu veux d'autres précisions demande, et progresse bien.


    PS : et j'oubliais, j'aime bien l'humour de ton jeu, ça me rappelle mes premiers programmes ! un jeu qui insulte son utilisateur ça donne toujours beaucoup de caractère au programme ...

  4. #4
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    donc en fait, en relisant et pour répondre simplement à ta première question :

    non, ta vision d'un programme n'est pas correcte , bien que tu sois sur la voie (il me semble qu'on a tous commencé à écrire des choses comme cela au début, et tout programmeur te répondra que ce n'est pas une bonne chose de faire comme cela.

    (Sache qu'un "vrai" programme (comme un vrai jeu commercial) est constitué de milliers ou de dizaines de milliers de lignes de codes.)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Tout d'abord merci ;


    1er point °) Aiiie !! ^^ Quel joli condensé d'informations je pense avoir grosso-modo compris mes erreurs , en revanche plus de mal a assimiler comment les éviters , mais je pense que plusieurs relecture devrais marcher.

    en clair : éviter le débordement en reformulant les retours de fonction , voir supprimer "int games" ; et je sais pu quoi pour toute mes options de jeu dite de niveaux , c'est sa?

    (excuse moi de ne pas avoir tout percuté tout de suite je commence juste )


    Et 2nd point °)
    PS : et j'oubliais, j'aime bien l'humour de ton jeu, ça me rappelle mes premiers programmes ! un jeu qui insulte son utilisateur ça donne toujours beaucoup de caractère au programme ...
    ^^ merciii

    3eme et dernier point °) Tu n'es pas d'"accord avec "forger pour devenir forgerons" , je te crois totalement mais que me conseil tu ? stp

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    On devient codeur en codant. C'est absolu. Mais avoir de bonne base en programmation facilite fortement la tache .

    Donc,t u te prend un cours de bonne qualité que tu lit et au fur et à mesure tu code. Ce que tu code importe peu, l'important étant que tu met en pratique la théorie du cours.

    Quand tu pense être prêt,attaque un petit projet.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Citation Envoyé par Snoky Voir le message
    Tout d'abord merci ;


    1er point °) Aiiie !! ^^ Quel joli condensé d'informations je pense avoir grosso-modo compris mes erreurs , en revanche plus de mal a assimiler comment les éviters , mais je pense que plusieurs relecture devrais marcher.

    en clair : éviter le débordement en reformulant les retours de fonction , voir supprimer "int games" ; et je sais pu quoi pour toute mes options de jeu dite de niveaux , c'est sa?
    en fait , surtout il te faut apprendre les fonctions. C'est un concept général en programmation et indispensable si tu veux faire des choses un tant soit peu plus compliquées que ton exemple.

    (excuse moi de ne pas avoir tout percuté tout de suite je commence juste )
    pas de problème. Les forums servent entre autre à expliquer ce qui n'est pas clair.

    Et 2nd point °)
    ^^ merciii
    de rien

    3eme et dernier point °) Tu n'es pas d'"accord avec "forger pour devenir forgerons" , je te crois totalement mais que me conseil tu ? stp
    au contraire, c'est comme l'as dit davidbrcz on apprend en faisant. Mais si tu le fait absolument sans guide, sans tuto, sans livre ou sans des explicateurs tu *risques* de prendre de mauvaises habitudes qui seront bien difficiles à oublier. Mais d'un coté si tu ne te lances jamais dans un petit truc pour faire une "base" comme ton petit jeu, tu ne feras jamais d'erreur et ne comprendras pas complètement ce que tu fais.

    je comprend que tu préfère commencer "à l'arrache", en allant chercher le début puis progressant.

    Mais les tutoriels C++ (quand ils sont bien faits) et les bon bouquins d'introduction te donneront de bonnes bases, et surtout ils expliqueront plus clairement, avec des exemples choisis, et des exercices avec une solution pour t'entrainer, et je pense que tu es conscient qu'au bout d'un moment si tu veux t'y mettre efficacement ce sera obligé de passer par cette étape.


    Personnellement, je trouve ta méthode très bien, surtout si ça te correspond, pour le début (et c'est bien le cas, tu commences tout juste).

  8. #8
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Bon, je n'ai pas de lien sous la main pour ces notions. il doit certainement en avoir, mais je n'ai pas trouvé là.

    Alors : je fais faire une petite intro sur les fonctions :

    Une fonction est un raccourci pour une ou plusieurs lignes de code. Au moment ou la fonction est appelée, la ligne qui exécute le code donne le controle a la fonction. Et la fonction commence à s'exécuter, et lorsqu'elle se termine l'exécution peut reprendre. De plus la fonction peut donner une valeur de retour à la ligne de code qui l'a appelée.

    En fait c'est un outil qui permet d'éviter de réecrire une série d'instructions répétitives. De plus, elle facilite grandement la lecture du code, tu découvriras que c'est très important, car un code doit etre souvent lu et corrigé.

    Ainsi un programme doit etre décomposé en modules : ce sont les fonctions. Plus tard tu apprendras aussi qu'on décompose aussi un programme en objets en C++, mais c'est pour plus tard.

    Exemple : une fonction pourrait ecrire le message que tu affiches souvent

    Au lieu de :
    (j'oublie games() pour l'instant, faisons dans main)
    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
     
     
    int main() {
      int nombremyst;
     //(...)
     
     cin >> game ;
     system("cls") ;
     
     
     
         if (game==1)
    {  
     cout << "\n---------------------Notice---------------------\n " ;
     cout <<  "\nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 10 \n" ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (10.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    } 
     
     
        else if (game==2)
    {  
     cout << "\n---------------------Notice---------------------\n " ;
     cout <<  "\nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 100 \n" ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (100.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    } 
     
     
         else if (game==3)
    {
     cout << "\n---------------------Notice---------------------\n ";
     cout <<  "\nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 1 000 \n  " ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (1000.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    }
     
     
         else if (game==4)
    {
     cout << "\n---------------------Notice---------------------\n ";
     cout << " \nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
     cout << "Le nombre est compris entre 1 et 10 000 \n" ;
     srand(time(NULL)); 
     for (int i=0 ; i<10;i++ ) 
     nombremyst =1+(int) (10000.0*rand()/(RAND_MAX+1.0)) ; 
     system("pause");
     system("cls");
    }
    Là c'est clair qu'il y a du code qui se répète beaucoup !

    Une première manière de le fractionner :
    en fait tu cherche simplement à afficher un message et à calculer le nombre mystère.

    On va créer une fonction qui s'occupe de ça. Elle va afficher le texte comme il faut et retourner la valeur calculée.

    Elle a par contre besoin d'une information qui peut changer : la taille maximum du nombre. Ce sera ce qu'on appelle un argument. une info dont la fonction a besoin (car la fonction ne connait pas les variables de main, elle ne peut savoir combien vaut game toute seule).

    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
    #include ...
    
    int introEtCalculMystere(float maximum) {
        cout << "\n---------------------Notice---------------------\n " ;
        cout <<  "\nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;    cout << "Le nombre est compris entre 1 et" << maximum << "\n" ;
        srand(time(NULL));
        int valeurDeRetour; 
        for (int i=0 ; i<10;i++ ) 
            valeurDeRetour =1+(int) (maximum*rand()/(RAND_MAX+1.0)) ; 
        system("pause");
        system("cls");
    
        return valeurDeRetour; // rend le controle à main(), et à la place du nom de la fonction, le programme lira la valeur de "valeurDeRetour"
    }
    
    int main() {
        int nombremyst;
        int game;
        //(...)
    
        cin >> game ;
        system("cls") ;
     
     
        
        if (game==1) {  
            nombremyst = introEtCalculMystere(10);
        } else if (game==2) {  
            nombremyst = introEtCalculMystere(100);
        } else if (game==3) {
            nombremyst = introEtCalculMystere(1000);
        } else if (game==4) {
            nombremyst = introEtCalculMystere(10000);
        } elseif (game==5)
    
        // (...)
    
    }
    Voila, c'est un début, après tu vois que la partie ou ce n'est pas l'ordinateur qui trouve le nombre est différente. Meme s'il elle n'apparait qu'une fois ce serait bien, pour la clarté du programme d'en faire aussi une fonction. ( int introEtDemandeMystere() ) qui n'aurait cette fois pas besoin d'argument.

    J'ai mis l'argument "maximum" en float : c'est un nombre à virgule. J'ai fait cela car dans ta boucle for, tu as indiqué 10.0, 100.0, etc... donc je pense que tu voulais être sur que le type du nombre était "float"



    Une fonction peut elle-même appeler plusieurs autres fonctions si elle le souhaite.

    par exemple on peut encore décomposer introEtCalculMystere( ) en faisant une fonction à part pour le calcul aléatoire : comme ça si tu souhaites plus tard modifier la manière dont le jeu trouve un nombre, tu n'auras qu'à éditer cette petite fonction et tu es sur de ne rien oublier !
    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
    //fonction qui retourne un nombre mystere calculé entre 1 et maximum
    int calculMystere(float maximum) {
        int nombreMystereCalcule; 
        for (int i=0 ; i<10;i++ ) 
            nombreMystereCalcule =1+(int) (maximum*rand()/(RAND_MAX+1.0)) ;
        return nombreMystereCalcule;
    }
    
    int introEtCalculMystere(float maximum) {
        cout << "\n---------------------Notice---------------------\n " ;
        cout <<  "\nLe but de se jeu est de deviner le nombre creer par l'ordinateur \n" ;
        cout << "Le nombre est compris entre 1 et" << maximum << "\n" ;
        srand(time(NULL));
        
    // je fais le calcul après , ça ne change rien
        system("pause");
        system("cls");
        
        return calculMystere(maximum); // rend le controle à main(), et à la place du nom de la fonction, le programme va appeler calculMystere(maximum) et faire "return LaValeurDeRetourDeCalculMystere;" lorsque calculMystere(maximum) sera terminée.
    }
    En fait, en C, " main() " est elle même une fonction : elle est appelée au démarrage du programme et lorsqu'elle se termine, le programme est arreté.


    Voila de quoi avancer.

    Bien sur les fonctions apportent leur lot de problème, mais tu ne peux pas penser à programmer sans. (enfin c'est faisable, mais ça a deja été fait y'a des dizaines d'année et c'est désastreux).

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Mercii

    Je pense que je n'ai plus qu'a appliqué , en revanche une question tu places toujours les "return +nomdefonction " avant la fonction qui est lu auparavant .
    C'est obligatoire ?
    Peut on décomposer en fonction tout en laissant la structure "linéaire du programme ?"

  10. #10
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    si une fonction est faite juste pour remplacer un bout de code, sans valeur de retour, c'est à ce moment là qu'on utilise le type void .

    et donc pas besoin de return, mais on peut l'utiliser pour ne "rien renvoyer mais sortir de la fonction" :

    return;


    mais si la fonction renvoie un type, il faut qu'elle se termine par un

    return TrucDuBontype;

    Par contre, précision supplémentaire : tu pourras compiler sans que la fonction contienne ou passe effectivement par un return (et elle se terminera simplement donc à la fin du bloc de la fonction).

    Mais c'est dangereux si elle n'est pas void, cela peut causer des erreurs pendant l'exécution c'est comme utiliser une variable sans jamais dire ce qu'elle vaut.

    Un compilateur digne de ce nom doit afficher un warning s'il y a un risque qu'un fonction ne s'acheve pas par un return.


    voila un exemple qui parlera de lui même je pense :

    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
     
    #include <iostream>
    using namespace std;
     
    //définitions de fonction (elles doivent etre définies avant l'endroit ou elles sont utilisées)
     
    int FoncInt() {
       cout << "Cette fonction retourne un int à la fin" <<endl;
       return 100;
       cout << "ce texte ne s'affichera pas";
    }
     
    void FoncVoid() {
        cout << "Cette fonction ne retourne rien, pas besoin de return pour terminer la fonction";
        return; //ici le return est complètement facultatif, pas de risque d'erreur
        // mais il peut etre pratique à utiliser pour sortir plus tot de la fonction :
        cout << "Ce texte ne s'affichera pas non plus";
    }
     
    int FoncIntDanger() {
       cout << "(le programme appelle FoncIntDanger() )";
       // danger !!! cette fonction ne retourne rien alors que le programme
       // le croit. (voir main() ) la valeur est donc indéfinie.
    }
     
    int main() {
       //exemple d'utilisation de fonction qui retourne un certain type de valeur:
      //appel simple, les instructions, on se fiche de la valeur retournée
      FoncInt(); 
      // on peut utiliser le nom de la fonction comme un int
      int monInt = FoncInt() +2;
      cout << "La valeur retournée par FoncInt() est " << FoncInt();
      int monCalcul;
     
      //pour une fonction void on ne peut faire que :
      FoncVoid();
      //car il n'y pas de variable void possible, et << ne peut pas etre utilisé avec void. Mais les instructions sont bien exécutées.
     
     
      cout << "Danger ! valeur pas définie ! : " << FoncIntDanger();
      // la ligne précédente revient à faire :
      // int variablePasInitialisee;
      // cout << "Danger ! valeur pas définie ! << variablePasInitialisee;
     
     
      return 0;
    }

  11. #11
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Et au passage, pour quand tu liras cette réponse, voici une autre manière de résumer mon argumentaire en faveur des fonctions.

    En lisant ça sur un sujet différent ça me paraissait bien exprimer ce que j'ai voulu dire (concernant l'utilité des fonctions), mais en plus clair :o)

    koala01 (rédacteur/modérateur) a écrit :

    N'oublie jamais qu'un code source est beaucoup plus souvent lu qu'il n'est écrit, et que, de ce fait, il est fortement conseillé de faire de manière à ce que la lecture soit la plus simple possible, tant pour les autres que pour toi même...

    En effet, un code qui te parait limpide aujourd'hui risque fort de te paraitre bien nébuleux dans un mois ou deux... penses alors à ce que peuvent ressentir des gens qui n'ont aucune idée à la base de la logique que tu a voulu suivre

    Enfin, je ne saurais jamais assez insister non plus sur la nécessiter de "modulariser" ton code: crée des fonctions de base, qui n'ont qu'une responsabilité précise en veillant à ce qu'elle la remplisse correctement...

    L'idée qui soustend ce conseil est simple: il est plus facile de trouver "ce qui coince" dans dix lignes de code que dans cent... et, si on sait déjà que le problème se situe dans la fonction "lecture" (par exemple), on peut déjà beaucoup plus facilement cerner le problème

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Merci de tout coeur Pacorabanix ..

Discussions similaires

  1. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48
  2. Réponses: 4
    Dernier message: 07/12/2002, 07h34
  3. Appel de procédure...
    Par AmaX dans le forum Langage
    Réponses: 4
    Dernier message: 24/11/2002, 17h48
  4. appel de fichier d'Aide
    Par Atrebate62 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 24/09/2002, 14h13

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