Я работаю над программой, которая, учитывая список значений (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;
}
Вашего расчета режима очень неэффективно. Представьте себе, есть ли 1000 номеров - ваш вложенный цикл 'for' будет итерировать миллион раз, если бы было 10000 номеров, циклы повторялись бы сто миллионов раз, другими словами,« O (n * n) ». Для отсортированного списка режим может быть рассчитан в одном цикле за один проход через данные. Даже для несортированного списка режим может быть рассчитан более эффективно. – PaulMcKenzie
Помимо вопроса, который, как я думаю, ответил ниже, я очень подозрительно отношусь к понятию «режим» при применении к набору значений ** 'double' **. Если у вас есть представление о диапазоне чисел, затем разделите их на подходящие бункеры и подсчитайте количество в каждом ящике. («Std :: map» может быть подходящей структурой для хранения отсчетов.) –