|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre éclairé
![]() Etudiant informatique autodidacte Inscription : juin 2010 Messages : 591 ![]() |
Salut les programmeurs C,
Je continue de découvrir le C mais je n'ai pas encore commencé l'apprentissage de la standard library en profondeur d'où cette question réellement a 2 centimes : À 2 cents plus exactement car j'ai fait un programme qui calcule ce dont vous avez besoin exactement pour payer une addition : On entre une somme en Euro et le programme calcule de combien de billets et pièces de chaque sorte vous avez besoin pour avoir l'appoint dont je vous épargne le code source. Le problème est que je demande l'entrée avec: Le programme fait des modulo grâce à deux fonctions: Code :
Code :
J'ai clairement identifié le problème venant de scanf() qui ne permet pas de constante tel : "%.2f" ou du moins qui génère des warnings et des erreurs de traitement dans ce cas là. Merci pour vos réponses.
__________________
Pour faire tes armes: Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant. Et sois toujours bien armé avant de te lancer. Le hasard ne sourit qu'aux gens préparés... Blog: http://3dcyberspace.unblog.fr/ Site: Sanctuaire cybernétique |
||||
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 699 ![]() |
Salut,
C'est bien de continuer le C Tu devrais regarder cette discussion : http://www.developpez.net/forums/d13...es-virgule-lu/ Une solution peut-être de lire avec fgets(), de convertir en un nombre de centimes et de faire les calculs avec des entiers et un facteur de 100.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
30
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 495 ![]() |
Salut
Tu n'as pas bien explique ton soucis mais je pense que je le devine. Je crois que tu es confronte au probleme inherent a tous les ordis et tous les langages a propos du codage des decimaux. En effet, pour un ordi, un decimal est un nombre code a base de puissances negatives de 2. Donc 0.25 en base 10 etant 2^(-2) sera code 0.01 en base 2. Mais ce systeme ne marche pas pour tous les nombres et ainsi 0.6 sera code 0.1001001001001. Et dans l'autre sens si on decode ce chiffre, cela ne donne pas exactement 0.6 (cela donne 0.5999999 ou bien 0.6000001). D'ou la proposition de bktero de travailler exclusivement en centimes (entiers) quitte a convertir lors de la saisie et de l'affichage. Une autre solution serait d'utiliser une bibliotheque dediee a la gestion des decimaux. Ce genre de bibliotheque (qui existe en natif dans d'autres langages comme Python) code les decimaux chiffre par chiffre et effectue ensuite les calculs comme au primaire (chaque chiffre est pris independemment pour etre calcule avec chaque autre chiffre). Calculs (relativement) longs mais resultats garantis sans erreurs. Je sais qu'il en existe une ecrite en C qu'on peut telecharger et utiliser ensuite facilement dans ses codes C (on en parle parfois sur ce fofo)...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|
|
00
|
|
|
#4 |
|
Membre éclairé
![]() Etudiant informatique autodidacte Inscription : juin 2010 Messages : 591 ![]() |
Merci pour vos réponses,
Je connaissait le problème des nombres a virgule flottante et les problèmes de la représentation binaire de ceux-ci , d'ailleurs j'ai écrit un module en python qui permet de manipuler: additionner, soustraire et multiplier des string binaires et la division ne fait pas partie des fonctions du module justement a cause de ce problème, c'est pas vraiment un module réellement utile mais ca fait un peu de lecture car il ,est documenter et les méthodes de calcules sont calquer sur les règles du calcule binaire vous pouvez éventuellement jeter un œil a mon module: Module python de manipulation et de calcule de nombres binaires. Seulement je pensait qu'il existait une possibilité plus trivial avec le format de la constante de scanf, mais comme vous infirmez, il va falloir formater l'entrée comme dit dans la FAQ. Merci pour vos réponses.
__________________
Pour faire tes armes: Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant. Et sois toujours bien armé avant de te lancer. Le hasard ne sourit qu'aux gens préparés... Blog: http://3dcyberspace.unblog.fr/ Site: Sanctuaire cybernétique |
|
10
|
|
|
#5 | |
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 495 ![]() |
Citation:
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|
|
|
10
|
|
|
#6 | |
|
Expert Confirmé
![]() ![]() Inscription : août 2006 Messages : 3 414 ![]() |
Hai,
Citation:
Car si c'est "général", alors c'est impossible : on tombe très souvent sur des nombres qui ont une infinité de décimales, il faut donc bien les limiter quelque part.
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir. |
|
|
|
11
|
|
|
#7 | |
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 495 ![]() |
Citation:
Pour gerer les rationnels je ne sais pas ce que Python propose en natif mais j'ai de mon cote developpe ma propre librairie basee sur les calculs des fractions...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|
|
|
20
|
|
|
#8 | ||||
|
Membre éclairé
![]() Etudiant informatique autodidacte Inscription : juin 2010 Messages : 591 ![]() |
Réponse rapide:
Je n'arrive pas obtenir un float a précision de 2 chiffres après le virgule car écrire: Code :
512.12 512.119995 Et en essayant obtenir la précision a deux chiffres: Code :
Je continuerai a chercher car le problème est plus grave que le formatage des entrées: j'ai remarquer que mes fonctions subissaient le même sort. Merci pour vos réponses.
__________________
Pour faire tes armes: Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant. Et sois toujours bien armé avant de te lancer. Le hasard ne sourit qu'aux gens préparés... Blog: http://3dcyberspace.unblog.fr/ Site: Sanctuaire cybernétique |
||||
|
00
|
|
|
#9 | |||
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 699 ![]() |
Citation:
Code :
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|||
|
00
|
|
|
#10 | |||
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 495 ![]() |
Citation:
Code c :
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|||
|
|
10
|
|
|
#11 | |
|
Membre éclairé
![]() Etudiant informatique autodidacte Inscription : juin 2010 Messages : 591 ![]() |
Merci pour vos réponses,
pour Bktero : Citation:
Comme un char vaut 1 octet la chaine euro n'a pas besoin de 255 octets effectivement. mais concernant le float c'est une autre question. Sve@r merci d'avoir mis en lumière ce que l'on m'avait déjà dit au début du poste: de séparé la partie entière de la partie décimale pour le traitement, seulement je fait avec les moyens du bords pour l'instant mais est je suis tomber sur strtof qui ne change rien au problème comme dit plus haut. Je vais essayer d'arriver a un résultat exact, merci pour vos réponses éclairées.
__________________
Pour faire tes armes: Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant. Et sois toujours bien armé avant de te lancer. Le hasard ne sourit qu'aux gens préparés... Blog: http://3dcyberspace.unblog.fr/ Site: Sanctuaire cybernétique |
|
|
00
|
|
|
#12 | ||
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 495 ![]() |
Citation:
En fait, quand tu utilises un pointeur (char *euro), la variable "euro" contient une valeur aleatoire car non initialisee. Mais quand tu demandes de remplir la zone avec n'importe quoi (une saisie, une autre variable, etc), ca va aller direct taper a l'adresse correspondant a cette valeur et commencer a y ecrire. Et la c'est la cata. Cette adresse est peut-etre celle d'une autre variable, etc. Et le pire c'est que si c'est l'adresse d'une autre variable non seulement le compilo ne te dira rien mais ton programme fonctionnera sans planter. Mais il te fera n'importe quoi (on appelle cela "comportement indetermine"). Pour simplifier: chaque fois que tu utilises un pointeur (char *truc), tu n'as pas le droit d'aller ecrire dans la zone pointee (dans "*truc") si tu n'as pas d'abord ecrit "truc=une adresse valide" (bien souvent ce sera truc=malloc(...) ; la fonction malloc te renvoyant l'adresse d'une zone allouee donc forcement valide (sauf si allocation ratee mais c'est un autre soucis) De mon cote je ne me suis pas embete avec du malloc: j'ai declare un tableau de 255 octets et j'ai indique a fgets() de se limiter a ce nombre (mais definit au debut donc facilement modifiable => une seule modif, une recompilation et tout remarche)... Citation:
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||
|
|
00
|
|
|
#13 | ||
|
Membre éclairé
![]() Etudiant informatique autodidacte Inscription : juin 2010 Messages : 591 ![]() |
Brefs je suis parvenue a mes fins grâce a vos bon conseils,
et je suis tellement content d'y être arriver que je vous montre ici le code source final un peu barban d'opérations consécutives répétitives mais c'est le prix a payer pour écrire en C. J'ai réussi en faisant entré l'utilisateur la somme en euro avec fgets() que dont je sépare le tableau résultant en deux partie: -la partie entière et la partie décimale. PS: il n'y a aucune vérification de l'entrée utilisateur et je n'ai pas pris la peine de commenter le code. Code :
Merci pour vos réponse et de part ce biais pour votre contribution. Le problème est résolus.
__________________
Pour faire tes armes: Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant. Et sois toujours bien armé avant de te lancer. Le hasard ne sourit qu'aux gens préparés... Blog: http://3dcyberspace.unblog.fr/ Site: Sanctuaire cybernétique |
||
|
00
|
|
|
#14 | |
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 495 ![]() |
Citation:
La je ne suis pas chez moi mais des mardi, je te montrerai une autre facon de faire bien plus souple et bien plus optimisee basee sur un tableau de structures contenant d'un cote la monnaie a utiliser/diviser et de l'autre le libelle correspondant
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|
|
|
00
|
|
|
#15 | ||||
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 495 ![]() |
Citation:
Code c :
Résultat Citation:
Mais à la base ce que je voulais te montrer, c'est que la force de ce genre de code réside dans
Donc voilà. Essaye de t'inspirer de ces principes pour plus tard. Ecrire programme ce n'est pas seulement écrire un code qui fonctionne mais aussi essayer de penser à son évolutivité future...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||||
|
|
30
|
|
|
#16 |
|
Expert Confirmé
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 185 ![]() |
Une réalisation élégante, j'aime beaucoup.
Par contre, j'aurai typé le "libelle" du t_monnaie en const char*, surtout qu'il est initialisé via une chaine littérale
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
|
00
|
|
|
#17 | |
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 495 ![]() |
Merci
![]() Citation:
PS: j'avais oublié de mettre "cents" à 0 dans le cas où la somme n'a pas de ".". J'ai rectifié cet oubli...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|
|
|
00
|
|
|
#18 | |
![]() ![]() ![]() Raymond Inscription : mai 2007 Messages : 9 036 ![]() |
Citation:
__________________
Raymond Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi ![]() Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.e-verbe Un logiciel de conjugaison des verbes de la langue française.Ma page personnelle sur DVP. |
|
|
|
00
|
|
|
#19 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 699 ![]() |
Un joli code
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#20 | |
|
Expert Confirmé
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 185 ![]() |
Citation:
en gros, pour un type T, ca donne:
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com