2015-06-10 44 views
-4

我試過這個,但我的編譯器(Visual Studio 2013)不斷弄亂事情。 我有一個從9開始的9乘9矩陣。它在beginig處是0。從元素1:1開始,我開始遞增矩陣中的值或增加x,y,基本上移動到下一個矩陣元素。C忽略增量

但是,該程序忽略我的增量和x,y最初設置爲1的事實。 它也忽略了一個函數調用。代碼在下面註釋。

我相信這是我正在編譯的源代碼! 重新啓動的筆記本電腦和Visual Studio,但仍然無法正常工作。 打開新項目,同樣的事情。 在此先感謝。

#include<stdio.h> 
#include<stdlib.h> 

unsigned int Matrix[10][10], x, y; 

// Ignore this.. 
int checkLine() 
{ 
    unsigned int i, j, k; 
    for (k = 1; k <= 9; k++){ 
     if (Matrix[k][1] == 0) break; 
     for (i = 1; i <= 9; i++) 
      for (j = 1; j <= 9; j++) 
       if (Matrix[k][i] == Matrix[k][j] && i!=j) 
        return 0; 
    } 
    return 1; 
} 

//Ignore this.. 
int checkColumn() 
{ 
    unsigned int i, j, k; 
    for (k = 1; k <= 9; k++){ 
     if (Matrix[1][k] == 0) break; 
     for (i = 1; i <= 9; i++) 
      for (j = 1; j <= 9; j++) 
       if (Matrix[i][k] == Matrix[j][k] && i!=j) 
        return 0; 
    } 
    return 1; 
} 

//Ignore this.. 
int checkSquare() 
{ 
    unsigned int i, j, k,l,m,n; 
    for (m = 1; m <= 7; m = m + 3) 
    for (n = 1; n <= 7; n = n + 3) 

    for (k = m; k <= m + 2; k++) 
    for (l = n; l <= n + 2; l++) 
    for (i = m; i <= m + 2; i++) 
    for (j = n; j <= n + 2; j++) 
     if (Matrix[k][l] == Matrix[i][j] && !(k==i && l==j)) 
      return 0; 
    return 1; 
} 

void increment() 
{ 
    if (y == 9) 
    { 
     x++; 
     y = 1; 
    } 
    else y++; 
} 

void decrement() 
{ 
    if (y == 1) 
    { 
     x--; 
     y = 9; 
    } 
    else 
     y--; 
} 

void print_Matrix(){ 
    unsigned int i, j; 

    for (i = 1; i <= 9; i++){ 
     for (j = 1; j <= 9; j++) 
      printf("%u ", Matrix[i][j]); 
     printf("\n"); 
    } 
} 

// 
// MAIN. PROBLEM BELOW 
//** 
void main() 
{ 
    unsigned int i, j; 
    for (i = 1; i <= 9;i++) 
    for (j = 1; j <= 9; j++) 
     Matrix[i][j] = 0; 

    print_Matrix(); // Function call is ignored here. Don't know why.*** 

    x = 1; 
    y = 1; 
    // X and Y are OBVIOUSLY 1*** 

    while (x < 10) //Condition OBVIOUSLY true*** 
    { 
     printf("%u, %u", x, y); //Keeps printing 0,3 and eventually 0,2*** 
     printf("\n"); 

     Matrix[x][y]++; //Incrementation...*** 

     print_Matrix(); // Always prints a blank Matrix consisting of only 0's*** 


     if (checkLine() && checkColumn() && checkSquare()) 
     { 
      increment(); 
     } 

     if (Matrix[x][y] == 10){ 
      Matrix[x][y] = 0; 
      decrement(); 
     } 



    } 

    print_Matrix(); 

} 
+1

你的例子甚至沒有按原樣編譯。它應該是'int main()'。 –

+0

你怎麼知道第一個函數調用是「被忽略」?從給出的代碼看來這是不可能的。 – ooga

+0

http://imageshack.com/a/img538/9657/rHcnx9.png –

回答

0

你覺得increment被忽略,因爲checkSquare功能是越野車。它從未返回1,因此從未調用過該函數。

+0

通過增量我的意思是矩陣[x] [y] ++部分.... –

+0

對於'x = 1,y = 1',指令Matrix [x] [y] ++'正在生效。但是在它變成10之後,對'遞減'函數的調用就發生了,其中'x'變爲0,'y'變成'9'。但是在'print_matrix'函數中,你從來沒有用'x = 0'打印單元格。在'checkLine','checkColumn'和'checkSquare'函數中,您正在檢查具有'x> 1'的單元格。 – Pratap

+0

你是第二個這樣說的。在我的筆記本電腦上沒有。除非我用int替換unsigned int ...不知道爲什麼 –

0

你的輸出比較混亂,因爲線的輸出

printf("%u, %u", x, y); 

運行成

print_Matrix(); 

輸出通過添加一個新行到第一行的輸出,通過使用即

printf("%u, %u\n", x, y); 

你會注意到,在某點x得到遞減爲0,永遠不會再增加。既然你永遠不會打印Matrix[0][y],你永遠不會看到非零值。

除了改變上述printf,如果你改變print_Matrix到:

void print_Matrix(){ 
    unsigned int i, j; 

    for (i = 0; i <= 9; i++){ 
     // ^^^ Use 0 instead of 1 
     for (j = 0; j <= 9; j++) 
      // ^^^ Use 0 instead of 1 
     printf("%u ", Matrix[i][j]); 
     printf("\n"); 
    } 
} 

你會看到非零值。

請參閱工作代碼http://ideone.com/HlQ4xp

+0

你說什麼都沒有發生在我身上,除非我用int替換unsigned int ...爲什麼?我不明白.. –

+0

@AlexPop,請參閱http://ideone.com/HlQ4xp上的工作代碼。 –

0

會發生什麼事是,你正在增加由x和y標記的位置,這是位置[1] [1]。直到它達到10沒有什麼有趣的事情發生,你實際上可以看到矩陣的左上角增加到10,但是減少的條件變爲真,並且你遞減。

見自己(打印),

while (x < 10) //Condition OBVIOUSLY true*** 
{ 
    printf("%u, %u", x, y); //Keeps printing 0,3 and eventually 0,2*** 
    printf("\n"); 

    Matrix[x][y]++; //Incrementation...*** 

    print_Matrix(); // Always prints a blank Matrix consisting of only 0's*** 


    if (checkLine() && checkColumn() && checkSquare()) 
    { 
     increment(); 
    } 

    if (Matrix[x][y] == 10){ 
     Matrix[x][y] = 0; 
     decrement(); 
    } 

    printf("Enter to continue\n"); 
    getchar(); 

} 

原來Y = 9,X = 0,[1] [1]的位置變爲0,所以你看到的只是零,因爲你不是印刷零指數。

此過程重複,直到Y = 1和X = 0,您將位置增加到10,以使減量再次起作用。當Y = 1,X = 0且位置[0] [1]爲10時,遞減調用將執行x--。由於X是一個無符號整數,它會下溢併成爲42億的東西,大於10並且循環結束。

你想在這裏實現什麼?


編輯:當您製作x和y整數而不是無符號整數時,會發生更奇妙的事情。

而不是x下溢它將變成-1。當我運行代碼時,Matrix [-1] [9] ++奇怪地增加了x,所以x回到0.這意味着程序在這一點上永遠循環。

增量函數從未被調用過。

0

它顯示矩陣和增量時的在線測試,這裏有結果

1)C編譯器

http://ideone.com/KRLO8w

#include<stdio.h> 
#include<stdlib.h> 

unsigned int Matrix[10][10], x, y; 

// Ignore this.. 
int checkLine() 
{ 
    unsigned int i, j, k; 
    for (k = 1; k <= 9; k++){ 
     if (Matrix[k][1] == 0) break; 
     for (i = 1; i <= 9; i++) 
      for (j = 1; j <= 9; j++) 
       if (Matrix[k][i] == Matrix[k][j] && i!=j) 
        return 0; 
    } 
    return 1; 
} 

//Ignore this.. 
int checkColumn() 
{ 
    unsigned int i, j, k; 
    for (k = 1; k <= 9; k++){ 
     if (Matrix[1][k] == 0) break; 
     for (i = 1; i <= 9; i++) 
      for (j = 1; j <= 9; j++) 
       if (Matrix[i][k] == Matrix[j][k] && i!=j) 
        return 0; 
    } 
    return 1; 
} 

//Ignore this.. 
int checkSquare() 
{ 
    unsigned int i, j, k,l,m,n; 
    for (m = 1; m <= 7; m = m + 3) 
    for (n = 1; n <= 7; n = n + 3) 

    for (k = m; k <= m + 2; k++) 
    for (l = n; l <= n + 2; l++) 
    for (i = m; i <= m + 2; i++) 
    for (j = n; j <= n + 2; j++) 
     if (Matrix[k][l] == Matrix[i][j] && !(k==i && l==j)) 
      return 0; 
    return 1; 
} 

void increment() 
{ 
    if (y == 9) 
    { 
     x++; 
     y = 1; 
    } 
    else y++; 
} 

void decrement() 
{ 
    if (y == 1) 
    { 
     x--; 
     y = 9; 
    } 
    else 
     y--; 
} 

void print_Matrix(){ 
    unsigned int i, j; 

    for (i = 1; i <= 9; i++){ 
     for (j = 1; j <= 9; j++) 
      printf("%u ", Matrix[i][j]); 
     printf("\n"); 
    } 
} 

// 
// MAIN. PROBLEM BELOW 
//** 
void main() 
{ 
    unsigned int i, j; 
    for (i = 1; i <= 9;i++) 
    for (j = 1; j <= 9; j++) 
     Matrix[i][j] = 0; 

    print_Matrix(); // Function call is ignored here. Don't know why.*** 

    x = 1; 
    y = 1; 
    // X and Y are OBVIOUSLY 1*** 

    while (x < 10) //Condition OBVIOUSLY true*** 
    { 
     printf("%u, %u", x, y); //Keeps printing 0,3 and eventually 0,2*** 
     printf("\n"); 

     Matrix[x][y]++; //Incrementation...*** 

     print_Matrix(); // Always prints a blank Matrix consisting of only 0's*** 


     if (checkLine() && checkColumn() && checkSquare()) 
     { 
      increment(); 
     } 

     if (Matrix[x][y] == 10){ 
      Matrix[x][y] = 0; 
      decrement(); 
     } 



    } 

    print_Matrix(); 

} 

2)爲C++編譯器C++ 4.9.2(改變返回類型主要爲int)

http://ideone.com/Ey5nG1

在您的映像起始值爲0時,3是由於命令提示符的緩衝區限制。由於程序永遠不會結束,所以它突然終止,最新的幾個字節存儲在緩衝區中,僅顯示那麼多。要查看完整的輸出將其重定向到一個文件並將其打開。