C二维数组最小而不是最大

时间:2011-06-29 01:54:24

标签: c arrays

我是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保持最小值所在的列...我怎么能实现???

3 个答案:

答案 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] );