2017-01-07 3 views
0

Я работаю над программой, которая, учитывая список значений (double s) из входного файла, сортирует их по возрастанию и вычисляет mode, и распечатать результат в выходном файле. Это то, к чему я придумал.C++ 11 - Ошибка в режиме расчета в векторе чисел

Что нужно сделать, это назначить режим x-м элементу вектора, который производит большее значение для current, но когда я запускаю эту программу, режим всегда равен последнему элементу вектора.

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

Любая помощь очень ценится.

#include <iostream> 
#include <cmath> 
#include <algorithm> 
#include <vector> 
#include <fstream> 
using namespace std; 

int main() 
{ 
    ifstream iFile("inp.txt"); 
    if(!iFile) 
    { 
     cout << "Error input!" << endl; 
     return -1; 
    } 

    ofstream oFile("out.txt"); 
    if(!oFile) 
    { 
     cout << "Error output!" << endl; 
     return -1; 
    } 

    double data; 
    vector<double> list; 

    while(iFile >> data) 
    { 
     list.push_back(data);    //put the elements in a vector 
     sort(list.begin(), list.end());  //and sort them in ascending order 
    } 

    for(int m = 0; m < list.size(); ++m) //this is just 
    {          //to verify 
     oFile << list[m] << endl;   //that the elements 
    }          //are listed in order 

    int current = 0; 
    int previous = 0; 
    int mode = 0; 
    for(int x = 0; x < list.size(); ++x)  //select an element of the vector 
    { 
     for(int y = 0; y < list.size(); ++y) //match it against all the other elements of the vector 
     { 
      if(list[x] == list[y])    //if they're of equal value 
      { 
       ++current;      //add 1 to variable "current" 
      } 
     } 

     if(current > previous)     //if "current" > "previous" 
      { 
       mode = list[x];     //set the element "x" (from the first for) of the vector "list" to be the new mode 
       current = previous;    //and set current to be the new previous  
      } 

     current = 0;       //reset current to 0 
    } 

    oFile << "\nmode: " << mode << endl;  //output "mode" 

    return 0; 
} 
+0

Вашего расчета режима очень неэффективно. Представьте себе, есть ли 1000 номеров - ваш вложенный цикл 'for' будет итерировать миллион раз, если бы было 10000 номеров, циклы повторялись бы сто миллионов раз, другими словами,« O (n * n) ». Для отсортированного списка режим может быть рассчитан в одном цикле за один проход через данные. Даже для несортированного списка режим может быть рассчитан более эффективно. – PaulMcKenzie

+0

Помимо вопроса, который, как я думаю, ответил ниже, я очень подозрительно отношусь к понятию «режим» при применении к набору значений ** 'double' **. Если у вас есть представление о диапазоне чисел, затем разделите их на подходящие бункеры и подсчитайте количество в каждом ящике. («Std :: map» может быть подходящей структурой для хранения отсчетов.) –

ответ

1

Try с

previous = current; 

вместо

current = previous; 

в последнем if или previous когда-либо равен нулю, а последняя x (соответствие с самим собой, когда y равно x) сгенерируйте current больше, чем previous (то есть нуль).

OT: смотреть на эту while

while(iFile >> data) 
{ 
    list.push_back(data);    //put the elements in a vector 
    sort(list.begin(), list.end());  //and sort them in ascending order 
} 

Там нет необходимости сортировать вектор после каждой вставки. Я предлагаю вам добавить в list все содержимое входного файла и, после, сортировать вектор. Только один раз, только после последней вставки.

Что-то вроде

while(iFile >> data) 
{ 
    list.push_back(data); //put the elements in a vector 
} 

sort(list.begin(), list.end()); //and sort them only one time 
+0

Это сработало! Удивительно, это было так просто. Спасибо. –

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