[C] Moyenne d'entiers -> résultat à virgule

Moyenne d'entiers -> résultat à virgule [C] - C - Programmation

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)
 

Code :
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int n;
  5. int x;
  6. int som=0;
  7. float moy;
  8. int i=0;
  9. int j=1;
  10. printf("Bienvenue dans le programme de calcul de moyenne\n---------\n\nDe combien de nombres souhaitez vous faire la moyenne?:\n" );
  11. scanf("%d",&n);
  12. while(i<n){
  13.            printf("\nEntrer la valeur du %deme nombre:",j);
  14.            scanf("%d",&x);
  15.            som=som+x;
  16.            i=i+1;
  17.            j=j+1;
  18. }
  19. moy=som/n;   
  20.  
  21. printf("\n\nLa moyenne de cette liste de nombres est %f\n\n",moy);
  22. system("PAUSE" );
  23. }


 
Il fonctionne super bien, j'adore ça :D 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 cité 1 fois
Message édité par ngkreator le 19-09-2005 à 11:18:52
Reply

Marsh Posté le 18-09-2005 à 23:45:11   

Reply

Marsh Posté le 18-09-2005 à 23:56:30    

Attention a bien utiliser les balises 'fixed' ou 'cpp'...

ngkreator a écrit :



#include <stdio.h>
int main(void)
 {
<...>
 }


Le seul problème c'est que j'obtient obligatoirement un résultat entier, et pourtant la variable "moy" est en float.


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


Message édité par Emmanuel Delahaye le 19-09-2005 à 00:01:44

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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 :
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int n;
  5. int x;
  6. int som=0;
  7. float moy;
  8. int i=0;
  9. int j=1;
  10. printf("Bienvenue dans le programme de calcul de moyenne\n---------\n\nDe combien de nombres souhaitez vous faire la moyenne?:\n" );
  11. scanf("%d",&n);
  12. while(n<=0){ printf("Veuillez entrer un nombre striqtement positif\n" );
  13.              scanf("%f",&n);
  14. }
  15. while(i<n){
  16.            printf("\nEntrer la valeur du %deme nombre:",j);
  17.            scanf("%d",&x);
  18.            som=som+x;
  19.            i=i+1;
  20.            j=j+1;
  21. }
  22. moy=som/n;   
  23.  
  24. printf("\n\nLa moyenne de cette liste de nombres est %f\n\n",moy);
  25. system("PAUSE" );
  26. }

Message cité 1 fois
Message édité par ngkreator le 19-09-2005 à 11:19:59
Reply

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...


../main.c: In function `main_':
../main.c:28: warning: float format, different type arg (arg 2)
 
../main.c:43: error: implicit declaration of function `system'
 
../main.c:43: warning: nested extern declaration of `system'


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...


Message édité par Emmanuel Delahaye le 19-09-2005 à 09:30:18

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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.

Reply

Marsh Posté le 19-09-2005 à 11:35:52    

Citation :

striqtement


 
[:pingouino]

Reply

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.
 
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.


 
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".

Reply

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.  

Reply

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.
 
Voilà si j'arrive à résoudre ça le programme sera nickel.


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.  


Encore une fois, tu n'écoutes rien... C'est desespérant...


Message édité par Emmanuel Delahaye le 20-09-2005 à 08:27:59

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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.

Reply

Marsh Posté le 20-09-2005 à 08:58:59   

Reply

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.
 
Mais merci encore pour ton aide.


 
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"


Message édité par Sve@r le 20-09-2005 à 10:24:51
Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed