2011-08-18 58 views
2

我正在學習C,我想知道如何減少for循環,以使其更易於表現。優化/減少For-loops

#include<stdio.h> 

int main() { 

char input[81]; 
int i; 
char input2[9][9]; 
int col,row; 
printf("Enter sudoku board:"); 
scanf("%s",&input); 


for (i=0;i<9;i++) { 
    for (col=0;col<9;col++) 
     input2[0][col]=input[i]; 
    for (col=0;col<9;col++) 
     input2[1][col]=input[i]; 
    for (col=0;col<9;col++) 
     input2[2][col]=input[i]; 
    for (col=0;col<9;col++) 
     input2[3][col]=input[i]; 
    for (col=0;col<9;col++) 
     input2[4][col]=input[i]; 
    for (col=0;col<9;col++) 
     input2[5][col]=input[i]; 
    for (col=0;col<9;col++) 
     input2[6][col]=input[i]; 
    for (col=0;col<9;col++) 
     input2[7][col]=input[i]; 
    for (col=0;col<9;col++) 
     input2[8][col]=input[i]; 
} 

這表明用戶會在數組中輸入81個數字,然後輸入的數字將被轉移到9x9數組。在此先感謝!:)

+0

...您的循環似乎將輸入2的所有單元格設置爲輸入[8]。 – Chowlett

回答

0

你想要的是填寫9 * 9矩陣基於81輸入的數量。如上所述,您需要爲末尾的'\0'分配一個字符。這就是C風格的陣列所着稱的。

int i = 0, row = 0, col = 0; 
    // set matrix row by row 
    for (row = 0; row < 9; row++) 
    { 
     // for each row, set from left to right 
     for (col = 0; col < 9; col++) 
     { 
     input2[row][col] = input[i++]; 
     } 
    } 

改進:你不必預分配一個字符串認爲81字符。你可以選擇直接設置你想要的結果數組。

 int i = 0, row = 0, col = 0; 
     // set matrix row by row 
     for (row = 0; row < 9; row++) 
     { 
      // for each row, set from left to right 
      for (col = 0; col < 9; col++) 
      { 
      scanf("%c", &input2[row][col]); 
      } 
     } 
2

您的代碼沒有達到您期望的效果。

這聽起來像你想是這樣的:

for (row = 0; row < 9; ++row) { 
    for (col = 0; col < 9; ++col) { 
     input2[row][col] = input[(row * 9) + col]; 
    } 
} 

編輯:順便說一下,讓用戶輸入一個字符串時,請確保有足夠的空間在緩衝區來存放整個字符串,加終止'\0'人物!您的input緩衝區需要至少有82 char的空間。

+0

爲什麼使用++行和++ col而不是使用row ++和col ++?謝謝 –

+0

@Trixie:使用C++的習慣習慣。前綴增量可以更有效,因爲它避免了複製操作。對於像int這樣的內在類型來說,這兩種方法並不重要,但儘可能使用前綴增量是一個好主意(只是爲了適應那些重要的情況)。一些更多的細節可以在[C++ FAQ Lite 13.15](http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.15)中找到。 –

+0

你爲什麼要放(行* 9) ?謝謝 –

1

由於您希望允許用戶輸入81數字(作爲字符),所以char數組的大小必須爲82或更多。

char input[82]; 

而且你scanf函數不應該有&

scanf("%s",input); 

既然你想變換由用戶輸入到一個二維數組的一維數組,你可以這樣做:

for (row=0;row<9;row++) { 
    for (col=0;col<9;col++) 
     input2[row][col] = input[row*9+col]; 
0

由於代碼下面的第一步應該工作 -

int i,j; 
for(i=0;i<9;i++) 
{ 
    for(j=0;j<9;j++) 
    { 
     input2[i][j]=input[i]; 

    } 
} 

EDIT:我已經給出了使for循環更具可讀性的解決方案,以執行OP提到的任何功能。除了像他原來的代碼是正確還是不正確之外,還沒有提出任何其他建議?