#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])
}
运行效果截图:
另外多说一句,你所说的公正性,是不是指被点名过的同学不会再次被随机点名到。如果是这个意思,那么你可以通过数组来设置它,即把点名过的同学的学号或姓名保存到一维数组里,随机判断时只需循环检查下该同学是否已被点名过。这里就留给你做了。
例:
#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--&gt;m域宽,打印出来以后,在控制台上,显示m位;
如果我们要打印的数的位数如果超过我们设定m则原样输出;
如果我们要打印的数的位数如果小于我们设定的位数,则补空白,具体如下:
如果m为正数,则左对齐(左侧补空白);
如果m为负数,则右对齐(右侧补空白)。
2、转义字符
如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示。
如:printf("%f%%",1.0/3);输出结果:0.333333%。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)