Bien le bonjour
.
Je suis un noob total en programmation, je viens de suivre mon 1er cours et je dois écrire un petit programme basique en langage C.
Voici l´énnoncé et ma réponse. J´aimerais bien que quelqu´un y jette un coup d´oeil et me dise si je suis dans le bon ou si je m´égare!
Exercice; L´instruction scanf("%f",&x); permet de saisir un nombre flottant dans une variable (ici, la variable x). Ecrire un programme qui demande le rayon d´un cercle et calcule et affiche sa circonférence et son aire.
Ma réponse:
int main()
{
float c;
float a;
c = 2*3.14.r;
a = 3.14*r²;
scanf("%f",&r);
printf("c=%f,a=%f\n",c,a);
}
Je pense que c´est incorrect car je n´arrive pas à le compiler. Si quelqu´un pouvait me corriger, ça me ferait plaisir. Merci d´avance. ![]()
/* Oui, je sais que Pi est déjà dans math.h, mais je ne vais pas l´embrouiller le pauvre */
/*Autant faire un beau main */
int main(int argc, char **argv) {
/* C´est bien gentil, mais il faut le déclarer, r */
float r;
/* L´opérateur ² n´existe pas en C */
scanf("%f",&r);
printf("Circonférence=%f\nAire=%f\n",2*PI*r,PI*r*r
);
/* Tu as déclaré que main retournait un entier */
/* On pourrait mettre un return 0 */
/* Mais plus spécifiquement, pour main on utilise l´instruction suivante */
/* Je te passe les détails */
exit(0);
}
Salut. Il y a un petit point où je ne suis pas d´accord avec toi hitman :
/*Autant faire un beau main */
int main(int argc, char **argv) {
Pourquoi ? On utilise par argc et argv, autant donc ne pas les mettre. Personnellement voici ce que j´aurai fait :
int main(void)
{
float r;
printf("Quel est le rayon du cercle: ");
fflush(stdout);
printf("Sa circonference est donc %f et son aire %f\n", 2 * PI * r, PI * r * r);
return 0;
}
Sinon, je pense que scanf est une fonction vicieuse car il faut bien la connaître pour bien l´utiliser. Elle a l´air très simple mais au contraire, est très compliquée d´utilisation. Néanmoins, tu l´utilises au début puis normalement par la suite, tu vérifies le retour de scanf et tu agis en conséquence :
- Soit la saisie est bonne et on agit normalement
- Soit elle est mauvaise et on "purge" le buffer.
Pour plus d´information sur scanf voir développez.com, article Scanf démythifiée.
Une autre alternative à l´utilisation de scanf est l´emploi de fgets + fonctions de conversions stro*
Bonne continuation ![]()
Arf j´ai justement omis le scanf. Code corrigé :
int main(void)
{
float r;
printf("Quel est le rayon du cercle: ");
fflush(stdout);
scanf("%f",&r);
printf("Sa circonference est donc %f et son aire %f\n", 2 * PI * r, PI * r * r);
return 0;
}
Merci beaucoup ![]()
"je n´arrive pas à le compiler"
--> Ne jamais dire cela sans nous préciser ce qu´il dit (pour la 1ere erreur), et sur quelle ligne
En effet, la ou il devait gueuler, c´était sur le "²"
Je voudrais ajouter quelquechose, tu as fais:
float c;
float a;
c = 2*3.14.r;
a = 3.14*r²;
scanf("%f",&r);
Plusieurs chose n´allait pas.
Dans un premier temps la variable r n´était pas déclarée.
Mais en plus l´ordre des opération est important! La variable r n´a pas de valeur (en fait une valeure imprévisible) tant que tu ne lui en a pas donné.
la valeure de la variable c apres ´c = 2*3.14.r;´ n´est donc pas prévisible non plus.
Voilà, suite à vos remarques et conseils, j´ai réussi a compiler ce programme qui fonctionne parfaitement maintenant. C´est ultra-basique, j´ai sûrement fait des choses bizarres ou inutiles mais ça fonctionne, c´est le principal pour moi dans un premier temps.
Voici ce que j´ai fais:
int main()
{
float r;
scanf("%f",&r);
float c;
c = 2*3.14*r;
float a;
a = 3.14*r*r;
printf("c=%f,a=%f\n",2*3.14*r,3.14*r*r);
}
Si vous avez des remarques, n´hésitez pas!
Oui, tu utilises une constante : si tu utilises Pi 100 000 000 de fois dans ton programme et que tu décides de changer sa précision, tu vas devoir changer toutes ses apparitions.
Tu peux soit définir une constante (Voir faire appel à celle de math.h), soit déclarer une variable. Cependant la constante sera plus efficace car le nombre est stoqué en dur à la compilation (Mais pour ça aussi je te passe les détails). Sinon, il est bon d´afficher un texte avant la saisie et tu déclares deux variables qui ne servent à rien puisque tu peux effectuer ces calculs directement dans le printf.
Tu peux aussi écrire deux fonctions (Mais bon, c´est bourin est gourmand pour un truc aussi simple qu´une directive préprocesseur fait aussi bien et ne consomme pas des sauts à l´exécution si ne place sur la pile, ..., mais une fois de plus, je te passe les détails).
J´ajouterai qu´en C89, les variables doivent être déclarées en début de bloc ![]()
hitman : ces variables servent peut-être "à rien", mais ne nuisent pas au programme (en fait, le code généré par le compilo sera probablement exactement le même avec ou sans variables, à l´ordre des instruction près).
par contre ça améliore la lisibilité de faire le calcul hors du printf, donc c´est plus sympa.
Je trouve que ça encombre ! Autant faire une fonction dans ce cas, ou utiliser le préprocesseur.
Oui au code clair, non au code inutile.
Perso, avoir une expression de 3km dans un printf, je trouve que c´est bof bof niveau clarté.
De toutes façons c´est de la sodomie de drosophiles : à ce niveau ce n´est pas la peine de se prendre la tête avec de tels détails sinon on pourrait aussi lui dire d´utiliser write plutôt que printf car le dernier n´est pas performant, etc.
Ya pas à dire, on repère le pro dans la bande. N´est-ce pas hitman
Vous aurez beau retourner l´affaire comme vous voulez, hitman a l´air de savoir ce qu´il raconte.
Scuzez moi, mais les expressions de 3km directement dans les fonctions c´est typique du C. Pour n´importe que programmeur C non débutant le code de hitman est très clair.
![]()
absolument pas : un code avec des lignes courtes est plus clair quel que soit ton niveau de programmation.
Et ça n´a rien a voir avec de la "sodomie de drosophile" car leproblème est tout autre que celui de printf/write qui change le code.
Là, il s´agit uniquement de modifier la présentation d´un programme qui reste strictement le même.
cela permet egealement durant les phases de débuggage de ne pas avoir une constante en dure dans le code, ou encore d´avoir une vérification de type a la compilation.
En terme d´execution en -O2 on est bien d´accord que c´est pareil, mais mettre une variable a valeure constante n´a que des avantages par rapport a une macro du préprocesseur.
On est bien d´accord, un code avec des lignes courtes est + clair.
Mais enfin, on peut pas dire que le code de hitman est illisible.
Je peux vous assurer que quand vous pondez des milliers de ligne de code vous ne vous amusez pas à déclarer des variables juste pour le plaisir.
Et si vraiment on veut être clair, on met des commentaires !! !
Maintenant je dois admettre que quand on tombe sur un bug qui résiste, on fini par repasser par des variables qui pourront être "printfées" ou inspectée via un debugueur.
![]()
"Je peux vous assurer que quand vous pondez des milliers de ligne de code vous ne vous amusez pas à déclarer des variables juste pour le plaisir."
Et pourquoi pas si ca rend le code plus clair.
De toute facon, si l´on "remplace" une variable par une autre, le compilatuer le verra bien et les fusionnera dnas le meme registre.
Il faut ecrire le code de la facon la plus clair possible. Tant que les algorthmes sous jacent ne changent pas, tant que l´on ne fait que des difference de nommage de variable ou ce genre de chose, on n´impacte pas le code binaire (ou tres faiblement)