2016-07-12 71 views
-1

這裏的目標是從標準輸入讀取1個數字,然後讀取一組數字,然後檢查兩者是否爲雙射。如果我已經正確理解了這一點,那意味着第一個數字必須在數字集合中,並且集合中不能有任何重複的數字。從標準輸入讀數和比較數字C

採樣輸入

3 
1 2 3 

樣本輸出

YES 

採樣輸入

5 
2 3 4 5 2 

樣本輸出

NO 

我輸入

3 
1 2 3 

我的輸出

NO 

看來,我的錯誤來了FR om我的數組檢查重複項。它總是設置checkDups 1。這一段代碼:

for(x=0; x < 20; x++) { 
    if(n == numbers[x]) checkNums = 1; 
    for(y=0; y < 20; y++) { 
     if(x != y && numbers[x] == numbers[y]) { 
      checkDups = 1; 
     } 
    } 
} 

全碼

int n; 
int numbers[21]; 
int i = 0; 
int x = 0; 
int y = 0; 
int checkDups = 0; 
int checkNums = 0; 

scanf("%d", &n); 

while(i < 20 && scanf("%d", &numbers[i]) == 1) i++; 

for(x=0; x < 20; x++) { 
    if(n == numbers[x]) checkNums = 1; 
    for(y=0; y < 20; y++) { 
     if(x != y && numbers[x] == numbers[y]) { 
      checkDups = 1; 
     } 
    } 
} 

if(checkNums == 1 && checkDups == 0) printf("YES"); 
else printf("NO"); 
+1

不要寫代碼,難以閱讀,'爲(I = 0;((I <20)&&(scanf函數( 「%d」,&numbers [i])); ++ i)'更具可讀性,並且一行if語句不會爲代碼添加任何內容,但是難以讀取它,並且使用一致的空格。 –

+0

@iharob謝謝。將修改。你有沒有發現任何其他錯誤? – Adjit

+0

這些都不是錯誤,但很好的可讀和漂亮的代碼是一個很好的開始找到任何。 –

回答

3

既然有未初始化的數組(numbers),則無法確定==的行爲。

在C11標準文檔,

左值指定自動存儲持續時間,可能已與 寄存器 存儲類聲明 在需要指定的值 一個上下文被用於的一個目的對象,但該對象未初始化。 (6.3.2.1)。

因此,與numbers[x]numbers[y])的結果,其中x >= iy >= i)是未定義的。

請不要使用未初始化區域(在這種情況下,指數超過i

+0

啊好吧,我只是回到C,所以需要習慣初始化所有東西。但是現在,即使我初始化了它,我的循環也會經過這些初始化值,如果它們都是0,它會找到一個匹配項。儘管至少現在我知道該怎麼做才能解決問題。感謝您的解釋。 – Adjit

+0

@Adjit,不僅在初始化所有數組元素之前,而且在初始化之後,您都應該小心您訪問的位置。 在您的源代碼中,for語句檢查__any同一對是否存在___,因此如果將__all數組元素初始化爲'0'__,則輸入之外的任何兩個元素都將被視爲__same pair__ –

2

此修改for循環工作對我來說:

for(x=0; x < i; x++) { 
    if(n == numbers[x]) 
     checkNums = 1; 
    for(y=x; y < i; y++) { 
     if(x != y && numbers[x] == numbers[y]) { 
      checkDups = 1; 
     } 
    } 
}