《学生成绩管理软件》设计文档.docx
《《学生成绩管理软件》设计文档.docx》由会员分享,可在线阅读,更多相关《《学生成绩管理软件》设计文档.docx(42页珍藏版)》请在冰点文库上搜索。
《学生成绩管理软件》设计文档
广西工学院鹿山学院
C++面向对象程序设计实训
《学生成绩管理软件》设计文档
系别:
计算机工程系
专业:
计软092
学号:
姓名:
二0一0年2月18日
引言
项目简要介绍
(1):
能按学期、班级完成对学生成绩的录入、修改
(2):
能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的平均成绩进行排序(3):
能查询学生成绩,不及格科目及学生名单(4):
能按班级输出学生的成绩单
项目背景
【该学生成绩管理系统在国内外是倍受欢迎的,该程序是使用C++语言编写的。
】
项目的创新点
【该学生成绩管理系统相对其他同类软件来说有简洁、明朗易懂的优点,有效地利用C++中的类以及类的继承和派生,体现C++语言的核心内容。
】
定义
请看下文总体设计
任务概述
目标
【能够实现对学生成绩信息的管理,方便统计学生成绩管理,能够对C++类能够进一步了解与运用。
】
运行环境
【在VC6.0环境下可以运行,XP系统或者Windows7也可以运行。
】
需求
功能需求
要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
要求在设计的过程中,建立清晰的类层次;
在系统的设计中,至少要用到面向对象的一种机制。
性能需求
数据精确度
时间特性要求
总体设计
基本设计概念和处理流程
【增加学生成绩以及信息输入学生成绩以及信息(一旦输入,系统将会自动保存)查看(输出)已存好的学生成绩以及信息修改或者删除已有的学生成绩以及信息将已有的学生成绩以及信息排序按照总分大小排序按照各科成绩大小排序。
。
。
。
。
。
。
。
(具体请读者运行该程序后自行操作即可看的更加明确)。
】
总体结构
1主要知识点
运算符重载增加了C++语言的可扩充性。
类及类的成员函数,结构体等。
冒泡排序法及使用控制符控制输出格式等。
2关键技术
程序中每一种数据类型用一个类来实现,共设计了1个类。
类base。
类定义了相应的处理各功能的函数及主界面与推出界面。
具体定义如下所示:
(1)结构体structstudent
结构体中定义了int型变量num;char型数组变量name[20];float型变量math;float型变量Eglish;float型变量Chinese;float型变量sum;floa型变量taverage;int型变量banji;
(2)类base
类base中,定义了:
voidjiemian();函数:
主要是对界面的统一存放、及利于使用者根据提示进入不同的函数功能区;voidtuichu();函数:
对退出程序的管理界面;voidxiugai_score()函数:
对学生成绩的修改函数;voidtongji_score()函数:
对学生成绩的统计函数;voidset_score()函数:
对学生成绩的录入;voiddisplay_score()函数:
显示学生的成绩;voidsearch_score()函数:
对学生成绩的查询;
并且定义了结构体变量studentstu[100]:
用于存放学生的信息;及int型变量renshu;
3各函数的功能
界面函数:
jiemian()
主要提示使用者进入不同的功能区。
(1)录入成绩的函数:
voidset_score()
根据提示输入renshu的值;进入成绩录入循环;待录入完成后,返回主界面,重新选择下一项功能。
(2)查询学生信息的函数:
voidsearch_score()
根据提示选择不同的查询方式:
1.查询学生的成绩。
2.查询不及格同学的信息。
3.查询学生的名单。
0.返回主界面。
(3)成绩的修改函数:
voidxiugai_score()
根据提示选择不同的修改方式进行相应的修改
(4)统计学生成绩的函数:
voidtontji_score()
出现提示界面:
1、求学生成绩的总分;2、求学生成绩的平均分;3、根据学生的平均分对学生的成绩进行排序;
(5)退出程序的函数:
voidtuichu_score()
退出程序;欢迎下次使用的提示。
4基本功能要求
(1)功能选择可以用菜单来实现
首先是界面*******************
~@^_^@~~@^_^@~
欢迎使用学生成绩管理系统
***********************
请选择(1—6)0★1.成绩的录入0.★2:
修改学生的成绩
★3:
统计学生的成绩
★4:
查询学生的成绩
★5.输出学生的信息
★6:
退出程序
(2)程序结构图
接口设计
外部接口
内部接口
数据结构设计
1逻辑结构设计
数据结构与程序的关系
【增加学生成绩以及信息输入学生成绩以及信息(一旦输入,系统将会自动保存)查看(输出)已存好的学生成绩以及信息修改或者删除已有的学生成绩以及信息将已有的学生成绩以及信息排序按照总分大小排序按照各科成绩大小排序。
】
使用说明
安装与初始化
【在VC6.0环境下直接运行程序即可。
】
软件主要功能的使用说明
【对软件主要功能的操作和输入输出做简要的说明】
6.运行结果
程序运行时,首先出现主界面菜单,由用户进行功能选择,选择不同的数字,进入不同的功能区。
如图2所示。
图2程序运行主界面
选择1,则显示次级菜单,进入成绩录入界面,如图3所示。
图3成绩录入界面
选择1,进行成绩录入功能,如图4所示。
图4成绩录入
选择0后返回主界面进行其它的操作
图5返回主界面
选择2,进入修改界面:
修改界面
按1,通过寻找姓名的方式查找后修改
选3,进行学生成绩的统计
选4,进入查询界面
按2、3分别进入查询不及格科目及学生的成绩
查询不及格科目结果
查询学生的成绩
选5输出学生的成绩界面
选1输出学生的科目成绩
选2输出学生的总体成绩
第一部分基础实训
第1章类与对象的创建
一、实验目的
1.掌握C++类的概念和基本组成,学会设计类,掌握类的使用方法;
2.熟悉各种成员函数包括构造函数、析构函数、内嵌函数的定义与使用;
3.掌握静态数据成员的使用。
4.掌握C++类的概念和基本组成,学会设计类,掌握类的使用方法;
5.熟悉各种成员函数包括构造函数、析构函数、内嵌函数的定义与使用;
6.掌握静态数据成员的使用。
二、实验内容及步骤
1.在下面的类定义中找出语法错误:
(1)classAA
{
public:
voidprint();
intsum();
AA(){}
AA(int,int);
private:
intx=0;//私有变量定义时不能初始化
inty;
};
(2)classBB
{
intone;
inttwo;
public:
boolequal();
voidprint();
BB(int,int);
}//没有分号
(3)classCC
{
public:
voidset(intx,inty);
voidprint();
CC(){}
CC(intx,inty);//重载错误
boolCC(intx,inty);
private:
intx;
inty;
};
2.改正以下程序中的错误,并分析错误原因。
#include
classpoint
{
intx1,x2;
public:
point(intx=0,inty=0){
x1=x;
x2=y;
}//增加的构造函数
intgetx1(){returnx1;}
intgetx2(){returnx2;}
};
voidmain()
{
pointdata(5,5);
cout<cout<}
3.分析找出以下程序中的错误,说明错误原因,给出修改方案使之能正确运行。
#include
classone
{
inta1,a2;
public:
one(intx1,intx2){a1=x1;a2=x2;}
};
voidmain()
{
onedata(2,3);
cout<cout<}
4.分析以下程序的错误原因,给出修改方案使之能正确运行。
#include
classAmplifier
{
public:
floatinvol,outvol;
public:
Amplifier(floatvin,floatvout)
{
invol=vin;
outvol=vout;
}
floatgain();//增加返回类型
};
floatAmplifier:
:
gain(){returnoutvol/invol;}//增加返回类型
voidmain()
{
Amplifieramp(5.0,12.0);
cout<<"Thegainis=>"<}
5.考虑下面的声明:
#include"iostream.h"
classxClass
{
public:
voidfunc();
voidprint()const;
xClass(){u=0;w=0;}//第六题
xClass(intx,doubley){u=x;w=y;}
private:
intu;
doublew;
};
voidxClass:
:
func(){
u=10;
w=15.5;
}//第四题的答案
voidxClass:
:
print()const{
cout<
cout<}//第五题的答案。
voidmain()
{
xClasst(20,35.4);
t.print();
}
(1)类xClass有几个成员?
答:
有四个成员。
(2)类xClass有几个私有成员?
答:
有两个。
(3)类xClass有几个构造函数?
答:
有两个。
(4)编写成员函数func,将u和w的值分别设置为10和15.5。
(5)编写成员函数print,打印u和w的值。
(6)编写xClass类的默认的构造函数的定义,将私有成员初始化为0。
(7)编写c++程序,声明xClass类的对象t,并将t的数据成员分别初始化为20和35.4,并打印数据成员的值。
6.考虑下面类的定义:
//
(1)为testClass编写成员函数的定义
//
(2)编写程序,测试testClass类的各种操作。
#include"iostream.h"
classtestClass
{
public:
intsum(){returnx+y;}//返回私有成员的和
voidprint()const{cout<<"x="<testClass(){x=0;y=0;}//默认构造函数,将私有成员初始化为0
testClass(inta,intb){x=a;y=b;}//带参数的构造函数
private:
intx;
inty;
};
voidmain()
{
testClasst;
t.print();
cout<<"x+y="<t.print();
testClassp(12,34);
p.print();
cout<<"x+y="<
}}7.考虑下面类的定义:
#include"iostream.h"
classkClass
{
public:
kClass(){x=0;y=0;}//line1
kClass(intx1){x=x1;y=0;}//line2
kClass(intx1,intx2){x=x1;y=x2;}//line3
kClass(doublex1,intx2){x=x2;y=x1;}//line4
voidshow(){cout<<"x="<private:
intx;
doubley;
};
/*
(1)当有下面声明时,给出其所执行的构造函数的行号:
kClassone;
kClasstwo(5,6);
kClassthree(3.5,8);
(2)编写第1行的构造函数的定义,使私有数据成员初始化为0。
(3)编写第2行的构造函数的定义,使私有数据成员u初始化为相应的参数
值,v初始化为0。
(4)编写第3行、第4行的构造函数的定义,使私有数据成员初始化为相应的参数值。
*/
voidmain()
{
kClassone;
one.show();
kClasstwo(5,6);
two.show();
kClassthree(3.5,8);
three.show();
}
8.设计一个Date类,包含数据成员year、month、day,定义构造函数对日期进行初始化,定义成员函数Print()输出日期。
构造一个Birthday的对象进行测试。
#include"iostream.h"
classData
{
public:
Data(intx,inty,intz){year=x;month=y;day=z;}
voidprint(){cout<<"年/月/日:
"<private:
intyear;
intmonth;
intday;
};
voidmain()
{
DataBrithday(1989,12,27);
Brithday.print();
}
9.设计一个用于人事管理的Person类,它的成员数据有:
编号(id)、姓名(name)、身份证号(idcard)、性别(sex)、出生日期(birthday).其中出生日期为Date类的内嵌子对象。
编写相应的构造函数和析构函数,并构造一个Person对象进行测试。
#include"iostream.h"
#include"string.h"
classData{
public:
Data(intx,inty,intz){year=x;month=y;day=z;}
voidprint(){cout<<"年/月/日:
"<private:
intyear;
intmonth;
intday;
};
classPerson{
public:
Person(intp1,charp2[],charp3[],charp4[],Datap5);
voidshow();
private:
intid;
charname[20];
charidcard[20];
charsex[10];
Databrithday;
};
Person:
:
Person(intp1,charp2[],charp3[],charp4[],Datap5):
brithday(p5)
{
id=p1;
strcpy(name,p2);
strcpy(idcard,p3);
strcpy(sex,p4);
}
voidPerson:
:
show()
{
cout<}
voidmain()
{Datat(1998,5,6);
Personp1(12,"ihn","kk","nv",t);
p1.show();
}
10.设计定义图书类(Book类):
Book类应该包含书的如下信息:
书名、作者(最多4个)、出版社、国际标准图书编号、价格、库存数。
为了知道作者人数,另有一个信息表示作者数。
Book类应该包含实现各种操作的成员函数,例如:
针对书名的一般操作有显示书名,设置书名,检查是否有相同的书名.......类似地,针对库存数的一般操作有显示库存数,设置库存数,更新库存数,返回库存数......针对书的作者、出版社、国际标准图书编号、价格,添加类似操作,并添加合适的构造函数和析构函数(如果需要)。
编写使用Book类的程序,并测试Book类对象的各种操作。
声明有10个Book类型的元素的数组,执行以下操作:
通过书名检索书籍信息、通过国际标准图书编号检索书籍信息、更新库存数。
#include"iostream.h"
#include"string.h"
classBook{
public:
Book();
Book(charp1[],charp2[],charp3[],intp4[],intp5);//构造函数
voidShow_bookname(){cout<voidSet_bookname();//设置书名
voidCheck_bookname();//检查是否有相同书名
voidShow_stocknumber(){cout<private:
charB_name[20];//书名
charAuthor[20];//作者名
charPress[20];//出版社名
intNumber[15];//图书编号
intPrice;//价格
intS_number;//库存数
};
Book:
:
Book(charp1[],charp2[],charp3[],intp4[],intp5){
Price=p5;
strcpy(B_name,p1);
strcpy(Author,p2);
strcpy(Press,p3);
Number=p4;
}
voidBook:
:
Set_bookname(){
charname[20];
getx(name);
strcpy(B_name,name);
}
voidmain()
{
Bookbook[10];
}
第2章继承性与派生类
一、实验目的
1.掌握派生的类别与方式;
2.了解派生类中如何使用基类的成员、基类成员在派生类中的访问控制。
二、实验内容
1.分析下列程序中的访问权限,并回答所提的问题。
#include
classA{
public:
voidf1(){cout<<"A:
"<A(){i1=10;j1=11;}
protected:
intj1;
private:
inti1;
};
classB:
publicA
{
public:
voidf2(){cout<<"B:
"<B(){i2=20;j2=21;}
protected:
inti2;
private:
intj2;
};
classC:
publicB
{
public:
voidf3(){cout<<"c:
"<C(){i3=30;j3=31;}
protected:
intj3;
private:
inti3;
};
voidmain()
{
Aa;
Bb;
Cc;
}
回答下列问题:
1派生类B中成员函数f2()能否访问基类A中的成员f1(),i1和j1呢?
答:
能访问j1,不能访问i1,能访问f1()。
2派生类B的对象b能否访问基类A中的成员f1(),i1和j1呢?
答:
能访问j1,不能访问i1,能访问f1()。
3派生类C中成员函数f3()能否访问直接基类B中的成员f2()和j2呢?
能否访问间接基类A中的成员f1(),j1和i1呢?
答:
不能访问j2,能访问f2();能访问f1(),j1,不能访问i1
④派生类C的对象c能否访问直接基类B中的成员f2(),i2和j2呢?
能否访问间接基类A中的成员f1(),j1和i1呢?
答:
能访问f2(),不能访问i2,j2;能访问f1(),不能访问i1,j1.
2.指出下面程序中的错误,改正并运行。
#include
classPoint
{
private:
intx1,x2;
public:
Point();
Point(intx,inty){x1=x;x2=y;}
intx_cord(){returnx1;}
inty_cord(){returnx2;}
};
voidmain()
{
Pointdata(5,6);
cout<cout<Pointmore_data[20];
}
3.指出并改正下面程序中的错误。
#include
classPoint
{
intx,y;
public:
Point(inta=0,intb=0){x=a;y=b;}
voidmove(intxoffset,intyoffset){x+=xoffset;y+=yoffset;}
intgetx(){returnx;}
intgety(){returny;}
};
classRectangle:
publicPoint
{intlength,width;
public:
Rectangle(intx,inty,intl,intw):
Point(x,y){length=l;width=w;}
intgetlength(){returnlength;}
intgetwidth(){returnwidth;}
};
voidmain()
{
Rectangler(0,0,8,4);
r.move(23,56);
cout<}
4.指出并改正下面程序中的错误。
#include