我有以下形式的一组数据:
a1 b1 c1 d1
a2 b2 c2 d2
...
an bn cn dn
我的目标是找到c列最小值的行。
我做了以下事情:
const int limit=100000;
float Array[limit][4];
int main() {
double a, b, c, d, smallest, ref1, ref2;
ifstream in("data.dat");
int idx=-1, point;
while(!in.eof()) {
idx++;
in >> a >> b >> c >> d;
Array[idx][0]=a; Array[idx][1]=b; Array[idx][2]=c; Array[idx][3]=d;
} \\end of while
in.close();
int count=idx;
for(int i=1; i<count; i++) {
ref1= Array[0][2];
ref2 = Array[i][2];
if(ref2 < ref1) {ref1 = ref2; point=i;} //I thought this will save the smallest value
smallest = ref1; point= i;
} \\end for
cout << "point" << Array[point][0] << Array[point][1] << .. etc.
return 0;
}
但是,输出是数据中的最后一点。 (在输入这个问题时,我意识到ref1将始终是Array [0] [2],因为读取了新行。所以现在我完全迷失了!)
如何将一个点保存为参考点,以便将其与其余数据进行比较,并且每次与较小的点进行比较时它会变为较小的值?
UPDATE :我通过采用ref1 = Array [0] [2]来解决这个问题。离开for循环。
答案 0 :(得分:3)
要证明您在一组值中找到了最小值,请将您的for循环更改为以下内容:
int smallest_val = std::numeric_limits<int>::max();
for(int i=0; i < idx; i++)
{
if (Array[i][2] < smallest_val)
smallest_val = Array[i][2];
}
基本上,您可以将smallest_val
设置为使用std::numeric_limits<int>::max()
可能拥有的最大可能值。现在,数组中的每个值必须至少与smallest_value
或更小(没有任何东西可以更大)一样大。当您遍历数组时,一旦您点击的值小于当前smaller_value
中的值,您就可以正确地将smaller_value
中的值重新分配给该新的较低值。通过以int
类型表示的最大可能值开始,可以避免在最小值相对于彼此的情况下遇到的问题。使用数学归纳法,这种方法对于你在这里尝试做的事情是不必要的。
答案 1 :(得分:3)
你应该像我在循环外设置引用并更新最小的顺便说一下,不要将浮动与双打混合但是这里有一个示例代码:
#include <iostream>
#include <fstream>
using namespace std;
const int limit=100000;
float Array[limit][4];
int main() {
double a, b, c, d, smallest, ref1, ref2;
ifstream in("data.dat");
int idx=-1, point;
while(!in.eof()) {
idx++;
in >> a >> b >> c >> d;
Array[idx][0]=a;
Array[idx][1]=b;
Array[idx][2]=c;
Array[idx][3]=d;
} //end of while
in.close();
int i = 0;
int count;
smallest = Array[i][2];
for( i=1; i<count; i++) {
ref2 = Array[i][2];
if(ref2 < smallest) {
smallest = ref2;
point=i;
}
}
std::cout << "point" << Array[point][0] << " "
<< Array[point][1] << " "
<< Array[point][2] << " "
<< Array[point][3] << std::endl;
return 0;
}
使用数据文件
1 2 3 4
2 3 8 9
1 3 5 2
1 1 1 1
2 4 2 4
3 1 0 1
HTH
答案 2 :(得分:1)
另一方面,输入循环控制不正确:
while(!in.eof()) {
在读取失败之前,eof()不会被触发。在实践中,这意味着输入循环执行一次额外的时间,并且您在上次通过时获得无意义的值。
正确的测试是
while(in >> a >> b >> c >> d) {
如果任何提取器失败(希望因为in
位于输入的末尾,则while循环将结束。
答案 3 :(得分:0)
这里的问题是你永远不会与你最小的人比较。您可以在ref1和ref2之间分配最低值,而无需考虑先前的迭代。此外,ref1始终是数据中的第一个值,因此如果最后一个值大于第一个值,则最小值始终是最后一个值。将循环更改为Jason发布的内容将解决您的问题。