2012-03-10 4 views
0

Моя программа должна анализировать файл csv и идентифицировать недостающую комбинацию чисел. Заказ не имеет значения.Почему моя программа работает правильно

Программа компилирует и запускает, но распечатывает номера, которые уже напечатаны в строке в файле.

ввода (mega2.csv):

123 
134 
142 

234 Примечание не в списке.

Ожидаемый результат: Программа должна выводить 234, так как это единственная комбинация не используется. Вместо этого ничего не выдает.

Код:

#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

Измените свой вопрос, чтобы иметь более описательное название и удалить части кода, которые не имеют отношения к делу. Перед публикацией вы должны запустить точный код, который вы публикуете, и убедиться, что в нем возникла проблема. –

+2

Ваше название кажется слишком расплывчатым. –

+3

«В коде есть какие-то ненужные вещи, они ничего не влияют, просто игнорируйте их». Как насчет удаления ненужных частей и предоставления нам [Short, Self Contained, Correct (Compilable), Example] (http://sscce.org/)? Это облегчило бы вам сообщество StackOverflow. См. Также http://tinyurl.com/so-hints – Johnsyweb

ответ

1
int count; 

в main() никогда не инициализируется так, он содержит неопределенное значение.
Инициализировать его первым:

int count = 0; 

EDIT:
Для тех, кто опоздал на вечеринку или для тех, кто downvoted в спешке, не потрудившись даже прочитать код:

Есть два count переменные, являющиеся используется здесь. Один в области main() и другой внутри цикла do-while. count внутри цикла инициализируется, но count в main() нет, и это тот, который используется в состоянии do-while.

Здесь small snippet, который демонстрирует, о чем я говорю, если у кого-то еще есть проблемы, понимающие это.

+0

count также является его локальной переменной .... и он уже инициализировал его ... –

+2

@ShashankKadne: Если мои глаза не предают меня, 'count' используется в' do-while', это тот, который объявлен в области 'main()' и это никогда не инициализируется. –

+0

Я могу видеть int count = 0 внутри его do-while –

0

Ваш алгоритм обнаружения недостающей комбинации с использованием rand() выглядит очень подозрительно. Но я предполагаю, что это какое-то упражнение, поэтому я оставлю вас понять это для себя.

Некоторая проблема, с которой вам нужно обратиться с кодом, который приведет к запутанному поведению, как вы видите.

  • Только одна из ваших переменных инициализирована. Они должны все быть инициализирован, как это:

    string fileName = "mega2.csv"; 
    
  • У вас есть две переменные, называемые count. Вы должны переименовать их (и другие сильно названные переменные). Что они подсчитывают?

  • Вы не проверить, был ли открыт успешный файл и действовать соответствующим образом, если это не так:

     if (!inFile) 
         { 
          std::cerr << "Could not open file [" << fileName << "]. Exiting." << std::endl; 
          break; 
         } 
    
  • Вы не проверять, были ли переменные читать из файла успешно и действовать соответствующим образом, если они не. Учитывая, что вы пытаетесь прочитать три значения, разделенные запятыми, из вашего файла, но ваш входной файл не содержит запятых, это, вероятно, будет проблемой!

  • Вы не проверяете ввод пользователя.

    cout << "Enter number of plays (or -number to quit): "; 
    if (!(cin >> amount)) 
    { 
        std::cerr << "Invalid input" << std::endl; 
        break; 
    } 
    
  • У вас неиспользованные переменные. Удалите их.

Кроме того, ваш main() делает слишком много. Попробуйте разбить свой код на гораздо более мелкие компоненты. Это облегчит вам тестирование, а другим - чтение.

Смежные вопросы