c语言随机点名系统
㈠ c语言 随机点名
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#defineSTU_NUM_MAX64//假设最多有64个学生
structStudent
{
charname[10];
intstuID;
}stu[STU_NUM_MAX];
intexist[STU_NUM_MAX];//用以保存被点过名
staticintindex=0;//记住点名的次数
voidIitialize(){
for(inti=0;i<STU_NUM_MAX;i++)exist[i]=0;
}
boolIsExist(intid){
for(inti=0;i<STU_NUM_MAX;i++)
if(exist[i]==id)returntrue;//已存在
returnfalse;//不存在
}
voidAdd()//添加数据
{
FILE*fp;
intstu_num;
printf(" ?:");
scanf("%d",&stu_num);
for(inti=0;i<stu_num;i++){
printf(" ");
printf(" PleaseinputstudentID:");
scanf("%d",&stu[i].stuID);
printf(" Pleaseinputstudentname:");
scanf("%s",stu[i].name);
fflush(stdin);
}
if((fp=fopen("stu.dat","ab"))==NULL) {
printf("Can'topenfile ");
exit(1);
}
for(intj=0;j<stu_num;j++)
{
if(fwrite(&stu[j],sizeof(structStudent),1,fp)!=1)
printf("Errorwritingfile. ");
}
fclose(fp);
}
voidrollcall()//随机点名
{
FILE*fp;
if((fp=fopen("stu.dat","rb"))==NULL)
{
printf("Can'topenfile. ");
exit(1);
}
srand((unsigned)time(NULL));
inti=0;
intrandID=rand()%(64-1+1)+1;//1~64
printf(" 随机点到的学号为:%d %s %s ",randID,"StuID","StuName");
do
{
fseek(fp,i*sizeof(structStudent),SEEK_SET);
if(fread(&stu[i],sizeof(structStudent),1,fp))
{
if(stu[i].stuID==randID&&!IsExist(randID)){
printf(" %4d %5s ",stu[i].stuID,stu[i].name);
exist[index++]=randID;
break;}
}
i++;
}while(!feof(fp));
fclose(fp);
}
intmain()
{
intselect=0;
charanswer='y';
Iitialize();
do
{
printf("1.添加数据2.随机点名3.退出 请选择:");
fflush(stdin);
scanf("%d",&select);
switch(select)
{
case1:
Add();
break;
case2:
rollcall();
break;
case3:
return0;
}
fflush(stdin);
printf("Youwanttocontinue?:");
scanf("%c",&answer);
}while(answer=='y'||answer=='Y');
return0;
}
上面的代码,我留下几个细节问题留给你自己学着解决,都是很简单的:
上面的代码,我没有对重复的学号作判断。
上面的代码,我没有把点名存放到另一个文件,而是用数组替代(可以实现的也很简单)。我怕写得代码太多,网络限制提交。
上面的代码,是测试数据,stu.dat目标文件并没有64个学生,我只写入了12条数据。
上面的代码,我没有对数据数量(最多64条)作判断。
㈡ c语言课堂随机点名
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#defineMAXSTUDENT100
charName[MAXSTUDENT][16];
//读文件内保存的学生姓名
intreadName(constchar*fileName)
{
intpos,slen;
FILE*fp=fopen(fileName,"r");
if(fp==NULL)return0;
memset(Name,0,sizeof(Name));
pos=0;
while(!feof(fp)&&pos<MAXSTUDENT)
{
fgets(Name[pos],16,fp);
slen=strlen(Name[pos]);
if(slen>0)
{
slen--;
while(Name[pos][slen]==10||Name[pos][slen]==13)Name[pos][slen--]=0;//去掉字符串后的换行符
pos++;
}
}
printf("读入%d人姓名 ",pos);
fclose(fp);
returnpos;
}
voidmain()
{
charfileName[32];
intn,pos,loop;
charflag[100];
srand(time(NULL));
printf("请输入学生姓名文件名:");
scanf("%s",fileName);
n=readName(fileName);
if(n==0)
{
printf("读取错误,请确认文件%s是否名是否正确,文件的格式是否正确! ",fileName);
return;
}
getchar();
memset(flag,0,sizeof(flag));
while(1)
{
pos=rand()%n;
loop=0;
while(flag[pos])//可以保证每个人都点到一次
{
if(++loop>n)memset(flag,0,sizeof(flag));
pos=rand()%n;
}
flag[pos]=1;
printf("点%s",Name[pos]);
if(getchar()!=10)break;
}
}
㈢ 用c语言编一个上课点名系统
是作业吗?
如果不是作业的话,建议还是别这么麻烦,弄一张表把。
现在外国都流行用EXCEL抽人,EXCEL(新版本的,好像2010里面有),有一个 抽样的类型,能够从表中随机抽出数据。。
然后在用VLOOKUP显示人名就好了。。。
如果是作业的话。。。用C++,面向对象,秒杀级别的作业。。
新建一个STUDENT类,然后将学好和姓名设置成PUBLIC成员。
然后再新建一个STUDENT类数组,然后读入文件即可。。。关键还是在于TXT文件格式怎么分割的问题。。其实也不难,CSTRING里面有很丰富的成员方法,用一些来拼接就好。
最后再找在VC的库里面找一个随机函数,或者自己写一个也行。。。
秒杀级别的作业。。。。自己动手把楼主,很简单的说。。。
㈣ 怎么用C语言编写随机点名
使用系统函数 int rand(void)产生伪随机数,先用void srand(unsigned int seed)函数设置随机种子,这样就会产生真正的随机函数
㈤ 随机点名程序设计 C语言编程
设置一个足够大的随机池,给每一个学生分配相同的空间,然后利用随机数来选取被点名的学生,同时对该学生所分配的空间和其他学生的空间进行缩减或增加。然后执行下一轮。
大致思路就是这样,希望能够帮到你哦~
㈥ c语言 随机点名
“为了公平起见,我们决定做一个随机点名小程序”不是说你们决定做一个小程序吗?为什么不自己做呀?没有必要一个班的学生都没有能力编写一个这种简单程序吧
网络知道并不是一个提交结果的平台,所谓知道就是将知识贡献,让大家获得启发,不是给人当奴隶干活!
㈦ c语言 课堂随机点名程序 跪求大神帮我修改正确!
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <time.h>
func1(char stubuff[100][100],int stucnt);
func2(char stubuff[100][100],int stucnt);
struct Student
{
int stdno;
char name[20];
char sex[20];
};
int main()
{
FILE *fp;
int stucnt=0,x;
char line[100]="\0",stubuff[100][100];
char filename[20];
struct Student *st;
printf("\t\t\t欢迎使用课堂随机点名程序!\n\n");
printf("点名前请输入您要点名的班级:");
scanf("%s",filename);
fp=fopen(filename,"r");
while (fgets(line,99,fp)!=NULL)
{
strcpy(stubuff[stucnt++],line);
}
printf("该班一共有%d个学生\n",stucnt);
srand((unsigned)time(NULL));
printf("请选择:\n");
printf("1:开始点名\n2:查看全班具体情况\n3:结束程序\n");
printf("请输入您的选择:");
scanf("%d",&x);
switch(x)
{
case 1:
func1(stubuff[100][100],stucnt);break;
case 2:
func2(stubuff[100][100],stucnt);break;
case 3:
printf("\t\t\t谢谢使用!\n");
}
fclose(fp);
return 0;
}
func1(char stubuff[100][100],int stucnt)
{
int i,j,chou,tmp,sel[100]={0},flag;
do
{
printf("请输入这次要点名的人数:");
scanf("%d",&chou);
if (chou>stucnt)
{
printf("这个班没有这么多学生\n");
}
} while(chou>stucnt ||chou<0);
for (i=0;i<chou;i++)
{
flag=0;
tmp=rand()%stucnt+1;
for (j=0;j<i;j++)
{
if (sel[j]==tmp)
{
flag=1;
break;
}
}
if (flag==1)
{
i--;
}else
{
sel[i]=tmp;
}
}
printf("点名情况如下:\n");
printf("学号\t\t姓名\t性别\n");
for (i=0;i<chou;i++)
{
fflush(stdin);
getchar();
printf("%s",stubuff[sel[i]-1]);
}
}
func2(char stubuff[100][100],int stucnt)
{
int i;
for (i=0;i<stucnt;i++)
{
fflush(stdin);
getchar();
printf("%s",stubuff[i]);
}
}