04061284教师上课随机点名.docx
《04061284教师上课随机点名.docx》由会员分享,可在线阅读,更多相关《04061284教师上课随机点名.docx(14页珍藏版)》请在冰点文库上搜索。
04061284教师上课随机点名
沈阳航空工业学院
课程设计
学号__________
班级__________
姓名__________
指导教师__________
年月日
沈阳航空工业学院
课程设计任务书
机械与汽车学院机械设计制造及其自动化专业5406108班学号200504061284
一、课程设计题目:
教师上课随机点名
二、课程设计工作自2007年7月9日起至2007年7月14日止
三、课程设计内容:
运用所学的C语言知识,编制和调试程序,具有如下功能:
教师在每次上课时,需要对学生随机点名提问。
每次只提问1名同学,对于任何一位同学的提问次数不可超过3次。
如果所有的同学都被提问了3次,则次数归0,重新开始。
学生信息应事先保存到文件myfile.dat中。
学生共有4人,名单如下:
20013011001杜永宁20013011002王传华
20013011003殷泳20013011004杨柳青
所谓点名,是指计算器将某位同学的姓名和学号打印到屏幕上,则表示该同学被点名1次。
四、课程设计要求:
程序质量:
●贯彻结构化程序设计思想。
●用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。
●用户界面中的菜单至少应包括“开始点名”、“显示所有同学点名情况”、“保存点名”、“退出”4项。
●代码应适当缩进,并给出必要的注释,以增强程序的可读性。
课程设计说明书:
课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:
●封面
●课程设计任务书
●目录
需求分析(分析题目的要求)
●程序流程图(总体流程图和主要功能模块流程图)
●核心技术的实现说明及相应程序段
●个人总结
●参考资料
●源程序及适当的注释
指导教师:
____________________
学生签名:
____________________
目录
一、程序设计题目…………………………………1
二、需求分析………………………………………1
三、程序流程图……………………………………2
四、核心技术的实现方法、程序段及注释…………5
五、个人总结………………………………………7
六、参考文献………………………………………8七、完整源程序代码………………………………8
一、程序设计题目
教师上课随机点名,具体要求如下:
1、开始点名
2、显示所有同学点名情况
3、保存点名
4、退出
注:
每个学生数据至少应该包括学号、姓名、被点到的次数,学生数据要保存在you.txt文件中。
二、需求分析
经过对程序设计题目的严格分析大体得知,整个程序的设计实现分为四个模块,其中每一个模块对应一个函数,他们的功能分别是:
教师开始点名函数(start()),显示点名情况函数(display()),保存点名记录函数(save()),退出点名系统函数(exit(0))。
所有函数的实现严格按照题目的要求。
1、教师开始点名函数实现的功能是随机抽取结构体数组里存储的一个学生信息,并打印到计算机屏幕上,称之为一次点名,连续调用就是多次随机点名。
根据学生是否在席的情况,教师选择“确认”使学生被点到的次数加一,选择“取消”则表示此次点名无效。
2、显示点名情况函数实现的功能是将学生学号和姓名连并被点到的次数打印到用户屏幕上;
3、保存点名记录函数实现的功能是将点名完毕后的存储于计算机内存的学生数据传递到一个程序自动新建的外存文件里面,这个文件的文件名及路径是D:
\\you.txt;
4、退出点名系统函数该函数实现的功能是结束本次点名,退出点名系统;
每一个学生记录都包含学号、姓名,以及被点到的次数,学生信息的类型定义为结构体数组类型,系统刚开始调用的学生信息均来自于D:
\\myfile.dat,D:
\\myfile.dat中的被点到的次数均为零,并将点完名的学生信息保存到D:
\\you.txt中。
三、程序流程
1、程序总体框图
图1.程序总体框图
2、具体功能框图
(1)教师开始点名函数start();
rand()%8=>i
输出点名一次
stu[i].t<3
选择“确认点名”选择“取消
输出“确认成功!
”
输出“取消成功!
”
stu[i].t+1=>stu[i].t
(stu[i].t==3)&&(stu[i].t==3)&&(stu[i].t==3)
是否
0=>j
0=>stu[j].t
j+1=>j
直到j<8
图2.教师开始点名函数start()
(2)显示点名情况函数display();
0=>k
输出“stu[k].num”,“stu[k].name”
k+1=>k
直到k<8
图3.显示点名情况函数display()
(3)保存点名记录函数save();
定义文件指针*fp1
if((fp1=(“D:
\\you.txt”,“w+”))==NULL)
是否
程序打开D:
\\you.txt
0=>i
输出“文件打开失败!
”
把stu[]里存储的点名
信息保存you.txt
i+1=>i
直到i<4
关闭D:
\\you.txt文件
输出“保存点名成功!
”
图4.保存点名记录函数save()
(4)退出点名系统函数exit(0);
此函数为c语言标准库函数,只需在源程序开头加一个#include申明即可调用。
四、核心技术的实现方法、程序段及注释
本程序主要由三个自定义函数、一个标准库函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。
,其中三个自定义的函数是程序中较为核心的部分,下面分别进行说明。
1、教师开始点名函数start()
此函数首先是从结构体数组stu[]的四个成员里面随机抽取一个成员并打印到计算机屏幕上。
这里要用到rand()这个标准库函数,rand()%n(n是整数)可产生0到n-1之间的一个随机整数,如果谁被抽到了一次,在其点名次数小于3次的情况下,被点到的次数就加一。
待所有的同学被点到三次后,则将被点到的次数都归零。
具体的程序段如下:
voidstart()/*开始点名*/
{
inti,j;
i=rand()%8;/*产生一个0-7范围内的一个随机整数*/
printf("\n选择“确认点名”或“取消点名”");
printf("\n%s%s",stu[i].num,stu[i].name);
if(stu[i].t<3)
{
switch(getch())/*实现确认或者取消一次点名的功能*/
{
case'1':
printf("\n确认成功!
");stu[i].t++;break;
case'2':
printf("\n取消成功!
");break;
default:
printf("\n出错!
");
}
}
if((stu[0].t==3)&&(stu[1].t==3)&&(stu[2].t==3)&&(stu[3].t==3))
{
for(j=0;j<8;j++)
stu[j].t=0;}/*所有的学生被点了三次后,点名次数重新归零*/
}
2、显示点名情况函数display()
该函数的核心功能是将教师点名过程中每个同学被点到的次数连同他本人的学号及姓名一起打印到计算机屏幕上显示,以便判断某位同学被点到次数是否超过了三次,如果哪位同学被随机抽取的次数超过了三次,则这位同学被点到的次数就不会再增加了。
具体程序段如下:
voiddisplay()/*将点名情况显示到屏幕上*/
{
intk;
for(k=0;k<8;k++)
printf("\n%s%s%d次",stu[k].num,stu[k].name,stu[k].t);
}
3、保存点名记录函数save()
教师点名完毕以后将点名的结果要保存起来,save()函数就是要实现这个功能的。
此函数需要先定义一个文件指针,然后用“w+”的形式为读写新建一个名为you.txt的文本文档,然后将计算机内存中(即结构体数组stu[]中)存储的点名结果传递到计算机外存D:
\\you.txt文本文档中。
此文档保存在D:
\\根目录下。
具体的程序段如下:
voidsave()/*将点名完毕后的内存点名信息保存到外存D:
\\you.txt文本文档中*/
{
inti;
FILE*fp1;
if((fp1=fopen("D:
\\you.txt","w+"))==NULL)
printf("文件打开失败!
");
elsefor(i=0;i<8;i++)
fprintf(fp1,"%s%s%d次\n",stu[i].num,stu[i].name,stu[i].t);
fclose(fp1);
printf("\n保存点名成功!
");
}
4、主函数main()
主函数的功能主要是将保存学生点名原始数据的外存文件myfile.dat中的学生信息传递到内存结构体数组stu[]中,并调用各个自定义的函数,四个菜单项功能主要是凭switch语句来实现的,并加一个goto循环,以实现连续多次点名。
注意:
myfile.dat应预先保存到D:
\\下,才能成功地将外存数据传递到内存结构体数组中。
五、个人总结
本次的C语言课程设计时间短,工作强度大,通过这次学习对我的逻辑思维能力,学习效率很有益处,是一次难得的锻炼机会。
由于课设的题目富有挑战性,大大开拓了我过去学习C语言那种相对局限的认知能力,并大致掌握了如何实现软件设计中将各个功能模块化这一重要设计知识。
这次课设让我大体掌握了VisualC++的基本功能,突破了那种以往以TC环境为主要设计媒介的思想束缚。
通过一周的课设使我的VC功能大大增强,设计起来得心应手,待全部源代码设计完毕后不禁有一种意犹未尽、行云流水的畅感,我决定以后继续进修VC++,熟悉它的每一项功能,达到一个初级程序编程员的水平。
课设的上机期间,辅导老师也给予了我们莫大的帮助,攻克了设计过程中一个又一个问题,核心问题的成功有很大一部分来自于教师的热心辅导,在此我深切的感谢你们,感谢你们那种无私的奉献。
六、参考文献
1谭浩强.C程序设计.北京:
清华大学出版社,2005
2刘成等.C语言程序设计实验指导与习题集.北京:
中国铁道出版社,2006
七、完整源程序代码
#include
#include
#include
#include
structstudent
{
charnum[20];/*存储学生学号*/
charname[30];/*存储学生姓名*/
intt;/*点名次数*/
}stu[8];
voidstart()/*开始点名*/
{
inti,j;
i=rand()%8;/*产生一个0-7范围内的一个随机整数*/
printf("\nxuanzhe“querendianming”huo“quexiaodianming”");
printf("\n%s%s",stu[i].num,stu[i].name);
if(stu[i].t<3)
{
switch(getch())/*实现确认或者取消一次点名的功能*/
{
case'1':
printf("\nquerenchenggong!
");stu[i].t++;break;
case'2':
printf("\nquexiaochenggong!
");break;
default:
printf("\nchucuo!
");
}
}
if((stu[0].t==3)&&(stu[1].t==3)&&(stu[2].t==3)&&(stu[3].t==3))
{
for(j=0;j<8;j++)
stu[j].t=0;}/*所有的学生被点了三次后,点名次数重新归零*/
}
voiddisplay()/*将点名情况显示到屏幕上*/
{
intk;
for(k=0;k<8;k++)
printf("\n%s%s%d次",stu[k].num,stu[k].name,stu[k].t);
}
voidsave()/*将点名完毕后的内存点名信息保存到外存D:
\\you.txt文本文档中*/
{
inti;
FILE*fp1;
if((fp1=fopen("D:
\\you.txt","w+"))==NULL)
printf("wenjiandakaishibai!
");
elsefor(i=0;i<8;i++)
fprintf(fp1,"%s%s%d次\n",stu[i].num,stu[i].name,stu[i].t);
fclose(fp1);
printf("\nbaochundianmingchenggong!
");
}
main()
{
FILE*fp2;
inti;
printf("**************************************\n");
printf("a.kaishidianming(1.querenquxiao2.quexiao)\n\n");
printf("b.xianshisuoyouxueshengdianmingqingkuang\n\n");
printf("c.baocundianming\n\n");
printf("d.tuichudianmingxitong\n\n");
printf("**************************************\n");
printf("qingxuanzheyigecaidanxiang:
");
if((fp2=fopen("D:
\\myfile.dat","w+"))==NULL)
printf("dakaiwenjianshibai!
");
elsefor(i=0;i<8;i++)
fscanf(fp2,"%s%s%d",stu[i].num,stu[i].name,&stu[i].t);/*将外存myfile.dat中的学生信息传递给内存stu[8]结构体数组中*/
fclose(fp2);
loop:
/*goto语句实现连续多次点名*/
switch(getch())/*switch语句调用四个函数,实现四个菜单项的功能*/
{
case'a':
start();break;
case'b':
display();break;
case'c':
save();break;
case'd':
exit(0);
}
gotoloop;
}
_