OVH Cloud OVH Cloud

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

Avatar
candide
Harpo wrote in news:43e3c552$0$20142$8fcfb975
@news.wanadoo.fr:

candide wrote:
[snip pretexte] je ne peux pas t'aider.


Ca, j'ai beau être un neuneu, j'avais compris.

Quand on utilise un produit, soit on a la doc soit on ne l'utilise pas,


Après La Rochefoucauld, je vous présente Harpo !

si tu n'arrives pas à trouver la doc de gcc sur le net inscris-toi à un
cours google,


Esquive facile.


Non, mais il faut arrêter de délirer !


Comme tu dis. Tu devrais aller te coucher.

Candide

Avatar
Harpo
Gabriel Dos Reis wrote:

ben tu vois, tu as appris quelque chose. Tu devrais être content de
dormir moins bête maintenant.


Tu es un optimiste irréductible.

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

Avatar
Bruno Jouhier
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?


Avatar
Laurent.Deniau

Laurent Deniau writes:

Et de tout facon j'utilise eassert qui a le meme comportement que assert
(et eassert.h que assert.h) mais leve une exception ExBadAssert en cas
d'echec au lieu de quitter le programme.


Pour pouvoir faire quelque chose une fois que l'exception est
attrapee, il faut etre sur d'au moins une partie de l'etat du
programme. De quelle partie de l'etat es-tu sur apres qu'une
assertion echoue? Si tu as l'equivalent des destructeurs, comment
ceux-ci peuvent ils etre sur que l'etat des objets qu'ils doivent
detruire, ils ne connaissent pas la cause pour laquelle ils sont
appeles.


C'est un vaste sujet! Comme il est tard, je vais faire court. Dans OOC,
j'ai 3 choses intrinsequement liee:

- les contextes. A chaque nouveau bloc try{} un nouveau contexte id est
cree.
- les objets. Chaque objet creer est a une structure immediatement
valide et est rattache au context id courant. Donc si le constructeur
commence par rendre son objet neutre pour son destructeur (e.g. mettre
les pointeurs a NULL) avant d'appliquer son code d'initialisation,
l'objet est potentiellement toujours valide pour le destructeur meme en
presence d'une exception pendant la construction (important pour le
dernier point). C'est une approche tres differente de C++ qui simplifie
enormement l'utilisation dans un constructeur de new ou toutes autres
fonctions suceptibles de lever une exception.
- les exceptions. Un throw declenche a la fois un stack unwinding pour
les pointeurs proteges explicitement (on est en C) et appelle le
destructeur de tous les objets rattaches au contexte courant (donc
crees entre le try et le throw et jamais detache ni retenu) avant de
passer au contexte id precedent et passer dans le/les catch().

Donc le seul point ou il faut garantir que le programme est dans un
etat stable est l'endroit ou on leve l'exception. C'est un probleme
local (principe fondamental des exceptions) generalement facile a
resoudre. Et bien souvent l'objet en question fait parti des objets qui
vont etre automatiquement detruit (meme s'il est incompletement
construit) et donc il faut juste le rendre neutre pour son destructeur
s'il ne l'etait pas deja.

Je comprends qu'on puisse tenter de faire des choses avant de partir,
mais a mon sens elles sont limitees (sauver une copie des donnees en
memoire mais certainement pas ecraser les donnees originales).


Pas seulement. Par exemple liberer de la memoire et recommencer,
diminuer la taille des paquets/buffers traites et recommencer,
reinterroger une BD avec des entrees differentes, demander a
l'utilisateur qqchose de mieux adapte, changer le contexte d'un
parseur, afficher/logger qqchose avant de quitter, etc... Bien que je
sois partisant de l'utilisation des exceptions dans des cas ...
exceptionnels, cette stabilite permet aussi de les utiliser pour faire
des tentatives.

a+, ld.


Avatar
Marc Boyer
Le 03-02-2006, candide a écrit :
Marc Boyer wrote in
news::


http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gcc/Warning-Options.html#Warnin
g-Options

* If `-Wall' or `-Wunused' is also specified, warn about
unused
arguments.


Donc c'est ça la seule différence ? Bon, c'est toujours pas
parfaitement limpide.


Non, ça c'est *une* des différences.
Il y a aussi les tests sur les non signés (toujours piégant), etc.


Je sais pas comment vous faites vous les informaticiens pour donner des
réponses aussi peu directes et aussi "confusantes" (c'est sans soute que je
suis très bouché).


Je suis désolé: au début, Emmanuel te dit que, à son sens,
les warnings utiles ad minima à demander au compilateurs sont activés avec
-Wall -W.

Ensuite, tu demandes quelles est la différence entre
"gcc -W -Wall" et "gcc -Wall". Alors, je te donne (issu de la doc)
la liste des warnings qu'active -W (ce qui est, il me semble,
la réponse à la question, non ?). Je souligne que ne connais
pas cette liste par coeur, je sais juste par tatonnenements
successifs que, pour mon code, je compile avec
-W -Wall -pedantic -stdÉ9
et que cela me conviens bien.
Et quand je travaille avec le code des élèves, j'ajoute
-Wuninitialized -0

Ensuite, comme tu dis ne pas avoir info sur ta machine, je
t'indique la page WEB où la trouver.

Que te dire de plus ?

Je dois vous dire que je n'ai quasiment vu aucun livre
d'informatique clair (alors que des livres de maths ou de physique clairs
ça existe -- bon, à bien réfléchir le livre de Desgraupes sur LaTeX est
assez clair).


Comme je le dis à mes étudiants au début du cours de C: ici, on est
dans le monde des normes réelles, qui ont 20 ans d'existence, où
des mauvais choix ont été fait mais on les garde par souci de
compatibilité, sans parler des guéguerres entres fournisseurs.

On est pas dans la jolie théorie des maths qui ont 150 ans
d'existence, et qui on été lissées, peaufinées, et où on
peut choisir la définition qui nous plait pour le sujet qui
nous intéresse.

Sinon, les bouquins d'info théo sont assez clairs non ?

Tu m'envoies une page du manuel (qui ne répond pas à la question) puis tu
m'envoies sur le site de gcc où il faut lire entre les lignes pour avoir la
réponse tout ça alors que tu aurais pu répondre que

1°) -Wall porte TRES mal son nom parce que c'est plutôt -WNearlyAll,


Oui, nous sommes d'accord. D'après de récentes discussions sur
fr.comp.lang.c++, -Wall signifirait 'activer tous les Warning
que Richard Stallman considère utiles'.

J'avoue que je n'avais pas compris que tu pensais que -Wall
signifiait 'tous les warnings'. Je sais que c'est une erreur
courante, je l'ai longtemps cru moi même, mais là, ça ne
m'est pas venu à l'esprit.

2°) -W l'ancienne façon de désigner l'option actuelle -Wextra


Je l'ai découvert en t'envoyant la page WEB.

3°) Ne pas croire que "extra"+"all"= "whole all", ce serait trop simple.


En effet.

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain




Avatar
candide
Marc Boyer wrote in
news::


Je suis désolé: au début, Emmanuel te dit que, à son sens,
les warnings utiles ad minima à demander au compilateurs sont activés
avec -Wall -W.


Pas exactement, même si sans importance, c'est Harpo qui disait ça au PO et
d'autre part, c'est -W -Wall (pour un débutant tout à de l'importance,
l'ordre des opérateurs pourrait ne pas être innocent).


Ensuite, tu demandes quelles est la différence entre
"gcc -W -Wall" et "gcc -Wall".


Oui

Alors, je te donne (issu de la doc)


Cette fameuse doc

la liste des warnings qu'active -W
(ce qui est, il me semble,
la réponse à la question, non ?).


Non, ma question n'est pas de savoir ce que fait la ligne de commande
gcc -W ni gcc -E ni gcc -stdÉ9 ou je ne sais quoi, ma question est de
savoir quelle _différence_ entre faire en ligne de commande
gcc -Wall et gcc -W -Wall.
Alors si j'essaye de comprendre ce que tu me dis, je viens à considérer que
le -W est obligatoire si on veut faire appel à tel ou tel type de warning,
qu'il s'agisse -Wall ou de -Wimplicit.


Je souligne que ne connais
pas cette liste par coeur, je sais juste par tatonnenements
successifs que, pour mon code, je compile avec
-W -Wall -pedantic -stdÉ9
et que cela me conviens bien.
Et quand je travaille avec le code des élèves, j'ajoute
-Wuninitialized -0

Ensuite, comme tu dis ne pas avoir info sur ta machine, je
t'indique la page WEB où la trouver.


Ne prend pas mal ce que je vais dire, je sais que tu es sur ce forum depuis
longtemps et dans le but, entre autres, de faire profiter à des débutants
comme moi, je sais que tu es soucieux de la qualité de l'enseignement que
tu dispenses à tes étudiants, c'est assez rare. Le problème est que tu as
tellement intégré tous les mécanismes que tu n'es pas/plus capable de
comprendre ce qu'un débutant ne comprend pas et en particulier que tu ne
vois pas toutes les _ambiguités_ que peut produire une doc style man car
l'information suppose que le lecteur est informé d'une quantité
d'informations implicites et contextuelles. Bien aussi prendre conscience
qu'enseigner quelque chose qui passe uniquement par le support texte (comme
sur les news ou dans un man voire dans un livre) démande infiniment plus de
réflexion pour avoir une action aussi efficace qu'en présentiel. Si par
exemple, je dois apprendre à utiliser gdb en utilisant la seule doc gnu, je
vais y passer 10 ou 20 (sic) fois plus de temps que si mon collègue d'info
est à côté de moi à me l'expliquer devant un PC. J'en profite pour signaler
une doc remarquable (sans être parfaite) sur gdb ici :
http://www.dirac.org/linux/gdb/
J'ajoute que le rôle pédagogique du debugger est largement sous-estimé, un
débutant apprendrait ENORMEMENT de choses avec ça, le problème c'est qu'il
faut d'abors savoir s'en servir d'où le problème de la doc, etc, etc

Pour ne pas faire traîner ce post HS indéfiniment et bien qu'il touche à
une question capitale, veuille déjà me dire si le résumé en trois points
qui m'a permis de m'endormir moins bête (mais de me réveiller aussi bête
que la veille visiblement),
cf. Message-ID: <43e389a9$0$21282$
est correct ou pas.


Candide

Avatar
Marc Boyer
Le 04-02-2006, candide a écrit :
Marc Boyer wrote in
news::
la liste des warnings qu'active -W
(ce qui est, il me semble,
la réponse à la question, non ?).


Non, ma question n'est pas de savoir ce que fait la ligne de commande
gcc -W ni gcc -E ni gcc -stdÉ9 ou je ne sais quoi, ma question est de
savoir quelle _différence_ entre faire en ligne de commande
gcc -Wall et gcc -W -Wall.
Alors si j'essaye de comprendre ce que tu me dis, je viens à considérer que
le -W est obligatoire si on veut faire appel à tel ou tel type de warning,
qu'il s'agisse -Wall ou de -Wimplicit.


Chaque argument de type -Wxxx demande au compilo d'activer certains
avertissements. La doc dit exactement lequel fait quoi.
-W en active certains, -Wall d'autres, et en plus, certains
sont communs je crois.

Je souligne que ne connais
pas cette liste par coeur, je sais juste par tatonnenements
successifs que, pour mon code, je compile avec
-W -Wall -pedantic -stdÉ9
et que cela me conviens bien.
Et quand je travaille avec le code des élèves, j'ajoute
-Wuninitialized -0

Ensuite, comme tu dis ne pas avoir info sur ta machine, je
t'indique la page WEB où la trouver.


Ne prend pas mal ce que je vais dire, je sais que tu es sur ce forum depuis
longtemps et dans le but, entre autres, de faire profiter à des débutants
comme moi, je sais que tu es soucieux de la qualité de l'enseignement que
tu dispenses à tes étudiants, c'est assez rare. Le problème est que tu as
tellement intégré tous les mécanismes que tu n'es pas/plus capable de
comprendre ce qu'un débutant ne comprend pas


C'est pour cela que je reste partisant de la formation TP, ie
un élève, un enseignant et une machine dans la même salle.

et en particulier que tu ne
vois pas toutes les _ambiguités_ que peut produire une doc style man car
l'information suppose que le lecteur est informé d'une quantité
d'informations implicites et contextuelles. Bien aussi prendre conscience
qu'enseigner quelque chose qui passe uniquement par le support texte (comme
sur les news ou dans un man voire dans un livre) démande infiniment plus de
réflexion pour avoir une action aussi efficace qu'en présentiel.


C'est pour cela que, même si je pense que mes cours sont de qualité,
je ne me lance pas à écrire le N+1 ième bouquin de C...
J'avoue aussi que, considérant que tu avais une agreg de math, j'ai du
mal à situer ton niveau: les questions que tu poses vont bien plus loins
que ce que se posent mes étudiants, et je t'imaginais plus apte à
lire des docs informatiques.

Si par
exemple, je dois apprendre à utiliser gdb en utilisant la seule doc gnu, je
vais y passer 10 ou 20 (sic) fois plus de temps que si mon collègue d'info
est à côté de moi à me l'expliquer devant un PC.


Tout à fait.

J'ajoute que le rôle pédagogique du debugger est largement sous-estimé, un
débutant apprendrait ENORMEMENT de choses avec ça, le problème c'est qu'il
faut d'abors savoir s'en servir d'où le problème de la doc, etc, etc


Peut-être en auto-apprentissage comme tu le fais.
Mon expérience d'enseignement est bien plus mitigée dans de cadre
d'enseignements classiques.

Pour ne pas faire traîner ce post HS indéfiniment et bien qu'il touche à
une question capitale, veuille déjà me dire si le résumé en trois points
qui m'a permis de m'endormir moins bête (mais de me réveiller aussi bête
que la veille visiblement),
cf. Message-ID: <43e389a9$0$21282$
est correct ou pas.


Oui, sauf que 2) est relatif à la version de GCC dont on parle.
Sur ma machine, -Wextra n'existe pas encore.

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain


Avatar
Jean-Marc Bourguet
candide writes:

Jean-Marc Bourguet wrote in
news::


Je ne suis pas sur de comprendre l'analogie. Si je l'ai
bien comprise, je répond: ce n'est pas en regardant un
moteur au ralenti qu'on apprend à conduire.


Oui, l'image est bonne, ton moteur semble fonctionner au
ralenti.


Merci.

[...]
Dois-je continuer ?


Avec les analogies? Non, visiblement elles n'aident pas a
nous comprendre.

De nouveau, je ne suis pas sûr de te comprendre. J'hésite
entre deux interprétations.

Pour l'une d'entre elles, je ne suis pas d'accord et il y a
le gros danger de finir par prendre le résultat de choix
d'implémentation pour les spéc.



Je vois très vaguement ce que tu veux dire mais désolé tu
ne t'exprimes pas clairement.


Arriver a penser que parce que l'ensemble "compilateur, OS,
machine" a fait certains choix -- par exemple d'utiliser des
bytes de 8 bits ou d'utiliser des bytes de 32 bits sur une
machine adressable par mot -- que ce sont des choix
universels, ou les seuls possibles sur ce genre de machine.
Il est possible d'avoir des bytes de plus de 8 bits, il est
possible d'avoir des bytes de 8 bits meme sur une machine
adressable par mot avec des mots de 32 bits... La norme
impose des contraintes, apres il peut y avoir pas mal de
variation dans la maniere dont les contraintes sont
respectees.

Pour l'autre,


Quelle est cette autre interprétation ?


Elle etait apparemment plus proche de ce que tu voulais
dire.

je suis d'accord et c'est une des raisons pour
lesquelles si j'avais à enseigner la programmation
j'envisagerai un langage interprété.


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


L'interet des langages interpretes, ce n'est pas de cacher
le langage machine. En fait, si on prend certains lisp,
l'"interpreteur" peut tres bien compiler en langage
machine. L'interet c'est l'interaction. Encore plus grande
qu'avec un debuger.

Quant au langage machine, je suis pour la connaissance de
l'architecture des ordinateurs, meme pour la connaissance de
la micro-architecture (ou l'implementation si on reprend la
nomenclature de Brooks et Blaauw). Cad de ne pas faire
croire que c'est autre chose qu'une interface toute aussi
abstraite. Ce n'est pas pour rien qu'un des bouquins de
Hennessy et Patterson est sous-titre "The Hardware/Software
Interface".

A+

--
Jean-Marc


Avatar
Laurent Deniau
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. Pour les membres, c'est a la
classe (au constructeur) de garantir que la chaine d'initialisation est
correcte. Si tu as un exemple concis d'heritage simple en C++ qui
montre un probleme qui te tiens a coeur, je peux essayer de voir en
quoi OOC resout ou non le probleme.

a+, ld.
Avatar
Laurent Deniau

assert(scanf("%199s", Nom) == 1);


Argh, ! Ne jamais faire ça ! Non compilé (du tout) en mode release !
Le scanf() saute aussi !


Il faut lire jusqu'au bout mon post et l'explication sur les assert.
Ceci dit, je ne deactive jamais les assert, meme en production,


Erreur. Je vois que tu n'as jamais utilisé VC++6 en mode release...
NDEBUG est défini (par défaut), et ça aurait fait drôle à ton c ode...


Effectivement, je n'ai meme jamais programme sous Windows et il y bien
longtemps sous DOS. Je ne suis pas maso ;-)

D'autre part, dans les regles de production de code de telle ou telle
boite, il pourrait très bien être spécifié que le code de product ion est
compilé avec -DNDEBUG.


Je livre seulement du code compile, bib ou prog ;-)

Il ne faut donc absolument pas utiliser assert() (celui du C standard)
pour vérifier autre chose que de la conception. Jamais les comportements
anormaux d^s au système ou à l'utilisateur.


C'est note.

a+, ld.