Тестирование на неравенство с while() в C

Я новичок в программировании на Си. Я хочу использовать цикл while, чтобы проверить число 500,00 в строке матрицы 'grid' и перейти к следующей строке, если ее там нет. Для этого я написал эту программу, но, к сожалению, она не дает никаких результатов, и я не знаю, в чем проблема.

Программа, которую я написал, находится здесь:

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(&grid[i][j]!=500.00  && c<=ncmax ); 

но это показывает эти ошибки

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

Что мне делать с этой проблемой? В общем, могу ли я использовать цикл while как этот? Если вам нужно увидеть всю программу, пожалуйста, дайте мне знать.

3 ответа

Решение

Я не понимаю твоего времени. Разве вы не хотите, если вместо этого?

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.00 в соответствии i,

PS: если вы знаете значение ncmaxВы могли бы упростить условие.

У вас есть цикл while, который ничего не делает, и я подозреваю, что он также избыточен. Посмотри на это внимательно; обратите внимание, как он что-то проверяет, но если что-то не найдено, он ничего не делает для изменения положения дел. Также посмотрите на свою точку с запятой; это в основном тело вашей петли сейчас.

Я подозреваю, что вы на самом деле хотите поставить проверку внутри вашего второго оператора for или превратить этот оператор for в цикл while.

Давайте внимательнее посмотрим на то, что делает ваш код, а затем на то, что, я думаю, вы хотите, чтобы он делал. Я изменил пробелы и отступы, чтобы сделать его более читабельным.

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);
}
Другие вопросы по тегам