2012-10-08 171 views
2

您好,我正在製作一個生成主代碼的快速程序,用戶必須猜測代碼。當檢查用戶的猜測時,我使用兩個函數一個用於精確匹配,另一個用於緊密匹配(其中他們得到的數字在主碼中但不在正確的位置)返回值函數C

Ex。主代碼1 2 3 4

用戶2 3 2 4 輸出應顯示用戶有2個密切匹配和一個完全匹配。我無法理解如何正確返回一個int。

當我嘗試在Main中打印它們時,我的輸出只顯示exactMatch和closeMatch的默認值。任何見解將不勝感激。謝謝。

#include<stdio.h> 
#include<math.h> 
#include<stdlib.h> 
#include<time.h> 
#define CODELENGTH 4 
#define NUMSYMBOLS 6 


int MasterCode[4]; 
int guess[ 4 ]; 
int exactMatch; 
int closeMatch=0; 

void genCode (int MasterCode[]) 
{ 
int i=0; 
int k; 
while (i < CODELENGTH){ 

MasterCode[i] =rand() %NUMSYMBOLS +1; 
    i++; 

}//end while loop. 
for (k = 0 ; k < 4; k++) { 
    printf("%d ", MasterCode[ k ]); 
} 

printf("\n"); 
} 





void getGuess (int guess[]) 
{ 

int number = 0; 

printf("Please enter your list of 4 numbers between 1 and 6: "); 
int j; 
int k; 
for (j = 0 ; j < 4; j++) { 
    scanf("%d", &number); 
    guess[ j ] = number; 
} 

printf("Your array has these values: "); 

for (k = 0 ; k < 4; k++) { 
    printf("%d ", guess[ k ]); 
} 

printf("\n"); 
} 




int main (int argc, char **argv) 
{ 
srand (time(NULL)); 

genCode(MasterCode); 
getGuess(guess); 
checkExactMatches(MasterCode, guess, exactMatch); 
checkCloseMatches(MasterCode, guess, closeMatch); 
printf("%d = Ending exactMatches \n", exactMatch); 
printf("%d = Ending closeMatches \n", closeMatch); 





} 
int checkExactMatches (int MasterCode[], int guess[], int exactMatch) 
    { 
int woot; 
for(woot=0; woot<4; woot++){ 


     if (MasterCode[woot] == guess[woot]){ 
      printf("Exact Match found \n"); 
      exactMatch ++; 
      printf("%d = Guess \n" , guess[ woot ]); 
      printf("%d = MasterCode \n", MasterCode[ woot ]); 
      printf("%d = exactMatch \n", exactMatch); 

     }// end if 

     if (MasterCode[woot] != guess[woot]) 
      printf("No EXACT match \n"); 


}//end for loop 

return exactMatch; 
} // end checkExactMatches 



int checkCloseMatches (int MasterCode[], int guess[], int closeMatch) 
    { 
int k; 
int j; 
for(k=0; k<4; k++){ 

    for (j=0; j<4; j++) { 


     if (MasterCode[k] == guess[j]){ 
    printf("CLOSE Match found \n"); 
    closeMatch ++; 
    printf("%d = Guess \n" , guess[ j ]); 
    printf("%d = MasterCode \n \n", MasterCode[ k ]); 
    printf("%d = closeMatch \n \n", closeMatch); 

}// end if 

if (MasterCode[k] != guess[j]) 
    printf("No CLOSE match \n"); 


    }//end nested for loop 
}//end for loop 

return closeMatch; 
} // end checkCloseMatches 
+0

這與主謀非常相似! – nneonneo

+0

是的。它基於那場比賽。 :) –

回答

3

獲取從函數返回的值實際上非常簡單,它基本上與將值分配給變量相同。在你的情況下,語法會是這樣的:

int result = checkExactMatches(MasterCode, guess, exactMatch); 

結果現在將保存該函數返回的值。

+1

謝謝我在我的程序中實現了這個代碼,它像一個魅力一樣工作。 –

+0

好聽。只是爲了進一步說明,儘管我更願意只回答這個問題,但其他一些答案已經提出了一個有效的觀點,即當您得到結果時,您不需要將計數參數傳遞到函數中的。然而,實施真的取決於你個人,所以請一定要聽取建議:)。 – Cdaragorn

1

請注意,雖然數組通過指針傳遞(意味着該函數可以修改指向指針),但是int是通過值傳遞的。因此,對函數內的int的更改只會在函數的持續時間內持續存在。

你想用

exactMatch = checkExactMatches(MasterCode, guess); 

,並在這種情況下,你不會有exactMatch傳遞更多。

1

C通過值傳遞參數,而不是通過引用,所以將int exactmatch傳入函數會在exactmatch內部創建數據的副本,因此在該方法內完成的操作不會執行任何操作。

你想要做的是從參數列表中刪除exactmatch,而是在方法的開頭將它設爲零(int exactmatch=0;,從全局變量去掉exactmatch,並使用類似int resultExact = checkExactMatches(MasterCode, guess);爲您的函數調用。您「再已經正確返回答案,你只是沒有拿起這個答案的任何地方。

3

你需要做的是

  • 不能通過數函數的自變量和
  • 而是收集函數的返回值N的計數

所以

checkExactMatches(MasterCode, guess, exactMatch); 

成爲

exactMatch = checkExactMatches(MasterCode, guess); 

你需要對函數頭部適當的更改,也避免使用全局變量。

+0

謝謝你的回答。我真的很感激。 –