c语言 随机点名

c语言 随机点名,第1张

#include<stdio.h>

#include<stdlib.h>

#include <time.h>

#define STU_NUM_MAX 64 // 假设最多有64个学生

struct Student  

{

char name[10]

int  stuID

}stu[STU_NUM_MAX]

int exist[STU_NUM_MAX] // 用以保存被点过名

static int index=0 // 记住点名的次数 

void Iitialize(){

for(int i=0i<STU_NUM_MAXi++) exist[i]=0

}

bool IsExist(int id){

for(int i=0i<STU_NUM_MAXi++)

if(exist[i]==id) return true //已存在

return false // 不存在

}

void Add() // 添加数据

{

FILE *fp

int stu_num

printf("\t\t You want to input the number of student?:")

scanf("%d",&stu_num)

for (int i=0i<stu_numi++){

printf("\n")

printf("\t\tPlease input student ID:")

    scanf("%d",&stu[i].stuID)

printf("\t\tPlease input student name:")

scanf("%s",stu[i].name)

fflush(stdin)

}

if((fp=fopen("stu.dat","ab"))==NULL)  {

printf("Can't open file\n")

exit(1)

}

for(int j=0j<stu_numj++)

{   

if(fwrite(&stu[j],sizeof(struct Student),1,fp)!=1) 

printf("Error writing file.\n")

}

   fclose(fp) 

}

void rollcall() // 随机点名

{

FILE *fp

    if((fp=fopen("stu.dat","rb"))==NULL)

{

printf("Can't open file.\n")

exit(1)

}

srand((unsigned)time(NULL))

int i=0

int randID=rand()%(64-1+1)+1 // 1~64

printf("\t\t随机点到的学号为:%d\n\t\t%s\t%s\n",randID,"StuID","StuName") 

do

{

        fseek(fp,i*sizeof(struct Student),SEEK_SET) 

if(fread(&stu[i],sizeof(struct Student),1,fp)) 

{

if(stu[i].stuID==randID&&!IsExist(randID)){

   printf("\t\t%4d\t%5s\n",stu[i].stuID,stu[i].name)

               exist[index++]=randID

   break}

}

  i++

}while(!feof(fp))

fclose(fp)

}

int main()

{

int select=0

char answer='y'

Iitialize()

do 

{

printf("1.添加数据 2.随机点伍没败名 3.退出\n请选择:")

fflush(stdin)

scanf("%d",&select)

switch(select)

{

case 1:

Add()

break

case 2:

rollcall()

break

case 3:

 return 0

}

fflush(stdin)

printf("You want to continue?:")

scanf("%c",&answer)

} while (answer=='y'||answer=='Y')

return 0

}

上面的代码,腔颤我留下几个细节问题留给你自己学着解决,都是很简单的:察逗

上面的代码,我没有对重复的学号作判断。

上面的代码,我没有把点名存放到另一个文件,而是用数组替代(可以实现的也很简单)。我怕写得代码太多,百度限制提交。

上面的代码,是测试数据,stu.dat目标文件并没有64个学生,我只写入了12条数据。

上面的代码,我没有对数据数量(最多64条)作判断。

设游穗置一个足够大的随机池,给每一个学生分配相同的空间,绝磨卜然后利用随机数来选取被点名的学生,同时对该学生所分配的空间和其他学生的空并穗间进行缩减或增加。然后执行下一轮。

大致思路就是这样,希望能够帮到你哦~

#include<stdio.h>

#include <stdlib.h>

#include <time.h>

#define  STU_NUM_MAX 4

struct StudentInfo  // 学生信息结构

{

 char name[15]

 int stu_id

}stu[STU_NUM_MAX]

void WriteData()  //写入学生信息

{

FILE *fp

int stu_num=4

   

for (int 孙亩卜i=0i<stu_numi++)

{

       printf("请输入第%d个学生的姓名:",i+1)

   scanf("%s",stu[i].name)

   printf("请输入第%d个学生的学号:",i+1)

   scanf("%d",&stu[i].stu_id)

}

if ((fp=fopen("myfile.dat","ab"))==NULL)

{

printf("Can't open file\n")

exit(1)

}

for (int j=0j<stu_numj++)

{

if(fwrite(&stu[j],sizeof(struct StudentInfo),1,fp)!=1)

 printf("Error writing file.\n")

}

fclose(fp)

}

void TeacherDM(int stuID) // 教师点名

{

FILE *fp

bool find_mark=false

    

printf("\n\t%s\t\t%s\n","学号","耐吵姓名则穗") 

if((fp=fopen("myfile.dat","rb"))==NULL) 

{

printf("Can't open file\n")

exit(1)

}

    int i=0

do

{

        fseek(fp,i*sizeof(struct StudentInfo),SEEK_SET)

fread(&stu[i],sizeof(struct StudentInfo),1,fp) 

if(stu[i].stu_id==stuID)

{

printf("\t%4d\t%s\n",stu[i].stu_id,stu[i].name)

printf("\n\n\t请【%s】同学回答某某问题.\n",stu[i].name)

find_mark=true

break

}

i++

}while(!feof(fp))

if(!find_mark) printf("\n\t\t未能找到学生号为:%d的记录!\n",stuID)

fclose(fp)

}

void main(void)

{

int stuID[4]={2013011001,2013011002,2013011003,2013011004}

    //WriteData()

srand((unsigned)time(NULL))//随机种子

    TeacherDM(stuID[rand()%(3-0+1)+0])

}

运行效果截图:

另外多说一句,你所说的公正性,是不是指被点名过的同学不会再次被随机点名到。如果是这个意思,那么你可以通过数组来设置它,即把点名过的同学的学号或姓名保存到一维数组里,随机判断时只需循环检查下该同学是否已被点名过。这里就留给你做了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12233147.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存