Petit logiciel qui ne fonctionne pas toujours

Petit logiciel qui ne fonctionne pas toujours - C++ - Programmation

Marsh Posté le 25-05-2006 à 11:06:59    

Bonjour,
 
Je debute en C++ et pour m'entrainer j'ai essayer de faire un petit logiciel de statistique.... Mais la j'ai un probleme et je cale ...
En fait mon pogiciel ne fonctionne que des fois lorsque je lui demande la médiane et cela dépend des valeurs que je rentre au debut (mais lequels précisement je sais pas), les autre fois il se ferme directement sans rien affiché comme s'il efféctuer une fonction "quitter" mais de temp en temp il plante aussi, je suis obliger d'aller dans le gestionnaire des taches pour le fermer...
De plus Il y a quelque chose que je ne comprend pas dans le code (je l'ai mi en commentaire rouge et souligné) et je pense que ca peut venir de là mais...
 
Voici le code (il est peut être pas super mais bon je debute):
 

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. using namespace std;
  4.     float somme_val();
  5.     int somme_effect();
  6.     float somme_totale();
  7.     float liste();
  8.     int nbvaleurs, choix, med;
  9.     float moy;
  10.     float * pval = new float[nbvaleurs];
  11.     int * peffect = new int[nbvaleurs];
  12.     float * liste_val = new float[somme_effect()];
  13. int main(int argc, char *argv[])
  14. {
  15.     cout<<"rentrez le nombre de valeurs differentes."<<endl;
  16.     cin>>nbvaleurs;
  17.     for(int i=0; i<nbvaleurs; i++){
  18.             cout<<"rentrez une valeur";
  19.             cin>>pval[i];
  20.             cout<<"rentrez son effectif";
  21.             cin>>peffect[i];
  22.             }
  23.     for(int i=0; i<nbvaleurs; i++){
  24.             cout<<pval[i]<<"\t";
  25.             }
  26.     cout<<endl;
  27.     for(int i=0; i<nbvaleurs; i++){
  28.             cout<<peffect[i]<<"\t";
  29.             }
  30.     cout<<endl<<"pour calculer la moyenne tapez1, la mediane tapez2."<<endl;
  31.     cin>>choix;
  32.     switch(choix){
  33.                   case 1: moy = somme_totale()/somme_effect();
  34.                           cout<<"la moyenne est de:"<<moy<<endl;
  35.                           break;
  36.                   case 2: liste();//pour somme_effect impaire
  37.                           int j = somme_effect();
  38.                           med = ((j+1)/2)-1;//le -1 sert a cerner la bonne case du tableau.
  39.                           cout<<"la mediane est:\t"<<liste_val[med];
  40.                   }
  41.     delete pval, peffect, liste_val;
  42.     system("PAUSE" );
  43.     return EXIT_SUCCESS;
  44. }
  45.     float somme_val(){
  46.                 float x;
  47.                 for(int i=0; i<nbvaleurs; i++){
  48.                          x += pval[i];
  49.                          }
  50.                  return x;
  51.                  }
  52.     int somme_effect (){
  53.                  float x; //ici  si je met int pour correspondre au type de la fonction, la moyenne est fausse.
  54.                  for(int i=0; i<nbvaleurs; i++){
  55.                          x += peffect[i];
  56.                          }
  57.                  return x;
  58.                  }
  59.     float somme_totale(){
  60.                    float x;
  61.                    for(int i=0; i<nbvaleurs; i++){
  62.                           x += pval[i] * peffect[i];
  63.                           }
  64.                    return x;
  65.                    }
  66.     float liste(){
  67.           int m= 0;
  68.           for(int i=0; i<nbvaleurs; i++){
  69.                   for(int n=0; n<peffect[i]; n++){
  70.                           liste_val[m]= pval[i];
  71.                           m++;
  72.                           }
  73.                   }
  74.           }


 
 
 
 
 
PS: Je sais pas si le forum est fait pour vérifier des codes entiers mais bon, je ne sais pas a qui m'adresser..
 
Aidez-moi s'il vous plait.


Message édité par elephant13 le 25-05-2006 à 11:18:28
Reply

Marsh Posté le 25-05-2006 à 11:06:59   

Reply

Marsh Posté le 25-05-2006 à 11:33:40    

utilise std::vector<float>
 
et utilise ton compilateur correctement : t'as des dizaines de variables pas initialisées ...

Reply

Marsh Posté le 25-05-2006 à 11:40:19    

Dsl mais deja je ne connais pas std::vector<float> et de plus je ne voi pas de variable non innitialisées....

Reply

Marsh Posté le 25-05-2006 à 11:48:25    

tu lis pas les erreurs que te donne ton compilateur ????

Reply

Marsh Posté le 25-05-2006 à 11:49:33    

Il ne m'en donne pas.. sauf le commentaire mis en rouge et souligné...
Aytrement je me suis renseigné sur vector et vais essayer.

Reply

Marsh Posté le 25-05-2006 à 12:11:05    

Voila ce que j'ai fais.. pas super...

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <vector>
  4. using namespace std;
  5.     float somme_val();
  6.     int somme_effect();
  7.     float somme_totale();
  8.     float liste();
  9.     int nbvaleurs, choix, med;
  10.     float moy;
  11.     std::vector <float> pval (nbvaleurs);
  12.     std::vector <int> peffect (nbvaleurs);
  13.     std::vector <float> liste_val;
  14.    
  15.    
  16.    
  17. int main(int argc, char *argv[])
  18. {
  19.     cout<<"rentrez le nombre de valeurs differentes."<<endl;
  20.     cin>>nbvaleurs;
  21.    
  22.     for(int i=0; i<nbvaleurs; i++){
  23.             cout<<"rentrez une valeur";
  24.             cin>>pval[i];
  25.             cout<<"rentrez son effectif";
  26.             cin>>peffect[i];
  27.             }
  28.            
  29.     for(int i=0; i<nbvaleurs; i++){
  30.             cout<<pval[i]<<"\t";
  31.             }
  32.     cout<<endl;
  33.     for(int i=0; i<nbvaleurs; i++){
  34.             cout<<peffect[i]<<"\t";
  35.             }
  36.            
  37.     cout<<endl<<"pour calculer la moyenne tapez1, la mediane tapez2."<<endl;
  38.     cin>>choix;
  39.     switch(choix){
  40.                   case 1: moy = somme_totale()/somme_effect();
  41.                           cout<<"la moyenne est de:"<<moy<<endl;
  42.                           break;
  43.                   case 2: liste();
  44.                           int j = somme_effect();
  45.                           med = ((j+1)/2)-1;//le -1 sert a cerner la bonne ncase du tableua.
  46.                           cout<<"la mediane est:\t"<<liste_val[med];
  47.                                
  48.                        
  49.                   }
  50.     pval.clear();
  51.     peffect.clear();
  52.     liste_val.clear();
  53.                  
  54.     system("PAUSE" );
  55.     return EXIT_SUCCESS;
  56. }
  57.    
  58.     float somme_val(){
  59.                 float x;
  60.                 for(int i=0; i<nbvaleurs; i++){
  61.                          x += pval[i];
  62.                          }
  63.                  return x;
  64.                  }
  65.                
  66.     int somme_effect (){
  67.                  float x;
  68.                  for(int i=0; i<nbvaleurs; i++){
  69.                          x += peffect[i];
  70.                          }
  71.                  return x;
  72.                  }
  73.                
  74.     float somme_totale(){
  75.                    float x;
  76.                    for(int i=0; i<nbvaleurs; i++){
  77.                           x += pval[i] * peffect[i];
  78.                           }
  79.                    return x;
  80.                    }
  81.                  
  82.     float liste(){
  83.           for(int i=0; i<nbvaleurs; i++){
  84.                   for(int n=0; n<peffect[i]; n++){
  85.                           liste_val.push_back(pval[i]);
  86.                           }
  87.                   }
  88.           for(int i=0 ; i <liste_val.size() ; i++){
  89.           cout <<liste_val[i] << endl;}
  90.           }


 
J'essaye, j'essaye mais je n'arrive jamai a quelque chose qui fonctionne....

Reply

Marsh Posté le 25-05-2006 à 12:20:33    

#
   float somme_val(){
#
               float x;
 
 
mais bien sur ...

Reply

Marsh Posté le 25-05-2006 à 12:29:56    

Je sais pas si c'est un coup de chance ou si tu l'as fait exprès, mais déjà au départ tu initialises tes 2 premiers tableaux avec une taille égale à 0 ( merci les variables globales... :ange:), or, pour ton 3ème tableau tu fais appel à somme_effect().
 
code de somme_Effect

Code :
  1. int somme_effect (){
  2.                 float x;
  3.                  for(int i=0; i<nbvaleurs; i++)
  4.                  {
  5.                    x += peffect[i];
  6.                   }
  7.                 return x;
  8.                 }


 
x n'est pas initialisé et a donc un contenu indéterminé.
nbvaleurs est initialisé à 0 donc tu ne passes pas dans ta boucle for et tu renvois directement x avec son contenu indéterminé, alors après le tableau bonne chance pour qu'il ait la taille que tu veux...

Reply

Marsh Posté le 25-05-2006 à 12:47:03    

Reply

Marsh Posté le 25-05-2006 à 18:30:56    

Ouai effectivement vu de ce point.. Je n'y avait pas pensé

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <vector>
  4. using namespace std;
  5.     float somme_val();
  6.     float somme_effect();
  7.     float somme_totale();
  8.     float liste();
  9.     int nbvaleurs, choix, med;
  10.     float moy, med1;
  11.     std::vector <float> pval;
  12.     std::vector <int> peffect;
  13.     std::vector <float> liste_val;
  14.    
  15.    
  16.    
  17. int main(int argc, char *argv[])
  18. {
  19.     cout<<"rentrez le nombre de valeurs differentes."<<endl;
  20.     cin>>nbvaleurs;
  21.    
  22.     for(int i=0; i<nbvaleurs; i++){
  23.             int j;
  24.             cout<<"rentrez une valeur";
  25.             cin>>j;
  26.             pval.push_back(j);
  27.             cout<<"rentrez son effectif";
  28.             cin>>j;
  29.             peffect.push_back(j);
  30.             }
  31.            
  32.     for(int i=0; i<nbvaleurs; i++){
  33.             cout<<pval[i]<<"\t";
  34.             }
  35.     cout<<endl;
  36.     for(int i=0; i<nbvaleurs; i++){
  37.             cout<<peffect[i]<<"\t";
  38.             }
  39.            
  40.     cout<<endl<<"pour calculer la moyenne tapez1, la mediane tapez2."<<endl;
  41.     cin>>choix;
  42.     switch(choix){
  43.                   case 1: moy = somme_totale()/somme_effect();
  44.                           cout<<"la moyenne est de:"<<moy<<endl;
  45.                           break;
  46.                   case 2: liste();
  47.                           int j = static_cast<int>(somme_effect());
  48.                           med = ((j+1)/2)-1;//le -1 sert a cerner la bonne ncase du tableua.
  49.                           cout<<"la mediane est:\t"<<liste_val[med];
  50.                                
  51.                        
  52.                   }
  53.     pval.clear();
  54.     peffect.clear();
  55.     liste_val.clear();
  56.                  
  57.     system("PAUSE" );
  58.     return EXIT_SUCCESS;
  59. }
  60.    
  61.     float somme_val(){
  62.                 float x;
  63.                 for(int i=0; i<nbvaleurs; i++){
  64.                          x += pval[i];
  65.                          }
  66.                  return x;
  67.                  }
  68.                
  69.     float somme_effect (){
  70.                  float x;
  71.                  for(int i=0; i<nbvaleurs; i++){
  72.                          x += peffect[i];
  73.                          }
  74.                  return x;
  75.                  }
  76.                
  77.     float somme_totale(){
  78.                    float x;
  79.                    for(int i=0; i<nbvaleurs; i++){
  80.                           x += pval[i] * peffect[i];
  81.                           }
  82.                    return x;
  83.                    }
  84.                  
  85.     float liste(){
  86.           for(int i=0; i<nbvaleurs; i++){
  87.                   for(int n=0; n<peffect[i]; n++){
  88.                           liste_val.push_back(pval[i]);
  89.                           }
  90.                   }
  91.           for(int i=0 ; i <liste_val.size() ; i++){//affiche la liste du tableau
  92.           cout <<liste_val[i]<< endl;}
  93.           }


 
Voila le code avec quelque modif, il a l'air de marcher, qu'en pensez vous?


Message édité par elephant13 le 25-05-2006 à 18:31:39
Reply

Marsh Posté le 25-05-2006 à 18:30:56   

Reply

Marsh Posté le 25-05-2006 à 19:20:40    

non ca marche pas
on t'a deja dit que tes variables 'x' ne sont pas initialisées, pourquoi tu ne le fais pas ?
 
tu peux aussi largement simplifier en utilisant std::accumulate par exemple (et supprimer ces variables globales inutiles)
 

Reply

Marsh Posté le 25-05-2006 à 19:42:10    

Oui je peux simplifier peut-être maiis je prefere faire un code que je comprend plutot ke de recpopier betement des bouts de code un peu partout....
 
Autrement je vien seulement de comprendre ce que vous entendiez par initialisé, pour moi c'est par ex (int x) alors que pour vous c'est appliqué une valeur a x, non?
 
PS: ca fait a peu pres un mois que je me suis mis au c++ alors si vous pouviez parler un peu plus "francais" ca arrangerais les choses...
 

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <vector>
  4. using namespace std;
  5.     float somme_val();
  6.     float somme_effect();
  7.     float somme_totale();
  8.     void liste();
  9.     int nbvaleurs, choix;
  10.    
  11.     std::vector <float> pval;
  12.     std::vector <int> peffect;
  13.     std::vector <float> liste_val;
  14.    
  15.    
  16.    
  17. int main(int argc, char *argv[])
  18. {
  19.     cout<<"rentrez le nombre de valeurs differentes."<<endl;
  20.     cin>>nbvaleurs;
  21.    
  22.     for(int i=0; i<nbvaleurs; i++){
  23.             int j;
  24.             cout<<"rentrez une valeur";
  25.             cin>>j;
  26.             pval.push_back(j);
  27.             cout<<"rentrez son effectif";
  28.             cin>>j;
  29.             peffect.push_back(j);
  30.             }
  31.            
  32.     for(int i=0; i<nbvaleurs; i++){
  33.             cout<<pval[i]<<"\t";
  34.             }
  35.     cout<<endl;
  36.     for(int i=0; i<nbvaleurs; i++){
  37.             cout<<peffect[i]<<"\t";
  38.             }
  39.            
  40.     cout<<endl<<"pour calculer la moyenne tapez1, la mediane tapez2."<<endl;
  41.     cin>>choix;
  42.     switch(choix){
  43.                   case 1:float moy;
  44.                            moy = somme_totale()/somme_effect();
  45.                           cout<<"la moyenne est de:"<<moy<<endl;
  46.                           break;
  47.                   case 2: liste();
  48.                           int med;
  49.                           int j = static_cast<int>(somme_effect());
  50.                           med = ((j+1)/2)-1;//le -1 sert a cerner la bonne ncase du tableua.
  51.                           cout<<"la mediane est:\t"<<liste_val[med];
  52.                                
  53.                        
  54.                   }
  55.     pval.clear();
  56.     peffect.clear();
  57.     liste_val.clear();
  58.                  
  59.     system("PAUSE" );
  60.     return EXIT_SUCCESS;
  61. }
  62.    
  63.     float somme_val(){
  64.                 float x=0;
  65.                 for(int i=0; i<nbvaleurs; i++){
  66.                          x += pval[i];
  67.                          }
  68.                  return x;
  69.                  }
  70.                
  71.     float somme_effect (){
  72.                  float x=0;
  73.                  for(int i=0; i<nbvaleurs; i++){
  74.                          x += peffect[i];
  75.                          }
  76.                  return x;
  77.                  }
  78.                
  79.     float somme_totale(){
  80.                    float x=0;
  81.                    for(int i=0; i<nbvaleurs; i++){
  82.                           x += pval[i] * peffect[i];
  83.                           }
  84.                    return x;
  85.                    }
  86.                  
  87.     void liste(){
  88.           for(int i=0; i<nbvaleurs; i++){
  89.                   for(int n=0; n<peffect[i]; n++){
  90.                           liste_val.push_back(pval[i]);
  91.                           }
  92.                   }
  93.           for(int i=0 ; i <liste_val.size() ; i++){//affiche la liste du tableau
  94.           cout <<liste_val[i]<< endl;}
  95.           }


 
C'est mieux?


Message édité par elephant13 le 25-05-2006 à 19:46:12
Reply

Marsh Posté le 25-05-2006 à 20:25:55    

mêmes réflexions que hier ... des tonnes de variables pas initialisées. Sors-toi les mains des poches et mets toi au boulot.
 
et dégage toutes ces variables globales;

Reply

Marsh Posté le 25-05-2006 à 22:32:08    

JE COMPREND PAS CE QUE TU DIS.
Sors-toi les mains des poches et exprime toi explicitement!!!

Reply

Marsh Posté le 25-05-2006 à 22:50:01    

ouvre un dictionnaire et compare : initialiser et declarer.
Faudra aussi voir à prendre son vallium [:pingouino]

Reply

Marsh Posté le 26-05-2006 à 02:08:06    

elephant13 a écrit :

JE COMPREND PAS CE QUE TU DIS.
Sors-toi les mains des poches et exprime toi explicitement!!!


 
"Initialiser une variable" signifie grosso-modo "lui donner dès le départ une valeur connue avant de s'en servir"
 
J'ai pas regardé ton code mais apparemment tu as plein de variables dont les valeurs ne sont pas connues au départ. Si tu les remplis avant de les traiter ça peut passer mais si tu commences à les traiter avant de les remplir, ça va merder.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-05-2006 à 02:19:55    

elephant13 a écrit :

JE COMPREND PAS CE QUE TU DIS.
Sors-toi les mains des poches et exprime toi explicitement!!!


Figure 1 : des méfaits de la caféine en intraveineuse


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 26-05-2006 à 09:40:54    

Taz a écrit :

et dégage toutes ces variables globales;


 
je suis foutu, je commence à mettre des ; à la fin des phrases;

Reply

Marsh Posté le 26-05-2006 à 09:42:06    

Taz a écrit :

je suis foutu, je commence à mettre des ; à la fin des phrases;


[:ddr555]


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-05-2006 à 16:19:30    

Merci Sve@r,
Mai si mon premier traitement de la variable c'est lui donner une valeur grace a "cin" je n'est pas besoin de l'initialiser avant, non? Ou en ai l'interet?

Reply

Marsh Posté le 26-05-2006 à 20:18:28    

elephant13 a écrit :

Merci Sve@r,
Mai si mon premier traitement de la variable c'est lui donner une valeur grace a "cin" je n'est pas besoin de l'initialiser avant, non? Ou en ai l'interet?


 
Là, il y a généralement 2 attitudes
- je n'initialise que les variables qu'il faut, juste avant de m'en servir (faut être sûr de soi)
- j'initialise toutes mes variables dès le début comme ça je suis certain de ne pas en oublier
 
Personnellement je préfère la première, mais d'autres préfèrent la seconde. La seconde est généralement mieux quand on est en groupe de programmeurs car quand les programmeurs se plongent dans le code de leurs copains, ils n'ont pas envie de se faire chier à vérifier, en plus de leur boulot, si toutes les variables de leurs copains ont bien une valeur avant qu'elles soient utilisées...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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