Тестирование на неравенство с 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);
}