C++课程设计报告
学院:计算机学院
班级:计科141班
姓名:刘建伟
学号:201400814125
指导老师:王璐
C++课程设计实验报告
学号:201400814125 班级:计科141 姓名:刘建伟
一、课程设计目的及要求
1、设计目的
计算机专业所开设的C++课程设计是教学实践环节中一项重要内容,进行此课程设计的旨在:
1.提高和加强学生的计算机应用与软件开发能力,使学生由初学者向专业的程序员过渡。
2.培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。
3.学习和掌握C++程序设计方法以及上机调试技巧,为今后学习其它专业课程打好基础。
本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,书写课程设计报告。
2、设计要求
1. 设计一个复数类CComplex (15分)
l 私有成员为,实部和虚部
l 采用指针存储动态数组方式存储n个复数信息。
l 重载“>>”、“<<”操作,实现直接输入/输出复数。
l 重载“+”、“-”操作,实现两个复数相加、减。
l 重载“+”、“-”操作,实现一个复数与一个实数相加、减,且满足交换律。
l 重载“=”操作,实现两个复数赋值。
l 重载[]操作直接获得第i个复数。
l 设计显示函数Display(CComplex*),输出数组中所有复数
2 .定义一个CPerson类及其派生类:学生类CStudent和教师类CTeacher。(25分)
其中,
CPerson类私有数据成员:身份ID(char*),姓名(char *),性别(枚举类型Tsex),生日(日期类CBirthday)。成员函数:CPerson()和~CPerson();其中,若对象缺省则为ID(“00000000”),姓名(空串),性别(man),生日(20000101);input():用于录入人员信息;displayP():用于显示人员信息。
学生类CStudent私有数据成员:班级名(char*),学号(char*),课程(包括课程名和成绩,可以用一个结构体实现。假定有8门课,则定义一个8元素的结构体数组);成员函数:构造函数和析构函数,若对象缺省则为学号(“00000000”),班级名(空串),课程(课程名空,成绩-1);input():用于录入学生信息;inputCourse():用于录入课程信息(这里指录入8门课的名称,即课程名);displayS():用于显示学生信息。
教师类CTeacher私有数据成员:职称(String类),工号(String类),所在部门(String类),教授课程(课程名、课程号)。成员函数:构造函数和析构函数,若对象缺省则为工号(“00000000”),职称(空串),所在部门(空串),课程(课程名空,课程号“000000”);input():用于录入教师相关信息;SetScore():用于录入学生课程成绩信息(设有一个10人的学生对象数组,则依次访问该数组的每个学生,针对每个修这门课程的学生,录入该门课的成绩。);DispScore():用于显示指定或所有学生课程成绩信息;SortScore():用于对所有学生课程成绩排序;SetedStuScore():用于修改指定学生课程成绩信息;displayT():用于显示教师信息。
1. 采用文件流方式存储学生信息和教师信息。
2. 要求从键盘上录入10名学生信息(包括8门课程成绩),4名教师信息(每名老师至少上一门课,,注意与学生课程的对应性,假设课程不重复)。上述各类函数至少运行一次。
设计抽象类:几何图形类 (20分)
l 要求:
l 派生类:长方形类(能定义长方体\正方体)、圆类(能定义圆柱\圆锥对象)、三角形类(能定义三棱锥)。
l 设计函数:设计成员函数,计算平面图形和立体图形的周长、面积、或表面积与体积;定义重载函数分别比较不同图形的面积,或表面积。
l 设计要求:各种图形的边长(半径)或棱长必须大于或等于0,且满足各种图形的对应特征,参数为边长或半径或棱长,在不同派生类实现上述函数;在不同类中如果参数超出范围则抛出字符串异常。
4. 职工信息管理系统(30分)
a.问题描述(功能要求):
职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。试设计一职工信息管理系统,使之能提供以下功能:
(1)系统以菜单方式工作
(2)职工信息录入功能(职工信息用文件保存)--输入
(3)职工信息浏览功能--输出
(4)查询和排序功能:(至少一种查询方式)--算法
按工资查询
按学历查询等
(5)职工信息删除、修改功能(任选项)
b.问题的解决方案:
根据系统功能要求,可以将问题解决分为以下步骤:
(1)分析系统中的各个实体之间的关系及其属性和行为;
(2)根据问题描述,设计系统的类层次;
(3)完成类层次中各个类的描述(包括属性和方法);
(4)完成类中各个成员函数的定义;
(5)完成系统的应用模块;
(6)功能调试;
(7)完成系统总结报告以及系统使用说明书。
c.其它要求:
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3)学生可自动增加新功能模块。
5. 成绩记录簿(30分)
1.问题描述(功能要求):
编制一个C++语言成绩记录簿,每个学生信息包括:学号、姓名、C++语言成绩。具体功能:
(1)创建信息链表并以磁盘文件保存;
(2)读取磁盘文件并显示输出所有学生的成绩;
(3)按学号或姓名查询成绩;
(4)添加成绩记录;
(5)修改指定姓名或学号的学生的成绩并可存盘;
(6)显示输出60分以下、60~79、80~89、90分以上各分数段的学生信息。
2.问题的解决方案:
根据系统功能要求,可以将问题解决分为以下步骤:
(1)分析系统中的各个实体之间的关系及其属性和行为;
(2)根据问题描述,设计系统的类层次;
(3)完成类层次中各个类的描述(包括属性和方法);
(4)完成类中各个成员函数的定义;
(5)完成系统的应用模块;
(6)功能调试;
(7)完成系统总结报告以及系统使用说明书。
3.其它要求:
(1)只能使用C++语言,源程序要有适当的注释,使程序容易阅读
(2)至少采用文本菜单界面
(3)学生可自动增加新功能模块
二、课程设计具体实现
1、定义一个复数类
a、总体设计
Ø 总体架构
复数类 |
||||||
构造函数 |
析构函数 |
类内重载 |
类外重载 |
动态数组 |
输出计算 |
主函数体 |
Ø 总体思路
在对书本上例题的进行仔细查看后,用C++语言在VC6.0编译器下进行编译工作完成题目中要求的各类运算符的重载等等。
b、详细设计
1、构造函数设计
CComplex(double re=0.0,doubleim=0.0)
{
real=re;
imag=im;
}
2、对各种操纵符的重载
ostream& operator<<(ostream&os,CComplex&p) //重载<<
{
if(p.real==0)
{
if(p.imag>0)
os<<p.imag<<"i"<<endl;
if(p.imag==0)
os<<p.real<<endl;
if(p.imag<0)
os<<p.imag<<"i"<<endl;
}
else
{
if(p.imag>0)
os<<p.real<<"+"<<p.imag<<"i"<<endl;
if(p.imag<0)
os<<p.real<<p.imag<<"i"<<endl;
if(p.imag==0)
os<<p.real<<endl;
}
returnos;
}
istream& operator>>(istream&is,CComplex&p) //重载>>
{
is>>p.real>>p.imag;
returnis;
}
CComplex CComplex::operator+(const CComplex&c) //重载+
{
CComplext;
t.real=real+c.real;
t.imag=imag+c.imag;
returnt;
}
CComplex CComplex::operator-(constCComplex& c) //重载-
{
CComplext;
t.real=real-c.real;
t.imag=imag-c.imag;
returnt;
}
CComplex CComplex::operator=(constCComplex& c) //重载=
{
real=c.real;
imag=c.imag;
return*this;
}
CComplex CComplex::operator+(double d)
{
CComplext;
t.real=real+d;
t.imag=imag;
returnt;
}
CComplex CComplex::operator-(double d)
{
CComplext;
t.real=real-d;
t.imag=imag;
returnt;
}
istream & operator>>(istream &in,vector<string>& s) //重载>>
{
stringstr;
in>>str;
s.push_back(str);
returnin;
}
CComplex operator-(double d,const CComplex&c2)
{
returnCComplex(d-c2.real,c2.imag);
}
CComplex CComplex::operator[](int z)
{
cout<<"liujianwei"<<endl;
return(z-1);
}
3、输出所有复数的函数
void Dispaly()
{
if(real==0)
{
if(imag>0)
cout<<imag<<"i"<<endl;
if(imag==0)
cout<<real<<endl;
if(imag<0)
cout<<imag<<"i"<<endl;
}
else
{
if(imag>0)
cout<<real<<"+"<<imag<<"i"<<endl;
if(imag<0)
cout<<real<<imag<<"i"<<endl;
if(imag==0)
cout<<real<<endl;
}
}
4、主函数的实现设计
int main()
{
system("color 0b");
stringc1,c2;
intc1_int,c2_int;
char*end;
doubleshishu;
charin;
cout<<"注意:除了键盘输入复数的个数之外,系统将自动开辟6个空间,用于保存计算结果。"<<endl;
cout<<"请输入复数个数:";
cin>>n;
cout<<endl;
p=newCComplex[n+7];
do
{
system("cls");
//system("color 1b");
zhujiemian();
cin >> in;
switch(in)
{
case'1':
{
system("cls");
for(i=0;i<n;i++)
{
cout<<"输入第"<<i+1<<"个的实部和虚部:"<<endl;
cin>>p[i];
}
for(i=0;i<n;i++)
{
cout<<"("<<i+1<<"):";
cout<<p[i];
}
system("pause");
break;
}
case'2':
{
system("cls");
xianshi();
if(flag_case3==1)
{
cout<<"("<<n+1<<"):";
p[n+1].Dispaly();
}
if(flag_case4==1)
{
cout<<"("<<n+2<<"):";
p[n+2].Dispaly();
}
if(flag_case5==1)
{
cout<<"("<<n+3<<"):";
p[n+3].Dispaly();
}
if(flag_case6==1)
{
cout<<"("<<n+4<<"):";
p[n+4].Dispaly();
cout<<"("<<n+5<<"):";
p[n+5].Dispaly();
}
if(flag_case7==1)
{
cout<<"("<<n+6<<"):";
p[n+6].Dispaly();
}
system("pause");
break;
}
case'3':
{
system("cls");
xianshi();
cout<<"请输入想加和的两位复数的下标"<<endl;
while(cin>>c1>>c2)
{
c1_int=static_cast<int>(strtol(c1.c_str(),&end, 10));
c2_int=static_cast<int>(strtol(c2.c_str(),&end, 10));
if(c1_int>n||c2_int>n)
{
cout<<"输入的下标不在所给范围内部!"<<endl;
cout<<"请输入想加和的两位复数的下标"<<endl;
}
else
{
break;
}
}
p[n+1]=p[c1_int-1]+p[c2_int-1];
cout<<"计算结果为:"<<p[n+1];
flag_case3=1;
system("pause");
break;
}
case'4':
{
system("cls");
xianshi();
cout<<"请输入想相减的两位复数的下标"<<endl;
while(cin>>c1>>c2)
{
c1_int=static_cast<int>(strtol(c1.c_str(),&end, 10));
c2_int=static_cast<int>(strtol(c2.c_str(),&end, 10));
if(c1_int>n||c2_int>n)
{
cout<<"输入的下标不在所给范围内部!"<<endl;
cout<<"请输入想相减的两位复数的下标"<<endl;
}
else
{
break;
}
}
p[n+2]=p[c1_int-1]-p[c2_int-1];
cout<<"计算结果为:"<<p[n+2];
flag_case4=1;
system("pause");
break;
}
case'5':
{
system("cls");
xianshi();
cout<<"请输入想加和的一位实数"<<endl;
cin>>shishu;
cout<<"请输入想加和复数的下标"<<endl;
while(cin>>c1)
{
c1_int=static_cast<int>(strtol(c1.c_str(),&end, 10));
if(c1_int>n)
{
cout<<"输入的下标不在所给范围内部!"<<endl;
cout<<"请输入想加和复数的下标"<<endl;
}
else
{
break;
}
}
p[n+3]=p[c1_int-1]+shishu;
cout<<"复数和实数的计算结果为:"<<p[n+3]<<endl;
cout<<"实数和复数的计算结果为:"<<p[n+3]<<endl;
cout<<"满足交换律!"<<endl;
flag_case5=1;
system("pause");
break;
}
case'6':
{
system("cls");
xianshi();
cout<<"请输入想相减的一位实数"<<endl;
cin>>shishu;
cout<<"请输入想相减复数的下标"<<endl;
while(cin>>c1)
{
c1_int=static_cast<int>(strtol(c1.c_str(),&end, 10));
if(c1_int>n)
{
cout<<"输入的下标不在所给范围内部!"<<endl;
cout<<"请输入想相减复数的下标"<<endl;
}
else
{
break;
}
}
p[n+4]=p[c1_int-1]-shishu;
cout<<"当实数当作被减数时:"<<endl;
cout<<"计算结果为:"<<p[n+4];
cout<<"当复数当作被减数时:"<<endl;
p[n+5]=shishu-p[c1_int-1];
cout<<"计算结果为:"<<p[n+5];
if((p[n+4].Real()==p[n+5].Real())&&(p[n+4].Imag()==p[n+5].Imag()))
{
cout<<"满足交换律!"<<endl;
}
else
{
cout<<"不满足交换律"<<endl;
}
flag_case6=1;
system("pause");
break;
}
case'7':
{
system("cls");
xianshi();
if(flag_case3==1)
{
cout<<"("<<n+1<<"):";
p[n+1].Dispaly();
}
if(flag_case4==1)
{
cout<<"("<<n+2<<"):";
p[n+2].Dispaly();
}
if(flag_case5==1)
{
cout<<"("<<n+3<<"):";
p[n+3].Dispaly();
}
if(flag_case6==1)
{
cout<<"("<<n+4<<"):";
p[n+4].Dispaly();
cout<<"("<<n+5<<"):";
p[n+5].Dispaly();
}
if(flag_case7==1)
{
cout<<"("<<n+6<<"):";
p[n+6].Dispaly();
}
cout<<"请输入需要赋值的下标"<<endl;
while(cin>>c1)
{
c1_int=static_cast<int>(strtol(c1.c_str(),&end, 10));
if(c1_int>n+6)
{
cout<<"输入的下标不在所给范围内部!"<<endl;
cout<<"请输入需要赋值的下标"<<endl;
}
else
{
break;
}
}
p[n+6]=p[c1_int-1];
cout<<"则第"<<n+6<<"个复数值为:"<<p[n+6]<<endl;
flag=1;
flag_case7=1;
system("pause");
break;
}
case'8':
{
system("cls");
xianshi();
if(flag_case3==1)
{
cout<<"("<<n+1<<"):";
p[n+1].Dispaly();
}
if(flag_case4==1)
{
cout<<"("<<n+2<<"):";
p[n+2].Dispaly();
}
if(flag_case5==1)
{
cout<<"("<<n+3<<"):";
p[n+3].Dispaly();
}
if(flag_case6==1)
{
cout<<"("<<n+4<<"):";
p[n+4].Dispaly();
cout<<"("<<n+5<<"):";
p[n+5].Dispaly();
}
if(flag_case7==1)
{
cout<<"("<<n+6<<"):";
p[n+6].Dispaly();
}
cout<<"请输入想获取复数的下标"<<endl;
while(cin>>c1)
{
c1_int=static_cast<int>(strtol(c1.c_str(),&end, 10));
if(c1_int>n+6)
{
cout<<"输入的下标不在所给范围内部!"<<endl;
cout<<"请输入需要赋值的下标"<<endl;
}
else
{
break;
}
}
cout<<"第"<<c1_int<<"个复数值为:"<<p[c1_int-1]<<endl;
system("pause");
break;
}
case'9':
{
cout << "即将退出界面" << endl;
break;
}
default:
{
cin.clear();
cin.sync();
cout << "输入错误,请重新输入命令:" << endl;
system("pause");
break;
}
}
}while(in!='9');
return0;
}
2.定义一个CPerson类及其派生类
a、总体设计
CPerson类 |
CBirthday类 |
||||
学生类 |
教师类 |
||||
录入信息 |
输出信息 |
录入成绩 |
录入信息 |
修改成绩 |
显示输出 |
主函数体 |
Ø 总体设计方案
定义Cperson类作为基类,然后定义Cperson类的派生类Cteacher.类和Cstudent类,将功能已类的成员函数实现,在VC6.0中编写并测试。
b、详细设计
1、CBirthday类设计
class CBirthday
{
public:
CBirthday()
{
year=2000;
strcpy(month,"01");
strcpy(day,"01");
}
CBirthday(int y,char *m,char*d)
{
year=y;
strcpy(month,m);
strcpy(month,d);
}
void Input()
{
cout<<"年:"; cin>>year;
cout<<"月:"; cin>>month;
cout<<"日:"; cin>>day;
}
void Print()
{
cout<<year<<"-"<<month<<"-"<<day<<endl;
}
private:
int year;
char month[5],day[5];
};
2、CPerson 类设计
class CPerson:publicCBirthday
{
public:
CPerson(char*,char*,Tsex,CBirthday&);
CPerson();
~CPerson();
void input();
void display();
private:
char ID[10];
char Name[20];
Tsex Sex;
CBirthday birthday;
};
3、学生类设计
class CStudent:public CPerson
{
public:
voidinput()
{
cout<<"输入学生信息:"<<endl;
CPerson::input ();
cout<<"学号:";cin>>number;
cout<<"班级名:";cin>>depart;
inputCourse();
}
CStudent();
CStudent(char*id,char *name,Tsex sex,CBirthday &d,char *num,char *dep);
~CStudent();
voidinputCourse();
voiddisplayS();
coursecj[8];
private:
charnumber[10];
chardepart[30];
};
4、教师类设计
class CTeacher:public CPerson
{
public:
voidinput()
{
cout<<"输入教师信息:"<<endl;
CPerson::input ();
cout<<"工号:"; cin>>number;
cout<<"职称:"; cin>>prof;
cout<<"部门:"; cin>>depart;
SetScore();
}
CTeacher();
CTeacher(char*id,char *name,Tsex sex,CBirthday &d,string num,string dep,string pro);
~CTeacher();
voidSetScore();
voidDispScore();
voidSortScore();
voidSetedStuScore(CStudent &);
voiddisplayT();
private:
stringnumber;
stringdepart;
stringprof;
TcourseTcj[2];
};
5、学生输入信息设计
CStudent::CStudent (char *id,char *name,Tsexsex,CBirthday &d,char *num,char *dep):CPerson(id,name,sex,d)
{
strcpy(number,num);
strcpy(depart,dep);
for(inti=0;i<8;i++)
{
strcpy(cj[i].coursename ,"");
cj[i].grade =-1;
}
}
6、学生输出信息设计
void CStudent::displayS ()
{
display();
cout<<"学号:"<<number<<endl;
cout<<"班级名:"<<depart<<endl;
cout<<"该生成绩:"<<endl;
for(inti=0;i<8;i++)
if(strcmp(cj[i].coursename,"")!=0)
cout<<cj[i].coursename<<'\t'<<cj[i].grade<<'\n';
else break;
cout<<"------------------"<<endl;
}
7、输入教师信息设计
void CTeacher::SetScore ()
{
cout<<"请输入所教课程数目:"<<endl;
cin>>q;
for(inti=0;i<q;i++)
{
cout<<"课程名"<<endl;
cin>>Tcj[i].coursename;
cout<<"各个学生的成绩"<<endl;
for(int j=0;j<8;j++)
cin>>Tcj[i].grade[j];
}
}
8、输出教师信息设计模板
void CTeacher::DispScore ()
{
for(inti=0;i<q;i++)
{
cout<<"课程名:"<<Tcj[i].coursename <<endl;
for(int j=0;j<8;j++)
cout<<"("<<j+1<<")"<<" "<<Tcj[i].grade [j]<<endl;
}
}
9.学生成绩修改模板
void CTeacher::SetedStuScore (CStudent &s)
{
intscore;
for(inti=0;i<2;i++)
if(strcmp(s.cj[i].coursename,"")!=0)
{
cout<<s.cj[i].coursename<<'\t'<<s.cj[i].grade<<endl;
cout<<"请输入修改的成绩"<<endl;
cin>>score;
cout<<s.cj[i].coursename<<'\t'<<score<<endl;
cout<<"---------------------"<<endl;
}
else break;
}
3、几何图形类
a、总体设计
Ø 总体设计图
几何图形类(虚基类) |
||||
长方形类 |
圆类 |
三角形类
|
||
长方体类 |
正方体类 |
圆柱类 |
圆锥类 |
正三棱锥类 |
Ø 总体设计方案
定义虚基类,派生出长方形类、圆类、三角形类、再分别从中派生出长方体类、正方体类、圆柱类、圆锥类、正三棱锥。在每个类中定义其功能函数,用于计算面积、体积。重载比较的函数,方便比较相同几何图形或不同几何图形的面积和体积。
b、详细设计
1、虚基类的定义
class Geometric_shape
{
public:
virtualdouble perimeter()=0;//周长
virtualdouble area()=0;//面积
virtualdouble volume()=0;//体积
virtualvoid Show(){};
};
2、圆类的定义
class Circle:public Geometric_shape//圆
{
doubleradius;
public:
Circle(){radius=0;}//构造函数
Circle(doublevv){radius=vv;}
doubleperimeter(){return 2.0*PI*radius;}//周长
doublearea(){return PI*radius*radius;}//面积
doublevolume(){return 0;}
doubleceshi(){return radius;}
voidShow(){cout<<"半径="<<radius<<endl;}
};
3、矩形类的定义
class Rectangle:public Geometric_shape//长方形
{
doublewidth,length;//宽、长
public:
Rectangle(){width=0;length=0;}//构造 长、宽
Rectangle(doublewid,double len)
{
width=wid;
length=len;
}
Rectangle(Rectangle&rr)
{
width=rr.width;
length=rr.length;
}
doubleperimeter(){return 2.0*(width+length);}//周长
doublearea(){return width*length;}//面积
doublevolume(){return 0;}//体积
doubleceshi1(){return width;}
double ceshi2(){returnlength;}
voidShow(){cout<<"宽="<<width<<'\n'<<"长="<<length<<endl;}
};
4、三角形类定义
class Triangle:public Geometric_shape//三角形
{
doublea,b,c;
public:
Triangle(){a=0;b=0;c=0;}
Triangle(doublev1){a=v1;}
Triangle(doublev1,double v2,double v3){a=v1;b=v2;c=v3;}
doubleperimeter(){return a+b+c;}//周长
doublearea()//面积
{
double s=(a+b+c)/2.0;
return sqrt(s*(s-a)*(s-b)*(s-c));
}
doublevolume(){return 0;}//体积
voidShow(){cout<<"边长a="<<a<<'\n'<<"边长b="<<b<<'\n'<<"边长c="<<c<<endl;}
double ceshi1(){returna;}
doubleceshi2(){return b;}
doubleceshi3(){return c;}
};
class Cube:public Rectangle//正方体
{
doubleheight;
public:
Cube(){}
Cube(doublewid,double len,double heg):Rectangle(wid,len){height=heg;}
doublearea(){return Rectangle::area()*6;}
doublevolume(){return sqrt(Rectangle::area())*Rectangle::area();}
doubleceshi(){return height;}
voidShow(){Rectangle::Show();cout<<"高="<<height<<endl;}
};
5、正三棱锥类定义
class Three_pyramid:public Triangle//正三棱锥
{
doubledd;//侧棱长
public:
Three_pyramid(){dd=0;}
Three_pyramid(double a,double b,doublec,double d):Triangle(a,b,c){dd=d;}
doublearea(){returnTriangle::area()+3*sqrt(Triangle::area()*4/sqrt(3))/2*sqrt(dd*dd-Triangle::area()/sqrt(3));}
doublevolume(){return Triangle::area()/3*sqrt(dd*dd-Triangle::area()*4/sqrt(3)/3);}
voidShow(){Triangle::Show();cout<<"侧棱="<<dd<<endl;}
doubleceshi(){return dd;}
};
6、长方体类定义
class Box:public Rectangle//长方体
{
doubleheight;
public:
Box(){height=0;}
Box(doublewid,double len,double heg):Rectangle(wid,len){height=heg;}
doublearea(){return Rectangle::area()*2+height*(Rectangle::perimeter());}
doubleceshi(){return height;}
doublevolume(){return Rectangle::area()*height;}//体积
};
7、圆柱体类定义
class Cylinder:public Circle//圆柱体
{
doubleheight;
public:
Cylinder(){height=0;}
Cylinder(doublevv,double heg):Circle(vv){height=heg;}
doublevolume(){return Circle::area()*height;}
doubleceshi(){return height;}
voidShow(){Circle::Show();cout<<"高="<<height<<endl;}
};
8、圆锥类定义
class Cone:public Circle//圆锥体
{
doublegenera;//母线
public:
Cone(){genera=0;}
Cone(doublevv,double gen):Circle(vv){genera=gen;}
doublearea(){return Circle::area()+sqrt(Circle::area()/PI)*genera;}
doublevolume(){return Circle::area()/3*sqrt(genera*genera-Circle::area()/PI);}
voidShow(){Circle::Show();cout<<"母线="<<genera<<endl;}
doubleceshi(){return genera;}
};
9、比较重载
double max(double x,double y)
{
returnx>y?x:y;
}
4、成绩记录薄
a、总体设计
Ø 总体设计图
学生类对象 |
||||||||
录入 |
输出 |
查询 |
修改 |
统计 |
文件录入 |
文件读取 |
||
文件 |
键盘 |
|
学号 |
姓名 |
|
按分数段 |
|
|
Ø 总体设计方案
设计学生类,用以保存身份、成绩信息,支持从键盘或者文件录入,在输入过程中应加入异常检测,防止错误数据的录入导致系统崩溃或出错。支持查询,修改,删除功能,可以进行分段统计,统计各个分数段的学生,最后能够存档在文件中。
b、详细设计
1、学生类的定义
class Cstudent
{
public:
Cstudent()//构造函数,将成绩赋值为零
{
string grade;
grade = '0';
}
voiddisplay()//控制输出,进行左对齐
{
cout<<"姓名:"<<std::left<<setw(20)<<na;
cout<<"学号:"<<std::left<<setw(20)<<id;
cout<<"成绩:"<<std::left<<setw(20)<<gr;
}
voidsetdate(string name, string idnumber, string grade)//对私有变量进行复制
{
na = name;
id = idnumber;
gr = grade;
}
stringstudent_name()
{
return na;
}
stringstudent_idnumber()
{
return id;
}
stringstudent_grade()
{
return gr;
}
stringfind_idnumber()//按照学号查找时学号
{
return id;
}
stringfind_NAME()//按照姓名查找时返回姓名
{
return na;
}
intcount()
{
int score;
char* end;
string grade;
score =static_cast<int>(strtol(gr.c_str(), &end, 10));//使用strtol(string to long) 利用string的c_str()转化为C风格字符串
return score;
}
voidrevise()
{
char* end;
int grade_bian;
cout << "请根据以下提示进行修改。" << endl;
cout << "姓名:";
cin >> na;
cout << "学号:";
cin >> id;
cout << "成绩(0~100):";
while(cin >> gr)
{
grade_bian=static_cast<int>(strtol(gr.c_str(), &end, 10));
if(grade_bian>=0&&grade_bian<=100)
{
break;
}
else
{
cout<<"输入有误!"<<endl;
cout << "请输入成绩(0~100):";
}
}
}
private:
stringna;
stringid;
stringgr;
};
2、异常检测示例
cin >> in;
if (!cin)
{
cin.clear();//清除cin的错误状态
cin.sync();//清空cin缓冲区里面未读取的信息...
cout <<"输入错误,重新返回主界面。" << endl;
system("pause");
//cin>>in;
continue;
}
3、读取文件示例
ifstream ofile;
string name;
string idnumber;
string grade;
int i = n;
ofile.open("H:\\student_in.txt", ios::in);
if (ofile.is_open())
{
for ( i = n; i < N; i++)
{//依次提取学生三个基本私有变量信息
ofile >> name;
ofile >> idnumber;
ofile >> grade;
p[i].setdate(name, idnumber, grade);
if (i >= N)
{
cout << "文件数据已经全部导入。" << endl;
cout << "当前学生数量:" << i << endl;
cout << "当前存储容量已达到最大值!" << endl;
break;
}
}
if(flag_case1==1)
{
for (i = 0; i < N; i++)
{
cout << "student" <<"[" << i + 1 << "]" << ":\t";
p[i].display();
cout << endl;
}
}
else
{
for (i = n; i < N; i++)
{
cout << "student" <<"[" << i + 1 << "]" << ":\t";
p[i].display();
cout << endl;
}
}
/*for (i = 0; i < N; i++)
{
p[i].display();
cout << endl;
}*/
cout << "已成功导入的学生数量:" << i << endl;
flag_case7 = 1;
}
else
{
cout << "打开文件时出错!";
}
ofile.close();
三、结束语
从课设开始到课设结束,总共经历了两周的时间。在这段时间,将自己在书本上学到的知识在实践中得以应用,同时也能够使自己的代码能力进一步地提高。能够很明显地感觉到,在编写题目的过程中,出现了许许多多从未遇到过的错误和问题。但通过请教老师、同学还有百度,最终得以解决。代码的完整度已经达到,但是程序的稳定性有时不尽如人意。总会出现接二连三的BUG。同时,在解决BUG的同时,能够获取更多的知识和调试断点的能力。无论是程序设计的思想还是到代码的具体实现,都需要去一步步构想。稳扎稳打,最后你的成果自然不会辜负你原来的期望。
特别感谢C++代课王老师和课设王老师的帮助,在他们的帮助下自己的程序才能够日趋完善。总之,自己在这次两周课程设计里学到了很多。自己将会更加努力,写出美丽的代码!