C++11 - 计算数字向量中的模式时出错
C++11 - Error in calculating mode in a vector of numbers
我正在开发一个程序,给定输入文件中的值列表 (double
s),按升序对它们进行排序并计算 mode
,然后打印结果在输出文件中。这是我到目前为止想到的。
它应该做的是将模式分配给向量的第 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;
}
试试
previous = current;
而不是
current = previous;
在最后一个 if
或 previous
永远为零和最后一个 x
(当 y
等于 x
时与自身匹配)生成大于 previous
(即零)的 current
。
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
我正在开发一个程序,给定输入文件中的值列表 (double
s),按升序对它们进行排序并计算 mode
,然后打印结果在输出文件中。这是我到目前为止想到的。
它应该做的是将模式分配给向量的第 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;
}
试试
previous = current;
而不是
current = previous;
在最后一个 if
或 previous
永远为零和最后一个 x
(当 y
等于 x
时与自身匹配)生成大于 previous
(即零)的 current
。
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