0

我是 C 编程新手。我想使用一个while循环来检查'网格'矩阵的一行中的数字500.00,如果它不存在则转到下一行。为此我编写了这个程序,但不幸的是它没有显示任何结果,我不知道问题出在哪里。

我写的程序在这里:

for(i=0;i<12;i++){
    c=0;
    for (j=0;j<26;j++){
        while(grid[i][j]!=500.00 && c<=ncmax );
        c++;
    }
    printf("%d \n \n",c);
} 

我将while循环更改为

 while(&grid[i][j]!=500.00  && c<=ncmax ); 

但它显示了这些错误

error C2440: '!=' : cannot convert from 'double' to 'float *'
error C2446: '!=' : no conversion from 'double' to 'float *'

这个问题我该怎么办?一般来说,我可以像这样使用while循环吗?如果您需要查看整个程序,请告诉我。

4

3 回答 3

3

你有一个什么都不做的while循环,我怀疑它也是多余的。仔细看;注意它是如何检查某些东西的,但是如果没有找到那个东西,它就不会做任何事情来改变事态。还要看看你的分号;这基本上是你现在循环的主体。

我怀疑你真的想把检查放在你的第二个 for 语句中,或者把那个 for 语句变成一个 while 循环。

于 2012-12-05T15:49:57.063 回答
1

我不明白你的时间。你不想要一个 if 吗?

for(i=0;i<12;i++) {
    c=0;
    for (j=0;j<26;j++) {
        if(grid[i][j]!=500.00  && c<=ncmax) {
            c++;
        } else {
            printf("%d \n \n",c);
        }
    }
}

但我认为你可以选择更简单的东西:

for(i=0;i<12;i++) {
    for (j=0;j<26;j++) {
        if(grid[i][j]==500.00) {
            printf("%d %d \n \n",i , j);
        }
    }
}

编辑:我刚刚注意到在第一个程序中,c并且j具有相同的值。您可以简化为:

for(i=0;i<12;i++) {
    c=0;
    while(c<26 && c<=ncmax && grid[i][c]!=500.00) {
        c++;
    }
    printf("%d \n \n",c);
}

输出应该是 的列表c。它等于26或或行ncmax+1中值的索引的最小值。500.00i

PS:如果你知道 的值ncmax,你可以简化条件。

于 2012-12-05T15:58:21.110 回答
0

让我们仔细看看你的代码做什么,然后我认为你想要它做什么。我更改了空格和缩进以使其更具可读性。

for (i = 0; i < 12; i++) { /* each column */
    c = 0;
    for (j = 0; j < 26; j++) { /* each row in this column */
        while(grid[i][j] != 500.00 && c <= ncmax)
            ; /* this is the body of the while loop: do nothing */
        c++;
    }
    printf("%d \n \n",c);
}

由于while循环的主体什么都不做,那么如果进入循环时两个条件都为真,就会一直循环下去。您可能已经发现了这一点。

如果您的目标是计算每列中等于 500.0 的值的数量,但在达到最大数量时停止计数,请考虑以下方法。

for (i = 0; i < 12; i++) { /* each column */
    c = 0;
    for (j = 0; j < 26 && c <= ncmax; j++) { /* each row */
        if (grid[i][j] == 500.0)
            c++;
    }
    print("%d\n\n", c);
}

顺便说一句,您需要小心比较浮点数或双精度数是否相等。最好使用亲密关系。

if (abs(grid[i][j] - 500.0) < EPSILON)
    c++; /* value is "close enough" */

编辑修复轻微的缩进错字。填充最后一个代码块的主体。

编辑#2如果目标是找到 500.0 在每列中出现的位置,则可以将内部循环更改为 while 循环,如下所示,同时消除变量。

for (i = 0; i < 12; i++) { /* each column */
    j = 0;

    while (j < 26 && grid[i][j] != 500.0)
        j++; /* each row this column, or until 500.0 */

    if (j == 26)
        print("ERROR: sentinel missing in column %d\n", i)
    else
        print("%d\n\n", j);
}
于 2012-12-05T16:15:37.070 回答