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: データの重複チェックについて。
1個目のデータ:チェックの必要なし(っていうか、チェックできない)リリ さんが書きました: このコードに重複チェックを組み込むには、どのようにすれば良いのでしょうか、、、
2個目のデータ:1個目と同じかどうかをチェック
3個目のデータ:1~2個目と同じかどうかをチェック
4個目のデータ:1~3個目と同じかどうかをチェック
5個目のデータ:1~4個目と同じかどうかをチェック
さて、これをよ~くながめてみると、何かの法則が見えてきませんか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: データの重複チェックについて。
重複のチェック自体は、forループを使い現在入力中の配列の一つ前までをチェックすればできます。
しかし、提示されたコードはそもそも正常に作動しないと思いますので、
重複チェックを組み込む前に修正することをおすすめします。
とりあえず、現在書いているコードの全文を載せてください。
しかし、提示されたコードはそもそも正常に作動しないと思いますので、
重複チェックを組み込む前に修正することをおすすめします。
とりあえず、現在書いているコードの全文を載せてください。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: データの重複チェックについて。
副管理者です。重複質問については削除させていただきました。
[追記]
コード添付時にはcodeタグをご利用下さい。
[追記]
コード添付時にはcodeタグをご利用下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: データの重複チェックについて。
非常に簡単な解決法としては
最初にchar型かbool型(C++)かなんか(別に何でもいいですが)100個分の配列を用意して
それらを0(またはfalse)で初期化し、整数を入力されるたび
その配列番号のところを1(またはtrue)に変えていけばよいでしょう
重複チェックは配列の要素が0か1かで判断できます(1ならば重複している)
もちろんこのやり方は入力される変数が整数でしかも範囲が限られている場合にのみ有効ですが・・・
そうでない場合 基本的には今までの要素すべてをチェックする総当り法か、木構造を用いたちょっと複雑なアルゴリズムを用いる必要があると思います
最初に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;
}
そうでない場合 基本的には今までの要素すべてをチェックする総当り法か、木構造を用いたちょっと複雑なアルゴリズムを用いる必要があると思います