0

我有一些伪代码可以在 nxm 矩阵中找到第一个全零行:

int first_zero_row = -1; /* none */
int i, j;
for(i=0; i<n; i++) {
    for (j=0; j<n; j++) {
       if (A[i][j]) goto next;
    }
    first_zero_row = i;
    break;
next: ;
}

虽然这应该可行,但我不认为使用 goto 语句是最好的方法。我对 C 不是很熟悉,但我的目标是尽可能使代码在 C 中结构良好。这会是最好的方法吗,还是有更快或更通用的方法?

4

4 回答 4

1

first_zero_row在内部循环运行完成时设置,

int first_zero_row = -1; /* none */
int i, j;
for(i=0; i<n; i++) {
    for (j=0; j<n; j++) {
       if (A[i][j]) break;
    }
    if (j == n) {
        first_zero_row = i;
        break;
    }
}

如果你想避免goto.

于 2013-04-04T20:18:36.093 回答
0

放置break;语句而不是 goto 语句。设置一个布尔标志并检查标志,如果标志为真,则也从外部 for 循环再次中断。像这样的东西-

bool nonZeroFlag = true;

for(i=0; i<n; i++) {
   for (j=0; j<n; j++) {
     if (A[i][j]){
        nonZeroFlag = false;
        break;
     }
   }
  if (nonZeroFlag) {
     first_zero_row = i;
     break;
  }
  nonZeroFlag = true;
}
于 2013-04-04T20:13:48.823 回答
0
int first_zero_row = -1; /* none */
int i, j;
for(i=0; i<n; i++) {
    for (j=0; j<n; j++) {
       if (A[i][j] != 0){
           first_zero_row = i;
       } 
    }
    break;
next: ;
}

这个怎么样?

于 2013-04-04T20:14:50.377 回答
0

这是一个没有breakgoto:)

int zero_count = -1; /* none */
i = j = 0;
for(i=0; i < n && (zero_count != n); i++) {
    for (j=0; j < n && (A[i][j] == 0); j++) {
       zero_count = j + 1;
    }
}

if(i < 10)
   printf("First Zero row is %d\n",i);
else
   printf("Nop! Not today!\n");
于 2013-04-04T20:20:02.180 回答