Programme C++ , erreur ? Ou ça ?

Programme C++ , erreur ? Ou ça ? - C++ - Programmation

Marsh Posté le 11-10-2012 à 23:33:03    

Bonsoir
 
Je suis en train de faire un programme , demandant à l'utilisateur de rentrer des valeurs ( notes ) . On les additionne au fut et a mesure ( accumulateur ) , et calcule leur nombre au fur et à mesure .
J'ai bien réussi pour l'instant  
 
Cependant , maintenant , on me demande de calculer la moyenne au final , qui pourant parait très facile , mais lorsque je le compile , il ne veut pas l'afficher..
 
Voici un lien :  
Ps :Afficher des notes différents de -1 , et lorsque l'utilisateur tape -1 , tout doit être afficher ( nombre , somme , moyenne )
 
http://img4.hostingpics.net/pics/757659code.png
 
 
Merci beaucoup d'avance ( Ps2 : Je suis un peu fatigué , donc cela pourrait être une erreur d’inattention , je ne vois vraiment pas pourquoi cela n'affiche même pas au moins " La moyenne est .." )

Reply

Marsh Posté le 11-10-2012 à 23:33:03   

Reply

Marsh Posté le 12-10-2012 à 00:26:31    

Bonsoir !  
 
L'erreur est très simple : Il manque le " << endl" à la ligne 22.
 
En effet, le saut de ligne provoque le "flush" de la sortie standard et l'affichage effectif de ce qui a été demandé, sinon, tout est gardé en mémoire en attendant le prochain saut de ligne.
 
En fin de programme, le comportement dépend de l'OS : Sous Linux, la dernière ligne aurait été affichée juste avant le "prompt" (ce qui aurait été équivalent à l'affichage "La moyenne est de : 3.3333 C:\C++\TP2>" ), tandis que sous Windows il semble que le contenu de ce qui n'a pas encore été affiché soit perdu.
 
Bonne continuation en C++ !

Reply

Marsh Posté le 12-10-2012 à 00:53:44    

Salut
 
Je viens de rajouter << endl;
 
La moyenne ne s'affiche toujours pas .

Reply

Marsh Posté le 12-10-2012 à 08:04:12    

Bonjour !  
 
C'est très étrange ...
 
Pouvez-vous copier / coller votre code (même si la copie d'écran est , a priori, très parlante ...) ?  
 
(Ceci serait plus simple pour faire des essais sur nos machines :)

Reply

Marsh Posté le 12-10-2012 à 10:01:12    

Salut ,  
 
le voici :
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. int main ()
  4. {
  5. float note =0 , accumulateur=0 , nombre =0 ;
  6. float moyenne =0;
  7. while ( note != -1)
  8. {
  9.    cout << "Saisir une note : " ;
  10.    cin >> note;
  11.  
  12.   if (note == -1)
  13. {
  14.      nombre = nombre +0;
  15.      accumulateur = accumulateur +0;
  16.  moyenne = accumulateur/nombre ;
  17.      cout << "Fin de la saisie ! " << " " << "La somme vaut :" << accumulateur << endl;
  18.  cout << "Le nombre de valeurs est : " << nombre << endl;
  19.  cout << "La moyenne est de :" << moyenne << endl;
  20.    }
  21.     else if ( note != -1)
  22. {
  23.  nombre = nombre +1;
  24.      accumulateur= accumulateur + note;
  25.  cout << "Le nombre de valeur est :" << nombre << endl;
  26.      cout << "La somme des valeurs est :" << accumulateur << endl;
  27.    }
  28. }
  29. return 0;
  30. }

Reply

Marsh Posté le 12-10-2012 à 10:38:41    

Attention aux floats et aux comparaisons tout de même.
Les note, accumulateur et nombre devraient être des entiers. Moyenne (et son calcul lui-même) sont bien en float.
 
Cela dit, j'ai du mal à croire que l'ajout du endl ne résolve pas l'affichage de moyenne ...
 
Edit : D'ailleurs ... J'obtiens ca avec le code collé en dernier.

$ ./a.exe
Saisir une note : 2
Le nombre de valeur est :1
La somme des valeurs est :2
Saisir une note : 3
Le nombre de valeur est :2
La somme des valeurs est :5
Saisir une note : 5
Le nombre de valeur est :3
La somme des valeurs est :10
Saisir une note : -1
Fin de la saisie !  La somme vaut :10
Le nombre de valeurs est : 3
La moyenne est de :3.33333


Message édité par theshockwave le 12-10-2012 à 10:40:20

---------------
last.fm
Reply

Marsh Posté le 12-10-2012 à 10:44:11    

C'est bon ça s'est arrangé :)
 
Merci encore !
 
Edit :: diviser un entier par un autre entier conduit à calculer le quotient entier de la division euclidienne. Si on veut calculer une division réelle, il suffit que'un des arguments ( accumulateur par exemple ) soit un réel . Si l'accumulateur est un réel, je pense signale qu'il serait logique que la variable note le soit aussi.

Message cité 1 fois
Message édité par Bloupies le 12-10-2012 à 10:47:59
Reply

Marsh Posté le 12-10-2012 à 11:49:22    

Bloupies a écrit :

C'est bon ça s'est arrangé :)
 
Merci encore !
 
Edit :: diviser un entier par un autre entier conduit à calculer le quotient entier de la division euclidienne. Si on veut calculer une division réelle, il suffit que'un des arguments ( accumulateur par exemple ) soit un réel . Si l'accumulateur est un réel, je pense signale qu'il serait logique que la variable note le soit aussi.


 
tu as bien retenu ton cours, mais ton raisonnement est erroné ici. Tu peux très bien conserver tes variables entières et faire :

Code :
  1. moyenne = accumulateur/float(nombre)


 
Ce qui revient exactement à ce que tu veux.


---------------
last.fm
Reply

Marsh Posté le 12-10-2012 à 18:07:45    

theshockwave a écrit :


Code :
  1. moyenne = accumulateur/static_cast<float>(nombre)




 
 :o  

Reply

Marsh Posté le 12-10-2012 à 18:55:49    


Tu as quelque chose à reprocher fondamentalement aux constructeurs ? :)


---------------
last.fm
Reply

Marsh Posté le 12-10-2012 à 18:55:49   

Reply

Marsh Posté le 15-10-2012 à 14:11:29    

c'est pas grepable

Reply

Marsh Posté le 15-10-2012 à 15:31:03    

certes ;)

Reply

Marsh Posté le 15-10-2012 à 16:07:55    

Joel F a écrit :

c'est pas grepable


mbof ... greper un static_cast<float> ou un float(, ca ne change pas vraiment la donne. Ca ressemble plus à une question de convention.


---------------
last.fm
Reply

Marsh Posté le 16-10-2012 à 08:41:21    

float(int,int)  est un truc valide qui n'a pas de rapport avec un cast

Reply

Marsh Posté le 16-10-2012 à 10:53:28    

Bah dans ce cas, profites-en pour éclairer ma lanterne, parce que je ne vois pas ce que ca veut dire et le compilo que j'ai sous le coude n'en veut pas
 
Edit : mes deux compilos n'en veulent pas :

Code :
  1. error: functional cast expression list treated as compound expression


Code :
  1. error C2564: 'float' : a function-style conversion to a built-in type can only take one argument


Message édité par theshockwave le 16-10-2012 à 10:56:33

---------------
last.fm
Reply

Marsh Posté le 17-10-2012 à 20:51:40    

float(int,int) est un type fonction prenant 2 int et renvoyant un float.
 
la subtilité est bien type fonction, pas pointeur de fonction. C'ets le seul type utilisabel en C++ sans qu'on puisse en faire une instance. Ca sert dans des astuces de metaprogrammation pour passer un unique type composite à des classes templates. L'exemple d'applciation classique est std::result_of
 
typedef std::result_of< float(int,int)>::type type;

Reply

Marsh Posté le 18-10-2012 à 11:31:06    

:jap:


---------------
last.fm
Reply

Marsh Posté le 18-10-2012 à 18:34:03    

Voilà, j'avais donc raison et maintenant je sais pourquoi  :D

Reply

Sujets relatifs:

Leave a Replay

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