Moyenne d'entiers -> résultat à virgule [C] - C - Programmation
Marsh Posté le 18-09-2005 à 23:56:30
Attention a bien utiliser les balises 'fixed' ou 'cpp'...
ngkreator a écrit :
|
C'est normal. 'som' et 'n' sont des entiers. La division est donc entière.
Change le type de 'som' en flottant. Je recommande 'double' plutôt que 'float' (plus précis).
Le bon usage de scanf() est délicat, ce qui entraine des risques d'instabilité avec ce code.
Si le nombre de valeurs est 0 le comportement est indéfini.
Améliorer ses saisies :
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers
Marsh Posté le 19-09-2005 à 00:21:38
Ah ok je ne pensais pas que ça marchais comme ça. J'essaye de prendre en compte le cas négatif et nul mais c'est pas si simple en fait.
C bien sympa les liens que tu m'as donné.
Edit:
Ah non le cas nul ou négatif est simple c'est juste que j'oubliais le "&" dans scanf(). O`est le véritable intérêt de "double" ici?
Par contre j'ai un chiffre totalment abérent comme résultat depuis que tout est en float:
Code :
|
Marsh Posté le 19-09-2005 à 09:21:24
ngkreator a écrit : Par contre j'ai un chiffre totalment abérent comme résultat depuis que tout est en float: |
Il y des erreurs. Si ton compilateur ne dit rien, soit il est mal reglé, soit il faut en changer...
|
D'autre part, 'tout' n'est pas en 'float'. Je t'avais conseillé de passer 'som' en float
Citation : Change le type de 'som' en flottant. |
et je continue de lire :
int som=0; |
Déjà signalé : Attention au choix des balises. Ce n'est pas 'quote', mais 'fixed' ou 'cpp' (boutons [fixe] ou [C/C++], puisque tu n'as pas l'air décidé à lire les regles du forum où tout est expliqué)
Si tu ne tiens pas compte des avis donnés, je perds mon temps...
Marsh Posté le 19-09-2005 à 11:27:00
Escuse moi j'ai modifié les balises après avoir vu qu'il y avait des régles. Pour "som" que j'avais laissé en entier c'est un pur oublie.
Mon compilateur c'est "Dev-C++" , j'ai essayé avec "Code::Blocks" et c'est vrai qu'il y a une erreur, que je vais essyer de comprendre d'ailleur.
Merci encore.
Marsh Posté le 19-09-2005 à 14:51:20
ngkreator a écrit : Escuse moi j'ai modifié les balises après avoir vu qu'il y avait des régles. Pour "som" que j'avais laissé en entier c'est un pur oublie. |
Ce n'est pas la peine de déclarer "som" en tant que "float" puisque c'est une somme d'entiers.
En revanche, quand tu divises un entier par un entier, le résultat est calculé en valeur "entières".
Une solution que je pense meilleure que de déclarer "som" en "float" est de demander explicitement que le calcul de la moyenne, à cet endroit précis, se fasse en "float". C'est ce qu'on appelle le "cast" (du verbe anglais "to cast" qui signifie "jouer un rôle" et qui a donné le mot "casting" du show-biz)
Au lieu d'écrire "moy=som/n", tu écris "moy=(float)som/n" ou "moy=som/(float)n" ou "moy=(float)som/(float)n"
L'un des deux opérandes étant considéré, pour la division, en "float" fera que toute la division sera faite en "float".
Marsh Posté le 20-09-2005 à 07:35:08
Ah ok bon à savoir merci. Donc en suivant vos conseils j'arrive à un résultat à virgule. Parcontre j'ai remarqué que si je donnais n=0 (pendant l'utilisation du prog), le prog me dit de "rentrer une valeur strictement positive". Jusque là ça va mais après il me demande de une infinité de fois de rentrer un nombre. Donc il y a un problème dans mon algorithme.
Voilà si j'arrive à résoudre ça le programme sera nickel.
Marsh Posté le 20-09-2005 à 08:26:00
ngkreator a écrit : Ah ok bon à savoir merci. Donc en suivant vos conseils j'arrive à un résultat à virgule. Parcontre j'ai remarqué que si je donnais n=0 (pendant l'utilisation du prog), le prog me dit de "rentrer une valeur strictement positive". Jusque là ça va mais après il me demande de une infinité de fois de rentrer un nombre. Donc il y a un problème dans mon algorithme. |
Je t'ai déjà signalé que scanf() était une fonction difficile à maitriser,
Citation : Le bon usage de scanf() est délicat, ce qui entraine des risques d'instabilité avec ce code. |
et je t'ai indiqué des alternatives.
Citation : |
Encore une fois, tu n'écoutes rien... C'est desespérant...
Marsh Posté le 20-09-2005 à 08:58:59
J'avais pris en compte ce que tu me disais, mais je ne pensais pas que, dans le cas de mon problème, scanf() posait problème. Je vais donc essayer les autres.
Mais merci encore pour ton aide.
Marsh Posté le 20-09-2005 à 10:20:52
ngkreator a écrit : J'avais pris en compte ce que tu me disais, mais je ne pensais pas que, dans le cas de mon problème, scanf() posait problème. Je vais donc essayer les autres. |
Ben en fait, dans ton troisième post je vois écrit "scanf("%f", &n)"
Si "n" est de type "int", le format "%f" n'est pas bon => Essaye de voir du coté de "%d"
Marsh Posté le 20-09-2005 à 10:37:34
Mieux vaut prendre le réflexe de n'utiliser scanf() que lorsqu'on connait les patterns, et utiliser une combo fgets()/strtod() ( ou fgets()/strtol() ), qu'il est bien utile de connaître.
Marsh Posté le 18-09-2005 à 23:45:11
Bonjour à tous,
Je m'initie au langage c pour appliquer des exos que l'on fait en algorithme. Je trouve le langage C très proche de la version algorithmique d'ailleur.
Donc j'ai transcrit un algorithme pour faire la moyenne en C avec l'aide de quelques tutos: (ya plein de problèmes en plus quand on programme quand même)
Il fonctionne super bien, j'adore ça Le seul problème c'est que j'obtient obligatoirement un résultat entier, et pourtant la variable "moy" est en float.
Je ne comprends pas.
Merci.
Message édité par ngkreator le 19-09-2005 à 11:18:52