用C语言编写一个随机点名程序

基本要求如下:
1. 学生名单存在一个文本文件students.txt 中(见附件),格式
学号 姓名
192101 李明
192102 王阳
……
2. 系统启动后,自动从文本文件中读取学生信息。每次选取(点击)相应功能,系
统随机抽取一个学生,显示给老师,用作点名。
用文本界面显示菜单,自行设计和完成菜单功能,供老师点选,可以考
虑动态显示系统选择的过程。考虑公平性,每个学生被点中的概率和次数尽量
一样,不能出现一个学生被点名两次了,还有学生没被点中的情况。
(可以使用另外一个文本文件,记录学生被点名的次数,或者在students.txt 文件
加入一个记录学生被点名次数的字段)
急求!!!

例:

#include<stdio.h>/*standardinput&output*/

#include<stdlib.h>/*standardlibary*/

#include<string.h>/*string*/

#include<conio.h>/*ConsoleInput/Output*/

#include<time.h>

structstudentinfo/*学生信息的结构体*/

charsNo[5];/*学生编号*/

charsxueNo[14];/*学号*/

charsname[20];/*学生的姓名*/

}st[100];

charhash[100]={0};/*链表的数组*/

intmain()

inti=0,j=0,flag=0,RN,*a;

FILE*fp;

charch,filename[20]={0},line[100]={0};

printf("Pleaseinputfilename:");

//fflush(stdin);/*用来清空输入缓存,以便不影响后面输入的东西*/

gets(filename);/*键盘输入文件名*/

fp=fopen(filename,"r");/*openreadonly*/

printf("名单如下:\n");/*显示所有的学生信息*/

while(fgets(line,sizeof(line)-1,fp))

if(line[0]!='\n'&&line[0]!='')

sscanf(line,"%s%s%s\n",st[i].sNo,st[i].sxueNo,st[i].sname);/*文件输入*/

printf("%s\n%s\n%s\n",st[i].sNo,st[i].sxueNo,st[i].sname);/*打印出来*/

i++;/*统计人数*/

/*设置随机数种子*/

srand((unsigned)time(NULL));

/*sizeof(类型符)是计算类型所占字节数,sizeof(int)是int所占字节数,再乘以i,得到i个int型数据的总字节数。malloc函数用于动态开辟一块内存空间,参数为开辟的内存空间字节数,返回开辟的内存空间的首地址指针。*/

a=(int*)malloc(sizeof(int)*i);

memset(a,-1,sizeof(a));/*将已开辟内存空间a的第4个字节设置为-1*/

printf("按空格键点名,其他键退出:");

fflush(stdin);

while((ch=getch())=='')

/*while(!(ch=getch())==NULL)*/

if(flag==i)/*如果flag等于总人数*/

printf("%s\n","点名结束");

break;

RN=rand()%i;/*产生一个随机数*/

while(hash[RN]==1)/*判断有没有完成某个一个学生点名*/

RN=rand()%i;/*产生随机数*/

flag++;/*计数*/

printf("\n~~~~~\n%s\n%s\n%s\n------------\n",st[RN].sNo,st[RN].sxueNo,st[RN].sname);/*输出学生的信息*/

hash[RN]=1;

扩展资料:

printf函数使用注意事项

1、域宽

%d:按整型数据的实际长度输出。

如果想输出指定宽度可以指定域宽,%md-->m域宽,打印出来以后,在控制台上,显示m位;

如果我们要打印的数的位数如果超过我们设定m则原样输出;

如果我们要打印的数的位数如果小于我们设定的位数,则补空白,具体如下:

如果m为正数,则左对齐(左侧补空白);

如果m为负数,则右对齐(右侧补空白)。

2、转义字符

如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示。

如:printf("%f%%",1.0/3);输出结果:0.333333%。

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-02-22
#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=0;i<stu_num;i++)
{
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=0;j<stu_num;j++)
{
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]);

}本回答被网友采纳

用C语言编写一个随机点名程序
printf("%s\n","点名结束");break;} RN=rand()%i;/*产生一个随机数*/ while(hash[RN]==1)/*判断有没有完成某个一个学生点名*/ RN=rand()%i;/*产生随机数*/ flag++;/*计数*/ printf("\n~~~\n%s\n%s\n%s\n---\n",s...

c语言 课堂随机点名程序 跪求大神帮我修改正确!
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(...

c语言 随机点名
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(...

跪求c语言上课随机点名程序设计
\\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]);}运行效果截图:另外多说一句,你所说的公正性,是不是指被点名过的同学不会再次被...

求C++的随机点名程序。。。要有随机点名和顺序点名
3、使用C语言随机函数取得随机数,srand((unsigned)time(0)); int rid = rand()%m_vInfo.size() - 1; SStudentInfo *pInfo = m_vInfo[rid];4、将pInfo里面的信息显示到界面 界面可以使用MFC, 如果使用控制台做的话也很方便 我只提供一个思路 如果要我提供源码, 你必须告诉我你的那个...

课堂随机点名系统程序设计。
查找:我认为,首先把txt文件存在硬盘上,最好在学生前面编上序号,完了用rand(srand)抽取号码。抽取完毕后,用号码对应用c语言函数fscanf查找号码所对应的学生姓名。删除和添加可以直接在txt里进行。如果非要在程序中的话,用fprintf就可以实现了。随机点名:从网上下载个汉语的发音包,用c调用即可。ran...

课堂随机点名系统(用C语言编写)
没有规矩不成方圆,如果没有人翘课,教务处也不会要求点名。学风一年不如一年。

急求一个C语言代码求高手帮忙
将个个功能以分开函数来写,这个就不用我说了吧 1、输入班级 2、输入随即抽取人数 3、打开班级名单 4、读取班级人数 5、判断班级人数是否少于随即抽取人数,少于返回第2步,否则执行下一步 6、读取班级名单 7、在1-总人数范围内取“抽取人数”个不重复的随机数 8、点名次数=0 9、判断点名次数,...

.NET老师布置的随机点名系统
是要用B\/S结构还是C\/S结构开发?随便写个简单的给你随机点名也就是用到随机函数string[] name=new string[]{"张三","李四","王麻子","小名","小红","小强"};string person=name[new Random().Next(0,name.length-1)];Console.WriteLine("被点名的人是:{0}",name); 其余的你自己去...

说说概率的故事(一)
c语言中与之相关的主要有两个函数:srand(seed)和rand(void)。srand()的功能就如刚才的例子,接受一个seed,生成随机序列。而rand()函数则会做一个派生:随机数表到区间[0, RAND_MAX]的映射(RAND_MAX一般定义为32767),于是就返回了一个1~32767的随记数。接下来一切都好办了。例如你想玩骰子,...

相似回答