2013-04-04 96 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");