学生信息管理系统课 程 设 计 报 告.docx
《学生信息管理系统课 程 设 计 报 告.docx》由会员分享,可在线阅读,更多相关《学生信息管理系统课 程 设 计 报 告.docx(16页珍藏版)》请在冰豆网上搜索。
学生信息管理系统课程设计报告
课程设计报告
课程设计名称:
学生信息管理系统
系别:
三系
学生姓名:
班级:
学号:
成绩:
指导教师:
汤亮
开课时间:
2010-2011学年2学期
一、课程设计目的
本课程设计是在学习面向对象基本理论之后的实践教学环节。
该实践教学是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧。
要求学生在设计中逐步提高程序设计能力,培养科学的软件工作方法。
学生通过课程设计在下述各方面得到锻炼:
(1)能根据实际问题的具体情况,结合面向对象的基本理论和基本技巧,正确分析问题,并能设计出解决问题的有效算法与程序。
(2)提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法和程序的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改,进一步提高程序设计水平。
二、课程设计要求
1、基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;
(3)在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法;
(4)在系统的设计中,要求运用面向对象的机制(继承、派生及多态性)来实现系统功能。
2、创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能及设计出比较友好的界面等。
三、课程设计内容
设计要求:
使用C++类实现
设计要求实现如下功能:
(1)建立学生信息数据,包括学号、姓名、性别、三科成绩、出生时间、年龄(必须计算得到)。
(2)使用继承的方法构造至少3个类,(即学生类——虚基类,一年级学生和二年级学生类——派生类)使用相应的对象放置10个学生信息。
(3)编写同名display()成员函数,用来输出数组的内容。
(4)按不同类别输出学生信息,比如按性别。
(可选功能)
(5)要求对“<<”和“>>”运算符进行重载。
考虑到输人学号时,也会因不小心引人空格,而且名字中也需要有空格,所以重载“>>’’运算符时,需要满足这个要求。
(6)抽取并计算学生的平均成绩。
(7)按照至少一科成绩进行排序。
(8)检索(查找)指定信息。
(如按姓名检索、按年龄检索)
(9)显示成绩分布的柱状图,示例如下:
(10)参考界面如下:
增加学生
显示全部学生
计算平均成绩
删除一个学生
按年级输出学生信息
按性别输出学生信息
按姓名检索学生
结束程序运行
四、课程设计概要设计
(一)写出必要的头文件
(二)定义一个学生类Student作为基类
公有数据成员:
name(姓名),year,month,day,number(学号),sex(性别),age(年龄),score1(语文),scres2(英语),scores3(数学),aver(三门学科平均成绩)。
公有成员函数:
(1)voiddisplay()用于输出学生的所有信息。
(2)intget_number()用于输出并返回学号number。
(3)floatget_score()用于返回所选的学科。
(4)voidaverage()求解并输出一个学生三科成绩的平均成绩。
将数据成员和成员函数等封装起来,将每个功能函数在类外定义。
(三)Student类派生出两个类Class1类和Class2类
(四)主函数中通过菜单调用各功能函数
用一个switch(m)通过输入m的值来决定执行界面中的哪一个功能。
五、课程设计详细设计与实现
写入头文件:
#include
公有数据成员:
name(姓名),year,month,day,number(学号),sex(性别),age(年龄),score1(语文),scres2(英语),scores3(数学),aver(三门学科平均成绩)。
公有成员函数:
(1)display()
输出一些提示语和输出类中的所有数据成员
(2)intget_number()
在这个函数里可以先输入一个学号,然后把这个学号返回。
(3)floatget_score(int&n)
用于返回Student类中学生的所选的学科。
先判断是哪一门学科,如果输入1就返回第一门学科语文。
(4)voidaverage()
求解并输出一个学生三科成绩的平均成绩。
将scores1,scores2,scores3相加除以3后赋给一个变量并输出它。
主函数:
用一个switch(m)通过输入m的值来决定执行界面中的哪一个功能。
输入一个m值:
case1:
执行录入数据功能,先判断是一年级还是二年级,如果是一年级
记数变量n1++,输入对象class1[n1-1].rewrite(),输入学生全部信息,二年级一样
case2:
执行输出全部数据功能,通过for循环,多次通过类定义的对象数组调用display(),对于一年级用n1控制调用display()次数,二年级一样。
case3:
执行计算三门学科平均成绩,先判断是一年级还是二年级,如果是一年级,通过for循环,t_1.get_number()==class1[i].number找出要求平均数的学生,然后通过for循环调用average()函数,二年级一样。
case4:
删除一个学生功能,输入要删除学生的年级和学号,如果是一年级,通过for循环看class1[i].number是否等于输入的学号,如果是就通过for(j=i;jclass1[j]=class1[j+1],覆盖要删除的学号,否就不执行结束,二年级一样。
case5:
按年级输出信息,输入一个数如果是1就调用class1定义的对象的display()成员函数,如果是2就调用class2定义的对象的display()成员函数。
case6:
按性别输出学生信息,输入一个字符型变量c如果c==class1[i].sex,就调用class1定义的对象的display()成员函数,如果c==class2[i].sex,就调用class2定义的对象的display()成员函数
case7:
按姓名检索学生信息,方法同case6。
case8:
按照至少一科成绩进行排序,输入年级和课程代号,然后通过冒泡排序法进行排序。
具体实现代码:
for(i=0;i{t1=i;
for(j=i;jif(class1[j].get_score(n)>class1[t1].get_score(n))t1=j;
if(t1!
=i)t_1=class1[t1],class1[t1]=class1[i],class1[i]=t_1;}
六、源代码与注释
#include
#include
usingnamespacestd;
classStudent
{
public:
//类公有数据成员和成员函数
stringname;
intnumber;
charsex;
intyear,month,day;
intage;
floatscores1;
floatscores2;
floatscores3;
floataver;
virtualvoiddisplay();//虚成员函数,输出Student类中学生的所有信息
intget_number();//用于输入并返回Student类中学生的学号number
floatget_score(int&n);//用于返回Student类中学生的所选的学科
voidaverage();//求解并输出Student类中学生的三科成绩的平均成绩aver
voidrewrite();
};
voidStudent:
:
display()//类外成员函数voiddisplay()定义
{cout<<"学号:
"<cout<<"姓名:
"<cout<<"性别:
"<cout<<"三门分数:
"<<"语文:
"<"<"<intStudent:
:
get_number()
{cout<<"请输入学生学号:
"<cin>>number;
returnnumber;}
floatStudent:
:
get_score(int&n)//类外成员函数定义
{if(n==1)
returnscores1;
elseif(n==2)
returnscores2;
elseif(n==3)
returnscores3;}
voidStudent:
:
average()//类外成员函数定义
{aver=(scores1+scores2+scores3)/3;
cout<voidStudent:
:
rewrite()
{cout<<"请输入学生学号:
"<cin>>number;
cout<<"请输入学生姓名:
"<cin>>name;
cout<<"请输入学生性别,M代表男生W代表女生:
"<cin>>sex;
cout<<"请输入学生语文分数:
"<cin>>scores1;
cout<<"请输入学生英语分数:
"<cin>>scores2;
cout<<"请输入学生数学分数:
"<cin>>scores3;
cout<<"请输入出生日期:
"<cin>>year>>month>>day;
age=2011-year;
}
classClass1:
publicStudent//声明公用派生类Class1
{public:
voiddisplay()//同名display()函数重新定义
{cout<<"年级:
一年级"<cout<<"学号:
"<cout<<"姓名:
"<cout<<"性别:
"<cout<<"三门分数:
"<<"语文:
"<"<"<cout<<"出生日期:
"<cout<<"年龄:
"<};
classClass2:
publicStudent//声明公用派生类Class2
{public:
voiddisplay()//同名display()函数重新定义
{cout<<"年级:
二年级"<cout<<"学号:
"<cout<<"姓名:
"<cout<<"性别:
"<cout<<"三门分数:
"<<"语文:
"<"<"<cout<<"出生日期:
"<cout<<"年龄:
"<};
intmain()
{
Studentclasst[10];
Student*pt=&classt[0];
boolq;//q为booi型,返回一个逻辑值并决定程序何时结束
intm,n,n1=0,n2=0,i,j,w;//声明整型变量
charc;
Class1class1[10];//声明Class1类的对象数组class1[10]
Class2class2[10];
Class1t_1;
Class2t_2;
stringt_s;
cout<<"**************************************"<cout<<"\t欢迎使用学生信息管理系统"<cout<<"**************************************"<do{q=false;//q决定程序何时结束
cout<cout<<"1.增加一名学生"<cout<<"2.显示全部学生信息"<cout<<"3.计算平均成绩"<cout<<"4.删除一个学生"<cout<<"5.按年级输出学生信息"<cout<<"6.按性别输出学生信息"<cout<<"7.按姓名检索学生信息"<cout<<"8.按照一门课程排序"<cout<<"9.退出系统"<cin>>m;
switch(m)//通过不同的m值执行不同的case
{case1:
cout<<"1代表一年级\t2代表二年级"<cin>>n;
if(n==1)
{n1++;
class1[n1-1].rewrite();}
elseif(n==2)
{n2++;
class2[n2-1].rewrite();}
break;
case2:
//显示全部学生
for(i=0;i{pt=&class1[0];
(pt+i)->display();
cout<for(i=0;i{pt=&class2[0];
(pt+i)->display();
cout<break;
case3:
//计算平均成绩
cout<<"输入年级:
";
cin>>n;
if(n==1)
{for(i=0;i{if(t_1.get_number()==class1[i].number)
class1[i].average();}
cout<elseif(n==2)
{for(i=0;i{if(t_2.get_number()==class2[i].number)
class2[i].average();}
cout<break;
case4:
//删除一个学生
cout<<"请输入要删除学生的年级和学号:
";
cin>>n>>w;
if(n==1)
{for(i=0;iif(class1[i].number==w)
{for(j=i;jclass1[j]=class1[j+1];
cout<<"信息已删除:
";
n1--;
break;}
elseif(class1[i].number!
=w)
{cout<<"未找到该学号"<break;}
}
elseif(n==2)
{for(i=0;iif(class2[i].number==w)
{for(j=i;jclass2[j]=class2[j+1];
cout<<"信息已删除:
";
n2--;
break;}
elseif(class2[i].number!
=w)
{cout<<"未找到该学号"<break;}
}
break;
case5:
//按年级输出学生信息
cout<<"请输入年级:
\n1.代表一年级\t2.代表二年级"<cin>>n;
if(n==1)for(i=0;i{pt=&class1[0];
(pt+i)->display();}
elseif(n==2)for(i=0;i(pt+i)->display();}
break;
case6:
//按性别输出学生信息
cout<<"请输入性别:
\n'M'男\t'W'女"<cin>>c;
for(i=0;i{
if(c==class1[i].sex)
{pt=&class1[0];
(pt+i)->display();
cout<}
for(i=0;i{
if(c==class2[i].sex)
{pt=&class2[0];
(pt+i)->display();
cout<}
break;
case7:
//按姓名检索学生
cout<<"请输入要检索的姓名:
";
cin>>t_s;
cout<<"以下是所有符合要求的信息"<for(i=0;i{if(class1[i].name==t_s)
{pt=&class1[0];
(pt+i)->display();}
cout<for(i=0;i{if(class2[i].name==t_s)
{pt=&class2[0];
(pt+i)->display();}
cout<break;
case8:
//按照至少一科成绩进行排序
cout<<"请输入要排序的年级和课程代号(1代表语文,2代表英语,3代表数学)"<cin>>m>>n;
intt1;
if(m==1)
for(i=0;i{t1=i;
for(j=i;jif(class1[j].get_score(n)>class1[t1].get_score(n))t1=j;
if(t1!
=i)t_1=class1[t1],class1[t1]=class1[i],class1[i]=t_1;}
elseif(m==2)
for(i=0;i{t1=i;for(j=i;jclass2[t1].get_score(n))t1=j;
if(t1!
=i)t_2=class2[t1],class2[t1]=class2[i],class2[i]=t_2;}
cout<<"排序已完成"<break;
case9:
//结束程序运行
q=true;break;}}
while(!
q);cout<<"谢谢你的使用"<return0;}
七、总结
这次编程题是我学C和C++以来做的最大的题目,这次编程我花了很长的时间。
通过该课程设计,我收获很多,而我的收获就是这学期学的理论有了用武之地,学到了不少只有通过上级才知道的知识,让我对编程有了新的认识,这次编程我翻了很多书,耐心地编写,一遍又一遍地调试,在调试过程中发现了自己很多的低级错误,慢慢地改正,终于编译通过并执行了。
我发现编程一定要有耐心,平时多加练习才能又快有准地完成任务。
给我的收获还有就是在编程钱一定要给自己规划好步骤,给自己搭建好一个框架,现在纸上写出大体的思路,这样编程起来就不会混乱,思路就会清晰。
当有了大体思路厚按照题目的要求先编写一小块的内容,每一小块地实现,最后在整合起来。
在审题并构造大体思路是,要根据C++课本中的主流知识,大多数程序编写的模式先写一个基类,然后派生出几个类这样大体的思路来思考,这样能够很快想出程序大体思想,然后花时间去编写出来,加上编写是注意到很多细节,这样程序就很容易完成了。