Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Premier programme fait maison...

116 réponses
Avatar
listes
Salut,

Voilà... je suis super débutant... Je poste ici mon premier programme
fait maison....

Je voudrait avoir votre avis..

J'utilise Xcode sur un macintosh sous 10.4.4, mais cela n'a pas beaucoup
d'importance...

#include <stdio.h>
#include <string.h>

int main (int argc, const char * argv[]) {

//on défini les variables
char Nom[200];
float quantite; // la variable quantité
float prix; // la variable prix
float total; // la variable total
float tauxtva; // le taux de tva
float soustotal; // le sous tatal sans la tva
float tva; // le montant de la tva

printf("Entrez votre nom : ");
scanf("%s", Nom);
printf("\n");
printf("Taux de tva ? : "); // on demande le taux de tva
scanf("%f",&tauxtva);
printf("\n");
printf("Quantite de l'article a facturer ? : "); // on demande
la quantité
scanf("%f",&quantite);
printf("\n");
printf("Le prix de l'article ? : "); // on demande le prix
scanf("%f",&prix);
printf("\n");

// le calcul

soustotal = quantite * prix;
tva = (soustotal * tauxtva)/100;
total = soustotal + tva;

//on affiche le résultat

printf ("Montant a payer hors tva %.2f\n\n",soustotal);
printf ("TVA a payer : %.2f\n\n", tva);
printf ("%s, vous avez un total a payer : %.2f\n", Nom, total);

return 0;
}

Est-ce assez clair dans la présentation (pour ce cas-ci bien sur) ?

A+

10 réponses

8 9 10 11 12
Avatar
Laurent Deniau
Bruno Jouhier wrote:
float quantite; // la variable quantité


a moins que tu traites des fractions d'objets

int quantite;



Et ton boucher, il ne vend le rosbif que par blocs d'un kilo?


Ta memoire ne retient qu'une ligne de code a la fois? Fait un effort

#define MEMORY (2*sizeof ligne)

Ne pas confondre non plus entite, quantite et unite.

a+, ld.



Avatar
Laurent Deniau
Stephane Legras-Decussy wrote:
"Pierre Maurette" a écrit dans le message de
news:

Vous êtes monochromatique, Candide.



cohérent ou non ? ça change tout...


J'aurais plutot dis polarise ou non? Parce que la ca frole le +/-pi/2 de
polarisation ;-)

a+, ld.


Avatar
Jean-Marc Bourguet
Laurent Deniau writes:

Jean-Marc Bourguet wrote:
"Laurent Deniau" writes:
C'est la que l'approche est differente. Je considere le
code correcte par defaut (parce que debugge et teste ;-) )
Optimiste... Mais je crois surtout que nous travaillons dans

des contextes très différents et que je maîtrise beaucoup
moins ce dont je ne m'occupe pas dans le programme que toi.


C'est fort possible. Je ne suis pas vraiment dans une logique
industrielle, mais plutot R&D.


Nous sommes en R&D mais la partie R, c'est plutot anecdotique. Plus
precisement, l'aspect D predomine fortement meme quand on fait du R.

mais je ne fais pas confiance aux entrees.
Je n'utilise pas des assertions pour vérifier les entrées de

l'utilisateur. Ces vérifications doivent être là quoi qu'il
passe dans la tête d'un CM, de celui qui reprendra le code,
ou des défauts considérés comme adéquats par le fournisseur
du compilateur qu'on utilisera dans le futur. Les
assertions sont pour moi des commentaires dont la validité
est vérifiée à l'exécution, elles ne font pas partie de ce
que le programme est sensé faire. Vérifier les entrées de
l'utilisateur, le programme doit le faire.


Je ne parle pas seulement de l'utilisateur. Par exemple si on devait
reecrire strlen en supposant que le C ait les exceptions:

size_t str_len(const char *str)
{
assert(str);
...
}

Est ce que tu considere que le assert devrait etre semantiquement
equivalent a un test+log+exit, un test+errno+return, un assert-debug
ou un assert-exception.


Tu me demandes quel spec il faut a mon avis ou comment
j'implementerais une spec donnee?

Sur la spec, j'en vois plusieurs possibles:
1/ str_len retourne 0 pour str == NULL
Ca me semble raisonnable, j'ai pas d'objections tant que l'ensemble de
la lib fonctionne sur le principe que NULL est un synonyme de "".

2/ str_len retourne -1 + errno pour str == NULL
Je ne vois pas dans quels cas ca peut etre un avantage sur tester la
validite de str avant, mais ca evite d'avoir un comportement indefini
ce est generalement un bien.

3/ str_len retourne par exception pour str == NULL
Exception signifie pour moi traitement non local de l'erreur, je n'en
vois pas de possible pour cette erreur. Certainement pas mon choix.

4/ str != NULL est une precondition.
Attitude classique en C. On peut discuter de l'interet par rapport au
2 dans ce cas particulier, mais en general, c'est difficile d'eviter
d'avoir des preconditions.

1 et 2 imposent l'implementation.

3 je fait test+exception, un assert ne participe pas pour moi a
l'implementation de la spec.

Le 4ieme cas est le plus interessant. Si str est NULL, c'est donc une
erreur de programmation. Face a une erreur de programmation, mon
attitude c'est de sortir le plus vite possible en evitant de faire
croire que tout c'est bien passe, que des resultats sont valides, que
continuer est possible.

Je ne vois pas ce qu'il y a a logger de plus que la pile qu'on optient
avec l'assert-debug.

exit() me gene dans ce cas, c'est un batard entre _exit() qui ne fait
rien et jeter une exception recuperee par le main qui fait non
seulement ce qui est enregisterer par atexit mais aussi le stack
unwinding. Il faudrait que le stack unwinding et l'execution des
atexit soit notifie qu'on est en cas d'erreur de programmation et non
d'un cas prevu.

assert-exception me gene aussi pour la meme raison. Et pour la raison
supplementaire que les exceptions font partie de la spec.

C'est vrai que l'on peut directement se poser la question de
l'interet des exceptions dans ce cas. Parce que 19/20 on quitte plus
ou moins brutalement. La question soujacente, c'est quelle classe de
problemes reveles au niveau N peuvent etre resolus au niveau N-P
(P<N)? On a parfois l'impression (c'est parfois mon cas) que les
exceptions servent surtout a se donner bonne conscience a ceux qui
ecrivent des bibliotheques mais que ceux qui les attrapes ne savent
pas trop quoi en faire. Un error_handler est souvent plus simple et
tout aussi efficace.


Avec l'avantage d'un error_handler peut aussi demander de ressayer.
Je crois sincerement que c'est le bon choix pour des bibliotheques,
mais je suis surtout utilisateur de celles-ci. Comme je l'ai ecrit,
j'en utilise une qui jette des exceptions quand ses preconditions ne
sont pas verifiees, j'ai un assert sur le catch.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Jean-Marc Bourguet
Laurent Deniau writes:

Jean-Marc Bourguet wrote:
"Laurent Deniau" writes:

OOC supporte seulement l'heritage simple et utilise la delegation de
type pour simuler l'heritage multiple. Un objet est structurellement
valide (du point de vu OOC) juste apres son *allocation* et avant son
initialisation, donc ses parents aussi.
Tu as l'air de dire maintenant que l'objet est en situation

neutre pour le destructeur par l'effet de l'allocation.


Non. Il est structurellement complet, mais pas initialise.

J'avais compris de

si le constructeur commence par rendre son objet neutre pour
son destructeur
qu'il fallait écrire du code spécifiquement pour ça. Comme



Exact.

il faut que toute la hiérarchie soit dans un état neutre
pour pouvoir appeler le destructeur, j'imaginais une
construction en deux temps.



Je me demande si je ne faisais pas une supposition qui n'est pas
valide. Si une exception est jetee pendant la construction du parent,
est-ce que le constructeur de la classe derivee est appele. Si non,
mon hypothese etait fausse.

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Antoine Leca
En news:43e5fc59$0$18339$,
candide va escriure:
P'tain, je suis un alien ou quoi, je parle à un réseau de neurones ou
à des humains ?


Non, mais tu parles à des gars qui ont des années d'expérience derrière eux,
et en particulier ont passé plus de temps que toi à inspecter les résultats
présentés par les débogueurs.

À part cela, il y a aussi un aspect chats jouant avec une souris.
Même si ce devrait être des lions et un lionceau.


C'est vraiment pas compliqué, une des facultés d'un code éxécutable,
c'est qu'il va s'exécuter très vite.


Admettons.

Un debugger me permet de tout contrôler de l'exécution du code machine,
à ma vitesse, en avant en arrière, il me montre ce que je fais dans
mon CODE SOURCE (humain quoi), il fait la correspondance, je peux pas
rêver mieux pour comprendre.


Il y a deux aspects manqués ici, à propos de « contrôle total ».
L'un est que le compilateur passe par une représentation intermédiaire (en
assembleur), et si tu restes avec le débogueur symbolique tu ne la vois pas,
et tu perds une partie de ce qui te manques ; en gros, un débogueur, cela
est indispensable justement quand il y a un souci à ce niveau « caché » ;
mais cela demande aussi une certaine maîtrise de l'assembleur (de la machine
considérée)...

Un autre aspect, c'est qu'il y a des bogues qui dépendent de l'enchaînement
des opérations et de leurs relations entre elles, les bogues que le
débogueur ne permet justement pas de chasser (un exemple caricatural sont
les méthodes de protection des logiciels).


Sinon, l'utilisation que tu décris est celle d'un interpréteur qui
permettrait de contrôler l'exécution pas à pas. Cela existe en dehors des
débogueurs (Instant-C faisait cela, si je me souviens bien). Ce n'est pas
vraiment l'utilisation normale des débogueurs.


Un debogueur, c'est un comprendeur.


Pas vraiment. C'est un outil, comme d'autres. Utiliser un outil à autre
chose que ce pour quoi il est destiné peut être parfois utile. Parfois
dangereux.

Tu as découvert un aspect utile. C'est très bien, et cela va te permettre de
faire des progrès. Mais d'autres essayent de te faire comprendre qu'il ne
s'agit pas d'une solution universelle à ton problème.


cachez ce code-machine que je ne saurais voir : je pense que c'est une
excellente solution pour ne rien comprendre en profondeur.


Il va pourtant falloir en passer par là.

Intel avec l'Itani{um,c} et son code machine parfaitement incompréhensible
était en avance sur son temps, mais les processeurs d'ajourd'hui deviennent
tellement compliqués que c'est réellement difficile de comprendre ce qui se
passe « en profondeur » ; et surtout, c'est inutile pour programmer.
Je sais bien que la tendance à la mode est aux architectures simplicistes,
machine à pile et adressage linéaire (je parle des machines virtuelles Java
ou CRT, en particulier) ; mais le problème est que le langage C vise aussi,
et même surtout, les autres architectures...

Par ailleurs, l'intérêt le plus flagrant du C en 2006, c'est sa portabilité.
Et le moyen pour cela, c'est justement de cacher le code machine.


Antoine

Avatar
Laurent Deniau
Jean-Marc Bourguet wrote:
Laurent Deniau writes:
Je ne parle pas seulement de l'utilisateur. Par exemple si on devait
reecrire strlen en supposant que le C ait les exceptions:

size_t str_len(const char *str)
{
assert(str);
...
}

Est ce que tu considere que le assert devrait etre semantiquement
equivalent a un test+log+exit, un test+errno+return, un assert-debug
ou un assert-exception.



Tu me demandes quel spec il faut a mon avis ou comment
j'implementerais une spec donnee?


voui.

Sur la spec, j'en vois plusieurs possibles:
1/ str_len retourne 0 pour str == NULL
Ca me semble raisonnable, j'ai pas d'objections tant que l'ensemble de
la lib fonctionne sur le principe que NULL est un synonyme de "".


Le genre de chose que j'evite absolument. C'est trop permissif et si
toute la bib est comme ca, debugger peut devenir franchement poilu.
Objective-C dans ses versions permissives qui acceptent d'envoyer un
message a nil est un cas typique que j'evite comme la peste.

2/ str_len retourne -1 + errno pour str == NULL
Je ne vois pas dans quels cas ca peut etre un avantage sur tester la
validite de str avant, mais ca evite d'avoir un comportement indefini
ce est generalement un bien.


Ca c'est la version C canal-historique. Ce n'est pas non plus celle que
je prefere.

3/ str_len retourne par exception pour str == NULL
Exception signifie pour moi traitement non local de l'erreur, je n'en
vois pas de possible pour cette erreur. Certainement pas mon choix.


he, he. C'est bien la ma question... Et c'est mon choix pour tout ce qui
releve d'une bib (90% de mon code).

4/ str != NULL est une precondition.
Attitude classique en C. On peut discuter de l'interet par rapport au
2 dans ce cas particulier, mais en general, c'est difficile d'eviter
d'avoir des preconditions.

1 et 2 imposent l'implementation.

3 je fait test+exception, un assert ne participe pas pour moi a
l'implementation de la spec.

Le 4ieme cas est le plus interessant. Si str est NULL, c'est donc une
erreur de programmation. Face a une erreur de programmation, mon
attitude c'est de sortir le plus vite possible en evitant de faire
croire que tout c'est bien passe, que des resultats sont valides, que
continuer est possible.


Mais si tu es dans une bib, comment tu sorts? Tu ne sais pas a l'avance
quelles sont les contraintes de l'utilisateur de ta bib.

Je ne vois pas ce qu'il y a a logger de plus que la pile qu'on optient
avec l'assert-debug.

exit() me gene dans ce cas, c'est un batard entre _exit() qui ne fait
rien et jeter une exception recuperee par le main qui fait non
seulement ce qui est enregisterer par atexit mais aussi le stack
unwinding. Il faudrait que le stack unwinding et l'execution des
atexit soit notifie qu'on est en cas d'erreur de programmation et non
d'un cas prevu.

assert-exception me gene aussi pour la meme raison. Et pour la raison
supplementaire que les exceptions font partie de la spec.


Ben je vois que tu n'as pas non plus la reponse-qui-va-bien.

C'est vrai que l'on peut directement se poser la question de
l'interet des exceptions dans ce cas. Parce que 19/20 on quitte plus
ou moins brutalement. La question soujacente, c'est quelle classe de
problemes reveles au niveau N peuvent etre resolus au niveau N-P
(P<N)? On a parfois l'impression (c'est parfois mon cas) que les
exceptions servent surtout a se donner bonne conscience a ceux qui
ecrivent des bibliotheques mais que ceux qui les attrapes ne savent
pas trop quoi en faire. Un error_handler est souvent plus simple et
tout aussi efficace.



Avec l'avantage d'un error_handler peut aussi demander de ressayer.
Je crois sincerement que c'est le bon choix pour des bibliotheques,
mais je suis surtout utilisateur de celles-ci. Comme je l'ai ecrit,
j'en utilise une qui jette des exceptions quand ses preconditions ne
sont pas verifiees, j'ai un assert sur le catch.


Exactement mon cas.

a+, ld.


Avatar
Laurent Deniau
Jean-Marc Bourguet wrote:
Je me demande si je ne faisais pas une supposition qui n'est pas
valide. Si une exception est jetee pendant la construction du parent,
est-ce que le constructeur de la classe derivee est appele. Si non,


Tu veux dire le destructeur?

mon hypothese etait fausse.


Si tu parles pour C++, la reponse est non. L'objet derive est
incompletement construit, son destructeur ne sera pas appele.

Si tu parles pour OOC, la reponse est oui. Les destructeurs sont
systematiquement appeles. D'ou la necessite de rentre neutre le parent
pour son destructeur avant le debut de l'initialisation des membres.
Concretement, je n'ai vu que la necessite de mettre a NULL les pointeurs
membres, rien de bien mechant. Je rappelle que OOC ne supporte que
l'heritage simple, en cas d'heritage multiple, c'est plus poilu.

a+, ld.

Avatar
Harpo
Antoine Leca wrote:


Par ailleurs, l'intérêt le plus flagrant du C en 2006, c'est sa
portabilité. Et le moyen pour cela, c'est justement de cacher le code
machine.


Je pense que l'intérêt principal d'un débuggeur est de débugger
principalement voire uniquement dans les cas extrêmes quand on a tout
essayé avant.

Il peut aussi servir à comprendre un peu l'architecture d'une machine
particulière, et, lorsqu'on comprend un peu une 1/2 12aine
d'architectures, j'imagine que l'on comprend plus facilement la 7ème,
c'est peut-être quand même le plus intéressant, voire même le plus
ludique.
Le fait justement que le C puisse cacher le code machine est de
permettre que la compréhension d'un comportement d'1 seul code machine
puisse faire trouver des erreurs dans un code en C.

Il sert aussi surtout à comprendre l'utilisation d'un débuggeur, mais ce
n'est pas toujours très utile, je me suis servi de gdb l'année
dernière, la fois avant c'était au millénaire dernier et c'était pour
voir ce qu'il proposait et on oublie entre-temps.

Un autre de ses avantages est aussi de permettre à ceux qui l'écrivent
d'acquérir une certaine maîtrise en C ou dans un assembleur, voire les
2 et plus si affinité, c'est loin d'être négligeable. Je pense
d'ailleurs que l'écriture de mini-debuggers devrait être proposé comme
exercice à des étudiants en programmation ("vous allez en chier, bande
de petits salopards!"), amha ce n'est pas passionnant pour tous mais ça
peut être utile pour certains et il y a des gens qui aiment ce genre de
choses.

Mais compter dessus pour débugger... Ouh la la !

--
http://harpo.free.fr/

Avatar
Jean-Marc Bourguet
Laurent Deniau writes:

Jean-Marc Bourguet wrote:
Laurent Deniau writes:
Je ne parle pas seulement de l'utilisateur. Par exemple si on devait
reecrire strlen en supposant que le C ait les exceptions:

size_t str_len(const char *str)
{
assert(str);
...
}

Est ce que tu considere que le assert devrait etre semantiquement
equivalent a un test+log+exit, un test+errno+return, un assert-debug
ou un assert-exception.
Tu me demandes quel spec il faut a mon avis ou comment

j'implementerais une spec donnee?


voui.

Sur la spec, j'en vois plusieurs possibles:
1/ str_len retourne 0 pour str == NULL
Ca me semble raisonnable, j'ai pas d'objections tant que l'ensemble de
la lib fonctionne sur le principe que NULL est un synonyme de "".


Le genre de chose que j'evite absolument. C'est trop permissif et si toute
la bib est comme ca, debugger peut devenir franchement poilu. Objective-C
dans ses versions permissives qui acceptent d'envoyer un message a nil est
un cas typique que j'evite comme la peste.


Le probleme est dans le "tant que l'ensemble de la lib fonctionne sur
ce principe"... il y a toujours un moment ou la difference se fait
sentir...

2/ str_len retourne -1 + errno pour str == NULL Je ne vois pas
dans quels cas ca peut etre un avantage sur tester la validite de
str avant, mais ca evite d'avoir un comportement indefini ce est
generalement un bien.


Ca c'est la version C canal-historique. Ce n'est pas non plus celle
que je prefere.

3/ str_len retourne par exception pour str == NULL
Exception signifie pour moi traitement non local de l'erreur, je n'en
vois pas de possible pour cette erreur. Certainement pas mon choix.


he, he. C'est bien la ma question... Et c'est mon choix pour tout ce qui
releve d'une bib (90% de mon code).

4/ str != NULL est une precondition.
Attitude classique en C. On peut discuter de l'interet par rapport au
2 dans ce cas particulier, mais en general, c'est difficile d'eviter
d'avoir des preconditions.
1 et 2 imposent l'implementation.
3 je fait test+exception, un assert ne participe pas pour moi a
l'implementation de la spec.
Le 4ieme cas est le plus interessant. Si str est NULL, c'est donc une
erreur de programmation. Face a une erreur de programmation, mon
attitude c'est de sortir le plus vite possible en evitant de faire
croire que tout c'est bien passe, que des resultats sont valides, que
continuer est possible.


Mais si tu es dans une bib, comment tu sorts? Tu ne sais pas a l'avance
quelles sont les contraintes de l'utilisateur de ta bib.


Je crois que mon choix serait un handler pour les preconditions dont
le defaut est halt.

Ben je vois que tu n'as pas non plus la reponse-qui-va-bien.


There is no silver bullet.

Le traitement des erreurs, c'est pour le moment toujours au niveau de
l'artisanat. J'ai pas encore vu un texte qui traite reellement en
profondeur de ce sujet. Si quelqu'un en connait, je suis preneur.

Un probleme, c'est que le traitement des erreurs doit etre homogene
pour une application. C'est un choix architectural qui doit etre fait
tres tot pour que quand on a a traiter une erreur, on sache comment
agir.

C'est vrai que l'on peut directement se poser la question de
l'interet des exceptions dans ce cas. Parce que 19/20 on quitte plus
ou moins brutalement. La question soujacente, c'est quelle classe de
problemes reveles au niveau N peuvent etre resolus au niveau N-P
(P<N)? On a parfois l'impression (c'est parfois mon cas) que les
exceptions servent surtout a se donner bonne conscience a ceux qui
ecrivent des bibliotheques mais que ceux qui les attrapes ne savent
pas trop quoi en faire. Un error_handler est souvent plus simple et
tout aussi efficace.
Avec l'avantage d'un error_handler peut aussi demander de ressayer.

Je crois sincerement que c'est le bon choix pour des bibliotheques,
mais je suis surtout utilisateur de celles-ci. Comme je l'ai ecrit,
j'en utilise une qui jette des exceptions quand ses preconditions ne
sont pas verifiees, j'ai un assert sur le catch.


Exactement mon cas.


Mon probleme pour les exceptions, c'est que j'ai la flemme de mettre
des try{}catch partout. J'en mets aux frontieres de sorte que je sais
que je le laisse s'echapper de ma couche que ce que je desire; et
comme je sais aussi que mes destructeurs ne font rien qui risquent une
corruption permanente de donnees ou de donner une fausse confiance a
l'utilisateur dans les resultats ca me va. Si j'avais des
destructeurs de ce genre, le crois que j'ajouterais un bloc try{}catch
aussi a leur niveau pour eviter leur execution.

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Jean-Marc Bourguet
Laurent Deniau writes:

Jean-Marc Bourguet wrote:
Je me demande si je ne faisais pas une supposition qui n'est pas
valide. Si une exception est jetee pendant la construction du parent,
est-ce que le constructeur de la classe derivee est appele. Si non,


Tu veux dire le destructeur?


Oui.

mon hypothese etait fausse.


Si tu parles pour C++, la reponse est non. L'objet derive est
incompletement construit, son destructeur ne sera pas appele.


Ca, je le sais :-)

Si tu parles pour OOC, la reponse est oui. Les destructeurs sont
systematiquement appeles. D'ou la necessite de rentre neutre le
parent pour son destructeur avant le debut de l'initialisation des
membres. Concretement, je n'ai vu que la necessite de mettre a NULL
les pointeurs membres, rien de bien mechant.


Je me demandais si tu avais un mecanisme plus general pour ca, qu'on
puisse compter sur un invariant dans le destructeur. Une technique
possible pour les deux phases (dans le cas de l'heritage simple, nous
sommes d'accord) serait de faire la mise en etat stable du
constructeur le plus derive (qui donc ne peut compter sur rien en ce
qui concerne les parents) , puis appeler celui du parent, et enfin
faire la partie "dangereuse".

Mais il est probable que ce soit de la complication pour rien.

Au fait, est-ce que tu as la meme chose qu'en C++/CLI, la possibilite
que les destructeurs soient appeles plusieurs fois?

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org


8 9 10 11 12