下のプログラムは最大100人まで抽選で選ぶプログラムの制作しています。
Windows7 Visual C++2010で作っています。
制作を進めてみたところあともうちょっとなんですが、抽選を行うと重複して結果が出てしまうことがあり、重複を出さないようにするためにはどうしたらよいですか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_MAX 10000000
void infor(char name[][BUFFER_MAX]){//名簿の中身を表示
int j;
for(j=0;j<=99;j++){
printf("%s,",name[j]);
}
printf("\n");
}
void sel(char name[][BUFFER_MAX],int sele){//抽選するための関数
int a,k;
int selectbox[50];
for(a=0;a<50;a++){
if(strcmp(name[a],"")==0){//nameで配列データがなくなるまでaをカウント
a=a-1;//aのままではデータがない配列まで差しているので引いておく
break;
}
}
puts("結果");
for(k=0;k<sele;k++){//抽選を行う。ここが間違いだと思うが、重複して出てしまうことがあり、重複を出さない方法がわからない
selectbox[k]=rand()%a;
printf("%s\n",name[selectbox[k]]);
}
}
int main(void){
int count;//登録するごとに人数をカウント
int i;//名簿の配列リストのカウント
char select[10];//gets関数を使って数字以外の文字を入力したときにエラーを出すための文字列変数
int sele;//select変数で数字が入力されたときに格納
static char name[100][BUFFER_MAX];//名簿:配列ごとに名前の登録
count=1;
i=0;
while(1){
printf("何人抽選しますか?:");
gets(select);
sele=atoi(select);//atoi関数でchar型からint型に変換
if (1 <= sele && sele <= 50)
break;
else
printf("抽選人数は1~50人でお願いします。\n");//1~50以外の数字、文字を入力したときにエラー
}
puts("抽選希望の登録を始めます。");
puts("抽選を開始するなら「抽選」と入力してください");
while(i<=99){
printf("%d人目:",count);
scanf("%s",name[i]);
if(strcmp(name[i],"抽選")==0&&i-1<sele){//抽選人数<抽選希望人数にするためにエラーを出す
printf("抽選希望人数は%d人以上でなくてはいけません。\n",sele+1);
continue;
}
if(strcmp(name[i],"抽選")==0){//抽選人数<抽選希望人数のときにsel関数で抽選開始
sel(name,sele);
continue;
}
if(i==99){//登録した人数が100人に達したとき
puts("これ以上登録できません。抽選を開始します。");
sel(name,sele);
continue;
}
infor(name);//人を登録していくと毎にname配列の状態を確認
i++;
count++;
}
return 0;
}