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ループがあり、それも冗長だと思います。それを注意深く見てください。何かをチェックする方法に注意してください。ただし、何かが見つからない場合は、状況を変更するために何もしません。セミコロンも見てください。これが基本的にループの本体です。

実際にチェックを2番目の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);
}

ちなみに、floatまたはdoubleを同等と比較する場合は注意が必要です。近さを使用することをお勧めします。

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 に答える