ページ 11

C言語で配列の重複チェック

Posted: 2010年9月10日(金) 00:44
by かなで
1~9の整数が入っている配列があります。
値が重複してたらエラー、していなかったらOKといった関数を作りたいです。
自分なりに作ってみたのですがどうもうまくいきません。
よろしければ修正案を頂けないでしょうか?

bool cf = false;
int array[9] = { 1,2,3, 7,5,6, 4,9,8 }; // この時はOKになります。
//int array[9] = { 2,2,3, 7,5,6, 4,9,8 }; // この時は2が重複しているのでエラーにしたいです。
int check = 1;
bool ArrayCheck(void){

    check = 1;
    
    do{
        for(int i=0; i<9; i++){
            if(array == check){
                check++;
            }
            if( i==8 ){
                if(check == 10) return true;
                else return false;
//                break;
            }
        }
    }while(1);

    return true;
}

~略~
    cf = ClearCheck();
    DrawFormatString( 100, 100, 0xffffff, "%d", cf );
    DrawFormatString( 100, 120, 0xffffff, "%d", check );

Re:C言語で配列の重複チェック

Posted: 2010年9月10日(金) 00:56
by うしお
array
がソートされていることが分かっているなら、
右隣と比べて同じならアウト、を1週したらどうでしょうか?

Re:C言語で配列の重複チェック

Posted: 2010年9月10日(金) 01:06
by 初級者
効率がいいかどうかは後で考えることにして、

[0]を[1]~[8]と比較する。どこかで一致したらfalseを返す。
[1]を[2]~[8]と比較する。どこかで一致したらfalseを返す。
[2]を[3]~[8]と比較する。どこかで一致したらfalseを返す。
[3]を[4]~[8]と比較する。どこかで一致したらfalseを返す。
[4]を[5]~[8]と比較する。どこかで一致したらfalseを返す。
[5]を[6]~[8]と比較する。どこかで一致したらfalseを返す。
[6]を[7]~[8]と比較する。どこかで一致したらfalseを返す。
[7]を[8]と比較する。一致したらfalseを返す。
ここまで来れば、すべての要素が異なることがわかるので、trueを返す。

というような二重ループからなる関数を作ればいいのではないでしょうか。


うしお氏の案は、例題の配列要素がソートされてないので却下。

Re:C言語で配列の重複チェック

Posted: 2010年9月10日(金) 01:23
by かなで
お二方ともご回答ありがとうございます。

あれ・・・いとも簡単に出来たかもしれません・・・。
下記のソースでいいのですよね?
bool ClearCheck(void){

    for(int i=0; i<9; i++){
        for(int j=i+1; j<9; j++){
            if(array == array[j]) return false;
        }    
    }

    return true;
}

Re:C言語で配列の重複チェック

Posted: 2010年9月10日(金) 06:06
by 初級者
iを8まで回す必要があるかどうか、再考してみてください。

Re:C言語で配列の重複チェック

Posted: 2010年9月11日(土) 00:40
by かなで
そうですよねΣ
修正させて頂きました。
皆様ありがとうございます!!