班级成绩管理系统.docx
《班级成绩管理系统.docx》由会员分享,可在线阅读,更多相关《班级成绩管理系统.docx(26页珍藏版)》请在冰点文库上搜索。
班级成绩管理系统
课程设计报告
课程名称C语言程序设计
课题名称班级成绩管理系统
专业电子信息
班级0802班
学号32
姓名董霄宇
指导教师肖伟平罗敬肖彬
2009年6月19日
湖南工程学院
课程设计任务书
课程名称C语言程序设计
课题班级成绩管理系统
专业班级电子信息0802班
学生姓名董霄宇
学号32
指导老师肖伟平罗敬肖彬
审批
任务书下达日期2009年6月19日
任务完成日期2009年6月30日
一、设计内容与设计要求
1.设计内容:
班级成绩管理系统设计
涉及的知识点:
①掌握并熟练运用C语言的基本数据类型与各种表达式,程序的流程控制语句;
②掌握数组的基本概念。
熟练掌握一维数组、二维数组的应用、掌握字符数组
与字符串的关系以及字符串的简单处理。
③掌握函数的定义,函数的返回值,函数的调用,函数的形式参数和实际参数之间的关系;掌握变量的作用域与生存期,了解函数的作用域。
④掌握结构的概念,结构类型的定义,结构变量的定义和初始化,结构成员的表示,结构的赋值含义,结构与指针、函数的关系。
⑤掌握文件、文件类型指针的基本概念,熟练掌握文件的打开与关闭以及文件的建立、读写等有关操作。
2.设计要求:
1)用C语言实现系统;利用结构体数组实现班级成绩的数据结构设计;系统
的各个功能模块要求用函数的形式实现;应提供一个界面来调用各个功能,
调用界面和各个功能的操作界面应尽可能清晰美观。
2)建立一个班级学生成绩数据库,文件名为bjcjk.txt,并从该文件中读取数据;
3)班级成绩管理系统应能提供以下功能:
(1)主菜单界面设计。
通过提示用户输入一个数字选项,调用相应的功能函数。
(2)成绩显示:
完成班级全部学生成绩的显示;
(3)成绩录入:
完成新增一个学生的成绩记录,并重新计算学生的平均成绩;
(4)成绩修改:
按学号修改一个学生的学习成绩,并重新计算学生的平均成绩;
(5)成绩排序:
按学生平均成绩进行排序;
(6)成绩统计:
①统计并显示每门课程的平均成绩;
②统计并显示超过某门课程平均分的人数以及学生记录;
4)说明:
(1)要求将修改后的数据写入到一个新的数据文件nwejck.txt中。
(2)对系统有兴趣的同学可以在实现基本要求的基础上,完善系统的其它功能。
5)班级成绩管理系统采用一个结构体数组,学生成绩数据库结构如下:
intxh/*学号*/
charname[10]/*姓名*/
intyy/*英语*/
intmat/*数学*/
intjsj/*计算机*/
intwl/*物理*/
intzf/*总分*/
注意:
学号不重复,且数据库应有10条或以上的记录。
6)要求:
1要求每个学生必须独立思考,认真并按时完成本课程设计所包含的所有内容;
2要求学生必须按照课程设计报告的完整格式说明设计内容,设计任务分析过程和算法,给出程序流程图和全部源程序;
3设计报告的完整格式应包括以下部分的内容:
1设计总体思路;
2程序及各个模块说明;
3总体模块框图;
4各个程序模块说明;
5程序流程图;
6程序清单;
7课程设计总结与体会(不少于400字)。
4上机时要求必到,设计完成,必须演示程序,答辩并提交设计报告。
二、进度安排
第18周星期五8:
00——12:
00
星期日15:
00——18:
00
第19周星期一19:
00——22:
00
星期三8:
00——12:
00
星期四14:
30——17:
30
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:
一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序原代码)。
目录
一.需求分析---------------------------------------7
(1)程序功能--------------------------------------7
(2)输入输出要求----------------------------------7
二.总体设计----------------------------------------7
三.模块功能详细设计分析----------------------------8
四.调试分析及体会----------------------------------9
五.部分运行界面截取图------------------------------11
六.流程图-----------------------------------------17
七.心得体会---------------------------------------18
八..附件------------------------------------------20
1.源程序-----------------------------------------20
2.参考书目---------------------------------------27
九.评分表------------------------------------------28
一.需要分析:
(1)程序功能
该程序是一个实现对班级成绩管理的系统。
包括显示,添加,删除,修改,排序,查找,统计及退出等功能。
输入学生的学号、姓名及成绩对其进行存储,在存储后可以对学生的成绩按学号和姓名进行查寻。
该系统具有存贮学生数据,按学号、姓名查询,列出学生成绩和统计功能。
系统输入数据后,将在当前目录中建立一个名为stu.dat文件,用于保存输入的数据。
(2)输入输出要求
学号输入只能用数字输入,姓名输入只能用字符,且最长为10个字符。
此程序在BC2.0下运行通过。
二.总体设计:
(1)抽象数据类型定义
学生成绩数据库结构:
数据库{学号:
int()
姓名:
char(10)
英语:
int()
数学:
int()
计算机:
int()
物理:
int()
总分:
int()
平均分:
flaot()
名次:
int()
}
(2)程序的模块及其功能和关系
该程序由9个模块组成,由主函数调用计算,显示,添加,删除,修改,排序,查找,统计及其退出等模块.下面将介绍每个模块的功能及与他们之间的关系.
模块图如下:
主菜单模块
Main()
添加模块
(3)主函数分析
主函数主要由一个switch()开关语句构成,开关语句在一个无限循环体里,开关语句里的开关是调用主菜单显示函数的返回值。
除最后一个语句是强制结束整个程序的语句外,其它case都是调用相应的函数,完成相应的功能。
各调用情况如下:
case1:
调用显示函数case2:
调用追加函数、case3:
调用修改函数、case4:
调用删除函数、case5:
调用查询函数、case6:
调用排序函数、case7:
调用退出函数,主函数将保证每调用完一个函数之后又调用显示函数,然后按任意键又重新回到主菜单,以便用户进行下一次的操作。
三.模块功能详细设计分析
<1>班级成绩显示模块:
VoidDisp()
这个模块的主要功能是用来计算每个人的平均分并显示班级中所有人各科相对应的成绩,平均分,总分及名次。
在主菜单中选择“1”就可以进入这个模块界面。
这个功能的实现是用了一个for循环来完成的。
通过这个循环printf()函数依次输出每一个人的学号,姓名,各科成绩,平均分,总分,名次。
最后在界面上显示所有人的信息因此我们可以浏览所有人的信息。
〈2〉班级成绩追加模块:
VoidAppe()
本模块的主要功能是添加一个人的记录。
在主菜单中键入“2”,就进入次模块。
由多个for循环控制。
在for循环中包括printf和scanf函数,依照提示依次输入:
学号,姓名,各科成绩。
再调用显示函数Disp()。
<3>班级成绩修改模块:
voidModi()
本模块的主要功能是按学号查找相应的记录,然后系统判断学号是否存在,如果不存在将提示用户,如果存在再根据提示语句,用户可以按要求修改记录中除学号,姓名以外的指定内容,可按照用户要求修改对应成绩,可由用户自行控制修改人数,并重新显示。
在主菜单中键入“3”就可以进入这个模块。
此模块是通过for循环语句控制实现的。
如果输入的信息不存在系统就提示信息提醒。
<4>班级成绩删除模块:
VoidDele()
此模块的主要功能是用来删除班级成绩管理中的信息。
可按指定学号,姓名删除记录并重新显示。
在主菜单中选择输入“4”,就可以进入这个模块的界面。
这个模块的设计是通过if和for循环语句控制实现的。
如果输入的信息不存在系统就提示信息提醒。
<5>.班级成绩查询模块:
voidQuery()
这个模块可以按学号查询;然后系统判断所输入信息是否存在,如果存在将显示该人的各科成绩,平均分,总分及名次。
这个模块是通过if和for循环语句控制实现的。
如果输入的信息不存在系统就提示信息提醒。
<6>班级成绩排序模块:
VoidSort()
该模块先由计算模块算出每个人的平均分及名次,再通过对名次的排序。
运用双重for循环嵌套及if语句进行排序。
<7>班级成绩退出模块:
voidQuit()
任意键退出程序.
四.程序调试分析
1.在显示函数里应该含有计算函数,否则显示的信息中平均分,总分及名次都为零。
2.在输入函数中设了一个无限循环,可以输入无数个学生的成绩信息,但是不方便退出,后来用了一个输入函数输入要输入的学生信息的个数,在用循环控制,这样就方便多了。
3.输入太多个学生的成绩时,屏幕显示不能控制为一页一页显示,所以为了方便起见,不要输入太多记录。
4.在程序调试的时候,出现函数名变成未定义字符,经过分析后发现是没有在程序的前面些程序包含的语句,加上前面的头文件包含后就没有这个错误了.
5.在程序中需要输入的项太多,故在每个输入项前应加一个提示输入项,提示用户输入正确的信息。
五.部分运行界面截取图
1、显示模块运行截面图
运行程序菜单框图中选则1,按回车。
运行结果如下图:
2、追加模块运行截面图
运行程序菜单框图中选则2,按回车.按照提示输入信息,运行结果如下图:
3、修改模块运行截面图
运行程序菜单框图中选则3,按回车.按照提示输入信息,结果如图:
4、删除模块运行截面图
运行程序菜单框图中选则4,按回车.按照提示输入信息,运行结果如下图:
5、查询模块运行截面图
运行程序菜单框图中选则5,按回车.按照提示输入信息,运行结果如下图
6、排序模块运行截面图
运行程序菜单框图中选则6,按回车.按照提示输入信息,运行结果如下图
六、流程图
1、总体设计流程图
主函数流程图:
读入数据
菜单界面
输入选择值
menu-selcet()
执行退出函数
执行排序函数
执行追加函数
执行删除函数
执行修改函数
执行显示函数
执行查询函数
创建新数据库
结束
七.心得体会
课程设计这一周感受颇深。
我想说实践是检验真理的唯一标准。
尤其对于C语言这门对动手能力要求很高的学科。
有很多程序你编了也检查了但也许就是发现不了错误,但只要一上机操作隐含的问题就全面暴露出来了。
C语言课程设计是一门细致的活。
正如熟话所说的:
一招不慎,满盘皆输。
一个错误的存在整个程序就运行不出结果。
对于基础不太牢固的我来真是一个考验,同时有时一个挑战。
它需要耐心、仔细和坚持。
说句老实话正如肖老师预言的在课程设计的前两天我是在失望、痛苦、焦虑和茫然中度过。
一开始我编的程序存在很多问题,这些问题使我头都大了。
就拿建立数据库来说我就建了不下十个。
真的是无从下手也不知所措!
怎么做怎么错,失败全面打击着我。
万事开头难,课程设计是前所未有的难。
痛定思痛,我强迫自己冷静下来:
先弄懂设计思路从整体上对课程设计有一个清晰的了解,接下来就开始着手模块的设计。
由于之前受了太多打击,接下来显示模块的成功出世给了我极大的安慰。
再接下来的追加、删除、修改和查询模块就顺手多了,因为我找到了一点自信。
C语言程序设计既是一个整体,同是各个模块之间相互独立又紧密联系。
因为有规律可循,后四个模块基本上就是switch、if-else和for语句的嵌套使用,当然还有基本输入输出函数的大量使用。
找到正确的方法才能得出结果。
在课程设计的过程中我遇到了很多问题,有过很多茫然,我觉得这是一个既艰辛又快乐的过程。
在这个过程中我学到了很多。
关于C语言关于人生。
碰壁,碰壁,碰多了就会学会。
也许真的就是那最后的坚持铸就了程序的结果。
更重要的是,这次课程设计虽然花了我不少时间,但正是这些时间,让我见识到了C语言的重要性。
这个学生成绩管理系统都是在自己知识范围内完成的,所以界面清晰简单,可能不是很好看,但绝对实用!
从这里我也得到一个体会,做一个程序,或者开发一个软件,应该着重从它的后台制作入手,不能做出一个中看不中用的程序或者软件。
通过对数据结构的课程设计,我了解并发现了很多调试程序的方法,而且懂得了如何处理错误的方法。
对C语言的使用得到了进一步的提高。
针对数据结构的书本知识得到了进一步的巩固,具体化就是加深了我对线性表的结构的理解查找的方法,数的排序等。
对程序的深层理解,清楚程序中每一步的功能,在程序的运行中是十分重要的,一个好的结构在运行中能够充分的发挥程序的功能。
结构设计的合理性决定了这个程序的
价值。
在今后的学习中我要注意这方面,使得我的编程能力能有进一步的提高。
经历了这次课程设计,不仅对我的学习提供了帮助,而且在意志力方面也得到了锻炼。
经过上机实践学习,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机
没有足够的耐力和信心就很难坚持对课程设计每一步的顺利进行。
相信这次的课程设计为我以后使用计算机打了一个小小的开头,这次设计,让我重新掌握了C语言,而且还得到了用C语言解决实际问题的宝贵经验!
。
我发现现在对于C语言我很感兴趣。
课程设计这一周我花了不少时间,流了不少汗水。
这说明了一个道理:
没有付出就没有收获!
八.附录
1.源程序
#include"stdio.h"
#include"string.h"
#include"conio.h"
intN=0;
structstu
{
intnum;/*学号*/
charname[10];/*姓名*/
inteng;/*英语*/
intmat;/*数学*/
intcom;/*计算机*/
intphy;/*物理*/
intsum;/*总分*/
}s[20];
voidRe_file()
{
FILE*fp;
fp=fopen("G:
\\bjcjk.txt","r");
while(fscanf(fp,"%d\n%s\n%d\n%d\n%d\n%d\n%d\n",&s[N].num,s[N].name,&s[N].eng,&s[N].mat,&s[N].com,&s[N].phy,&s[N].sum)!
=EOF)N++;
fclose(fp);
}
voidWr_file()
{inti;
FILE*fp;
fp=fopen("G:
\\nwejck.txt","w");
for(i=0;ifprintf(fp,"%d\n%s\n%d\n%d\n%d\n%d\n%d\n",s[i].num,s[i].name,s[i].eng,s[i].mat,s[i].com,s[i].phy,s[i].sum);
fclose(fp);
}
voidDisp()/*显示模块*/
{inti;
floatave[20];
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("学号姓名英语数学计算机物理总分平均分\n");
for(i=0;i{ave[i]=(float)s[i].sum/4;
printf("%-7d%-15s%-6d%-6d%-8d%-6d%-8d%-8f%",s[i].num,s[i].name,s[i].eng,s[i].mat,s[i].com,s[i].phy,s[i].sum,ave[i]);
printf("\n");
}
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
}
voidAppe()/*追加模块*/
{inti,num,j=0;
printf("Inputthenumberofthestudent:
\n");
scanf("%d",&num);
for(i=0;iif(num==s[i].num)
{j=1;break;}
if(j==1)printf("Error!
!
!
\n");
if(j==0)
{i=N;
s[i].num=num;
printf("Inputthenameofthestudent:
\n");
scanf("%s",s[i].name);
printf("InputtheEnglishscoreofthestudent:
\n");
scanf("%d",&s[i].eng);
printf("Inputthemathscoreofthestudent:
\n");
scanf("%d",&s[i].mat);
printf("Inputthecomputerscoreofthestudent:
\n");
scanf("%d",&s[i].com);
printf("Inputthephysicsscoreofthestudent:
\n");
scanf("%d",&s[i].phy);
s[i].sum=s[i].eng+s[i].mat+s[i].com+s[i].phy;
N=N+1;
}
}
voidModi()/*修改模块*/
{intnumber,i,neng,nmat,ncom,nphy,t,j=0;
printf("Inputtheerrornumberofthestudent:
\n");
scanf("%d",&number);
for(i=0;iif(s[i].num==number){j=1;break;}
if(j==1)
{printf("InputthenewEnglishscoreofthestudent:
\n");
scanf("%d",&neng);
{t=s[i].eng;
s[i].eng=neng;
neng=t;
}
printf("Inputthenewmathscoreofthestudent:
\n");
scanf("%d",&nmat);
{t=s[i].mat;
s[i].mat=nmat;
nmat=t;
}
printf("Inputthenewcomputerscoreofthestudent:
\n");
scanf("%d",&ncom);
{t=s[i].com;
s[i].com=ncom;
ncom=t;
}
printf("Inputthenewphysicsscoreofthestudent:
\n");
scanf("%d",&nphy);
{t=s[i].phy;
s[i].phy=nphy;
nphy=t;
}
s[i].sum=s[i].eng+s[i].mat+s[i].com+s[i].phy;
}
if(j==0)printf("Error!
!
!
\n");
}
voidDele()/*删除模块*/
{intnumber,i,j=0;
structstut;
printf("Inputthenumberofthestudent:
\n");
scanf("%d",&number);
for(i=0;iif(s[i].num==number){j=1;break;}
if(j==1)
{
for(;i{t=s[i+1];
s[i+1]=s[i];
s[i]=t;
}
N=N-1;
}
if(j==0)printf("Error!
!
!
\n");
}
voidQuery()/*查询模块*/
{intnumber,i,j=0;
floatave;
printf("Inputthenumberofthestudent:
\n");
scanf("%d",&number);
for(i=0;iif(s[i].num==number){j=1;break;}
if(j==1)
{printf("学号姓名英语数学计算机物理总分平均分\n");
ave=(float)s[i].sum/4;
printf("%-7d%-15s%-6d%-6d%-8d%-6d%-8d%-8f%",s[i].num,s[i].name,s[i].eng,s[i].mat,s[i].com,s[i].phy,s[i].sum,ave);
}
if(j==0)printf("Error!
!
!
\n");
}
voidSort()/*排序*/
{inti,j;
structstut2;
floatave[20],t1;
for(i=0;iave[i]=(float)s[i].sum/4;
for(j=0;jfor(i=