2016-01-10 80 views
0

我試圖創建一個二維數組3x3的方形。在二維數組中找到重複的值3x3魔方

計算和檢查完成。 現在,我試圖防止在二維數組中發生重複的數字。

我試圖用一個for循環蠻力而是cygwin的編譯給了我錯誤

下面是我的代碼。 我該如何去檢查2D數組?

#include <stdio.h> /* printf */ 

    /*Preprocessor*/ 
    /*set N constant 3*/ 
    #define N 3 
    typedef enum {false,true} 
    bool; 

int main() 
{ 
    /*initialize size to 3*/ 
    int size =3; 
    int sum, sum1, sum2,array[N][N]; 
    int row, col = 0; 

    int i, j, duplicate =0; 


    /* variable to 
    indicate process reached*/ 
    int checkf =0; 



    /*input into the array of an array*/ 
    for(row =0; row <size; row++) 
    { 
    for(col =0; col < size; col++) 
    { 
     scanf("%d", &array[row][col]); 
    } 
    } 

    **/*check for repeated values*/ 
    for(row =0; row<9; row++) 
    { 
    for(col=0; col <9; col++) 
    { 
     if(array==array[row][col]) 
    }  
    }** 







/*Diagonal*/ 
/*sum of diagonal from the left 
equals to sum of diagonal 
from the right */ 
    /*initialize sum2 to 0*/ 
    sum2 =0; 
    /*check if row less than 3*/ 
    for(row=0; row< size; row++) 
    { 
    /*check if col less than 3*/ 
    for(col=0;col<size; col++) 
    { 
     /*number of row 
     equals number of col*/ 
     if(row == col) 
     { 
     /*addition*/ 
     sum2 = sum2 + array[row][col]; 
     } 
    } 
    } 

/*row*/ 
    /*check if row less than 3*/ 
    for(row=0; row < size; row++) 
    { 
    /*initialize sum */ 
    sum = 0; 
    /*check if col less than 3*/ 
     for(col=0; col <size; col++) 
     { 
     /*addition of numbers*/ 
     sum = sum + array[row][col]; 
     } 
    /*check if all additions 
    adds up to same sum*/ 
    if(sum2 == sum) 
    { 
     /*a flag or check to print*/ 
     checkf =1; 
    } 
    else 
    { 
     /*a flag or check to print*/ 
     checkf =0; 
     break; 
    } 
    } 

    /*Columns*/ 

    /*check if row less than 3*/ 
    for(row = 0; row < size; row++) 
    { 
    /*initialize sum */ 
    sum1 =0; 
    /*check if col less than 3*/ 
    for(col = 0; col < size; col++) 
    { 
     /*addition*/ 
     sum1 = sum1 + array[col][row]; 
    } 
    /*sum of diagonal equals 
    sum of columns*/ 
    if(sum == sum1) 
    { 
     /*a flag or check to print*/ 
     checkf =1; 
    } 
    else 
    { 
     /*a flag or check to print*/ 
     checkf =0; 
     break; 
    } 
    } 


    /*if statement is true 
    prints and display*/ 
    if(checkf ==1) 
    { 
    printf("This is a magic square.\n"); 
    } 
    else 
    { 
    /*print and display*/ 
    printf("This is not a magic square.\n"); 
    } 
    return 0; 

} 
+0

「_but cygwin compiles give me error_」 - 什麼是錯誤?該錯誤消息對我們非常有用。 –

+0

'if(array == array [row] [col])'看起來不正確。你需要兩個更多的循環來檢查。看到[這個答案](http://stackoverflow.com/a/14879569/3049655) –

+0

嗨酷傢伙!我嘗試過應用之前的邏輯。即時通訊困惑我如何工作。 –

回答

1

如果你有一個平坦的,一維數組(固定大小N的,說了),你會覈對每一個元素的所有元素其左:

int unique1d(int array[N]) 
{ 
    int i, j; 

    for(i = 1; i < N*N; i++) { 
     for(j = 0; j < i; j++) { 
      if (array[i] == array[j]) return 0; 
     } 
    } 

    return 1;  
} 

你可以這樣做對於二維數組,當你首先「扁平」指數時。假設你列舉你的3 × 3格的細胞像這樣 「蝸居」 指數:

0 1 2 
3 4 5 
6 7 8 

然後你得到:

flat = row * N + col; 

,相反:

row = flat/N;  // truncating int division gives row 
col = flat % N;  // remainder gives column 

所以一功能,測試是否有重複在您的N × N網格看起來像這樣:

int unique(int array[N][N]) 
{ 
    int i, j; 

    for(i = 1; i < N*N; i++) { 
     for(j = 0; j < i; j++) { 
      if (array[i/3][i % 3] == array[j/3][j % 3]) return 0; 
     } 
    } 

    return 1;  
} 

我已經把它變成了一個單獨的函數,因爲它使代碼更加清晰。不是你怎麼不需要一個單獨的標誌和一個break。一旦找到它,您可以立即返回結果。 (此外,break將不得不跳出嵌套循環,但C中的break關鍵字只是跳出內部循環。)

(其餘代碼檢查方塊是否是魔術或不相容例如,你應該首先假設這個方形是魔法,然後如果一個魔術方的條件不成立,那麼將你的標誌設置爲false,你永遠不必設置該標誌回到但這是另一個問題的主題。)

編輯:爲了更好地解釋功能,下面是示例客戶端代碼。這實質上是你的程序沒有魔法檢查。 N必須是定義的常量,因爲它在您的程序中。

int main() 
{ 
    int array[N][N]; 
    int row, col; 

    for(row =0; row < N; row++) { 
     for(col =0; col < N; col++) { 
      scanf("%d", &array[row][col]); 
     } 
    } 

    if (unique(array)) { 
     puts("Values are unique"); 
    } else { 
     puts("There are duplicate values."); 
    } 

    return 0; 
} 
+0

我不應該調用一個帶有指針的2d數組的函數嗎? –

+0

q1.c:在函數'repeatedValues'中: q1。c:37:5:警告:返回使得指針從整數轉換爲無轉換 返回1; ^ q1.c:在函數'main'中: q1.c:49:5:warning:賦值使得整型指針沒有轉換 p = array [N] [N]; ^ q1.c:53:4:警告:ISO C90禁止混合聲明和代碼[-Wpedantic] int checkf = 0; ^ q1.c:66:19:警告:從不兼容的指針類型中傳遞'repeatedValues'的參數1 repeatedValues(p); ^ q1.c:26:6:note:expected'int(*)[3]'but argument is of type'int *' int * repeatedValues(int array [N] [N]) –

+0

@GeraldLee試試'int repeatedValues(int array [N])'而不是'int * repeatedValues(int array [N] [N])'或者只使用int repeatedValues(int array [N] [N])'並且調用函數'repeatedValues(數組);'。順便說一句,'p = array [N] [N];'看起來不正確。也許你想'int * p = * array;'? –