2012-03-10 5 views
0

Mon programme doit analyser un fichier csv et identifier une combinaison de nombres manquante. L'ordre n'a pas d'importance.Pourquoi mon programme ne fonctionne pas correctement

Le programme compile et s'exécute, mais imprime les nombres qui sont déjà imprimés dans une ligne dans le fichier.

entrée (mega2.csv):

123 
134 
142 

Remarque 234 est pas dans la liste.

Sortie prévue: Le programme est censé sortie 234 car il est la seule combinaison non utilisée. Au lieu de rien ne sort.

code:

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <string> 
#include <cstdlib> 
#include <ctime> 
#include <cmath> 
using namespace std; 

int main() 
{ 

    ifstream inFile; 
    string value; 
    string fileName; 
    int count; 
    int amount, playCount; 
    int a,b,c,d,e,f,g,h,i,j,k,l; 
    srand(time(0)); 
    char ch; 


do{ 

    cout << "Enter number of plays (or -number to quit): "; 

    cin >> amount; 

    cout << endl; 

    playCount = 1; 

    while(playCount <= amount){ 

     do{ 

      inFile.open("mega2.csv"); 

      //create random numbers a,b,c,d,e,f= mega num < 10 

      a = rand() % 5; 

      if(a == 0){a = 1;} 

      do{ 
      b = rand() % 5; 

      if(b == 0){b = 1;} 
      }while(b == a); 

      do{ 
      c = rand() % 5; 

      if(c == 0){c = 1;} 
      }while(c == a || c == b); 




      //Load numbers into g,h,i,j,k,l 

      do{ 


      inFile >> g; 
      inFile.get(ch); 
      inFile >> h; 
      inFile.get(ch); 
      inFile >> i; 
      inFile.get(ch); 

     int count = 0; 

     cout << g << "," << h << "," << i << endl; 



    //A  
    if(a == g || a == h || a == i){ 

     count++; 
    } 

    //B 
    if(b == g || b == h || b == i){ 

     count++; 
    } 

    //C 
    if(c == g || c == h || c == i){ 

     count++; 
    } 



}// close second half do loop 

    while(inFile && count < 3); 

    inFile.close(); 
    inFile.clear(); 


} // close whole do loop 

    while(count >= 3); 

    cout << endl; 
    cout << endl; 
    cout << endl; 

    cout << a << "," << b << "," << c << endl; 

    cout << endl; 

    playCount++; 

} // End playCount while loop 

}// End main do loop 

while(amount >= 0); // quit program with negative number 

    system("pause"); 
    return 0; 
} 
+0

S'il vous plaît modifier votre question pour avoir un titre plus descriptif et supprimer les parties du code qui sont hors de propos. Avant de poster, vous devez exécuter le code exact que vous publiez et assurez-vous que le problème se produit. –

+2

Votre titre semble trop vague. –

+3

"Il y a des choses inutiles dans le code, elles n'affectent rien, il suffit de les ignorer." Que diriez-vous de supprimer les parties non pertinentes et de nous fournir un [Short, Self Contained, Correct (Compilable), Exemple] (http://sscce.org/)? Cela faciliterait la tâche de la communauté StackOverflow. Voir aussi http://tinyurl.com/so-hints – Johnsyweb

Répondre

1
int count; 

dans le main() est jamais initialisées il contient une valeur indéterminés.
lsinitialisez premier:

int count = 0; 

EDIT:
Pour ceux en retard à la fête ou pour ceux qui downvoted à la hâte sans prendre la peine de lire réellement le code:

Il y a deux count variables étant utilisé ici. Un dans la portée de main() et un autre dans la boucle do-while. Le count à l'intérieur de la boucle est initialisé mais le count dans main() ne l'est pas et c'est celui qui est utilisé dans la condition de do-while.

Voici un small snippet qui démontre de quoi je parle si quelqu'un a encore des difficultés à comprendre cela.

+0

count est aussi sa variable locale .... et il l'a déjà initialisée ... –

+2

@ShashankKadne: À moins que mes yeux me trahissent, le «compte» utilisé dans «do-while» est celui déclaré dans le champ d'application de 'main()' et qui n'est jamais initialisé. –

+0

Je peux voir int count = 0 à l'intérieur de son do-while –

0

Votre algorithme pour détecter la combinaison manquante en utilisant rand() semble profondément suspect. Mais je suppose que c'est une sorte d'exercice, alors je vais vous laisser imaginer cela par vous-même.

Problème que vous devez résoudre avec votre code, ce qui entraînera un comportement confus comme vous le voyez.

  • Une seule de vos variables est initialisée. Ils devraient tous être initialisés, comme ceci:

    string fileName = "mega2.csv"; 
    
  • Vous avez deux variables appelées count. Vous devriez les renommer (et d'autres variables mal nommées). Que comptent-ils?

  • Vous n'êtes pas vérifier si le fichier a été ouvert avec succès et agir de façon appropriée s'il n'est pas:

     if (!inFile) 
         { 
          std::cerr << "Could not open file [" << fileName << "]. Exiting." << std::endl; 
          break; 
         } 
    
  • Vous n'êtes pas vérifier si les variables ont été lues dans un fichier avec succès et agir de façon appropriée si ils ne sont pas. Étant donné que vous essayez de lire trois valeurs séparées par des virgules à partir de votre fichier, mais que votre fichier d'entrée ne contient aucune virgule, cela risque d'être un problème!

  • Vous ne validez pas l'entrée de l'utilisateur.

    cout << "Enter number of plays (or -number to quit): "; 
    if (!(cin >> amount)) 
    { 
        std::cerr << "Invalid input" << std::endl; 
        break; 
    } 
    
  • Vous avez des variables inutilisées. Enlevez-les.

De plus, votre main() en fait beaucoup trop. Essayez de décomposer votre code en composants beaucoup plus petits. Cela vous permettra de tester plus facilement et d'en lire d'autres.

Questions connexes