1. | Document类(公有继承) 【问题描述】 定义一个Document类,有数据成员name, 从Document类派生出Book类,增加数据成员pageCount。 主函数已经提供如下,请勿修改: int main() { Document a("Document1"); Book b("Book1", 100); a.PrintNameOf(); b.PrintNameOf(); } 【样例输入】 无 Document1 Name of book: Book1 【样例说明】输出第一行为Document类对象a的名称;第二行为Book类对象b的名称。输出语句均在PrintNameOf()函数中完成。 |
---|
#include<bits/stdc++.h>
using namespace std; class Document
{
public:string name;Document(string s){name=s;}void PrintNameOf(){cout << name<<endl;}
}; class Book:public Document
{
public:int page;Book(string na,int n):Document(na){page=n;}void PrintNameOf(){cout << "Name of book: "<<name<<endl;}
};int main()
{Document a("Document1");Book b("Book1", 100);a.PrintNameOf();b.PrintNameOf();
}
2. | 学生类(静态数据成员和静态成员函数,即数据的共享) 【问题描述】 定义一个类Student,要求使用静态数据成员或静态成员函数计算全班学生的《计算机导论》课程的总成绩和平均成绩。请同学们自行设计该类。 【提示】 静态数据成员:static int total; 表示所有同学成绩总分 静态成员函数:static void Average(int sum){} 计算sum个学生的平均成绩,主函数在调用的时候采用Student::Average(n)的形式。 【输入形式】 学生姓名 课程成绩 【输出形式】 总成绩和平均成绩 【样例输入】 Zhang 82 Li 79 Wang 93 Liu 66 Xia 90 【样例输出】 410 82 |
---|
#include<bits/stdc++.h>
using namespace std;class Student
{
public:static int total;//static变量需要初始化static void Average(int sum);void Add(int score){total+=score;}
};
int Student::total=0;
void Student::Average(int sum)
{int t=(double)total/sum;cout << total<<endl<<t<<endl;
}int main()
{int num=5;Student s;int sco;string name;for(int i=0;i<num;i++){cin>>name;cin>>sco;s.Add(sco);}s.Average(num);return 0;
}
3. | 复数类Imaginary的设计 【问题描述】 根据以下主函数的功能来设计复数类Imaginary,使其能正确运行。类Imaginary中应该具有描述复数的实部和虚部的私有数据成员a和b,还有相应的构造函数和按照“a±bi”格式显示复数的成员函数print()。设计类Imaginary的2个友元函数分别进行复数的加、减运算,并在这些函数调用类Imaginary的成员函数print()显示结果。 int main() { float x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; //输入4个数据,分别表示进行运算的两个复数的实部和虚部 Imaginary imag1(x1,y1),imag2(x2,y2); //用x1、y1创建Imaginary类对象imag1 Add(imag1,imag2); //调用友元函数求两个复数之和,按a±bi的格式显示运算结果(a和b均为实数) Sub(imag1,imag2); //求两个复数之差并显示运算结果 return 0; } 【输入形式】 输入4个数据,分别表示进行运算的两个复数的实部和虚部 【输出形式】 2行,分别显示两个复数进行加、减运算的结果 【样例输入】 1 3 2 5 【样例输出】 3+8i -1-2i |
---|
#include<bits/stdc++.h>
using namespace std;class Imaginary
{
public:float a,b;Imaginary(float A,float B){a=A;b=B;}void print(){cout<<a<<b<<"i"<<endl;}void Add(Imaginary e1,Imaginary e2);void Sub(Imaginary e1,Imaginary e2);
};void Add(Imaginary e1,Imaginary e2)
{float c;c=e1.b+e2.b;if(c>0){cout<<e1.a+e2.a<<"+"<<c<<"i"<<endl;}else if(c<0){cout<<e1.a+e2.a<<c<<endl;} else{cout<<e1.a+e2.a<<endl;}
}void Sub(Imaginary e1,Imaginary e2)
{float c;c=e1.b-e2.b;if(c>0){cout<<e1.a-e2.a<<"+"<<c<<"i"<<endl;}else if(c<0){cout<<e1.a-e2.a<<c<<"i"<<endl;}else{cout<<e1.a-e2.a<<endl;}
}int main()
{float x1,y1,x2,y2;//输入4个数据,分别表示进行运算的两个复数的实部和虚部cin>>x1>>y1>>x2>>y2; //用x1、y1创建Imaginary类对象imag1Imaginary imag1(x1,y1),imag2(x2,y2); //调用友元函数求两个复数之和,按a±bi的格式显示运算结果(a和b均为实数)Add(imag1,imag2); //求两个复数之差并显示运算结果Sub(imag1,imag2); return 0;
}
4. | 图形类(继承与派生、纯虚函数、动态联编的多态性) 【问题描述】 (1)首先设计一个抽象类Shape,包含三个公有的纯虚函数,分别实现显示数据成员的值、计算面积、计算体积的功能,函数名为ShowData()、GoArea()、GoVolume() (2)设计两个Shape的公有派生类平面图形类、立体图形类,包含公有的数据成员面积area和体积volume,并实现基类Shape的三个纯虚函数的函数体。 (3)分别设计圆形类、椭圆类、矩形类、等腰三角形类,作为平面图形类的公有派生类。并在各个类里依次添加数据成员圆形半径、椭圆的横轴和纵轴长度、矩形的长和宽、等腰三角形的底边长和高。并实现数据的显示输出函数、实现计算面积的函数。 (4)分别设计球类、圆柱体类、长方体类,作为立体图形类的公有派生类。并在各个类里依次添加数据成员球的半径,圆柱体的底面的半径和高,长方体的长宽高。并实现数据的显示输出函数、实现计算体积的函数。 (5)计算面积的函数和计算体积的函数均需要先cin相应的数据,再才能计算,计算结果为double型,且保留2位小数,将计算结果给相应的数据成员进行赋值。函数无返回值。 (6)测试数据时,定义各种类型的对象,然后定义Shape类型的指针p,用户依次输入1、2、3......6、7,分别代表圆形、椭圆、矩形、三角形、球、圆柱体、长方体。通过使用switch语句,将对象地址赋值给p指针。然后调用该对象的计算面积或计算体积的函数,输出计算结果。为方便测试,switch仅执行一次,程序则结束。 举例: Shape *p; Circle c; p=&c; p->GoArea(); p->ShowData(); 【样例输入】 5 2 【样例输出】 33.51 【样例说明】5代表球,2代表球的半径,根据体积公式4/3*pi*r*r*r得到33.51 |
---|
#include<bits/stdc++.h>
using namespace std;
#define PI 3.14159265class Shape
{
public:virtual void ShowData()=0;virtual void GoArea()=0;virtual void GoVolume()=0;
}; class Plane_Figure:virtual public Shape
{
public:double area,volume;void ShowData(){printf("%.2f\n",area);}void GoArea(){area=0;}void GoVolume(){volume=0;}
};class Solid_Figure:virtual public Shape
{
public:double area,volume;void ShowData(){printf("%.2f\n",volume);}void GoArea(){area=0;}void GoVolume(){volume=0;}
};class Circle:public Plane_Figure//圆形类
{
private:int r;
public:void ShowData(){printf("%.2f\n",area);}void GoArea(){cin>>r;area=PI*r*r;}
};class Ellipse:public Plane_Figure//椭圆类
{
private:int a,b;
public:void ShowData(){printf("%.2f\n",area);}void GoArea(){cin>>a>>b;area=a*b*PI;}
};class Rectangle:public Plane_Figure//矩形类
{
private:int l,w;
public:void ShowData(){printf("%.2f\n",area);}void GoArea(){cin>>l>>w;area=l*w;}
};class Tag:public Plane_Figure//等腰三角形
{
private:int a,b;
public:void ShowData(){printf("%.2f\n",area);}void GoArea(){cin>>a>>b;area=(a*b)/2;}
};class Ball:public Solid_Figure//球类
{
private:int r;
public:void ShowData(){printf("%.2f\n",volume);}void GoVolume(){cin>>r;volume=(4*PI*r*r*r)/3;}
};class Column:public Solid_Figure//圆柱体类
{
private:int a,b;
public:void ShowData(){printf("%.2f\n",volume);}void GoVolume(){cin>>a>>b;volume=PI*a*a+2*PI*a*b;}
};class Cuboid:public Solid_Figure//长方体类
{
private:int c,k,g;
public:void ShowData(){printf("%.2f\n",volume);}void GoVolume(){cin>>c>>k>>g;volume=c*k*g;}
};int main()
{Shape *sh;Circle ci;Ellipse el;Rectangle re;Tag ta;Ball ba;Column co;Cuboid cu;int n;cin>>n;switch(n){case 1:sh=&ci;sh->GoArea();sh->ShowData();break;case 2:sh=⪙sh->GoArea();sh->ShowData();break;case 3:sh=&re;sh->GoArea();sh->ShowData();break;case 4:sh=&ta;sh->GoArea();sh->ShowData();break;case 5:sh=&ba;sh->GoVolume();sh->ShowData();break;case 6:sh=&co;sh->GoVolume();sh->ShowData();break;case 7:sh=&cu;sh->GoVolume();sh->ShowData();break;default:break;}return 0;
}
5. | Person类、学生类、教师类和研究生类(多重继承) 【问题描述】研究生Graduate既有学生Student的属性,又有教师Teacher的属性,通过多重继承说明一个研究生类Graduate。 从前面实验题目完成的Person类派生出Teacher类,新增专业(dept)和月薪(salary)属性,并定义Teacher类的构造函数初始化新增的数据成员,showMe成员函数显示新增的数据成员的值。 再从Person类派生出Student类,新增班级(class)和学号(ID)属性,定义Student类的构造函数初始化新增的数据成员,showMe成员函数显示新增的数据成员的值。 通过“多重继承”说明一个研究生类Graduate,定义Graduate类的构造函数,定义Graduate类的showMe成员函数显示各个数据成员的值。 主函数设计如下,请勿修改: int main(){ Graduate stu1("Lisi",22,'m',"College of Informatics",2000,"2015013","S101"); stu1.showMe(); return 0; } 提示:(1)Graduate的父类是Student和Teacher,而Student和Teacher有共同的父类Person,如果是普通继承则姓名、性别和年龄就发生了重复。因此,这一题需要用到虚基类的概念。 (2)注意showMe()成员函数在每个类里都有。 【样例输出】 class: S101 |
---|
#include<bits/stdc++.h>
using namespace std;class Person
{
protected:char name[10];int age;char sex;
public:Person(){}Person(char *s,int n,char c){strcpy(name,s);age=n;sex=c;}void ShowMe(){cout <<"name: "<<name<<endl;cout << "sex: "<<sex<<endl;cout << "age: "<<age<<endl;}
};class Teacher:virtual public Person
{
protected:char dept[30];double salary;
public:Teacher(char *a,double b){strcpy(dept,a);salary=b;}void ShowMe(){cout << "dept: "<<dept<<endl;cout << "salary: "<<salary<<endl;}
};class Student:virtual public Person
{
protected:char id[10],clas[10];
public:Student(char *a,char *b){strcpy(id,a);strcpy(clas,b);}void ShowMe(){cout << "class: "<<clas<<endl;cout<<"id: "<<id<<endl;}
};class Graduate:public Teacher,public Student
{
public:Graduate(char *na,int ag,char se,char *de,int salary,char *i,char *c):Person(na,ag,se),Teacher(de,salary),Student(i,c){}void showMe(){Student::ShowMe();Person::ShowMe();Teacher::ShowMe();}
};int main()
{Graduate stu1("Lisi",22,'m',"College of Informatics",2000,"2015013","S101");stu1.showMe();return 0;
}