“数据结构与算法”
课程设计报告
(一) 需求和规格说明
主要功能是对批量学生的各门成绩进行录入、修改、查询、统计等,要求方便快速。记录学生的学号、姓名、班级、性别、联系电话以及课程和成绩;可以对学生的成绩按学号和姓名进行查寻;输出显示学生成绩;并实现排序、统计及格率和优秀率功能。
编程任务:
(1)界面基本要求:
****************************
学生成绩管理系统
****************************
************************************
** F1 --帮助 **
** F2 --输入数据并存入文件 **
** F3 --根据学号查询成绩 **
** F4 --根据姓名查询成绩 **
** F5 --输出文件内容 **
** F6 –成绩排序 **
** F7 --统计及格和优秀人数 **
** ESC--退出系统 **
************************************
另:提倡用MFC的对话框做简单的输入输出交互界面。
(2)功能要求:
1)帮助:系统使用方法的相关信息。
2)输入数据并存入文件:输入相关信息,并实现文件流的读写操作。
3)根据学号查询成绩:输入学号,查询学生的各门成绩
4)根据姓名查询成绩:输入姓名,查询学生的各门成绩
5)输出文件内容:屏幕输出显示所有学生的成绩
6) 成绩排序:对某门成绩或总分进行快速排序,显示、保存
7)统计及格和优秀人数:统计及格和优秀率。
8)退出
(二) 设计
主要内容如下:
1. 关键类的设计,继承层次关系,代码:(编译器 C-Free 5.0)
首先,创建了一个student类.在student类的共有部分声明程序所需函数;然后就是student类的函数实现部分,其中定义student类的带参数及不带参数构造函数;再是常用函数的调用,并定义系统菜单函数及其界面;最后就是主函数文件。
属性和方法定义
(三) 用户手册
程序运行时,进入主界面
选择”0”,读取帮助信息
帮助信息
系统有对学生的学号、姓名、班级、性别、联系电话以及计算机、数学的成绩录入等功能
可以对学生的成绩按学号和姓名进行查寻,并且能对学生成绩实现排序功能。
按照界面说明进行程序的各个子程序调用,最终完成工作后便可退出。
@2014 Anpengfei. All rights reserved.
(四) 调试及测试
在调试过程中也出现了多处错误,逐一修改,坦然漏洞还是有的。
由于系统每增加一个学生信息,无论他(她)是的情况如何,其学号和其他信息都是自定义的,但是当出现相同学号时,系统能返回上级菜单,让用户重新输入。
对于班级、性别、电话号码都是后输入系统的,没有进行限制,此系统只有保存和调用数据的功能,并不能对数据进行判断,查验是否为合法班级。合法电话号码等等。
但是编程过程中对数学和微机的成绩输入是有限制的,输入数据必须满足0<=输入值<=100,否则将返回上级菜单重新输入。
(五) 运行实例:
以两组数据为例:
学号 姓名 班级 性别 电话 数学成绩 微机成绩
01 qq 01 b 666666 88 59
02 ww 02 g 888888 79 80
运行各功能函数 如图所示:
(六)进一步改进
(1)、并未实现文件流的读取,目前程序只能逐条进行输入,不能实现批量读入,以后会做改进。
(2)、没有实现结果的输出保存功能,信息只能在系统中调用,当系统关闭后没有保存想要的数值等功能,以后要加强。
(3)、没有进行MFC的优化设计,程序只是单纯的存在编译器当中,不过利用C-Free 5.0 倒是能生成”函数.exe”文件,能单独拿出来在windows 操作系统下使用。
(4)、对于信息的修改,用删除重新输入的方式来完成,并未构建直接修改函数。
(七)心得体会
由于本课题中的许多知识点都没有学过都要靠自己到课外的资料中去查找。在用的时候难免出现这样那样的错误。如开始设计出来的菜单不是预想的那样,而是总个窗中出现混乱。解决的这个问题的办法是调整。一个系统的菜单和提示信息非常重要。如果没有这些用户根本不知道怎么用这个成绩管理系统。在设计的调试过程中也无法顺利的完成调试工作。有了一个清晰简单的菜单和一些提示信息这后,调试过程完成的非常顺利。
回顾此次课程设计,我感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识熟悉了,本次课程设计结束了,我们通过这次实践学到了许多知识。学到了设计一个简单的系统。要注意哪些方面。也使我知道自己哪些方面做得还不够。这不仅是程序设计,更是锻炼处理问题的能力,同时编写程序是件细心活,稍不留神就会出错,这就必须要求我对待事情要认真!在编写程序的过程中,错误不断出现,不同的类型(如少写了一个符号,写错了字母,用错了函数等等)层出不穷,这考验我们待事细心,耐心,能不能坚持到底,不能半途而废。
但我总结出了一点点的经验如下:
1、要对系统的功能和要求做出详细的分析,并合理分解任务。
2、把分解出来的子任务,做给一个相对独立的模块。
3、在设计一个模块之前,要简单构想一下总界面的显视情况。
4、针对构想出来的界面进行程序的编写。
(八)对课程设计的建议
1、可以多做一些技术上的指导,多讲讲算法。针对每个人的题目,有一些建设性的指导,比如我的题目中要求MFC设计,可以简单得培训一下,或许效果会更好。
2、课程设计,每个人的题目都不一样,相互之间交流还是很少的,我建议今后可以出一些相对难一点儿题目,分组进行设计,这样在过程中每个人都能得到锻炼,还能培养合作意识和团队精神,这对即将成为程序员的我们是很重要的。
(九)附录¾¾源程序
#include<iostream>
#include<string>
#include<stdio.h>
#include<fstream>
#include<iomanip>
using namespace std;
class student
{
private:
string number;
string name;
string clas;
char gender;
string phone;
double computer;
double math;
double sum;
student *head;
student *curnode;
student *next;
float jige_num;
float youshen_num;
float jige;
float youxiu;
float jigelv;
float youshenglv;
float jigel;
float youxiul;
int count;
public:
student();//不带参数的构造函数
//带数据域参数的构造函数,用来动态建立节点---------------------------------
student(string ,string ,string ,char ,string ,double ,double ,double=0.0);
void help();//用于描述帮助信息
void sum_score();//总分函数
void cin_app();//用于输入
void app_score(string,string,string,char,string,double,double); //动态的建立节点
void del_score(); //删除全部节点
void displist(); //输出节点中的全部数据
void lookup(int ,string ); //查找函数
void del_score(int ,string ); //删除函数
void compositor(int); //排序函数
void tongji();//统计及格率和优秀率
};
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////student类的实现
void err_char();//输入错误字符检测函数
void score_err();//成绩范围检测函数,当输入成绩不在0到100之间时提示重新输入
student::student():next(NULL)//不带参数的构造函数
{
head=curnode=this;
}
//带参数的构造函数
student::student(string Number,string Name,string Clas,char Gender,string Phone,double Computer,double Math,double Sum):next(NULL)
{
number=Number;
name=Name;
clas=Clas;
gender=Gender;
phone=Phone;
computer=Computer;
math=Math;
sum=Sum;
}
//////////////////////////////////统计及格率和优秀率 ??????????????????????????
void student::tongji(){
int count;
int jige_num=0,youshen_num=0,jige=0,youxiu=0;//分别算计算机和数学成绩的率人数和率
float jigelv,youshenlv,jigel,youxiul;//jigelv stand for computer;jigel stand for math
int m=count;
for(int i=0;i<=m;i++)
{
if(computer>=60){jige_num=jige_num+1;}
if(computer>=85){youshen_num=youshen_num+1;}
if(math>=60){jige=jige+1;}
if(math>=85){youxiu=youxiu+1;}
}
jigelv=jige_num/m;
youshenlv=youshen_num/m;
jigel=jige/m;
youxiul=youxiu/m;
cout<<"计算机及格率: "<<jigelv*100.0<<"% 计算机优秀率: "<<youshenlv*100.0<<"%"<<endl;
cout<<"数学及格率: "<<jigel*100.0<<"% 数学优胜率: "<<youxiu*100.0<<"%"<<endl;
jige_num=0;
youshen_num=0;
jigelv=0;
youshenlv=0;
}
////////////////////////////////帮助信息//////////////////////////
void student::help(){
cout<<" 帮助信息 "<<endl;
cout<<"系统有对学生的学号、姓名、班级、性别、联系电话以及计算机、数学的成绩录入等功能"<<endl;
cout<<"可以对学生的成绩按学号和姓名进行查寻,并且能对学生成绩实现排序功能。"<<endl;
cout<<" @2014 Anpengfei. All rights reserved."<<endl;
cout<<" ";system("pause");
}
///////////////////////////////////////////////////////计算总成绩
void student::sum_score()
{sum=computer+math;}
void student::app_score(string Number,string Name,string Clas,char Gender,string Phone,double Computer,double Math)//动态建立节点
{
curnode->next=new student(Number,Name,Clas,Gender,Phone,Computer,Math);
curnode=curnode->next;
}
/////////////////////////////////////////////////////删除表中的全部数据
void student::del_score()
{
student *p;
curnode=head->next;
while(curnode!=NULL)
{
p=curnode->next;
delete curnode;
curnode=p;
}
head->next=NULL;
curnode=head;
cout<<"现已是一个空表 "<<endl;
cout<<" ";system("pause");
}
///////////////////////////////////////////////////输出表中的全部数据
void student::displist()
{
if(head->next==NULL)
{
cout<<"!这是一个空表!"<<endl;
cout<<" ";system("pause");
return;
}
else{
student *pw=curnode;
curnode=head->next;
cout<<"学号 姓名 班级 性别 电话 计算机 数学 总分 "<<endl;
while(curnode!=NULL)
{
cout<<curnode->number;
cout<<setw(12)<<curnode->name;
cout<<setw(8)<<curnode->clas;
cout<<setw(8)<<curnode->gender;
cout<<setw(14)<<curnode->phone;
cout<<setw(15)<<curnode->computer;
cout<<setw(8)<<curnode->math;
curnode->sum_score();
cout<<setw(8)<<curnode->sum;
if(curnode->next!=NULL)
cout<<endl;
else
cout<<endl;
curnode=curnode->next;
}
curnode=pw;
cout<<"!表中内容输出完毕!"<<endl;
cout<<endl;
cout<<" ";system("pause");
}
}
//////////////////////////////////////////////////////////////输入数据
void student::cin_app()
{
student *p=curnode;
bool b=0;
string Number;
string Name;
string Clas;
char Gender;
string Phone;
double Computer;
double Math;
int count=0;
while(1)
{
cout<<" 学 号:";
cin>>Number;
curnode=head->next;
while(curnode!=NULL)
{
b=(Number==curnode->number);
curnode=curnode->next;
}
if(!b)
break;
else
{
cout<<"出现了相同的学号,请重新输入"<<endl;
}
}
curnode=p;
cout<<" 姓 名:";
cin>>Name;
count++;
curnode=p;
cout<<"班级(数字):";
cin>>Clas;
curnode=p;
cout<<"性别(b for boy,g for girl):";
cin>>Gender;
curnode=p;
cout<<"电话:";
cin>>Phone;
while(1)
{
cout<<" 计算机:";
cin>>Computer;
while(cin.fail())
{
err_char();
cout<<" 计算机:";
cin>>Computer;
}
if(Computer>=0&&Computer<=100)
break;
else
score_err();
}
while(1)
{
cout<<" 数 学:";
cin>>Math;
while(cin.fail())
{
err_char();
cout<<" 数 学:";
cin>>Math;
}
if(Math>=0&&Math<=100)
break;
else
score_err();}
this->app_score(Number,Name,Clas,Gender,Phone,Computer,Math);
cout<<"记录已添加!"<<endl;
cout<<" ";system("pause");
}
/////////////////////////////////////////////////////////查找函数的实现
void student::lookup(int n,string str)
{
student *p=curnode;
bool b;
//定义i=1,当找到数据时把i置为0.用于输出没有找到数据
int i=1;
if(!(curnode=head->next))
{
cout<<"!这是一个空表!"<<endl;
curnode=p;
cout<<" ";system("pause");
return;
}
cout<<" 学号 姓名 班级 性别 电话 计算机 数学 总分 "<<endl;
while(curnode!=NULL)
{
switch(n)
{
case 1: b=curnode->number==str;break;
case 2: b=curnode->name==str;break;
default: return;
}
if(b)
{
i=0;
cout<<curnode->number;
cout<<setw(8)<<curnode->name;
cout<<setw(8)<<curnode->clas;
cout<<setw(8)<<curnode->gender;
cout<<setw(14)<<curnode->phone;
cout<<setw(15)<<curnode->computer;
cout<<setw(8)<<curnode->math;
curnode->sum_score();
cout<<setw(8)<<curnode->sum;
cout<<endl;
} curnode=curnode->next;
}
//当i=1是代表没有找到数据
if(i)
{
cout<<endl;
cout<<"没有匹配的数据 "<<endl;
}
curnode=p;
cout<<" 以上是本次查找的结果!"<<endl;
cout<<" ";system("pause");
}
/////////////////////////////////////////////////////////删除函数的实现
void student::del_score(int n,string str)
{
student *p=curnode,*pw=head;
bool b;
//定义i=1,当找到数据时把i置为0.用于输出没有找到数据
int i=1;
if(!(curnode=head->next))
{
cout<<"!这是一个空表!"<<endl;
curnode=p;
cout<<" ";system("pause");
return;
}
while(curnode!=NULL)
{
switch(n)
{
case 1: b=curnode->number==str;break;
case 2: b=curnode->name==str;break;
default: return;
}
if(b)
{
i=0;
pw->next=curnode->next;
delete curnode;
curnode=pw->next;
}
else
{
pw=curnode;
curnode=curnode->next;
}
}
//当i=1是代表没有找到数据
if(i)
{
cout<<"没有匹配的数据"<<endl;
}
else
{
cout<<" 数据删除成功 "<<endl;
}
curnode=head;
while(curnode->next)
{
curnode=curnode->next;
}
cout<<" ";system("pause");
}
/////////////////////////////////////////////////////////////排序函数的实现
void student::compositor(int n)
{
if(head->next==NULL)
{
cout<<"这是一个空表不能排序!"<<endl;
cout<<" ";system("pause");
return;
}
if(head->next->next==NULL)
{
cout<<"只有一条记录不用排序!"<<endl;
cout<<" ";system("pause");
return;
}
student *s,*p,*q,*r;
r=head;
s=head->next;
q=s;
p=q->next;
while(s!=NULL)
{
while(p!=NULL)
{
switch(n)
{
case 1:
{
while(s->computer<p->computer)
{
q->next=p->next;
r->next=p;
p->next=s;
s=p;
p=q->next;
if(p==NULL)
break;
}
break;
}
case 2:
{
while(s->sum<p->sum)
{
q->next=p->next;
r->next=p;
p->next=s;
s=p;
p=q->next;
if(p==NULL)
break;
}
break;
}
case 3:
{
while(s->math<p->math)
{
q->next=p->next;
r->next=p;
p->next=s;
s=p;
p=q->next;
if(p==NULL)
break;
}
break;
}
default: return;
}
if(p==NULL)
{
break;
}
q=p;
p=p->next;
}
r=s;
s=s->next;
q=s;
p=q->next;
if(p==NULL)
{
break;
}
}
cout<<"成功完成排序操作,即将输出排序结果!"<<endl;
cout<<" ";system("pause");
displist();
}
/////////////////////////////////////////////////////////////////////////////////////////
void menu()//系统菜单函数的定义
{ cout<<"**********************************************************"<<endl;
cout<<"************* 合 肥 工 业 大 学 ****************"<<endl;
cout<<"************* 学 生 成 绩 管 理 系 统 *****************"<<endl;
cout<<"**********************************************************"<<endl;
cout<<"************ 0 --帮助 **************"<<endl;
cout<<"************ 1 --输入数据并存入文件 **************"<<endl;
cout<<"************ 2 --根据名字或学号查询成绩 **************"<<endl;
cout<<"************ 3 --删除信息 **************"<<endl;
cout<<"************ 4 --显示文件内容 **************"<<endl;
cout<<"************ 5 –成绩排序(降序) **************"<<endl;
cout<<"************ 6 --统计及格和优秀人数 **************"<<endl;
cout<<"************ 其他任意键 --退出系统 **************"<<endl;
cout<<"**********************************************************"<<endl;
cout<<"请选择:";
}
//查找函数的调用
void fun_lookup(student &a)
{
int n;
string str;
cout<<"1、按学号 2、按姓名"<<endl;
cout<<" 你的选择是:";
cin>>n;
while(cin.fail())
{
err_char();
cout<<" 你的选择是:";
cin>>n;
}
if(n!=1&&n!=2)
n=1;
cout<<" 请输入查找关键字:";
cin>>str;
a.lookup(n,str);
}
//删除函数的调用
void fun_del(student &a)
{
int n;
string str;
cout<<"1、按学号 2、按姓名"<<endl;
cout<<" 你的选择是:";
cin>>n;
while(cin.fail())
{
err_char();
cout<<" 你的选择是:";
cin>>n;
}
if(n!=1&&n!=2)
n=1;
cout<<" 请输入删除关键字:";
cin>>str;
a.del_score(n,str);
}
//排序函数的调用
void fun_compositor(student &a)
{
int n,m;
cout<<" 1 按计算机分数排序 2 按总分排序 "<<endl;
cout<<" 3 按数学分数 排序 "<<endl;
cout<<" 你的选择是:";
cin>>n;
while(cin.fail())
{
err_char();
cout<<" 你的选择是:";
cin>>n;
}
cout<<endl;
//输出排序后的结果
a.compositor(n);
}
//成绩范围检测函数
void score_err()
{
cout<<"---- 输入的成绩应该在0--100之间----"<<endl;
cout<<" -----请返回重新输入----"<<endl;
}
//退出程序函数
void fun_exit()
{
cout<<"---------程序即将退出----------"<<endl;
cout<<" ";system("pause");
exit(1);
}
//输入错误字符检测函数
void err_char()
{
cout<<"---输入了非法字符,请重新输入---"<<endl;
cin.clear ();
cin.sync ();
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////主函数文件
void fun_lookup(student &a);//查找函数的调用定义
void fun_del(student &a);//删除函数的调用定义
void fun_compositor(student &a);//排序函数的调用定义
void fun_exit();//退出程序函数的定义
int main()
{
student a;
while(1)
{
int i;
menu();
cin>>i;
if(cin.fail()) //输入非法字符时退出
fun_exit();
switch (i)
{
case 0: a.help() ;break; //帮助
case 1: a.cin_app();break; //增加记录
case 2: fun_lookup(a);break; //查找记录
case 3: fun_del(a);break; //删除记录
case 4: a.displist();break; //查看记录
case 5: fun_compositor(a);break; //排序
case 6: a.tongji();break; //?? 统计及格和优秀人率
default: fun_exit();
return 0;}
}
}