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类对象imag1
Imaginary 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.14159265
class 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;
}