Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1538 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Petits calculs pour les crédits, ne fonctionne pas [noob]

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Petits calculs pour les crédits, ne fonctionne pas [noob]

n°2281495
Lt Ripley
T'es à fond là ?
Posté le 15-05-2016 à 16:30:19  profilanswer
 

Salut à tous
 
Je débute avec le C++, je suis le cours d'OpenClassrooms.
 
Je veux faire un tout petit programme pour calculer le montant des mensualités et le cout d'un crédit, en fonction d'un capital a emprunter, d'un TEG et d'un nombre de mensualités.
 
Déjà, les 2 premières lignes apparaissent collées dans la console, malgré mon endl...  Why ?!!
 
Ensuite et bien le calcul ne fonctionne pas...
 
Voici mon code :
 

Code :
  1. #include <iostream>
  2. //#include <string>
  3. #include <cmath>
  4. using namespace std;
  5. // programme pour calculer les mensualités et le cout des crédits
  6. int main()
  7. {
  8. int capitalAEmprunter, nombreMensualites;
  9. double teg, montantMensualites, coutDuCredit;
  10. cout << endl << "Petits calculs sur le credit";
  11. cout << endl << "Capital a emprunter ? ";
  12. cin >> capitalAEmprunter;
  13. cout << endl << "Nombre de mensualites ? ";
  14. cin >> nombreMensualites;
  15. cout << endl << "TEG ? ";
  16. cin >> teg;
  17. montantMensualites=(capitalAEmprunter*teg/12)/(1-(pow(1+teg/12,-nombreMensualites)));
  18. cout << endl << "Montant mensualites : " << montantMensualites;
  19. coutDuCredit = montantMensualites*nombreMensualites-capitalAEmprunter;
  20. cout << "    Cout du credit : " << coutDuCredit << endl;
  21.    return 0;
  22. }


 
 
Voici ce que j'ai dans la console :
 
http://img15.hostingpics.net/pics/765573Capturedcran77.png
 
 
 
Voici la formule mathématique que j'ai trouvé sur 2 sites :
 
http://img15.hostingpics.net/pics/406615Capturedcran76.png
 
 
Merci pour votre aide !


Message édité par Lt Ripley le 29-11-2016 à 18:38:54
mood
Publicité
Posté le 15-05-2016 à 16:30:19  profilanswer
 

n°2281497
rat de com​bat
attention rongeur méchant!
Posté le 15-05-2016 à 16:47:37  profilanswer
 

Citation :

Déjà, les 2 premières lignes apparaissent collées dans la console, malgré mon endl...  Why ?!!


Un endl place le cursor dans la ligne suivante - si tu veux une ligne vide faut donc mettre deux endl. Personnellement je les mettrais d'ailleurs plutôt à la fin du cout précédant (mais c'est une question de goût). Le cin rajoute automatiquement un saut de ligne.

 

Pour le calcul, le TEG est indiqué en % mais j'ai l'impression qu'il doit être sous forme décimale - soit 0,04 et non 4. Si je rajoute un teg=teg/100; dans le code le résultat à l'air bien plus plausible.

 

edit: Calcul confirmé par un autre site (sauf que ce dernier arrondit la mensualité). Pour le TEG il y a qu'a regarder l'exemple...


Message édité par rat de combat le 15-05-2016 à 16:50:08
n°2281498
Lt Ripley
T'es à fond là ?
Posté le 15-05-2016 à 17:01:07  profilanswer
 

Ahh oui ça fonctionne en décimal
 
Merci rat de combat !  :)

n°2281501
gilou
Modérateur
Modzilla
Posté le 15-05-2016 à 17:14:51  profilanswer
 

Pour la mise en forme de la sortie de ton programme:

Code :
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cmath>
  4. // programme pour calculer les mensualités et le cout des crédits
  5. int main() {
  6.     int capitalAEmprunter, nombreMensualites;
  7.     double teg, montantMensualites, coutDuCredit;
  8.    
  9.     std::cout << "\nPetits calculs sur le credit" << std::endl;
  10.     std::cout << "\nCapital a emprunter ? " << std::flush;
  11.     std::cin >> capitalAEmprunter;
  12.     std::cout << "\nNombre de mensualites ? " << std::flush;
  13.     std::cin >> nombreMensualites;
  14.     std::cout << "\nTEG ? " << std::flush;
  15.     std::cin >> teg;
  16.     montantMensualites = (capitalAEmprunter * teg / 12) / (1 - (std::pow(1 + teg / 12, -nombreMensualites)));
  17.     coutDuCredit = montantMensualites * nombreMensualites - capitalAEmprunter;
  18.     std::cout << std::fixed << std::setprecision(2);
  19.     std::cout << "\nMontant mensualites : " << montantMensualites;
  20.     std::cout << "\tCout du credit : " << coutDuCredit << std::endl;
  21.     return 0;
  22. }


Ce qui donne en sortie:


Petits calculs sur le credit
 
Capital a emprunter ? 200000
 
Nombre de mensualites ? 240
 
TEG ? 4
 
Montant mensualites : 66666.67  Cout du credit : 15800000.00


 
A+,


Message édité par gilou le 15-05-2016 à 17:16:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2281516
Lt Ripley
T'es à fond là ?
Posté le 15-05-2016 à 20:16:44  profilanswer
 

Merci gilou !
 
Je vais étudier tout ça

n°2281517
Lt Ripley
T'es à fond là ?
Posté le 15-05-2016 à 20:32:05  profilanswer
 

Ahhh... il faut enlever using namespace std et puis du coup utiliser std:: devant les cout et les cin ?
 
Et puis mettre \n devant le texte ?  Et pourquoi \t pour le dernier ?
 
Il y a une raison à tout cela, laquelle ?
 
Merci encore

n°2281530
gilou
Modérateur
Modzilla
Posté le 16-05-2016 à 01:02:57  profilanswer
 

> Ahhh... il faut enlever using namespace std et puis du coup utiliser std:: devant les cout et les cin ?  
Non, mais on n'est pas obligé, et quand on apprend le C++, ça permet de savoir quoi est dans quel namespace.
 
>Et puis mettre \n devant le texte
Ça te fait un saut de ligne avant ton texte, c'est plus lisible que de coller de multiples endl non finaux
 
> Et pourquoi \t pour le dernier ?
Pour avoir une tabulation.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2281728
Lt Ripley
T'es à fond là ?
Posté le 18-05-2016 à 20:14:25  profilanswer
 

Merci gilou pour ces nouvelles infos, j'utilise maintenant les trois : \n , \t et endl
 
Je suis toujours le cours de OpenClassrooms, j'avance, ça me plait bien...

n°2281762
gilou
Modérateur
Modzilla
Posté le 19-05-2016 à 12:06:14  profilanswer
 

Donc j'en déduis que tu avais compris cette ligne
std::cout << std::fixed << std::setprecision(2);
Qui me semblait plus adaptée pour afficher tes derniers résultats.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2281777
Lt Ripley
T'es à fond là ?
Posté le 19-05-2016 à 21:17:35  profilanswer
 

Punaise non, elle est passée à travers celle là, et flush aussi, en fait j'ai trouvé le tout compliqué et du coup je suis passé à coté...
 
Flush c'est pour s'assurer de vider le buffer et de bien ecrire ce qu'on envoie, c'est ça ?  il n'y en a besoin que quand tu fais autre chose qu'un cout après ?  Pas besoin non plus en cas de endl on dirait...
 
:pt1cable:  :pt1cable:  :pt1cable:  
 
Je suis étonné qu'on doivent écrire 25 fois std::
 
setprecision(2) c'est donc pour avoir seulement 2 chiffres après la virgule, mais le reste de la ligne je veux bien que tu m'expliques !

mood
Publicité
Posté le 19-05-2016 à 21:17:35  profilanswer
 

n°2281780
gilou
Modérateur
Modzilla
Posté le 20-05-2016 à 02:19:26  profilanswer
 

http://www.cplusplus.com/reference/ios/fixed/
 
> Flush c'est pour s'assurer de vider le buffer et de bien ecrire ce qu'on envoie, c'est ça ?
C'est utile pour écrire sans retour a la ligne. std::endl, grosso modo ca fait 1) un flush et 2) ça positionne le curseur en début de ligne suivante.
 
A+,


Message édité par gilou le 20-05-2016 à 02:23:57

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2281805
Lt Ripley
T'es à fond là ?
Posté le 20-05-2016 à 12:55:15  profilanswer
 

ok je comprends mieux, merci
 
D'après ce que je vois std::ios c'est le "parent" de cin, cout et des trucs commandes de fstream, c'est ça ?


Message édité par Lt Ripley le 20-05-2016 à 13:10:16
n°2281807
gilou
Modérateur
Modzilla
Posté le 20-05-2016 à 13:37:53  profilanswer
 

Tu as une hiérarchie de classes illustrée par le diagramme suivant:
http://reho.st/www.cplusplus.com/img/iostream.gif
et cin, cout ne sont pas des classes, mais des objets (ie des instances de classes).
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2281813
Lt Ripley
T'es à fond là ?
Posté le 20-05-2016 à 17:28:08  profilanswer
 

Oui je l'ai vu ce diagramme grâce à ton précédent lien.
 
Je n'imaginais pas être autant au début du début  [:luxy:2]  
 
Je ne risque pas de m'ennuyer !
 
Un grand merci pour toutes ces infos précieuses.
 
Ca tombe bien, je vois que les classes sont au programme du cours d'OpenClassroom que je suis (2 cours plus après que j'aie fini mon exo, sur lequel j'ai déjà passé pas loin de 8 ou 10 heures)
 
Ca me rassure  [:kakashii]
 
 ;)

n°2281851
Lt Ripley
T'es à fond là ?
Posté le 21-05-2016 à 11:59:19  profilanswer
 

Comment fait-on pour ajouter une tabulation à un groupe de lignes (un paragraphe quoi) d'un coup ?  Quand j'inclus du code dans une boucle je tabule chaque ligne, y a t-il une fonction dans code::blocks pour cela ?

n°2281855
rat de com​bat
attention rongeur méchant!
Posté le 21-05-2016 à 14:49:48  profilanswer
 

Pour tabuler plusieurs lignes il suffit de les sélectionner et d'appuyer la touche tab.

n°2281861
Lt Ripley
T'es à fond là ?
Posté le 21-05-2016 à 16:32:54  profilanswer
 

[:cerveau arf]  
 
Merci

n°2281865
gilou
Modérateur
Modzilla
Posté le 21-05-2016 à 19:41:30  profilanswer
 

Bon, alors maintenant, les problèmes avec ton programme.
Il suppose que l'input utilisateur sera parfait, ce qui dans la pratique s'apparente à croire au père noël.
 
Il faut envisager le cas  
1) d'une entrée non numérique quand un nombre est attendu  (tapes "aaaa" en réponse à la première question de ton programme, pour voir)
2) de plusieurs entrées numériques quand une seule est attendue (tapes "200000 24 0.04" en réponse à la première question de ton programme, pour voir)
 
D’où une version améliorée:
 

Code :
  1. #include <iostream>
  2. #include <ios>
  3. #include <istream>
  4. #include <limits>
  5. #include <iomanip>
  6. #include <cmath>
  7. template <typename CharT>
  8. void ignore_line (std::basic_istream<CharT>& in) {
  9.     in.ignore(std::numeric_limits<std::streamsize>::max(), in.widen('\n'));
  10. }
  11. // programme pour calculer les mensualités et le cout des crédits
  12. int main() {
  13.     int capitalAEmprunter, nombreMensualites;
  14.     double teg, montantMensualites, coutDuCredit;
  15.     std::cout << "\nPetits calculs sur le credit" << std::endl;
  16.     std::cout << "\nCapital a emprunter ? " << std::flush;
  17.     std::cin >> capitalAEmprunter;
  18.     if (!std::cin) {
  19.         std::cout << "\nErreur: Entree incorrecte!" << std::endl;
  20.         return(-1);
  21.     }
  22.     ignore_line(std::cin);
  23.     std::cout << "\nNombre de mensualites ? " << std::flush;
  24.     std::cin >> nombreMensualites;
  25.     if (!std::cin) {
  26.         std::cout << "\nErreur: Entree incorrecte!" << std::endl;
  27.         return(-1);
  28.     }
  29.     ignore_line(std::cin);
  30.     std::cout << "\nTEG ? " << std::flush;
  31.     std::cin >> teg;
  32.     if (!std::cin) {
  33.         std::cout << "\nErreur: Entree incorrecte!" << std::endl;
  34.         return(-1);
  35.     }
  36.     ignore_line(std::cin);
  37.     montantMensualites = (capitalAEmprunter * teg / 12) / (1 - (std::pow(1 + teg / 12, -nombreMensualites)));
  38.     coutDuCredit = montantMensualites * nombreMensualites - capitalAEmprunter;
  39.     std::cout << std::fixed << std::setprecision(2);
  40.     std::cout << "\nMontant mensualites : " << montantMensualites;
  41.     std::cout << "\tCout du credit : " << coutDuCredit << std::endl;
  42.     return 0;
  43. }


 
Explication:
    std::cin >> capitalAEmprunter;
    // Si !std::cin l'input n'a pu être parsé comme une variable du type attendu
    if (!std::cin) {
        std::cout << "\nErreur: Entree incorrecte!" << std::endl;
        return(-1);
    }
    // Sinon, s'il reste des trucs de tapés pas traités, on les lits et on n'en fait rien
    ignore_line(std::cin);
 
Dans l'absolu, pour blinder complètement ton programme, il faudrait aussi vérifier que tes calculs numériques ne provoquent pas de débordements.
 
A+,


Message édité par gilou le 21-05-2016 à 20:00:19

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2281954
Lt Ripley
T'es à fond là ?
Posté le 23-05-2016 à 13:51:56  profilanswer
 

Merci gilou
 
J'ai modifié mon programme en ajoutant tes améliorations, qui je le comprends bien, sont indispensables.
 
J'en comprends une partie mais pas tout, mais petit à petit ça viendra, et puis ça me permet de l'utiliser partout.
 
J'ai regardé un peu du coté des débordements, dits over/underflow si j'ai bon.  Il faut que j'approfondisse... ça sert à ne pas atteindre les maximums d'origine des int, double etc du C++ c'est ça ?  Et donc à ne pas être tronqué, ou autre ?
 
J'ai trouvé cette page qui en parle bien il me semble : http://www.developpez.net/forums/d [...] underflow/
 
Que peux tu me dire à ce sujet ?

n°2282010
gilou
Modérateur
Modzilla
Posté le 23-05-2016 à 15:37:34  profilanswer
 

Que malheureusement, il n'y a rien d'automatique.
Il y a une avancée pour les calculs en flottants avec <cfenv> mais ce n'est qu'une couche d'interface avec les flags du FPU, donc sa qualité dépend de celle du hardware.
cf http://stackoverflow.com/questions [...] -underflow
 
Ce pourquoi j'ai dit "dans l'absolu", parce que bien souvent, ce n'est pas blindé à ce niveau (ce serait un programme d'ingénierie, ou la fiabilité des calculs est primordiale, ce serait autre chose, mais pour un simple exercice en console...)
Je voulais juste te faire prendre conscience du problème potentiel.
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2282107
gilou
Modérateur
Modzilla
Posté le 23-05-2016 à 20:20:26  profilanswer
 

Bon, il m'a fallu installer une nouvelle version de g++ (5.1) pour que cfenv soit activé, mais on peut aboutir à ceci:
 

Code :
  1. #include <iostream>
  2. #include <ios>
  3. #include <istream>
  4. #include <limits>
  5. #include <iomanip>
  6. #include <cfenv>
  7. #include <cmath>
  8. template <typename CharT>
  9. void ignore_line (std::basic_istream<CharT>& in) {
  10.     in.ignore(std::numeric_limits<std::streamsize>::max(), in.widen('\n'));
  11. }
  12. // programme pour calculer les mensualités et le cout des crédits
  13. int main() {
  14.     int capitalAEmprunter, nombreMensualites;
  15.     double teg, montantMensualites, coutDuCredit;
  16.     std::cout << "\nPetits calculs sur le credit" << std::endl;
  17.     std::cout << "\nCapital a emprunter ? " << std::flush;
  18.     std::cin >> capitalAEmprunter;
  19.     if (!std::cin) {
  20.         std::cerr << "\nErreur: Entree incorrecte!" << std::endl;
  21.         return(-1);
  22.     }
  23.     ignore_line(std::cin);
  24.     std::cout << "\nNombre de mensualites ? " << std::flush;
  25.     std::cin >> nombreMensualites;
  26.     if (!std::cin) {
  27.         std::cerr << "\nErreur: Entree incorrecte!" << std::endl;
  28.         return(-1);
  29.     }
  30.     ignore_line(std::cin);
  31.     std::cout << "\nTEG ? " << std::flush;
  32.     std::cin >> teg;
  33.     if (!std::cin) {
  34.         std::cerr << "\nErreur: Entree incorrecte!" << std::endl;
  35.         return(-1);
  36.     }
  37.     ignore_line(std::cin);
  38.     std::feclearexcept(FE_ALL_EXCEPT);
  39.     montantMensualites = (capitalAEmprunter * teg / 12) / (1 - (std::pow(1 + teg / 12, -nombreMensualites)));
  40.     coutDuCredit = montantMensualites * nombreMensualites - capitalAEmprunter;
  41.     if (std::fetestexcept(FE_OVERFLOW|FE_UNDERFLOW|FE_INVALID|FE_DIVBYZERO)) {
  42.         std::cerr << "\nUne erreur de calcul est survenue!" << std::endl;
  43.         return(-1);
  44.     }
  45.     std::cout << std::fixed << std::setprecision(2);
  46.     std::cout << "\nMontant mensualites : " << montantMensualites;
  47.     std::cout << "\tCout du credit : " << coutDuCredit << std::endl;
  48.     return 0;
  49. }


(si tu entres un nombre de mensualités égal à 0, tu auras une division par 0 dans ton calcul de montantMensualites, si tu veux tester)
Note aussi que j'ai fait une correction par rapport à mon code précédent: les messages d'erreur avant interruption sont envoyés sur cerr et non sur cout, c'est plus propre conceptuellement.
 
Mais avant cela, il y a des choses de bon sens à faire:
vérifier que capitalAEmprunter > 0, nombreMensualites > 1 et 0 <= teg  
 
Et éventuellement faire un message d'alerte si teg > 0.2005 (20.05% est le taux d'usure le plus élevé, et en fait, selon la catégorie du crédit, il y a un teg légal max, égal au taux d'usure http://www.cbanque.com/credit/taux-usure.php )
 
Tu peux aussi vouloir que le teg soit saisi en % et faire directement la conversion dans ton programme.
 

Code :
  1. #include <iostream>
  2. #include <ios>
  3. #include <istream>
  4. #include <limits>
  5. #include <iomanip>
  6. #include <cfenv>
  7. #include <cmath>
  8. template <typename CharT>
  9. void ignore_line (std::basic_istream<CharT>& in) {
  10.     in.ignore(std::numeric_limits<std::streamsize>::max(), in.widen('\n'));
  11. }
  12. // programme pour calculer les mensualités et le cout des crédits
  13. int main() {
  14.     int capitalAEmprunter, nombreMensualites;
  15.     double teg, montantMensualites, coutDuCredit;
  16.     std::cout << "\nPetits calculs sur le credit" << std::endl;
  17.     std::cout << "\nCapital a emprunter ? " << std::flush;
  18.     std::cin >> capitalAEmprunter;
  19.     if (!std::cin) {
  20.         std::cerr << "\nErreur: Entree incorrecte!" << std::endl;
  21.         return(-1);
  22.     }
  23.     if (capitalAEmprunter < 0) {
  24.         std::cerr << "\nMontant invalide!" << std::endl;
  25.         return(-1);
  26.     }
  27.     ignore_line(std::cin);
  28.     std::cout << "\nNombre de mensualites ? " << std::flush;
  29.     std::cin >> nombreMensualites;
  30.     if (!std::cin) {
  31.         std::cerr << "\nErreur: Entree incorrecte!" << std::endl;
  32.         return(-1);
  33.     }
  34.     if (nombreMensualites < 1) {
  35.         std::cerr << "\nNombre de mensualites invalide!" << std::endl;
  36.         return(-1);
  37.     }
  38.     ignore_line(std::cin);
  39.     std::cout << "\nTEG (%) ? " << std::flush;
  40.     std::cin >> teg;
  41.     if (!std::cin) {
  42.         std::cerr << "\nErreur: Entree incorrecte!" << std::endl;
  43.         return(-1);
  44.     }
  45.     if (teg < 0) {
  46.         std::cerr << "\nteg invalide!" << std::endl;
  47.         return(-1);
  48.     }
  49.     teg /= 100;
  50.     const double MAX_TEG = 0.2005;
  51.     if (teg > MAX_TEG) {
  52.         std::cout << "\nAttention, le teg semble trop important!" << std::endl;
  53.     }
  54.     ignore_line(std::cin);
  55.     std::feclearexcept(FE_ALL_EXCEPT);
  56.     montantMensualites = (capitalAEmprunter * teg / 12) / (1 - (std::pow(1 + teg / 12, -nombreMensualites)));
  57.     coutDuCredit = montantMensualites * nombreMensualites - capitalAEmprunter;
  58.     if (std::fetestexcept(FE_OVERFLOW|FE_UNDERFLOW|FE_INVALID|FE_DIVBYZERO)) {
  59.         std::cerr << "\nUne erreur de calcul est survenue!" << std::endl;
  60.         return(-1);
  61.     }
  62.     std::cout << std::fixed << std::setprecision(2);
  63.     std::cout << "\nMontant mensualites : " << montantMensualites;
  64.     std::cout << "\tCout du credit : " << coutDuCredit << std::endl;
  65.     return 0;
  66. }


 


Petits calculs sur le credit
 
Capital a emprunter ? 200000
 
Nombre de mensualites ? 24
 
TEG (%) ? 4
 
Montant mensualites : 8684.98   Cout du credit : 8439.63


 
A+,

Message cité 1 fois
Message édité par gilou le 23-05-2016 à 21:35:41

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2282128
Farian
Posté le 24-05-2016 à 07:49:31  profilanswer
 

gilou a écrit :


Petits calculs sur le credit
 
Capital a emprunter ? 200000
 
Nombre de mensualites ? 24
 
TEG (%) ? 4
 
Montant mensualites : 8684.98   Cout du credit : 8439.63


 
A+,


 
Rembourser 200000 € en 24 mensualités, c'est très HFR-compliant [:clooney3]  
 
Sinon, pas d'avis sur la partie C++ des posts C++, je passais juste comme ça (et je n'ai pas encore eu l'occasion de me mettre à C++1x  [:lergo:3] )


---------------
On n'est jamais très fort pour ce calcul !
n°2282176
gilou
Modérateur
Modzilla
Posté le 24-05-2016 à 17:31:13  profilanswer
 

> et je n'ai pas encore eu l'occasion de me mettre à C++1x
 
Faut! C++11 (voire 14 pour le move) c'est vraiment bien foutu.
Même si pour les manipulations de strings, un bon vieux char * à la C est toujours bien plus rapide.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2282180
Lt Ripley
T'es à fond là ?
Posté le 24-05-2016 à 18:17:40  profilanswer
 

Bon, je crois que je suis passé à un g++ 5.1
 
Je l'ai donc pris ici (on demand installer) : http://tdm-gcc.tdragon.net/
Suivant un petit tuto sur OpenClassrooms
 
A debut ça ne fonctionnait pas (j'avais oublié le debugger).   Maintenant tout fonctionne comme avant, après installation de tdm-gcc  j'ai en fait juste changé les path du compiler et du debugger...
 
Mes petits programmes fonctionnent, mais ton nouveau code ne passe pas mieux qu'avec mon ancien g++.  C'est le même type d'erreur (pour ne pas dire "exactement les même erreurs" )
 
Voici ce que j'ai dans la zone de notification :
 

Citation :

||=== Build: Debug in creditgilou (compiler: GNU GCC Compiler) ===|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\c++0x_warning.h|32|error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.|
F:\C++\creditgilou\main.cpp||In function 'int main()':|
F:\C++\creditgilou\main.cpp|55|error: 'feclearexcept' is not a member of 'std'|
F:\C++\creditgilou\main.cpp|55|error: 'FE_ALL_EXCEPT' was not declared in this scope|
F:\C++\creditgilou\main.cpp|58|error: 'fetestexcept' is not a member of 'std'|
F:\C++\creditgilou\main.cpp|58|error: 'FE_OVERFLOW' was not declared in this scope|
F:\C++\creditgilou\main.cpp|58|error: 'FE_UNDERFLOW' was not declared in this scope|
F:\C++\creditgilou\main.cpp|58|error: 'FE_INVALID' was not declared in this scope|
F:\C++\creditgilou\main.cpp|58|error: 'FE_DIVBYZERO' was not declared in this scope|
||=== Build failed: 8 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|


 
Chose nouvelle pour moi, cette fois ci  un fichier c++0x_warning.h s'ouvre dans une fenêtre :
 

Citation :

#ifndef _CXX0X_WARNING_H
#define _CXX0X_WARNING_H 1
 
#if __cplusplus < 201103L
#error This file requires compiler and library support for the \
ISO C++ 2011 standard. This support is currently experimental, and must be \
enabled with the -std=c++11 or -std=gnu++11 compiler options.
#endif
 
#endif


 
J'ai aussi l'exercice corrigé du prof de mon exo de jeu de mot à lettres mélangées qui ne fonctionne toujours pas.

Message cité 1 fois
Message édité par Lt Ripley le 24-05-2016 à 18:19:48
n°2282189
rat de com​bat
attention rongeur méchant!
Posté le 24-05-2016 à 18:37:02  profilanswer
 

Citation :

and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.


Faut rajouter ça dans les paramètres passés au compilateur. Tu utilises quoi pour compiler? (Code::Blocks, Dev-C++, Eclipse, ligne de commande, ...)

n°2282197
gilou
Modérateur
Modzilla
Posté le 24-05-2016 à 19:29:21  profilanswer
 

J'allais le dire.
A priori, compiler avec -std=c++11 et aussi avec -Wall si possible  
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2282198
gilou
Modérateur
Modzilla
Posté le 24-05-2016 à 19:32:04  profilanswer
 

Lt Ripley a écrit :

Bon, je crois que je suis passé à un g++ 5.1
 
Je l'ai donc pris ici (on demand installer) : http://tdm-gcc.tdragon.net/


C'est ce que j'ai fait hier :D
 
Ensuite, en ligne de commande:
g++ -std=c++11 -Wall -o creditgilou.exe creditgilou.cpp
(perso, j'évite de nommer un fichier main.cpp quand il n'y en a qu'un)
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2282206
Lt Ripley
T'es à fond là ?
Posté le 24-05-2016 à 22:29:27  profilanswer
 

Merci les gars  ;)  
 
Ça marche.  J'ai ajouté les paramètres ici (j'ai ajouté -Wall aussi entre temps)
 
http://img11.hostingpics.net/pics/433929Capturedcran80.png
 
J'ai bon ?
 
J'utilise code::blocks 16.01
 
Bon l'exo corrigé du prof ne passe pas mais c'est pas la fin du monde

n°2282207
rat de com​bat
attention rongeur méchant!
Posté le 24-05-2016 à 23:02:35  profilanswer
 

Ca peut fonctionner mais je regarderais plutôt sous Compiler settings -> Compiler Flags, tu dois pouvoir activer les deux par là.  
 
Si l'exo du prof ne passera toujours pas tu peux toujours le poster (avec les messages d'erreurs).

n°2282221
Lt Ripley
T'es à fond là ?
Posté le 25-05-2016 à 09:01:19  profilanswer
 

Merci rat de combat j'ai pu faire comme tu dis
 
Voici le programme du prof
 

Code :
  1. // Main.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "MotMysterePlus.h"
  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7. bool play(true);
  8. srand(time(0));
  9. vector<string> dicoList(initDico());
  10. if(dicoList.size()==0)
  11. {
  12.  return 1;
  13. }
  14. cout << "**** BIENVENUE au jeu du Mot Mystere ****" <<endl;
  15. do
  16. {
  17.  bool wrongValue(true);
  18.  char answer('a');
  19.  //0- Proposer un mode Solo ou Duo
  20.  bool solo(false);
  21.  cout << "Voulez-vous jouer en Solo ou en Duo ? (s/d)"<<endl;
  22.  while(wrongValue)
  23.  {
  24.   cin.get(answer);
  25.   switch(answer)
  26.   {
  27.    case 's':
  28.     wrongValue=false;
  29.     solo=true;
  30.     break;
  31.    case 'd':
  32.     wrongValue=false;
  33.     break;
  34.    default:
  35.     cout << "'" <<answer<<"' n'est pas une valeur correct : (s/d)"<<endl;
  36.   }
  37.   cin.ignore(numeric_limits<streamsize>::max(), '\n'); // skip bad input
  38.  }
  39.  answer='a';
  40.  wrongValue=true;
  41.  //1- récupérer le mot à trouver
  42.  string soluce(getFinalWord(solo, dicoList));
  43.  if(soluce.compare("" )==0)
  44.  {
  45.   return 1;
  46.  }
  47.  //2- générer le mot Mystère
  48.  string mysteryWord(getMysteryWord(soluce));
  49.  //3- Trouver le mot Mystère
  50.  resolveMysteryWord(mysteryWord, soluce,solo);
  51.  cout<<"voulez-vous faire une autre partie ? (o/n)"<<endl;
  52.  while(wrongValue)
  53.  {
  54.   cin.ignore(numeric_limits<streamsize>::max(), '\n'); // skip bad input
  55.   cin.get(answer);
  56.   switch(answer)
  57.   {
  58.    case 'o':
  59.     wrongValue=false;
  60.     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  61.     break;
  62.    case 'n':
  63.     wrongValue=false;
  64.     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  65.     play=false;
  66.     break;
  67.    default:
  68.     cout << "'" <<answer<<"' n'est pas une valeur correct : (o/n)"<<endl;
  69.   }
  70.  }
  71. }while(play);
  72. return 0;
  73. }


 
 

Code :
  1. // stdafx.h : include file for standard system include files,
  2. // or project specific include files that are used frequently, but
  3. // are changed infrequently
  4. //
  5. #pragma once
  6. #include <stdio.h>
  7. #include <tchar.h>
  8. // TODO: reference additional headers your program requires here


 
 
 

Code :
  1. // stdafx.cpp : source file that includes just the standard includes
  2. // MotMysterePlus.pch will be the pre-compiled header
  3. // stdafx.obj will contain the pre-compiled type information
  4. #include "stdafx.h"
  5. // TODO: reference any additional headers you need in STDAFX.H
  6. // and not in this file


 
 
 
(Celui ci se nomme MotMysterePlus.h)

Code :
  1. // MotMysterePlus.cpp : Defines functions prototype.
  2. //  
  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <string>
  6. #include <ctime>
  7. #include <cstdlib>
  8. #include <fstream>
  9. #include <vector>
  10. using namespace std;
  11. string getFinalWord(bool solo, vector<string> wordList);
  12. string getMysteryWord(string word);
  13. void resolveMysteryWord(string const mixWord, string const finalWord,bool const solo);
  14. vector<string> initDico();


 
 
 

Code :
  1. // MotMysterePlus.cpp : Defines functions source code.
  2. //
  3. #include "stdafx.h"
  4. #include "MotMysterePlus.h"
  5. using namespace std;
  6. string getFinalWord(bool const solo, vector<string> wordList)
  7. {
  8. string word("" );
  9. if(solo)
  10. {
  11.  int randLevel (rand() % wordList.size());
  12.  word = wordList[randLevel];
  13. }
  14. else
  15. {
  16.  cout << "JOUEUR 1 ! Saisissez un mot :" << endl;
  17.  cin >> word ;
  18. }
  19. return word;
  20. }
  21. string getMysteryWord(string word)
  22. {
  23. string newWord("" );
  24. while(word.compare("" )!=0)
  25. {
  26.  int index = rand() % word.size();
  27.  newWord += word[index];
  28.  word.erase(index,1);
  29. }
  30. return newWord;
  31. }
  32. void resolveMysteryWord(string const mixWord, string const finalWord, bool const solo)
  33. {
  34. bool finish(false);
  35. int count(5);
  36. string temp("" );
  37. string joueur("JOUEUR 2 : " );
  38. if(solo)
  39. {
  40.  joueur="";
  41. }
  42. while(!finish)
  43. {
  44.  cout <<joueur<< "Quel est ce mot ? "<< mixWord << endl;
  45.  cout << "Il vous reste " <<count<<" coup(s)."<<endl;
  46.  cin >> temp;
  47.  if(temp.compare(finalWord)==0)
  48.  {
  49.   cout << "BRAVO !" <<endl;
  50.   cout << "Vous avez trouve en "<<5-count+1<<" essai(s)"<<endl;
  51.   finish=true;
  52.  }
  53.  else
  54.  {
  55.   --count;
  56.   if(count!=0)
  57.   {
  58.    cout << "ce n'est pas le bon mot ! "<<endl;
  59.   }
  60.   else
  61.   {
  62.    cout<<joueur<< "PERDU ! le mot mystere etait : "<<finalWord<<endl;
  63.    finish=true;
  64.   }
  65.  }
  66. }
  67. }
  68. vector<string> initDico()
  69. {
  70. cout << "veuillez patienter, nous initialisons le jeu ..." <<endl;;
  71. vector<string> wordList;
  72. string word("" );
  73. ifstream dico("dico.txt" );
  74. if(dico)
  75. {
  76.  string temp;
  77.  while(getline(dico, temp)&&(temp.compare("" )!=0))
  78.  {
  79.   wordList.push_back(temp);
  80.  }
  81.  int randLevel (rand() % wordList.size());
  82.  word = wordList[randLevel];
  83. }
  84. else
  85. {
  86.  cout << "ERREUR : impossible d'ouvrir le fichier en lecture." <<endl;
  87. }
  88. return wordList;
  89. }


 
 
 
Et les erreurs :
 

Citation :

||=== Build: Debug in corri mot mystere (compiler: GNU GCC Compiler) ===|
F:\C++\corri mot mystere\main.cpp||In function 'int main(int, _TCHAR**)':|
F:\C++\corri mot mystere\main.cpp|40|error: 'numeric_limits' was not declared in this scope|
F:\C++\corri mot mystere\main.cpp|40|error: expected primary-expression before '>' token|
F:\C++\corri mot mystere\main.cpp|40|error: no matching function for call to 'max()'|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|219|note: candidate: template<class _Tp> const _Tp& std::max(const _Tp&, const _Tp& )|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|219|note:   template argument deduction/substitution failed:|
F:\C++\corri mot mystere\main.cpp|40|note:   candidate expects 2 arguments, 0 provided|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|265|note: candidate: template<class _Tp, class _Compare> const _Tp& std::max(const _Tp&, const _Tp&, _Compare)|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|265|note:   template argument deduction/substitution failed:|
F:\C++\corri mot mystere\main.cpp|40|note:   candidate expects 3 arguments, 0 provided|
F:\C++\corri mot mystere\main.cpp|57|error: 'numeric_limits' was not declared in this scope|
F:\C++\corri mot mystere\main.cpp|57|error: expected primary-expression before '>' token|
F:\C++\corri mot mystere\main.cpp|57|error: no matching function for call to 'max()'|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|219|note: candidate: template<class _Tp> const _Tp& std::max(const _Tp&, const _Tp& )|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|219|note:   template argument deduction/substitution failed:|
F:\C++\corri mot mystere\main.cpp|57|note:   candidate expects 2 arguments, 0 provided|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|265|note: candidate: template<class _Tp, class _Compare> const _Tp& std::max(const _Tp&, const _Tp&, _Compare)|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|265|note:   template argument deduction/substitution failed:|
F:\C++\corri mot mystere\main.cpp|57|note:   candidate expects 3 arguments, 0 provided|
F:\C++\corri mot mystere\main.cpp|63|error: expected primary-expression before '>' token|
F:\C++\corri mot mystere\main.cpp|63|error: no matching function for call to 'max()'|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|219|note: candidate: template<class _Tp> const _Tp& std::max(const _Tp&, const _Tp& )|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|219|note:   template argument deduction/substitution failed:|
F:\C++\corri mot mystere\main.cpp|63|note:   candidate expects 2 arguments, 0 provided|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|265|note: candidate: template<class _Tp, class _Compare> const _Tp& std::max(const _Tp&, const _Tp&, _Compare)|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|265|note:   template argument deduction/substitution failed:|
F:\C++\corri mot mystere\main.cpp|63|note:   candidate expects 3 arguments, 0 provided|
F:\C++\corri mot mystere\main.cpp|67|error: expected primary-expression before '>' token|
F:\C++\corri mot mystere\main.cpp|67|error: no matching function for call to 'max()'|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|219|note: candidate: template<class _Tp> const _Tp& std::max(const _Tp&, const _Tp& )|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|219|note:   template argument deduction/substitution failed:|
F:\C++\corri mot mystere\main.cpp|67|note:   candidate expects 2 arguments, 0 provided|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|265|note: candidate: template<class _Tp, class _Compare> const _Tp& std::max(const _Tp&, const _Tp&, _Compare)|
C:\TDM-GCC-32\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_algobase.h|265|note:   template argument deduction/substitution failed:|
F:\C++\corri mot mystere\main.cpp|67|note:   candidate expects 3 arguments, 0 provided|
||=== Build failed: 10 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

n°2282231
rat de com​bat
attention rongeur méchant!
Posté le 25-05-2016 à 11:48:06  profilanswer
 

Internet me dit que pour numeric_limits faut rajouter #include <limits>. Toujours selon la même source int _tmain(int argc, _TCHAR* argv[]) est une extension de chez Microsoft, si ça pose problème remplace le par int main(void) (tu n'utilises pas les arguments passés à main ici).

n°2282236
gilou
Modérateur
Modzilla
Posté le 25-05-2016 à 12:21:30  profilanswer
 

Il suffit de rajouter
#include <limits>
dans MotMysterePlus.h
et ca compile, je viens de tester.
g++ -o myst.exe stdafx.cpp MotMysterePlus.cpp Main.cpp
 
Note:  
dico.txt vient d’où, histoire que je puisse tester.
 
perso, j'ai reformaté le code suivant mes conventions:
 

Code :
  1. // MotMysterePlus.cpp : Defines functions source code.
  2. //
  3. #include "stdafx.h"
  4. #include "MotMysterePlus.h"
  5. using namespace std;
  6. string getFinalWord(bool const solo, vector<string> wordList) {
  7.     string word("" );
  8.     if (solo) {
  9.         int randLevel (rand() % wordList.size());
  10.         word = wordList[randLevel];
  11.     }
  12.     else {
  13.         cout << "JOUEUR 1 ! Saisissez un mot :" << endl;
  14.         cin >> word ;
  15.     }
  16.     return word;
  17. }
  18. string getMysteryWord(string word) {
  19.     string newWord("" );
  20.     while (word.compare("" ) != 0) {
  21.         int index = rand() % word.size();
  22.         newWord += word[index];
  23.         word.erase(index, 1);
  24.     }
  25.     return newWord;
  26. }
  27. void resolveMysteryWord(string const mixWord, string const finalWord, bool const solo) {
  28.     bool finish(false);
  29.     int count(5);
  30.     string temp("" );
  31.     string joueur("JOUEUR 2 : " );
  32.     if (solo) {
  33.         joueur = "";
  34.     }
  35.     while (!finish) {
  36.         cout << joueur << "Quel est ce mot ? " << mixWord << endl;
  37.         cout << "Il vous reste " << count << " coup(s)." << endl;
  38.         cin >> temp;
  39.         if (temp.compare(finalWord) == 0) {
  40.             cout << "BRAVO !" <<endl;
  41.             cout << "Vous avez trouve en " << 5-count+1 << " essai(s)" << endl;
  42.             finish = true;
  43.         }
  44.         else {
  45.             --count;
  46.             if (count != 0 ) {
  47.                 cout << "ce n'est pas le bon mot ! "<< endl;
  48.             }
  49.             else {
  50.                 cout << joueur << "PERDU ! le mot mystere etait : " << finalWord << endl;
  51.                 finish = true;
  52.             }
  53.         }
  54.     }
  55. }
  56. vector<string> initDico() {
  57.     cout << "veuillez patienter, nous initialisons le jeu ..." << endl;
  58.     vector<string> wordList;
  59.     string word("" );
  60.     ifstream dico("dico.txt" );
  61.     if (dico) {
  62.         string temp;
  63.         while (getline(dico, temp) && (temp.compare("" ) != 0)) {
  64.             wordList.push_back(temp);
  65.         }
  66.         int randLevel (rand() % wordList.size());
  67.         word = wordList[randLevel];
  68.     }
  69.     else {
  70.         cout << "ERREUR : impossible d'ouvrir le fichier en lecture." << endl;
  71.     }
  72.     return wordList;
  73. }


 

Code :
  1. // Main.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "MotMysterePlus.h"
  5. int _tmain(int argc, _TCHAR* argv[]) {
  6.     bool play(true);
  7.     srand(time(0));
  8.     vector<string> dicoList(initDico());
  9.     if(dicoList.size() == 0) {
  10.         return 1;
  11.     }
  12.     cout << "**** BIENVENUE au jeu du Mot Mystere ****" <<endl;
  13.     do {
  14.         bool wrongValue(true);
  15.         char answer('a');
  16.         //0- Proposer un mode Solo ou Duo
  17.         bool solo(false);
  18.         cout << "Voulez-vous jouer en Solo ou en Duo ? (s/d)" << endl;
  19.         while (wrongValue) {
  20.             cin.get(answer);
  21.             switch (answer) {
  22.             case 's':
  23.                 wrongValue = false;
  24.                 solo = true;
  25.                 break;
  26.             case 'd':
  27.                 wrongValue = false;
  28.                 break;
  29.             default:
  30.                 cout << "'" << answer << "' n'est pas une valeur correct : (s/d)" << endl;
  31.             }
  32.             cin.ignore(numeric_limits<streamsize>::max(), '\n'); // skip bad input
  33.         }
  34.         answer  = 'a';
  35.         wrongValue = true;
  36.         //1- récupérer le mot à trouver
  37.         string soluce(getFinalWord(solo, dicoList));
  38.         if (soluce.compare("" ) == 0) {
  39.             return 1;
  40.         }
  41.         //2- générer le mot Mystère
  42.         string mysteryWord(getMysteryWord(soluce));
  43.         //3- Trouver le mot Mystère
  44.         resolveMysteryWord(mysteryWord, soluce, solo);
  45.         cout << "voulez-vous faire une autre partie ? (o/n)" << endl;
  46.         while (wrongValue) {
  47.             cin.ignore(numeric_limits<streamsize>::max(), '\n'); // skip bad input
  48.             cin.get(answer);
  49.             switch (answer) {
  50.             case 'o':
  51.                 wrongValue = false;
  52.                 cin.ignore(numeric_limits<streamsize>::max(), '\n');
  53.                 break;
  54.             case 'n':
  55.                 wrongValue = false;
  56.                 cin.ignore(numeric_limits<streamsize>::max(), '\n');
  57.                 play = false;
  58.                 break;
  59.             default:
  60.                 cout << "'" << answer << "' n'est pas une valeur correct : (o/n)" << endl;
  61.             }
  62.         }
  63.     } while (play);
  64.     return 0;
  65. }


 
A+,

Message cité 1 fois
Message édité par gilou le 25-05-2016 à 12:49:22

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2282238
Lt Ripley
T'es à fond là ?
Posté le 25-05-2016 à 12:41:21  profilanswer
 

Merci les gars
 
Voici le lien cjoint pour dico.txt : http://www.cjoint.com/c/FEzkNw3NfBz
 
Je vais tester tout ça et je reviens un peu plus tard

n°2282250
gilou
Modérateur
Modzilla
Posté le 25-05-2016 à 13:51:20  profilanswer
 

La solution marche.
Par contre, le jeu est assez injouable, il faudrait des niveaux de difficulté.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2282252
Lt Ripley
T'es à fond là ?
Posté le 25-05-2016 à 14:14:26  profilanswer
 

Je viens de réussir à faire tourner l'exo du prof, en mettant #include "stdafx.cpp" et MotMysterePlus.cpp au lieu de .h pour les deux, au tout début de main.cpp
 
Bon mais j'ai pas à rougir, le mien est mieux !  Je pioche partout dans le dico et non que au début et en incrémentant, l'aspect visuel est mieux, la jouabilité aussi, plus rapide...
 
Edit : je viens de voir ton post


Message édité par Lt Ripley le 25-05-2016 à 14:15:57
n°2282253
Lt Ripley
T'es à fond là ?
Posté le 25-05-2016 à 14:15:25  profilanswer
 

gilou a écrit :

La solution marche.
Par contre, le jeu est assez injouable, il faudrait des niveaux de difficulté.
 
A+,


Pas faux

n°2282254
Lt Ripley
T'es à fond là ?
Posté le 25-05-2016 à 14:23:16  profilanswer
 

Mais j'ai un peu de mal avec mes boucles je ne sais plus trop ou j'en suis, il faut que je travaille à ce niveau déjà
 
Voici mon code //proud of me
 
 

Code :
  1. #include <iostream>
  2. #include <ctime>
  3. #include <cstdlib>
  4. #include <string>
  5. #include <fstream>
  6. using namespace std;
  7. /* Exercice : Jeu du mot mystere : Merci OpenClassrooms
  8. Mode 1 ou 2 Joueurs
  9. */
  10. //melange : fonction qui renvoi un melange du mot mystere
  11. string melange(string motAMelanger)
  12. {
  13. srand(time(0));
  14. int nbAleatoire(0);
  15. string motMelange;
  16.     do
  17.     {
  18.     nbAleatoire = rand() %motAMelanger.size();
  19.     motMelange += motAMelanger[nbAleatoire];
  20.     motAMelanger.erase(nbAleatoire,1);
  21.     }while (motAMelanger.size() !=0);
  22.     return motMelange;
  23. }
  24. // fonction pour nb joueur = 1
  25. int jeu1Joueur()
  26. {
  27.     string nlPartie1J("OUI" );
  28.     do
  29.     {
  30.     cout <<"\n Mode 1 joueur \n";
  31.     string motMystere1J, motDevine1J, motADeviner1J, motRecupere;
  32.     ifstream monFlux("dico.txt" );
  33.     if(monFlux)
  34.     {
  35.         string ligne;
  36.         int nbLignes(0);
  37.         while(getline(monFlux,ligne))
  38.         {
  39.             nbLignes++;
  40.         }
  41.         monFlux.clear();
  42.         monFlux.seekg(0, ios::beg); // renvoie le curseur au début
  43.         int positionAleatoire(0), multiplicateurAleatoire;
  44.         srand(time(0));
  45.         do
  46.         {
  47.             multiplicateurAleatoire = rand()%50;
  48.             positionAleatoire = multiplicateurAleatoire*(rand()%nbLignes);
  49.         }while (positionAleatoire>nbLignes);
  50.         string motExtrait;
  51.         for (int i(0);i<positionAleatoire; i++)
  52.         {
  53.             getline(monFlux,motExtrait);
  54.         }
  55.         motMystere1J = melange(motExtrait); // appel la fonction melange
  56.         cout << endl << "\t\t\t\t\t  " << motMystere1J << endl << endl << endl;
  57.         int nbEssais1J(5);
  58.         do
  59.         {
  60.             if (nbEssais1J == 0)
  61.             {
  62.                 cout << "Vous n'avez plus d'essais ! Il s'agissait de : " << motExtrait << "\n\n";
  63.                 motDevine1J=motExtrait;  //pour arrêter la boucle
  64.             }
  65.             else
  66.             {
  67.                 cout << " Quel est ce mot ? (" << nbEssais1J << " essais) : ";
  68.                 cin >> motDevine1J;
  69.                 nbEssais1J-=1;
  70.                 if (motDevine1J==motExtrait)
  71.                 {
  72.                     cout << "\n ============= Bravo vous avez gagne ! =============\n\n";
  73.                 }
  74.                 else
  75.                 {
  76.                     cout << "\n Ce n'est pas le mot (" << nbEssais1J << " essais) : ";
  77.                 }
  78.         }
  79.         }while (motDevine1J!=motExtrait);
  80.     }else cout <<"Erreur : impossible d'acceder au fichier dico.txt";
  81.     cout << "\n Nouvelle partie ? (tapez OUI ou NON) : ";
  82.     cin >> nlPartie1J;
  83.     }while (nlPartie1J=="OUI" );
  84. }
  85. // Fonction pour nb joueurs = 2
  86. int jeu2Joueurs()
  87. {
  88.     string nlPartie2J("OUI" );
  89.     do
  90.     {
  91.     string motADeviner, motDevine;
  92.     cout << "\n Mode 2 joueurs \n";
  93.     cout << "\n Joueur 1 : Saisissez un mot mystere : ";
  94.     cin >> motADeviner;
  95.     string motMystere, motMelange; //sort le mot saisi de l'écran
  96.     for (int i(0); i<30; i++)
  97.     {
  98.         cout << endl;
  99.     }
  100.     motMystere = melange(motADeviner); // appel la fonction melange
  101.     cout << endl << "\t\t\t\t\t  voici le mot melange : " << motMystere << endl << endl << endl;
  102.     int nbEssais(5);
  103.     do
  104.     {
  105.         if (nbEssais == 0)
  106.         {
  107.             cout << "Vous n'avez plus d'essais ! Il s'agissait de : " << motADeviner << "\n\n";
  108.             motDevine=motADeviner;
  109.         }
  110.         else
  111.         {
  112.             cout << " Joueur 2 : Quel est ce mot ? (" << nbEssais << " essais) : ";
  113.             cin >> motDevine;
  114.             nbEssais-=1;
  115.             if (motDevine==motADeviner)
  116.             {
  117.                 cout << "\n ============= Bravo vous avez gagne ! =============\n\n";
  118.             }
  119.             else
  120.             {
  121.                 cout << "\n Ce n'est pas le mot (" << nbEssais << " essais) : ";
  122.             }
  123.         }
  124.     }while (motDevine!=motADeviner);
  125.     cout << "\n Nouvelle partie ? (tapez OUI ou NON) : ";
  126.     cin >> nlPartie2J;
  127.     }while (nlPartie2J=="OUI" );
  128. }
  129. int main()
  130. {
  131.     cout << "\n \t ================== \n \t JEU DU MOT MYSTERE \n \t ================== \n      Majuscules obligatoires !" << endl << endl;
  132.     cout << "\n Entrez le nombre de joueurs (1 ou 2) : ";
  133.     int nbJoueurs;
  134.     cin >> nbJoueurs;
  135.     switch (nbJoueurs)
  136.     {
  137.         case 1:
  138.         jeu1Joueur();
  139.         break;
  140.         case 2:
  141.         jeu2Joueurs();
  142.         break;
  143.     }
  144.     return 0;
  145. }

n°2282255
rat de com​bat
attention rongeur méchant!
Posté le 25-05-2016 à 14:40:10  profilanswer
 

S'agissant de C++ je laisse la parole à gilou, juste deux remarques:
- srand(time(0)); on le fait une seule fois au début du programme (dans le main()).
- C'est bien d'activer les warnings (-Wall) mais faut aussi les prendre en compte.  ;)
Dans le cas présent ce n'est rien qui va empêcher le fonctionnement du programme mais les warnings peuvent donner des précieuses infos si il y a un problème et puis - surtout en tant que débutant - autant faire les choses proprement...

Code :
  1. tst.cpp: In function 'int jeu1Joueur()':
  2. tst.cpp:85:1: warning: no return statement in function returning non-void [-Wreturn-type]
  3. tst.cpp: In function 'int jeu2Joueurs()':
  4. tst.cpp:129:1: warning: no return statement in function returning non-void [-Wreturn-type]


int -> void


Message édité par rat de combat le 25-05-2016 à 14:40:34
n°2282257
Lt Ripley
T'es à fond là ?
Posté le 25-05-2016 à 14:53:54  profilanswer
 

Merci rat de combat je modifie de ce pas
 
Là les gars j'en peux plus : si vous voyiez le foutoir dans les fichiers/projets/dossiers and co  :pt1cable:  je vais reprendre à zero pour avoir plusieurs projets ouverts dans code::blocks tout bien propre.  J'avais commencé comme ça mais ça n'avait pas fonctionné...

n°2282258
Lt Ripley
T'es à fond là ?
Posté le 25-05-2016 à 14:58:55  profilanswer
 

gilou a écrit :

Il suffit de rajouter
#include <limits>
dans MotMysterePlus.h

Il faut que je le mette dans main.cpp pour que ça fonctionne

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Petits calculs pour les crédits, ne fonctionne pas [noob]

 

Sujets relatifs
découpage d'un char (C++)[C#] Capture d'écran en jeu
Petits programmes C++Point de syntaxe C++ pour un noob siouplait
raw socket - CPYTHON MYSQL C'est pourtant simple mais...
C Racine communeC : Envoi et retour d'un tableau dans des fonctions.
Plus de sujets relatifs à : Petits calculs pour les crédits, ne fonctionne pas [noob]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR