上海电力学院
《高级程序设计C++》
课程设计
题目:学生综合测评系统
院系:计算机科学与技术学院
专业年级:计算机科学与技术
学生姓名:学号:20111695
指导教师:
2013年1月
目录
目录 (2)
1.需求分析 (3)
2.概要设计 (4)
3.详细设计 (6)
4.用户使用手册 (9)
4.1 环境设置 (9)
4.2 操作步骤 (10)
5.程序创新点.......................................... 错误!未定义书签。6.使用的主要技术.................................. 错误!未定义书签。7.总结 ..................................................... 错误!未定义书签。附录 ................................................................ 错误!未定义书签。
1.需求分析
本系统旨在便于学校管理和查阅学生信息并计算学生的考试成绩和名次以及综合测评成绩和名次。每个学生的信息为:学号、姓名、性别、家庭住址、联系电话、高等数学、物理、英语三门单科成绩、、同学互评分、品德成绩、任课教师评分。考试平均成绩、同学互评分、品德成绩、任课教师评分分别占综合测评总分的60%,10%,10%,20%。
程序的基本功能:
1.学生信息处理:
(1) 输入学生信息、学号、姓名、性别、家庭住址、联系电话,按学号以小到大的顺序存入文件中。
(2) 插入(修改)同学信息。
(3) 删除同学信息。
(4) 浏览学生信息。
2.学生数据处理:
(1) 按考试科目录入学生成绩并且按公式:考试成绩=(语文+数学+外语)/3 计算考试成绩,并计算考试名次。
(2) 学生测评数据输入并计算综合测评总分及名次。
(3) 学生数据管理。
(4) 学生数据查询。
3.学生综合信息输出
2.概要设计
根据需求分析中的描述,知道需要一个帐户类型,由于基本数据类型无法实现将一个用户的信息绑定在一起,所以需要定义一个抽象数据类型帐户,命名为Student,其定义如下:
class Student
{
public:
int num;//学号
string name;//姓名
string sex;//性别
string address;//家庭住址
string phone;//联系电话
double english;//英语成绩
double math;//数学成绩
double physics;//物理分数
double average;//考试成绩
double grade1;//同学互评分
double grade2;//品德成绩
double grade3;//任课教室评分
double gradesum;//综合测评成绩
int ranking1;//考试名次
int ranking2;//综合测评名次
};
为了方便外部函数进行操作,以上全为共有变量。
定义一个对象数组Student stud[100];方便对Student类中数据进行输入和输出以及排序等等功能。
外部操作函数有:
void read()//从文件中读取学生信息函数
void show()//显示学生信息函数
void save()//保存学生信息函数
void SR()//输入学生信息函数
void SC()//删除学生信息函数
void TJ()//添加学生信息函数
void XG()//修改学生信息函数
void PM1()//计算考试成绩以及排名函数
void PM2()//计算综合测评成绩以及排名函数
void sn()//按学生学号查找学生信息
void sm()//按学生姓名查找学生信息
void Fire()//学生信息管理界面
void statistics()//学生成绩统计管理界面
void inquiry()//学生查询管理界面
void about()//关于系统界面
void thanks()//退出程序界面
主函数为学生测评系统主界面
3、详细设计
void read()
{
char filename[20];
cout<<"从文件中读取信息!"< cout<<"请输入文件名:"< cin>>filename; cout<<"请问要读取几名学生信息:"< cin>>n; ifstream infile; infile.open(filename,ios::in|ios::out); if(!infile) { cerr<<"open error!"< exit(1); } int i=0; do { infile>>stud[i].num>>stud[i].name>>stud[i].sex>>stud[i].address >>stud[i].phone>>stud[i].english>>stud[i].math >>stud[i].physics>>stud[i].grade1 >>stud[i].grade2>>stud[i].grade3; i++; } while(!infile.eof()); infile.close(); cout<<"读取成功!"< } 以上为读取文件中学生信息的函数,当信息成功读取后才可进行修改或添加或删除,所以在许多外部函数里面都必须要有读取函数的功能为前提。 void save() { int i; char filename[20]; cout<<"将记录保存在文件夹!"< cout<<"请输入文件名:"; cin>>filename; ofstream outfile(filename); if(!outfile) { cerr<<"open error!"< } //保存时按学号排序,采用冒泡排序法实现数组内的排序 …… for(i=0;i { outfile< < < } outfile.close(); cout<<"保存成功!"< } 在每次保存时都先按学号排序,保证信息是按学号从小到大的顺序存入文件。在输入、修改、添加和删除函数的末端都有保存函数以实现信息的保存。 void XG() { read(); begin:string find_name; int i; cout<<"请输入你要修改的学生名字:"< cin>>find_name; for(i=0;i if(stud[i].name==find_name) {……}//输出修改前学生信息 if(stud[i].name!=find_name) { cout<<"can't find this name"< cout<<"请重新查找!"< goto begin; } cout<<"请输入新的信息:"< cout<<"学号:"<<' ';cin>>stud[i].num; …… …… cout<<"修改成功,是否保存?(y/n)"< cin>>press; switch(press) { case 'y' : save();break; default: cout<<"不保存!";break; } } 基于数组形式对数据进行修改。基本上所有函数都是基于数组进行操作,像删除函数是用循环先匹配类中的一个数据,找到之后再以此开始用对象数组后面的替换掉前一个,以实现删除功能。 string SC_name; cout<<"请输入你要删除的学生名字:"< int i=0; cin>>SC_name; while(stud[i].name!=SC_name && i i++; //查找判断 if(stud[i].name==SC_name) { for(int j=i;j { stud[i].num=stud[i+1].num; stud[i].name=stud[i+1].name; …… …… } } 考试成绩排名和综合测评成绩排名都是采用冒泡排序法实现: double temp[100]; for(int a=0;a { stud[a].average=(stud[a].english+stud[a].math+stud[a].physics)/3; temp[a]=stud[a].average; } double t; for(int j=0;j {for(int k=0;k {f(temp[k] {t=temp[k]; temp[k]=temp[k+1]; temp[k+1]=t;}}} for(int q=0;q {for(int p=0;p {if(stud[p].average==temp[q]) stud[p].ranking1=q+1;}} 最后各种界面函数通过switch语句进行调用,以实现各种功能来完成此系统: void Fire()//学生信息管理系统界面 { while(choose!=0) { //输出界面样式略。 cout<<"\t\t 请输入0-5之间的任意一数字:"<<' '; cin>>choose; switch(choose) {case 1:system("cls");SR();break; case 2:system("cls");SC();break; case 3:system("cls");TJ();break; case 4:system("cls");XG();break; case 5:system("cls");show();break; default:cout<<"\t\t 输入错误或返回主界面"<<'\n';break;}}} 4、用户使用手册 4.1 环境设置 将已创建扩展名为cpp在VC6.0中运行即可,如图所示。 4.2 操作步骤 编译每个扩展名为.cpp的文件,如果有编译错误,则根据提示修改,否则编译成功。最后编译、连接和运行测试程序文件,输入数据并测试程序的各种操作。如图所示。 在当前的Dos窗口中,输入要执行的功能号码,如输入1,然后单击回车,则显示如图所示。 此为学生信息管理界面,输入要执行的功能号码,如输入1,然后单击回车,则显示如图所示。 按提示输入3个学生信息并保存至文件1.txt中,完成后返回学生信息管理界面,输入要执行的功能号码,如输入5,然后单击回车,然后输入文件名1.txt和要读取几名学生信息,如输入3,则显示如图所示。 如上所示,按照提示内容输入功能号并回车确认就能正确使用本系统。 5、使用的主要技术 文本文件的读写、数组。 6、总结 经过一个学期对《C++程序设计》的学习,我学习到了基本的理论知识,了解到了C++语言程序设计的思想,这些知识都为我的课程设计和进一步学习打下了坚实的基础。 在为期一周的的C++课程设计中,我体会颇多,学到了很多东西。我加强了对C++程序设计这门课程的认识,并且复习了自己以前学过的知识。这些都使得我对计算机语言的学习有了更深入的认识。像学生测评系统这样的程序设计,经历了平时在课堂和考试中不会出现的问题和考验。而这些问题,并不是只靠课本就可以轻易解决的。所以,锻炼了我们独立思考和解决问题的能力。特别是向老师提问时,老师教会了我调试程序的方法,让我更容易发现自己所犯的错误。 在老师和同学的帮助下,通过自己的努力,终于完成了这次学生测评系统的课程设计,虽然还有缺陷,但过程中所摸索到的经验是一笔宝贵的财富。 总而言之,这次课程设计让我收获很大。 附录 #include #include #include #include using namespace std; char press;int choose=1;int n; class Student { public: int num;//学号 string name;//姓名 string sex;//性别 string address;//家庭住址 string phone;//联系电话 double english;//英语成绩 double math;//数学成绩 double physics;//物理分数 double average;//考试成绩 double grade1;//同学互评分 double grade2;//品德成绩 double grade3;//任课教室评分 double gradesum;//综合测评成绩 int ranking1;//考试名次 int ranking2;//综合测评名次 }; Student stud[100]; //————————————————读取学生信息—————————————————— void read() { char filename[20]; cout<<"从文件中读取信息!"< cout<<"请输入文件名:"< cin>>filename; cout<<"请问要读取几名学生信息:"< cin>>n; ifstream infile; infile.open(filename,ios::in|ios::out); if(!infile) {