Sve@r | k-nar a écrit :
Bonjour à tous, C'est mon premier post dans cette section, je découvre un petit peu le C et je me suis amusé à faire un petit programme qui calcule le discriminant d'une équation du 2nd ordre et calcule les racines:
Code :
- #include <stdio.h>
- int main(void)
- {
-
- // déclaration des variables //
-
- float delta,a,b,c,z1,z2,racinedelta;
-
- // aperçu de la formule //
-
- printf("\n\nLa formule est: \t ax^2 + bx + c = 0\n\n\n" );
-
-
- // on tape les valeurs à rentrer //
-
- printf("Valeur de a: \t" );
- scanf("%f",&a);
-
- printf("Valeur de b: \t" );
- scanf("%f",&b);
-
- printf("Valeur de c: \t" );
- scanf("%f",&c);
-
-
- // calcul du discriminant //
-
- printf("\n\nCalcul du discriminant: \n\n" );
-
- delta= (b*b) - (4*a*c);
-
- printf("\nle discriminant vaut: \t%f\n\n",delta);
-
-
- // conditions pour les racines //
-
- if(delta>0)
-
- {
- racinedelta=sqrt(delta);
-
- z1= ((-b)+racinedelta)/(2*a);
- z2= ((-b)-racinedelta)/(2*a);
-
- printf("il existe 2 solutions, z1 et z2:\n \nz1= %f \n\nz2= %f\n\n",z1,z2);
- }
- else
-
- if(delta==0)
-
-
- {
- printf("Solution double car discriminant = 0\n\n" );
-
- z1=z2= (-b)/(2*a);
-
- printf("z1 = z2 = %f\n\n",z1);
- }
-
- else
-
- if(delta<0)
-
-
- printf("il n'existe pas de racines reelles\n\n" );
-
-
-
- system("PAUSE" );
- return 0;
- }
|
Merci de me dire ce que vous en pensez et les éventuelles choses à améliorer dans la présentation/structure de mon code , autant prendre les bonnes habitudes tout de suite. 
|
Boaf, c'est un joli programme bien écrit. Je me rappelle quand j'ai commencé à apprendre le basic, j'avais écrit le même !!!
Bon, voici mes remarques de bases
1) tu as bien pensé à mettre "int main" et "return 0" => c'est super
2) tu peux utiliser l'indentation pour bien montrer quel bloc correspond au else et quel autre au if. Certains n'aiment pas l'indentation parce qu'elle varie suivant les éditeurs (chacun est libre) donc tu peux utiliser les espaces mais l'important est de bien aligner les blocs
3) essaye de prendre l'habitude de découper ton programme en tâches élémentaires. C'est pas évident avec un aussi petit truc mais tu verras, ensuite cela te sera très profitable. Par exemple tu pourrais déléguer une fonction pour saisir les 3 coefficients, une autre pour afficher le résultat. Bon, ça viendra avec le temps
Ma remarque la plus importante viendra avec scanf(). Je sais que c'est la première fonction qu'on apprend aux débutants mais c'est la pire car elle attend une entrée "formatée" et, par définition, ce que tape un gazier à qui on dit "entrer un nombre" derrière
son clavier est souvent tout sauf du nombre. Pour toi ça va car tu es le créateur de ton programme mais si tu écris un programme pour un tiers, il faut bannir "scanf()" car tu n'arriveras jamais à bien contrôler ce que tape le gars. Surtout si le gars tapes du texte là où scanf attend un nombre, alors
1) le nombre ne sera pas rempli
2) le buffer d'entrée "clavier" gardera ce texte dans sa mémoire => dès que tu feras saisir un texte par scanf (par exemple un nom) alors scanf récupèrera la chaîne qu'il a conservée de la saisie précédente et c'est cette chaîne que tu recevras => gros bug !!!
La bonne façon de faire saisir un nombre (ou 2 ou 3 ou 50) à quelqu'un est la suivante
1) tu fais saisir une chaîne avec "fgets(chaine, xxx, stdin)" avec "xxx" le nombre de car. max que tu acceptes; en ayant évidemment pris soin de tailler ta chaîne suffisemment grande pour accepter "xxx" octets
2) tu fais un "n=sscanf(chaine, "%... %... %...", &var1, &var2, ...)" avec autant de variables que t'as besoin
3) tu vérifies que "n" vaut bien le nombre de variables attendu. Een effet, "sscanf()" renvoie systématiquement le nombre de variables qu'il a remplies => si "n" ne vaut pas la bonne valeur, tu recommences au "1"
Avec cette méthode, le gars peut taper ce qu'il veut => c'est du texte donc ce sera stocké dans la chaîne => s'il n'a pas tapé ce qu'il faut "sscanf()" n'arrivera pas à remplir les variables et tu détecteras cette anomalie grace à "n". CQFD!!! ---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
|