Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4682 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1202008
ngkreator
Posté le 18-09-2005 à 23:45:11  profilanswer
 

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
mood
Publicité
Posté le 18-09-2005 à 23:45:11  profilanswer
 

n°1202015
Emmanuel D​elahaye
C is a sharp tool
Posté le 18-09-2005 à 23:56:30  profilanswer
 

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/
n°1202027
ngkreator
Posté le 19-09-2005 à 00:21:38  profilanswer
 

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
n°1202065
Emmanuel D​elahaye
C is a sharp tool
Posté le 19-09-2005 à 09:21:24  profilanswer
 

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/
n°1202240
ngkreator
Posté le 19-09-2005 à 11:27:00  profilanswer
 

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.

n°1202249
chrisbk
-
Posté le 19-09-2005 à 11:35:52  profilanswer
 

Citation :

striqtement


 
[:pingouino]

n°1202459
Sve@r
Posté le 19-09-2005 à 14:51:20  profilanswer
 

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

n°1202901
ngkreator
Posté le 20-09-2005 à 07:35:08  profilanswer
 

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.  

n°1202902
Emmanuel D​elahaye
C is a sharp tool
Posté le 20-09-2005 à 08:26:00  profilanswer
 

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/
n°1202915
ngkreator
Posté le 20-09-2005 à 08:58:59  profilanswer
 

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.

mood
Publicité
Posté le 20-09-2005 à 08:58:59  profilanswer
 

n°1203005
Sve@r
Posté le 20-09-2005 à 10:20:52  profilanswer
 

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
n°1203022
Elmoricq
Modérateur
Posté le 20-09-2005 à 10:37:34  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Resultat d'une requete parametre dans zone de liste !!Comment passer un chiffre a virgule sur une autre page?
recuperer le resultat d'une execution javascriptAfficher le résultat d'une requête PHP et MySQL
Resultat trie d'une recherche avec FileSearchXint : nouvelle bibliothèque C++ pour très grands entiers.
calculer une moyenne en enlevant avant deux données...[RESOLU] Récupérer résultat d'1 requête SQL dans 1 script bourne shell
2chiffres apres la virguleProblème dans mon code, résultat étrange
Plus de sujets relatifs à : [C] Moyenne d'entiers -> résultat à virgule


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)