学生点名系统.docx
《学生点名系统.docx》由会员分享,可在线阅读,更多相关《学生点名系统.docx(27页珍藏版)》请在冰豆网上搜索。
学生点名系统
沈阳航空工业学院
课程设计
学号__________
班级__________
姓名__________
指导教师__________
年月日
沈阳航空工业学院
课程设计任务书
机械与汽车学院机械设计制造及其自动化专业5406108班学号200504061273
一、课程设计题目:
学生点名系统
二、课程设计工作自2007年7月9日起至2006年7月14日止
三、课程设计内容:
运用所学的C语言知识,编制和调试程序,具有如下功能:
1,输入学生数据
2,对学生进行点名
3,统计、三次未到的学生记录,并将其考试标志设为0
4,统计缺席次数少于三次的学生记录,并将其考试标志设为1
5,分别输出两种考试标志的学生记录
6,随机查询任意学生信息并输出
注,每个学生数据至少应该包括学号.姓名.点名记录.考试标志四项信息.学生数据要保存在student.dat文件中
四、课程设计要求:
程序质量:
1。
采用模块化程序设计方法:
在程序界面,以菜单的形式调用各功能函数:
程序可度性强,界面友好,输出形式尽量美观。
2,用户界面友好,功能明确,操作方便:
可以加以其它功能或修饰。
3,用界面友好的菜单至少因该包括.输入数据.点名.统计点名情况.
计缺席记录.显示考试标志.退出.6项。
4,代码应适当缩进,并给出必要的注释,以增强程序的可读性。
课程设计说明书:
课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:
●封面
●课程设计任务书
●目录
●需求分析(分析题目的要求)
●程序流程图(总体流程图和主要功能模块流程图)
●核心技术的实现说明及相应程序段
●个人总结
●参考资料
●源程序及适当的注释
指导教师:
________学生签名:
________
目录
一、需求分析1
二、程序流程图2
三、核心技术的实现说明及相应程序段7
四、个人总结13
五、参考文献13
六、源程序13
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为六个模块,其中每一个模块对应一个函数,他们的功能分别是:
输入学生数据函数(voidoutPutStudent),对学生进行点名(voidcall),统计点名情况(voidcountskip),统计缺席情况(voidoutputexamstudentskip0),显示学生考试标志(voidoutputexamstudentskip1)以及退出(show)。
1、输入学生数据函数主要实现程序最初运行时学生数据的录入以及其后的运行中学生数据的追加功能。
2、对学生进行点名实现的功能是按照学号对学生进行点名。
3、统计点名情况按照题目的具体要求实现的是对学生的点名记录进行统计。
4、统计缺席情况允许按照学号对学生的出席情况进行查询。
5、显示学生考试标志可以实现对学生记录中除点名情况以外的数据的修改。
6、退出可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。
每一个学生记录都包含学号、姓名,点名记录、考试标志,四项信息,在程序当中,将学生记录类型定义为结构体类型,添加以及追加的学生信息直接写入E盘的student.dat文件中,其他函数每次对学生记录的访问,其数据来源都是student.dat文件,这样做不但可以保证学生数据的一致性,而且可以对学生数据进行永久保存,保证每次运行程序都可以采用原来的数据。
二、程序流程图
1、程序总体结构图
图1程序总体结构图
2、具体功能框图
(1)添加学生数据
图2添加学生数据
(2)点名call函数
图3点名call函数
(3)输出点名三次和三次以上未到学生
图4输出点名三次和三次以上未到学生
(4)输出点名全勤或三次以下未到学生
图5输出点名全勤或三次以下未到学生
(5)单个学生查询searchstudent函数
图6单个学生查询searchstudent函数
三、核心技术的实现说明及相应程序段
本程序主要由六个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。
在这些函数当中,点名系统,显示学生考试标志,单个查询学生记录等是比较关键的,下面分别进行说明。
1、添加数据函数
添加数据分为两种情况,其一是在学生文件(student.dat)不存在的情况下,首先由程序创建一个新文件,并将录入的学生信息写入该文件当中;其二是在学生文件(student.dat)已经存在的情况下,此时文件要以读写方式或追加的方式打开,这样才可以保证以前已经存在的数据不丢失。
具体的程序段如下:
voidoutPutStudent(student*stu1,intnum)
{
inti=0;
FILE*fp;
if((fp=fopen("student.dat","r"))==NULL)/*读写方式打开文件*/
{
printf("cannotopenfile\n");
return;
}
for(i=0;i{
fread(&stu1[i],sizeof(structstudent),1,fp);/*从指定文件中打开一个长度为sizeof的数据项*/
}
for(i=0;i{
printf("%s%d%d%d\n",stu1[i].name,stu1[i].num,stu1[i].callSkip,stu1[i].examSkip);/*输入学生的信息*/
}
//delete[]stu;
fclose(fp);/*关闭文件*/
}
2,点名CALL函数。
该函数的核心信息是对学生进行点点名,对已经记录在电脑中的数据的同学进行点名,并对学生的点名情况进行记录,输入Y则显示同学出席,输入N则显示同学没到。
voidcall(student*stu1,intnum)
{
intii=0;/*定义函数*/
for(ii=0;ii{
charch='';
printf("%s",stu1[ii].name);
printf("来了吗?
(此处错误输出默认为n)\t\ty/n?
:
");
//charch='';
scanf("%c",&ch);
scanf("%c",&ch);
//cin>>ch;
if(ch=='y')/*如果输入Y*/
{
printf("他来了!
\n");/*显示他来了*/
}
else/*否则*/
{
stu1[ii].callSkip++;
printf("他没有来!
\n");/*显示他没来*/
}
}
}
3.输出点名三次和三次以上未到学生
其核心内容是对系统已经记录的学生信息进行处理,并输出点名三次和三次以上未到学生,并且通过学生的出席和缺席情况记录学生的考试标志。
voidcountskip(student*stu1,intnum)
{
intii=0;
for(ii=0;ii{
if(stu1[ii].callSkip>=3)/*缺席次数大于3*/
{
stu1[ii].examSkip=0;/*则考试表示显示0*/
}
else
{
stu1[ii].examSkip=1;/*否则显示1*/
}
}
}
4,输出点名全勤或三次以下未到学生
对已有的数据进行处理,然后对学生的缺席情况进行统计,输出点名全勤或三次以下未到学生。
并且记录学生的情况。
同时显示学生的考试标志。
voidoutputexamstudentskip1(student*stu1,intnum)
{
printf("全勤或缺席次数不到3次的同学为:
\n");
intii=0;
intis_have=0;/*定义函数*/
for(ii=0;ii{
if(stu1[ii].examSkip==1)/*考试标志为1*/
{
printf("%s\n",stu1[ii].name);/*输出学生数据*/
is_have++;
}
}
if(is_have==0)
{
printf("没有全勤和缺席次数不到3次的同学\n");
}
}
5,单个学生查询searchstudent函数
对电脑已经记录的学生信息进行查询,显示学生的出席和缺席情况,学生的姓名以及学生的学号和考试标志,并输出查询学生的数据。
voidsearchstudent(student*stu1,intnum)
{
charch[10];/*定义长度为10的字符串*/
printf("请输入你想查询学生的姓名:
\n");
scanf("%s",ch);
//cin>>ch;
intii=0;
for(ii=0;ii{
if(strcmp(ch,stu1[ii].name)==0)
{
printf("\n学生名字学号学生点名未到次数(学生记录)考试标志\n");
printf("%s\t%d\t\t%d\t\t\t%d\n",stu1[ii].name,stu1[ii].num,stu1[ii].callSkip,stu1[ii].examSkip);
}
}
//delete[]ch;
}
6、总分排序函数:
voidmain()
{
inti=0;
intover=1;
intstudentnumber=0;
intdocontrol=0;
FILE*fp;
if((fp=fopen("student.dat","w"))==NULL)
{
printf("cannotopenfile\n");
return;
}
printf("请输入你们班有多少个学生?
:
\n");
scanf("%d",&studentnumber);
student*stu=newstudent[studentnumber];
printf("******************************************************\n");
printf("*请输入学生信息,格式如下*\n");
printf("*姓名学号学生记录考试记录*\n");
printf("*wang20020101*\n");
printf("*zhang20020201*\n");
printf("*由于是刚开学,所以初试的学生记录应该为0*\n");
printf("*考试记录应该为1*\n");
printf("******************************************************\n");
printf("请输入:
\n");
for(i=0;i{
scanf("%s%d%d%d",stu[i].name,&stu[i].num,&stu[i].callSkip,&stu[i].examSkip);
}
for(i=0;i{
fwrite(&stu[i],sizeof(structstudent),1,fp);
}
fclose(fp);
while(over==1)
{
printf("\n1.点名\n");
printf("2.输出点名三次和三次以上未到学生\n");
printf("3.输出点名全勤或三次以下未到学生\n");
printf("4.单个学生查询\n");
printf("请选择你想进行的操作:
");
scanf("%d",&docontrol);
printf("\n");
switch(docontrol)
{
case1:
call(stu,studentnumber);
break;
case2:
countskip(stu,studentnumber);
outputexamstudentskip0(stu,studentnumber);
break;
case3:
countskip(stu,studentnumber);
outputexamstudentskip1(stu,studentnumber);
break;
case4:
countskip(stu,studentnumber);
searchstudent(stu,studentnumber);
break;
default:
break;
}
printf("\n\n是否想结束?
y/n:
");
charch;
scanf("%c",&ch);
scanf("%c",&ch);
//cin>>ch;
if(ch=='y')
{
over=0;
}
else
{
over=1;
}
}
delete[]stu;
}
四、个人总结
通过本次的课程设计使我认识到了自己的不足,加深了对C语言知识的了解,充分体会到了C语言的重要行,并且通过课程设计深化了自己的C语言知识,虽然以前对C语言不是很熟练,但通过学习已经大大增进了自己的C语言知识,本次课程设计刚开始的时候确实遇到了不少困难,但通过自己的努力,一点点的克服了困难,最终拿出了自己的程序。
五、参考文献
1谭浩强.C程序设计.北京:
清华大学出版社,2005
2刘成等.C语言程序设计实验指导与习题集.北京:
中国铁道出版社,2006
六、源程序
#include
#include
#include
//#include"miao.h"
//#include
//usingnamespacestd;
structstudent
{
charname[10];
intnum;
intcallSkip;
intexamSkip;
};
voidoutPutStudent(student*stu1,intnum)
{
inti=0;
FILE*fp;
if((fp=fopen("student.dat","r"))==NULL)/*读写方式打开文件*/
{
printf("cannotopenfile\n");
return;
}
for(i=0;i{
fread(&stu1[i],sizeof(structstudent),1,fp);/*从指定文件中打开一个长度为sizeof的数据项*/
}
for(i=0;i{
printf("%s%d%d%d\n",stu1[i].name,stu1[i].num,stu1[i].callSkip,stu1[i].examSkip);/*输入学生的信息*/
}
//delete[]stu;
fclose(fp);/*关闭文件*/
}
voidcall(student*stu1,intnum)
{
intii=0;/*定义函数*/
for(ii=0;ii{
charch='';
printf("%s",stu1[ii].name);
printf("来了吗?
(此处错误输出默认为n)\t\ty/n?
:
");
//charch='';
scanf("%c",&ch);
scanf("%c",&ch);
//cin>>ch;
if(ch=='y')/*如果输入Y*/
{
printf("他来了!
\n");/*显示他来了*/
}
else/*否则*/
{
stu1[ii].callSkip++;
printf("他没有来!
\n");/*显示他没来*/
}
}
}
voidcountskip(student*stu1,intnum)
{
intii=0;
for(ii=0;ii{
if(stu1[ii].callSkip>=3)/*缺席次数大于3*/
{
stu1[ii].examSkip=0;/*则考试表示显示0*/
}
else
{
stu1[ii].examSkip=1;/*否则显示1*/
}
}
}
voidoutputexamstudentskip0(student*stu1,intnum)
{
printf("缺席次数大于3次的同学为:
\n");
intii=0;
intis_have=0;
for(ii=0;ii{
if(stu1[ii].examSkip==0)
{
printf("%s\n",stu1[ii].name);
is_have++;
}
}
if(is_have==0)
{
printf("没有超过三次未到的同学.\n");
}
}
voidoutputexamstudentskip1(student*stu1,intnum)
{
printf("全勤或缺席次数不到3次的同学为:
\n");
intii=0;
intis_have=0;
for(ii=0;ii{
if(stu1[ii].examSkip==1)
{
printf("%s\n",stu1[ii].name);
is_have++;
}
}
if(is_have==0)
{
printf("没有全勤和缺席次数不到3次的同学\n");
}
}
voidsearchstudent(student*stu1,intnum)
{
charch[10];
printf("请输入你想查询学生的姓名:
\n");
scanf("%s",ch);
//cin>>ch;
intii=0;
for(ii=0;ii{
if(strcmp(ch,stu1[ii].name)==0)
{
printf("\n学生名字学号学生点名未到次数(学生记录)考试标志\n");
printf("%s\t%d\t\t%d\t\t\t%d\n",stu1[ii].name,stu1[ii].num,stu1[ii].callSkip,stu1[ii].examSkip);
}
}
//delete[]ch;
}
voidmain()
{
inti=0;
intover=1;
intstudentnumber=0;
intdocontrol=0;
FILE*fp;
if((fp=fopen("student.dat","w"))==NULL)
{
printf("cannotopenfile\n");
return;
}
printf("请输入你们班有多少个学生?
:
\n");
scanf("%d",&studentnumber);
student*stu=newstudent[studentnumber];
printf("******************************************************\n");
printf("*请输入学生信息,格式如下*\n");
printf("*姓名学号学生记录考试记录*\n");
printf("*wang20020101*\n");
printf("*zhang20020201*\n");
printf("*由于是刚开学,所以初试的学生记录应该为0*\n");
printf("*考试记录应该为1*\n");
printf("******************************************************\n");
printf("请输入:
\n");
for(i=0;i{
scanf("%s%d%d%d",stu[i].name,&stu[i].num,&stu[i].callSkip,&stu[i].examSkip);
}
for(i=0;i{
fwrite(&stu[i],sizeof(structstudent),1,fp);
}
fclose(fp);
while(over==1)
{
printf("\n1.点名\n");
printf("2.输出点名三次和三次以上未到学生\n");
printf("3.输出点名全勤或三次以下未到学生\n");
printf("4.单个学生查询\n");
printf("请选择你想进行的操作:
");
scanf("%d",&docontrol);
printf("\n");
switch(docontrol)
{
case1:
call(stu,studentnumber);
break;
case2:
countskip(stu,studentnumber);
outputexamstudentskip0(stu,studentnumber);
break;