C++课程设计报告总结

时间:2020-12-09 17:00:35

 

 

 

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++代课王老师和课设王老师的帮助,在他们的帮助下自己的程序才能够日趋完善。总之,自己在这次两周课程设计里学到了很多。自己将会更加努力,写出美丽的代码!