C语言毕业课程设计报告成绩管理系统.docx
《C语言毕业课程设计报告成绩管理系统.docx》由会员分享,可在线阅读,更多相关《C语言毕业课程设计报告成绩管理系统.docx(51页珍藏版)》请在冰豆网上搜索。
C语言毕业课程设计报告成绩管理系统
(此文档为word格式,下载后您可任意编辑修改!
)
机电工程学院
中南大学
计算机程序设计基础C++
课程设计
题目学生成绩管理系统
成员姓名姚东盼学号班级:
机械1309
成员姓名吴子珍学号班级:
机械1309
成员姓名李文林学号班级:
机械1309
指导教师杨放琼
学院机电工程学院
日期2014年7月2日
目录:
第一章设计任务及任务分配
1.课题及功能组成…………………………………………………………1
2.小组成员及任务分配……………………………………………………1
3.进度安排…………………………………………………………………1
4.小组成员设计内容简介…………………………………………………1
第二章需求分析
1.程序设计要求……………………………………………………………2
2.程序实现形式……………………………………………………………2
3.程序函数原型……………………………………………………………2
4.程序流程图………………………………………………………………2
第三章程序设计
1.概要设计…………………………………………………………………4
2.具体程序设计……………………………………………………………4
3.调试及错误分析…………………………………………………………22
第四章程序使用说明及运行实例
1.程序演示…………………………………………………………………23
2.注意事项…………………………………………………………………26
第五章课程设计心得
1.程序设计过程…………………………………………………………27
2.心得体会………………………………………………………………27
(附录)源代码(全)……………………………………………………28
第一章设计任务及任务分配
1.课题及功能组成
我们选择的是学生成绩管理系统,面向的是老师统计学生的成绩。
根据设计任务要求,我们主要划分了6个主要的功能函数:
查找信息函数、修改信息函数、插入或新建文件函数、删除信息函数、实现统计功能的函数、查看信息函数。
为了方便对多个成绩单文件进行操作,我们还额外加了一个可以选择文件的功能。
2.小组成员及任务分配
组长:
姚东盼总体设计。
设计流程、模块函数原型接口设计,模块组装调试以及查看(载入)函数,删除和统计函数的编写,撰写报告。
组员:
李文林吴子珍负责模块程序设计,并独立调试自己的程序。
其中吴子珍负责查找函数,插入函数的编写;李文林负责修改信息函数以及开始函数的编写。
3.进度安排
第一周:
查找资料,了解要实现的功能,完成分工,学习补充文件操作的知识,以及链表的知识。
第二周:
认真完成各自的任务,组建调试,纠错分析,撰写实践报告。
4.小组成员设计内容简介
姚东盼:
1建立学生链表的数据结构
2设计总体流程及具体实现方法
3voidzairu()函数,此函数将文件信息提取到内存,以链表的形式存储。
4voidtongji()函数,此函数实现统计功能:
排序、计算及格率、平均分。
5voidshanchu()函数,此函数通过将文件信息调入内存,然后删除文件内容,找到要删除的记录,除要删除的记录以外都重新写入文件。
从而实现删除功能。
吴子珍
1voidchazhao()函数,此函数通过比较要查找的数据成员与内存中链表的是否相似选择输出。
2voidcharu()函数,此函数实现添加记录和新建文件的功能。
3voidchose()函数,选择功能函数。
李文林
①voidstart()函数,开始菜单函数。
②voidxiugai()函数,此函数通过将文件信息调入内存,然后将文件内容删除,将内存中链表的内容修改后,进行二次重写。
第二章需求分析
1.程序设计要求
基本要求:
(1)所有记录保存在一个数据文件中;
(2)具备记录添加功能;(3)具备记录删除功能;(4)具备记录修改功能;(5)具备记录查询功能;(6)计算统计功能;(7)良好操作界面菜单。
2.实现形式
分析课设要求,①其中要求记录保存在一个数据文件中,因此程序设计必须包括文件的输入输出。
②另外要求具备记录添加功能,由于不确定要添加的内容多少以及文件内容的多少,根据链表可以接尾添加数据的特性可得出这里选择链表作为学生成员的数据结构更合适一些。
③由于面向对象部分我们还没有深入学习而且此处用之前c语言面向对象过程的内容完全可以胜任,故选择面向过程的方法。
3.程序函数原型
所有函数成员:
voidmain();//主函数
voidstart();//开场界面
voidzairu();//载入文件到内存链表以及输出信息
voidchose();//选择功能函数的函数
voidchazhao();//查找函数
voidxiugai();//修改函数
voidcharu();//插入函数
voidshanchu();//删除函数
voidtongji();//统计函数
voidjige();//统计函数子函数计算及格率
voidpaixu();//统计函数子函数进行成绩排序
voidpingjun();//统计函数子函数计算平均分
4.程序框图
第三章程序设计
1.概要设计
本课程设计假设面向的使用对象是老师,用于老师录入,修改,查看学生成绩。
程序主要录入学生的信息内容包括:
学号、姓名、性别、数学成绩、英语成绩、vc成绩(其他成绩如果添加的话完全和上面三门相同)。
为了便于对多个成绩文件的管理,本程序还特意添加了选择文件的功能。
整体设计尽可能的考虑了不同的意外情况和应用需求,并给予了解决方案。
2.具体程序设计
①、首先是主函数。
为了使程序结构尽可能的清晰,主函数尽量的进行了简洁化处理。
voidmain()
{
cout<<"*欢迎使用学生信息管理系统*"<cout<loop1:
cout<<"请输入目标文件名"<cin>>fname;
zairu();
loop:
start();//开场
chose();//选择功能
fanhui();//返回函数
if(flag2){flag2=0;gotoloop1;}//flag2是判断是否重新选择文件的标志位
if(!
flag2&&m!
=8)gotoloop;//m=8是重新返回主菜单操作界面
}
②开始start()函数
voidstart()//打印初始界面函数
{
cout<cout<cout<<"*请选择要进行的操作*"<cout<<"**********************"<cout<<"*1.查找信息2.修改信息*"<cout<<"*3.插入信息4.删除信息*"<cout<<"*5.统计功能6.选择文件*"<cout<<"*7.查看信息8.退出系统*"<cout<<"*********************"<cout<cout<<"请选择***"<}
③功能选择函数
功能选择函数基本没有什么障碍,就是利用switch语句进行选择功能。
voidchose()//功能选择函数
{
cin>>m;
switch(m)
{
case1:
chazhao();break;
case2:
xiugai();break;
case3:
charu();break;
case4:
shanchu();break;
case5:
tongji();break;
case6:
flag2=1;break;
case7:
zairu();break;
case8:
cout<<"谢谢使用!
"<default:
cout<<"请输入正确数字(1--8)"<}
}
④载入函数(显示信息函数)
载入函数,就是将文件里的信息提取到内存链表中。
其中两点注意部分。
其一是,要将文件中头部的汉字提取过滤掉(因为这不是学生的数据信息)。
具体实施方法就是提取到一个字符串变量中,然后丢掉。
其二,关于用eof()函数对文件是否读取结束的判断。
由于,eof()函数并不是读完最后一个数据返回false值,而是读完最后一个数据再往下读不到的时候才返回false值,即提取完最后一个字符eof()函数还为true。
解决办法:
设置一个数据缓冲位。
voidzairu()//载入函数,将文件内容提取到内存
{
ifstreaminfile;
infile.open(fname,ios:
:
in);//读入文件
if(!
infile)cout<<"文件读取失败"<else
{
cout<<"检索所有数据"<cout<infile>>stname1>>stname1>>stname1>>stname1>>stname1>>stname1;
//把数据中的汉字部分提取后丢掉
head=last=NULL;//先置为空指针
p=newstudent;//开辟新的单元用于存放从文件中提取的信息
infile>>p->id>>p->name>>p->sex>>p->math>>p->English>>p->vc;//读取链表的头
cout<id<name<sex<math<English<vc<head=last=p;
while(!
infile.eof())//读取文件中的数据
{
p=newstudent;
last->next=p;
infile>>stname1;//作为缓冲,读完这个数据可以看出数据是否读完
if(!
infile.eof())//二次判断
{
strcpy(p->id,stname1);
infile>>p->name>>p->sex>>p->math>>p->English>>p->vc;
last=p;cout<id<name<sex<math;
cout<English<vc<}
}
cout<<"****************************************************************"<cout<last->next=NULL;
infile.close();//切断内存与文件的联系
}
}
⑤查找函数
查找函数提供了两种查找方式,按学号查找和按姓名查找。
两种操作完全类似。
具体实施办法是:
获取要查找的学号或者姓名信息,然后读取已载入内存中的链表学号或者姓名信息,用字符串比较函数比较两者是否相同,相同则输出,不相同则不输出。
voidchazhao()//查找函数
{
loop:
cout<<"请选择查找方式"<cout<<"1.按学号查找2.按姓名查找"<intn,flag=0;
cin>>n;
if(n==1)cout<<"请输入学号"<elseif(n==2)cout<<"请输入名字"<else
{
cout<<"请输入正确的数字1--2"<gotoloop;
}
cin>>stname;
p=head;
while(p)//读取链表数据,写入文件
{
if(n==1)strcpy(stname1,p->id);
if(n==2)strcpy(stname1,p->name);
if(strcmp(stname,stname1));//字符串比较函数,判断是否是查找的数据
else
{
flag=1;//标志位重置
cout<<"下面是搜索到的记录"<cout<id<name<sex<math
cout<English<vc<}
p=p->next;
}
if(flag==0)cout<<"没有要查找的数据"<}
6修改函数xiugai()
修改函数借用了查找函数,提供了两种查找对象的方式。
修改内容利用了switch语句,通过字符串复制函数实施姓名、学号、性别的修改。
具体实施办法是,将文件中的内容提取到内存中,然后第二次以写入的方式打开,清除文件内容,将要修改的内容在内存里修改之后重新写入文件。
voidxiugai()//修改函数
{
cout<<"请选择查找对象方式"<cout<<"1.按学号查找对象2.按名字查找对象"<intn,flag=0,flag1=0;
cin>>n;
if(n==1)cout<<"请输入学号"<elseif(n==2)cout<<"请输入名字"<else
{
cout<<"请输入正确的数字1--2"<gotoloop;
}
cin>>stname;
p=head;
loop:
ofstreamoutfile(fname,ios:
:
out);//文件输出流对象
outfile<while(p)//读取链表数据,写入文件
{
if(n==1)strcpy(stname1,p->id);
if(n==2)strcpy(stname1,p->name);
if(strcmp(stname,stname1))//字符串比较函数,判断是否是查找的数据
outfile<id<name<sex<math<English<vc<else
{
flag=1;
cout<<"下面是搜索到的记录"<cout<id<name<sex<math;
cout<English<vc<cout<<"请选择要修改的内容"<cout<<"**************************************"<cout<<"*
(1)学号
(2)姓名*"<cout<<"*(3)性别(4)数学*"<cout<<"*(5)English(6)VC*"<cout<<"**************************************"<intq;
cin>>q;
switch(q)//修改
{
case1:
cout<<"请输入:
将原学号"<id<<"修改为"<cin>>stname;strcpy(p->id,stname);break;
case2:
cout<<"请输入:
将原姓名"<name<<"修改为"<cin>>stname;strcpy(p->name,stname);break;
case3:
cout<<"请输入:
将原性别"<sex<<"修改为"<charsex1[5];
cin>>sex1;strcpy(p->sex,sex1);break;
case4:
cout<<"请输入:
将原数学成绩"<math<<"修改为"<intscore;
cin>>score;p->math=score;break;
case5:
cout<<"请输入:
将原英语成绩"<English<<"修改为"<cin>>score;p->English=score;break;
case6:
cout<<"请输入:
将原VC成绩"<vc<<"修改为"<cin>>score;p->vc=score;break;
default:
cout<<"请输入正确的数字(1--6)"<}
outfile<id<name<sex<math;
outfile<English<vc<}
p=p->next;
}
if(flag1==1)gotoloop;//没找到要修改的数据,重新返回
outfile.close();
if(flag==0)cout<<"没有要查找的数据"<elsecout<<"修改成功!
"<}
7插入函数
插入函数提供了两种功能,一是在文件末尾添加数据,另外就是新建一个文件加入数据(如果原有文件存在默认清除数据再新建)。
实施方法:
在末尾添加数据,写入方式为IOS:
:
app;新建写入方式是IOS:
:
out;
voidcharu()
{
ifstreaminfile;
ofstreamoutfile;
cout<<"插入
(1)新建
(2)"<intm;
cin>>m;
if(m==1)//在已有的文件末尾添加记录
{
infile.open(fname,ios:
:
in);
outfile.open(fname,ios:
:
app);
}
elseif(m==2)//新建文件,并添加记录
{
outfile.open(fname,ios:
:
out);
infile.open(fname,ios:
:
in);
outfile<}
else
cout<<"请输入正确的数字(1-2)"<if(!
infile)cout<<"文件读取失败"<if(!
outfile)cout<<"文件写入失败"<if(!
infile||!
outfile)
cout<<"操作失败"<else//插入记录
{
cout<<"请输入要插入的数据个数"<intn,i;
cin>>n;
cout<<"请输入数据"<cout<student*p,*head,*last;
head=last=NULL;
p=newstudent;
cin>>p->id;
cin>>p->name>>p->sex;
cin>>p->math>>p->English>>p->vc;
head=last=p;
for(i=1;i{
p=newstudent;
last->next=p;
cin>>p->id;
cin>>p->name>>p->sex;
cin>>p->math>>p->English>>p->vc;
last=p;
}
last->next=NULL;
p=head;
cout<<"已录入的数据为"<cout<while(p)
{
outfile<id<name<sex<math<English<vc<cout<id<name<sex<math<English<vc<p=p->next;
}
infile.close();
outfile.close();
}
}
8删除函数
删除函数和修改函数思路基本完全一致。
先读入到内存,然后清空文件,用字符串比较函数找到要删除的数据