健身跑学分管理系统1.docx
《健身跑学分管理系统1.docx》由会员分享,可在线阅读,更多相关《健身跑学分管理系统1.docx(18页珍藏版)》请在冰豆网上搜索。
健身跑学分管理系统1
沈阳航空工业学院
课程设计
学号200704021029
班级7402101
姓名邢龙
指导教师吴杰宏
2008年9月12日
沈阳航空工业学院
课程设计任务书
电子工程系电子信息工程专业7402101班学号200704021029
一、课程设计题目:
健身跑学分管理系统
(1)
二、课程设计工作自2008年9月08日起至2008年9月11日止
三、课程设计内容:
用C语言编写软件完成以下任务:
学生的记录信息要保存在磁盘文件中(记录结构至少应该包括以下四项:
学号、姓名、累计次数、学分)。
学分计算方法:
在本学期内累计次数打倒20次,可得到0.5学分,否则没有学分,新学期开始累计次数从0开始累计。
在大学期间,最多可得到2学分。
该系统具有如下功能:
(1)学生记录输入;
(2)跑步签到(每签到一次,累计次数加1);
(3)删除某学生记录。
四、课程设计要求:
程序质量:
●贯彻结构化的程序设计思想。
●用户界面友好,功能明确,操作方便。
●用户界面中的菜单至少应包括“学生跑步信息录入”、“学生跑步签到”、“某生信息删除”、“退出”4项。
●代码应适当缩进,并给出必要的注释,以增强程序的可读性。
课程设计说明书:
课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:
●封面
●课程设计任务书
●目录
●需求分析(分析题目的要求)
●程序流程图(总体流程图和主要功能模块流程图)
●核心技术的实现说明及相应程序段
●个人总结
●参考资料
●源程序及适当的注释
指导教师:
________学生签名:
________
目录
一、需求分析3
二、程序流程图3
三、核心技术的实现说明及相应程序段6
四、个人总结10
五、参考文献11
六、源程序11
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为3个模块,其中每一个模块对应一个函数,他们的主要功能分别是:
学生记录输入函数(change),跑步签到函数(number),删除某学生记录函数(del)
1、学生记录输入函数主要实现程序开始运行时学生相关数据的输入以及此后的运行中学生数据的追加功能;
2、跑步签到函数实现的功能是按照学号对学生的数据记录进行按要求添加;
3、删除某学生记录实现的功能是按照学号对学生的数据记录进行按要求的删除。
本系统程序还具有退出功能,从而达到可以在程序的一次运行当中循环执行所有的功能的要求,并根据操作者的需要终止程序。
将每一个学生记录都包含学号、姓名,以及签到次数、学分.记录类型定义为结构体类型,添加以及追加的学生信息直接写入student.dat中,其他函数对学生记录的访问时,数据来源都是student.dat文件,这样做:
1。
可以保证学生数据的一致性2。
可以对学生数据进行永久保存,保证每次运行程序都可以采用原来的数据。
二、程序流程图
1、程序总体结构图
学生跑步信息录入学生跑步签到某生信息删除退出
2、具体功能框图
(1)学生记录输入change()
读写方式打开D盘
真
Student.dat文件不成功?
假
输出文件打开失败
打开指定文件
for(i=0;i输入学生学号
num
输入学生姓名name
输入签到次数count
输入学生学分score
检查输入信息合法
关闭文件
(2)跑步签到number()
首先输入签到学生学号num
打开D盘
真
Student.dat文件不成功?
(追加方式)
假
输出文件打开失败
打开指定文件
for(i=0;i判断学生学号找到对应值num
stu[i].score+=0.5,stu[i].count=0;进行签到运算
判断输入的合法性
输出运算结果
对文件编辑结束
关闭文件
(3)删除某学生记录del()
首先输入要删除信息的学生学号num
打开D盘
真
Student.dat文件不成功(追加)
假
输出文件打开失败
打开指定文件
对输入的学号进行判断(真,执行下一步;否,输出没有找到该生信息)
左移覆盖该学生记录,具体方法如下:
删除姓名name
删除签到次数count
删除学生学分score
检查输入信息合法性
关闭文件
(4)退出功能(主函数中的)exit(0)。
该功能通过调用#include库函数实现的。
这里不过多说明。
三、核心技术的实现说明及相应程序段
本程序主要由3个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。
在这些函数当中,学生记录输入函数、其中跑步签到函数和删除功能函数是程序中较为核心的部分,下面分别进行说明。
1、学生记录输入函数
学生记录输入实际为两步实现的:
1。
新建学生文件(student.dat)2。
将录入的学生信息写入(student.dat)文件中。
[表面上看对整体系统的影响不大,但是实际上程序的原始信息录入的关键就在于此,“记忆”是其核心]具体的程序段如下:
voidchange()/*学生信息输入*/
{
FILE*fp;
inta,i,c;
staticb=0;
if((fp=fopen("d:
\\student.txt","w+"))==NULL)
{
printf("文件打开失败!
\n");
return;
}
for(i=0;i{
stu[i].num=0;
stu[i].count=0;
stu[i].score=0;
}
for(i=0;i{printf("\n输入学生信息:
");
printf("\n输入学生学号,按回车键确认:
");
scanf("%d",&stu[i].num);
printf("\n输入学生姓名,按回车键确认:
");
scanf("%s",stu[i].name);
printf("\n输入签到次数,按回车键确认:
");
scanf("%d",&stu[i].count);
printf("\n输入学分,按回车键确认:
");
scanf("%f",&stu[i].score);
}
for(i=0;i{
if(fwrite(&stu[i],sizeof(structstudent),1,fp)!
=1)
printf("文件书写错误\n");
}
fclose(fp);
}
2、跑步签到函数是在学生文件(student.dat)已经存在的情况下,此时文件要以读写方式或追加的方式打开,这样才可以保证以前已经存在的数据不丢失[记忆功能的体现].
该函数执行时,首先由用户输入签到学生的学号,而后按照该学号进行查找,如果文件中存在该学生的数据,程序查找到指定的学生学号签到次数加1,只要满20次,签到次数就归零,同时学分加0.5。
此改变被应用到结构体中。
该函数的核心是签到次数的增加,归零以及学分的添加最终对原文件的更改。
这些操作完成后,要签到的学生信息则改变,也就实现了签到。
在数组中更改学生信息后,还要将更改后的新信息写回原文件当中,从而保证其完善性。
具体的程序段如下:
voidnumber()/*学生签到功能*/
{
FILE*fp;
inti,num;
printf("\n请输入签到学生的学号:
");
scanf("%d",&num);
if((fp=fopen("d:
\\student.dat","r+"))==NULL)
{
printf("对不起,文件打开失败\n");
return;
}/*打开文件*/
for(i=0;i{
fread(&stu[i],sizeof(structstudent),1,fp);/*读取数据*/
if(num==stu[i].num)/*对输入的学生学号进行判断,找到对应值*/
{
stu[i].count++;
{if(stu[i].count==20)
stu[i].score+=0.5,stu[i].count=0;}/*进行签到运算*/
if(stu[i].num!
=0)
printf("\n%d\t%s\t%d\t%f",stu[i].num,stu[i].name,stu[i].count,stu[i].score);/*输入签到结果*/
if((fp=fopen("d:
\\student.dat","r+"))==NULL)
{
printf("文件打开失败\n");
return;
}
if(fwrite(&stu[i],sizeof(structstudent),1,fp)!
=1)
printf("\n输入错误");/*对签到功能中的文件编辑结束*/
}
}
fclose(fp);
}
3、删除某学生记录函数是在完成了要求功能后,因不想继续保留指定学生的记录而对其进行删除的功能。
实现该功能的关键在于在打开student.dat文件的前提下对数据中的指定相目实行左移覆盖,从而实现删除功能[在我所编辑的程序系统中,因为没有显示具体信息的功能要求,我是通过两种方法证明该功能的可用性:
1。
重复删除显示“没有找到该学生信息!
”2。
签到已删除的学生,出现错误显示]。
具体程序段如下:
voiddel()/*删除功能*/
{FILE*fp;
inti,t;
voidchange();
if((fp=fopen("d:
\\student.dat","r+"))==NULL)
{
printf("文件打开失败!
\n");
return;
}
for(t=0;tfread(&stu[t],sizeof(structstudent),1,fp);
intj,m;
printf("请输入想要删除的学生学号");
scanf("%d",&m);
for(i=0;iif(m==stu[i].num)break;
if(i>=N)
{printf("没有找到该学生信息!
\n");
return;
}
else
{for(j=i+1;jstrcpy(stu[j-1].name,stu[j].name);/*学生姓名的删除*/
stu[j-1].count=stu[j].count;/*学生签到次数的删除*/
stu[j-1].score=stu[j].score;/*学生学分的删除*/
stu[j-1].num=stu[j].num;/*学生学号的删除*/
}
if((fp=fopen("d:
\\student.dat","w"))==NULL)
{printf("文件打开失败!
");
return;
}
else/*重新写回到原文件中*/
{putw(N-1,fp);/*将N-1重新写入文件中*/
for(i=0;ifwrite(&stu[i],sizeof(structstudent),1,fp);
}
fclose(fp);
printf("删除成功!
\n");/*删除成功*/
}
四、个人总结
总体来讲C++的课设无论从性质上还是实质上都超出了一般意义的“课程”的概念。
我对其定义为:
一次近乎“实战”意义上的“演习”。
它是一周的,最接近社会应用的训练。
不但提升了我对C语言的理论理解,更提升了我的实际操作能力。
事实上,我在接到这道题的时候心里真的没有底。
虽然对书本上的知识掌握的还算可以,但是在题目中明显要用到许多书中不常出现的函数,结构。
并且,平时学习时练习的大多是分解的单功能程序。
在这次的课设中是要把多个具有不同功能的程序体有机的联系在一起,使其能够达到题目的要求。
对于我来说难度着实是不小的。
经过计划,首先思考系统的结构,分解其各个功能。
然后针对每个功能去编辑程序,并且借鉴了一定量的已有程序。
最后整和调试我的程序。
我认为老师对课设的理解是有一定意义的:
可以做参考,但是一定要学会你所参考的东西。
并且老师对我的程序提出了改进意见:
1。
学生的学号应用字符型,使其长度更能满足实际要求。
2。
对程序中了解不深入的语句及函数应即使查询相关书籍。
(对此我已有一定改进)
虽然在一周的努力,辛苦当中,有无数次的尝试被无情的证明是错误的。
但是当自己的程序能运行时心中的快乐绝对可以胜过之前的磨砺。
所有付出都值得,并且有很大的收获。
是我对这次课设的最简洁的个人总结。
在此仅感谢我的指导老师和编写C++语言教程的专家们。
五、参考文献
1谭浩强.C程序设计.北京:
清华大学出版社,2005
2刘成等.C语言程序设计实验指导与习题集.北京:
中国铁道出版社,2006
3谭明金.C语言程序设计实例精粹2007
4陈丽芳.C语言程度设计实验学习指导2006
5张军安.C语言程序设计应用基础教程
(其他较多类似参考书籍从略)
六、源程序
#include
#include
#include
#include
#include/*相关的库函数,最后一项与exit(0)*/
#defineN3/*宏定义,定义可记录的学生个数*/
structstudent
{
intnum;
charname[10];
intcount;
floatscore;
}stu[N];
voidchange()/*对学生信息进行输入*/
{
FILE*fp;
inti;
if((fp=fopen("d:
\\student.dat","w+"))==NULL)
{
printf("文件打开失败!
\n");
return;
}/*打开文件*/
for(i=0;i{
stu[i].num=0;
stu[i].count=0;
stu[i].score=0;/*为数据赋初始值*/
}
for(i=0;i{printf("\nÇëÊäÈëѧÉúÐÅÏ¢:
");
printf("\n请输入学生学号,按回车键确认:
");
scanf("%d",&stu[i].num);
printf("\n请输入学生姓名,按回车键确认:
");
scanf("%s",stu[i].name);
printf("\n请输入签到次数,按回车键确认:
");
scanf("%d",&stu[i].count);
printf("\n请输入学分,按回车键确认:
");
scanf("%f",&stu[i].score);
}
for(i=0;i{
if(fwrite(&stu[i],sizeof(structstudent),1,fp)!
=1)
printf("对不起,文件书写错误\n");
}/*文件输入结束*/
fclose(fp);
}
voidnumber()/*学生签到功能*/
{
FILE*fp;
inti,num;
printf("\n请输入签到学生的学号:
");
scanf("%d",&num);
if((fp=fopen("d:
\\student.dat","r+"))==NULL)
{
printf("对不起,文件打开失败\n");
return;
}/*打开文件*/
for(i=0;i{
fread(&stu[i],sizeof(structstudent),1,fp);/*读取数据*/
if(num==stu[i].num)/*对输入的学生学号进行判断,找到对应值*/
{
stu[i].count++;
{if(stu[i].count==20)
stu[i].score+=0.5,stu[i].count=0;}/*进行签到运算*/
if(stu[i].num!
=0)
printf("\n%d\t%s\t%d\t%f",stu[i].num,stu[i].name,stu[i].count,stu[i].score);/*输入签到结果*/
if((fp=fopen("d:
\\student.dat","r+"))==NULL)
{
printf("文件打开失败\n");
return;
}
if(fwrite(&stu[i],sizeof(structstudent),1,fp)!
=1)
printf("\n输入错误");/*对签到功能中的文件编辑结束*/
}
}
fclose(fp);
}
voiddel()/*删除功能*/
{FILE*fp;
inti,t;
voidchange();
if((fp=fopen("d:
\\student.dat","r+"))==NULL)
{
printf("文件打开失败!
\n");
return;
}
for(t=0;tfread(&stu[t],sizeof(structstudent),1,fp);
intj,m;
printf("请输入想要删除的学生学号");
scanf("%d",&m);
for(i=0;iif(m==stu[i].num)break;
if(i>=N)
{printf("没有找到该学生信息!
\n");
return;
}
else
{for(j=i+1;jstrcpy(stu[j-1].name,stu[j].name);/*学生姓名的删除*/
stu[j-1].count=stu[j].count;/*学生签到次数的删除*/
stu[j-1].score=stu[j].score;/*学生学分的删除*/
stu[j-1].num=stu[j].num;/*学生学号的删除*/
}
if((fp=fopen("d:
\\student.dat","w"))==NULL)
{printf("文件打开失败!
");
return;
}
else/*重新写回到原文件中*/
{putw(N-1,fp);/*将N-1重新写入文件中*/
for(i=0;ifwrite(&stu[i],sizeof(structstudent),1,fp);
}
fclose(fp);
printf("删除成功!
\n");/*删除成功*/
}
voidmain()/*主函数,主功能菜单*/
{
intt;
for(t=1;;t++)/*循环输出功能菜单*/
{
printf("\n");
printf("********************学生健康跑签到系统********************");/*主菜单*/
printf("\n1*学生跑步信息录入");
printf("\n2*学生跑步签到");
printf("\n3*某学生信息删除");
printf("\n4*退出");
printf("\n请输入您要选择的操作的序号:
");
switch(getch())
{
case'1':
change();break;
case'2':
number();break;
case'3':
del();break;
case'4':
exit(0);break;
default:
printf("输入错误,请输入列表中存在的序号!
\n");
}
}}