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

  FORUM HardWare.fr
  Programmation
  C++

  Petit logiciel qui ne fonctionne pas toujours

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Petit logiciel qui ne fonctionne pas toujours

n°1374788
elephant13
Posté le 25-05-2006 à 11:06:59  profilanswer
 

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
mood
Publicité
Posté le 25-05-2006 à 11:06:59  profilanswer
 

n°1374807
Taz
bisounours-codeur
Posté le 25-05-2006 à 11:33:40  profilanswer
 

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

n°1374812
elephant13
Posté le 25-05-2006 à 11:40:19  profilanswer
 

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

n°1374822
kirua_sama
Learn sciences with senses
Posté le 25-05-2006 à 11:48:25  profilanswer
 

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

n°1374826
elephant13
Posté le 25-05-2006 à 11:49:33  profilanswer
 

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

n°1374845
elephant13
Posté le 25-05-2006 à 12:11:05  profilanswer
 

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

n°1374852
Taz
bisounours-codeur
Posté le 25-05-2006 à 12:20:33  profilanswer
 

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

n°1374857
LePhasme
Les Belges domineront le monde
Posté le 25-05-2006 à 12:29:56  profilanswer
 

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

n°1374867
skelter
Posté le 25-05-2006 à 12:47:03  profilanswer
 
n°1375008
elephant13
Posté le 25-05-2006 à 18:30:56  profilanswer
 

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
mood
Publicité
Posté le 25-05-2006 à 18:30:56  profilanswer
 

n°1375033
skelter
Posté le 25-05-2006 à 19:20:40  profilanswer
 

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)
 

n°1375050
elephant13
Posté le 25-05-2006 à 19:42:10  profilanswer
 

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
n°1375081
Taz
bisounours-codeur
Posté le 25-05-2006 à 20:25:55  profilanswer
 

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;

n°1375169
elephant13
Posté le 25-05-2006 à 22:32:08  profilanswer
 

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

n°1375184
Joel F
Real men use unique_ptr
Posté le 25-05-2006 à 22:50:01  profilanswer
 

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

n°1375308
Sve@r
Posté le 26-05-2006 à 02:08:06  profilanswer
 

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.
n°1375312
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 26-05-2006 à 02:19:55  profilanswer
 

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)
n°1375347
Taz
bisounours-codeur
Posté le 26-05-2006 à 09:40:54  profilanswer
 

Taz a écrit :

et dégage toutes ces variables globales;


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

n°1375348
Sve@r
Posté le 26-05-2006 à 09:42:06  profilanswer
 

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.
n°1375634
elephant13
Posté le 26-05-2006 à 16:19:30  profilanswer
 

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?

n°1375743
Sve@r
Posté le 26-05-2006 à 20:18:28  profilanswer
 

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.
mood
Publicité
Posté le   profilanswer
 


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

  Petit logiciel qui ne fonctionne pas toujours

 

Sujets relatifs
Comment fonctionne le md5 dans les .htpasswd ?petit php
petit probleme de selection multiple avec date[SHELL] petit script facil mais gros soucit
Besoin de quelques pro pour un petit logLogiciel de blog ?
TextBox : Petit carré devant chaque saut de ligneessai de group by (ne fonctionne pas vraiment)
Logiciel pour laboratoireQuel CMS pour un petit site de musique ?
Plus de sujets relatifs à : Petit logiciel qui ne fonctionne pas toujours


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR