2016-07-12 4 views
-1

ここでの目標は、stdinから1の数値を読み込み、次に数値のセットを読み込み、2つがbijectionであるかどうかを確認することです。私がそれを正しく理解していれば、最初の数字が数字のセットに入っていなければならず、セットに重複した数字はないはずです。stdinから読み込んでCの数値を比較する

サンプル入力

3 
1 2 3 

サンプル出力

YES 

サンプル入力

5 
2 3 4 5 2 

私のエラーはFRに来ていると思われるサンプル出力

NO 

マイ入力

3 
1 2 3 

マイ出力

NO 

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のため、 '、読みにくいコードを記述しないでくださいを使用しないでください"%d"、&numbers [i])); ++ i) 'ははるかに読みやすく、' if'ステートメントはコードに何も追加しませんが、読みにくいです。おかげで@ –

+0

改訂されます。あなたは他のエラーを見つけましたか? – Adjit

+0

これらはエラーではありませんが、うまく読みやすくて美しいコードが見つかるはずです。 –

答えて

3

があるので初期化されていない配列(numbers)の場合は、動作が==であることを確認することはできません。

C11標準文書において

レジスタストレージクラスが指定の値 を必要とする文脈で使用されると を宣言されている可能性が自動記憶域期間のオブジェクトを指定する左辺値そのオブジェクトは初期化されていません。 (6.3.2.1)。

そこでnumbers[x]numbers[y])で結果x >= iy >= i)が未定義です。 ((私は20を<)&&(scanf関数(;

初期化されていないエリア(この場合には、i上で指標)

+0

ああ大丈夫、私はちょうどCに戻っているので、すべてを初期化するのに慣れる必要があります。しかし、今では私が初期化しても、私のループはそれらの初期化された値を通過し、それらがすべて0であれば一致を見つけるでしょう。少なくとも今、私は問題を解決するために何をすべきか知っていますが。説明ありがとう。 – Adjit

+0

@Adjitすべての配列要素を初期化する前だけでなく、初期化後もアクセスする場所に注意する必要があります。 ソースコードで__any同じペアが存在するかどうかを確認するステートメントのために、__all配列要素を '0' __で初期化すると、入力を超える2つの要素は__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; 
     } 
    } 
} 
関連する問題