最近班级里需要人员抽签参加活动,闲来无事用java的(Math.random()方法||java.util.Random())写了一个随机抽签的,所以我又了解了一下C语言的随机数获取。
C语言的随机数获取:
参考:http://c.biancheng.net/view/2043.html
程序的抽签信息源文件可以自己通过程序去做出来。。。咳咳,虽然方法很笨…
程序中有些函数注释掉了,还有的隐藏了,就是制作源信息文件的。
你们可以改进改进,我这个写的比较乱。。。
还有就是因为我不太喜欢参加活动,所以在随机数函数里是输出不出来46号的。。
具体程序代码:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
#define COUNT 48 //总人数
//#define STU 20 //抽取学生人数 -为用户自定义人数,所以不启用
//#define INITCOUNT 100 顺序表初始化量
//#define INCREMENT 10 顺序表增量
typedef struct
{
char no[15];//学号
char name[10];//姓名
}student;
//-----------------------------------
FILE *stu,*lu;//定义学生信息源文件指针,幸运儿文件指针
char *pno="学号",*pname="姓名",*pflag="编号";//字符串指针
int n;//抽取幸运儿数量
//-----------------------------------
/*typedef struct
{
student *data;//基地址
int length;//长度
}StuList; 顺序表-暂不启用
*/
//----函数声明---
void MENU();//菜单
unsigned int RandomNum();//随机数,Seed为time,单位为秒
void DivCount(int *n);//用户自定义抽取人数
void TestInput(student *p);//测试输入
int WriteLuckyVisible(student *p,int *Lucky);//写入幸运儿txt文件,用户可视化的
int ReadStu(student *p); //读取信息源文件
int WriteStuInvisible(student *p);//制作信息源文件时使用
int ReadStuVisible(student *p);//制作读取数据源信息时使用
//--------------
void main()
{
//-----变量定义----------
int choose,i,j;
int Lucky[COUNT];//幸运儿
student data[COUNT];
//----------------------
DivCount(&n);
//ReadStuVisible(data);制作完毕-暂不启用
ReadStu(data);
for(;;)
{
MENU();
scanf("%d",&choose);
switch(choose)
{
case 1:
do
{
printf("--抽取中--
");
printf("计数 丨%s丨%s %s
",pflag,pno,pname);
for(i=0;i<n;i++)
{
Lucky[i]=RandomNum();
for(j=0;j<i;j++)//---寻找重复项
{
if(Lucky[j]==Lucky[i])
while(Lucky[i]==Lucky[j])
{
Lucky[i]=RandomNum();
}
else
continue;
}
//printf("%d
",Lucky[i]);随机数重复测试
printf("第%-3d. %-4d% -13s %-5s
",i+1,Lucky[i],data[Lucky[i]-1].no,data[Lucky[i]-1].name);//下标从0开始
}
//------------------------------
printf("【1.重新抽取丨2.输出至TXT文件丨】:");
scanf("%d",&choose);
switch(choose)
{
case 1:;break;
case 2:
if((WriteLuckyVisible(data,Lucky)==1))
printf("输出成功!
");
else
printf("错误!
");
;break;
default:printf("输入错误!
");
}
}while(choose==1);
;break;
case 2:exit(0);break;
case 8:printf("%s %s",data[0].no,data[0].name);break;
case 9:
//TestInput(data);
WriteStuInvisible(data);break;
default:printf(" 输入错误!");break;
}
system("pause");
}
}
int ReadStuVisible(student *p)
{
int i;
if((stu=fopen("002.txt","r"))==NULL)
return 0;
for(i=0;i<COUNT;i++)
fscanf(stu,"%s %s",(p+i)->name,(p+i)->no);
fclose(stu);
return 1;
}
int ReadStu(student *p)
{
if((stu=fopen("Source.data","r"))==NULL)
return 0;
fread(p,sizeof(student),COUNT,stu);
fclose(stu);
return 1;
}
int WriteStuInvisible(student *p)
{
if((stu=fopen("Source.data","wt+"))==NULL)
return 0;
fwrite(p,sizeof(student),COUNT,stu);
fclose(stu);
return 1;
}
int WriteLuckyVisible(student *p,int *Lucky)
{
int i;
if((lu=fopen("LuckyDog.txt","wt+"))==NULL)
return 0;
fprintf(lu,"计数 丨%s丨%s %s
",pflag,pno,pname);
for(i=0;i<n;i++)
{
fprintf(lu,"第%-4d. %-4d% -13s %-5s
",i+1,Lucky[i],p[Lucky[i]-1].no,p[Lucky[i]-1].name);
}
fclose(lu);
return 1;
}
void TestInput(student *p)
{
int i;
for(i=0;i<COUNT;i++)
{
system("cls");
printf("----No.%d----
",i+1);
printf("学号:");
scanf("%s",(p+i)->no);
printf("姓名;");
scanf("%s",(p+i)->name);
}
}
void DivCount(int *n)
{
for(;;)
{
system("cls");
printf(" 请输入本次准备抽取人数:");
scanf("%d",n);
if(*n<1||*n>COUNT)
{
printf(" 抽取人数不合法!");
system("pause");
continue;
}
else
break;
}
}
unsigned int RandomNum()
{
unsigned int x;
srand(time(NULL));
for(;;)
{
Sleep(1000);
x=rand()%COUNT+1;
if(x!=46)
break;
else
continue;
}
return x;
}
void MENU()
{
system("cls");
printf(" --------------------
");
printf(" 丨 1.抽取 2.结束 丨
");
printf(" --------------------
");
printf(" 请输入:");
}
呃呃,自己预想的好多功能还没有实现,而且抽签的实现方法还有点复杂。。。