我是stackoverflow的新手,因为我是编程新手,但我并不是一个'专业和狂热的程序员'。爱好者可能但不专业......
在我的一些初学者代码的一部分中,我有一个二维数组diff[i][j]
,其中i==j
的值为零。我试图获得每行中的最小值,但不是零值......
搜索第一行中最小的一部分代码(正在构建中)是:
i=1;
double smallest;
for ( j=1 ; j<=n ; j++ )
{
smallest = diff[i][j];
if ( j!=i && diff[i][j] < smallest )
smallest = diff[i][j];
}
printf("\n %lf\n", smallest);
然而,结果总是最大的数字而不是最小的数字。谁知道为什么??
P.S。我要感谢处理stackoverflow.com的任何建议或评论,以及我问我问题的方式,因为我是新来的...提前谢谢你......
EDIT 在下面的答案之后,我决定让i = 1成为一个特例,并为这两种情况制作两个独立的函数......但是,当我尝试将j分配给其他变量时我失败了...在前面的代码中:
if (j!=i && diff[i][j]<smallest) {smallest=diff[i][j]; d=j}
先前声明了d和所有内容...当我打印d时它打印一个随机数&gt;也许是内存位置内容...尝试调试以分配初始值 - 带声明 - 并且在打印时它出来了初始值...我希望d保持最小值所在的列...我怎么能实现???
答案 0 :(得分:2)
你永远不会初始化最小的
i=1;
double smallest = diff[1][2]; // initialize it to a non-diagonal element in the column
for (j=1; j<=n; j++)
if (j!=i && diff[i][j]<smallest){
smallest=diff[i][j];
}
printf("\n %lf\n", smallest);
编辑:
您的代码中似乎还有{ smallest= diff[i][j]; .. }
会覆盖每次迭代最小的值。我在答案中删除了它。
答案 1 :(得分:2)
首先,数组索引从C开始,而不是1,所以你应该j = 0; j < n
,假设n
是数组的大小。
然后,每次循环时都会分配给smallest
,而不仅仅是新值更小。所以,你所看到的是 last 值。
假设你确实在行的末尾运行了一个,那么这个“最后一个值”实际上可能是下一行的第一个值。或者存储在内存中的某些任意值恰好超过了数组的末尾,如果你的数组恰好有2行。无论如何,读取超过数组末尾的未定义行为是不好的。任何事都可以发生,而且经常发生的事情比你期望的更令人费解。
答案 2 :(得分:1)
小心你的数组索引。在C数组中,索引从零开始。
有关:
double array[10];
你将通过以下方式浏览所有十个元素:
int i;
for( i = 0; i < 10; i++ )
printf( "The array value at %d is %g\n", i, array[i] );