データの重複チェックについて。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
リリ

データの重複チェックについて。

#1

投稿記事 by リリ » 14年前

struct person
{
int no;
char name[10];
}data[5];
という構造体の配列が5つあったとして、関数内で入力を行う際、2番目以降のナンバーを入力するときに重複している番号があった場合、エラーメッセージを表示して入力に戻るようにしたいのです。

while(1)
{
printf("0~99までの番号を入力 : ");
scanf("%d",&idata->no);
if(idata->no >=0 && idata->no<=99)
{
break;
}

printf("番号が範囲外です");
}

このコードに重複チェックを組み込むには、どのようにすれば良いのでしょうか、、、

box
記事: 2002
登録日時: 14年前

Re: データの重複チェックについて。

#2

投稿記事 by box » 14年前

リリ さんが書きました: このコードに重複チェックを組み込むには、どのようにすれば良いのでしょうか、、、
1個目のデータ:チェックの必要なし(っていうか、チェックできない)
2個目のデータ:1個目と同じかどうかをチェック
3個目のデータ:1~2個目と同じかどうかをチェック
4個目のデータ:1~3個目と同じかどうかをチェック
5個目のデータ:1~4個目と同じかどうかをチェック

さて、これをよ~くながめてみると、何かの法則が見えてきませんか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: データの重複チェックについて。

#3

投稿記事 by h2so5 » 14年前

重複のチェック自体は、forループを使い現在入力中の配列の一つ前までをチェックすればできます。

しかし、提示されたコードはそもそも正常に作動しないと思いますので、
重複チェックを組み込む前に修正することをおすすめします。

とりあえず、現在書いているコードの全文を載せてください。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: データの重複チェックについて。

#4

投稿記事 by softya(ソフト屋) » 14年前

副管理者です。重複質問については削除させていただきました。

[追記]
コード添付時にはcodeタグをご利用下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
GRAM
記事: 164
登録日時: 14年前
住所: 大阪

Re: データの重複チェックについて。

#5

投稿記事 by GRAM » 14年前

非常に簡単な解決法としては

最初にchar型かbool型(C++)かなんか(別に何でもいいですが)100個分の配列を用意して
それらを0(またはfalse)で初期化し、整数を入力されるたび
その配列番号のところを1(またはtrue)に変えていけばよいでしょう

重複チェックは配列の要素が0か1かで判断できます(1ならば重複している)

コード:

#include <stdio.h>
 
char b[100];
int main(){
        int n, end;
        do{
                printf("0~99までの番号を入力 : \n");
                end = scanf("%d",&n);
                if(n < 0 && n > 99){
                        printf("番号が範囲外です\n"); 
                        break;
                }
                if(b[n] != 0){
                        printf("重複しています\n");
                        continue;
                }
                b[n] = 1;
        }while(end == 1);
        return 0;
}  
もちろんこのやり方は入力される変数が整数でしかも範囲が限られている場合にのみ有効ですが・・・
そうでない場合 基本的には今までの要素すべてをチェックする総当り法か、木構造を用いたちょっと複雑なアルゴリズムを用いる必要があると思います

閉鎖

“C言語何でも質問掲示板” へ戻る