ページ 1 / 1
データの重複チェックについて。
Posted: 2011年5月15日(日) 20:01
by リリ
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("番号が範囲外です");
}
このコードに重複チェックを組み込むには、どのようにすれば良いのでしょうか、、、
Re: データの重複チェックについて。
Posted: 2011年5月15日(日) 20:12
by box
リリ さんが書きました:
このコードに重複チェックを組み込むには、どのようにすれば良いのでしょうか、、、
1個目のデータ:チェックの必要なし(っていうか、チェックできない)
2個目のデータ:1個目と同じかどうかをチェック
3個目のデータ:1~2個目と同じかどうかをチェック
4個目のデータ:1~3個目と同じかどうかをチェック
5個目のデータ:1~4個目と同じかどうかをチェック
さて、これをよ~くながめてみると、何かの法則が見えてきませんか?
Re: データの重複チェックについて。
Posted: 2011年5月15日(日) 20:13
by h2so5
重複のチェック自体は、forループを使い現在入力中の配列の一つ前までをチェックすればできます。
しかし、提示されたコードはそもそも正常に作動しないと思いますので、
重複チェックを組み込む前に修正することをおすすめします。
とりあえず、現在書いているコードの全文を載せてください。
Re: データの重複チェックについて。
Posted: 2011年5月15日(日) 21:35
by softya(ソフト屋)
副管理者です。重複質問については削除させていただきました。
[追記]
コード添付時にはcodeタグをご利用下さい。
Re: データの重複チェックについて。
Posted: 2011年5月17日(火) 15:12
by GRAM
非常に簡単な解決法としては
最初に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;
}
もちろんこのやり方は入力される変数が整数でしかも範囲が限られている場合にのみ有効ですが・・・
そうでない場合 基本的には今までの要素すべてをチェックする総当り法か、木構造を用いたちょっと複雑なアルゴリズムを用いる必要があると思います