2013-04-04 70 views
0

我有一些伪代码中找到N×M矩阵的第一个全零行:寻找零的第一行的n×n矩阵用C

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语言结构化。这会是最好的方式去做,还是有更快或更普遍的方式?

+1

有什么错转到但也有其他的方式来写这一点,如果这是你在问什么。 – 2013-04-04 20:12:18

+0

将它提取到它自己的函数中将允许您使用'return i'来支持两个'break'语句。 – allonhadaya 2013-04-04 20:18:30

+0

C没有'continue'语句吗? (也就是说我会避免在一个块中使用这两个函数,并且这对于返回“true”或“false”的函数是一个明显的候选,这取决于它是否找到了全零行)。 – millimoose 2013-04-04 20:22:54

回答

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

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; 
} 
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: ; 
} 

这个怎么样?

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");