Petits calculs pour les crédits, ne fonctionne pas [noob] - C++ - Programmation
Marsh Posté le 15-05-2016 à 16:47:37
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...
Marsh Posté le 15-05-2016 à 17:14:51
Pour la mise en forme de la sortie de ton programme:
Code :
|
Ce qui donne en sortie:
|
A+,
Marsh Posté le 15-05-2016 à 20:32:05
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
Marsh Posté le 16-05-2016 à 01:02:57
> 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+,
Marsh Posté le 18-05-2016 à 20:14:25
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...
Marsh Posté le 19-05-2016 à 12:06:14
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+,
Marsh Posté le 19-05-2016 à 21:17:35
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...
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 !
Marsh Posté le 20-05-2016 à 02:19:26
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+,
Marsh Posté le 20-05-2016 à 12:55:15
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 ?
Marsh Posté le 20-05-2016 à 13:37:53
Tu as une hiérarchie de classes illustrée par le diagramme suivant:
et cin, cout ne sont pas des classes, mais des objets (ie des instances de classes).
A+,
Marsh Posté le 20-05-2016 à 17:28:08
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
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
Marsh Posté le 21-05-2016 à 11:59:19
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 ?
Marsh Posté le 21-05-2016 à 14:49:48
Pour tabuler plusieurs lignes il suffit de les sélectionner et d'appuyer la touche tab.
Marsh Posté le 21-05-2016 à 19:41:30
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 :
|
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+,
Marsh Posté le 23-05-2016 à 13:51:56
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 ?
Marsh Posté le 23-05-2016 à 15:37:34
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+,
Marsh Posté le 23-05-2016 à 20:20:26
Bon, il m'a fallu installer une nouvelle version de g++ (5.1) pour que cfenv soit activé, mais on peut aboutir à ceci:
Code :
|
(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 :
|
|
A+,
Marsh Posté le 24-05-2016 à 07:49:31
gilou a écrit :
|
Rembourser 200000 € en 24 mensualités, c'est très HFR-compliant
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 )
Marsh Posté le 24-05-2016 à 17:31:13
> 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+,
Marsh Posté le 24-05-2016 à 18:17:40
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) ===| |
Chose nouvelle pour moi, cette fois ci un fichier c++0x_warning.h s'ouvre dans une fenêtre :
Citation : #ifndef _CXX0X_WARNING_H |
J'ai aussi l'exercice corrigé du prof de mon exo de jeu de mot à lettres mélangées qui ne fonctionne toujours pas.
Marsh Posté le 24-05-2016 à 18:37:02
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, ...)
Marsh Posté le 24-05-2016 à 19:29:21
J'allais le dire.
A priori, compiler avec -std=c++11 et aussi avec -Wall si possible
A+,
Marsh Posté le 24-05-2016 à 19:32:04
Lt Ripley a écrit : Bon, je crois que je suis passé à un g++ 5.1 |
C'est ce que j'ai fait hier
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+,
Marsh Posté le 24-05-2016 à 22:29:27
Merci les gars
Ça marche. J'ai ajouté les paramètres ici (j'ai ajouté -Wall aussi entre temps)
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
Marsh Posté le 24-05-2016 à 23:02:35
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).
Marsh Posté le 25-05-2016 à 09:01:19
Merci rat de combat j'ai pu faire comme tu dis
Voici le programme du prof
Code :
|
Code :
|
Code :
|
(Celui ci se nomme MotMysterePlus.h)
Code :
|
Code :
|
Et les erreurs :
Citation : ||=== Build: Debug in corri mot mystere (compiler: GNU GCC Compiler) ===| |
Marsh Posté le 25-05-2016 à 11:48:06
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).
Marsh Posté le 25-05-2016 à 12:21:30
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 :
|
Code :
|
A+,
Marsh Posté le 25-05-2016 à 12:41:21
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
Marsh Posté le 25-05-2016 à 13:51:20
La solution marche.
Par contre, le jeu est assez injouable, il faudrait des niveaux de difficulté.
A+,
Marsh Posté le 25-05-2016 à 14:14:26
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
Marsh Posté le 25-05-2016 à 14:15:25
gilou a écrit : La solution marche. |
Pas faux
Marsh Posté le 25-05-2016 à 14:23:16
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 :
|
Marsh Posté le 25-05-2016 à 14:40:10
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 :
|
int -> void
Marsh Posté le 25-05-2016 à 14:53:54
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 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é...
Marsh Posté le 25-05-2016 à 14:58:55
gilou a écrit : Il suffit de rajouter |
Il faut que je le mette dans main.cpp pour que ça fonctionne
Marsh Posté le 15-05-2016 à 16:30:19
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 :
Voici ce que j'ai dans la console :
Voici la formule mathématique que j'ai trouvé sur 2 sites :
Merci pour votre aide !
Message édité par Lt Ripley le 29-11-2016 à 18:38:54