2023.4.20编程一小时打卡

一、问题描述:

定义shape类,无数据成员,包含两个纯虚函数成员void setvalues() 和float area() ,由shape类进行派生如下:

矩形类,包含两个数据成员变量用于描述底和高,均为float类型,重新定义上述两个纯虚函数成员,完成数据成员值的设定和面积的计算;

三角形类,包含两个数据成员变量用于描述底和高,均为float类型,重新定义上述两个纯虚函数成员,完成数据成员值的设定和面积的计算;

正方形类,包含一个数据成员变量用于描述边长,float类型,重新定义上述两个纯虚函数成员,完成数据成员值的设定和面积的计算;

圆形类,包含一个数据成员变量用于描述半径,float类型,重新定义上述两个纯虚函数成员,完成数据成员值的设定和面积的计算;

在主函数中定义相应的指针对象和普通对象,利用虚函数实现多态,依次分别输入矩形的底和高,三角形的底和高,正方形的边长,圆形的半径,若其中任何一个值小于等于0,则输出Set Value Error!,然后退出程序,对于之前已正确输入的数值计算相应形状的面积。

【输入形式】

矩形的底和高

三角形的底和高

正方形的边长

圆形的半径

【输出形式】

矩形面积

三角形面积

正方形面积

圆形面积

二、解题思路:

 首先,定义一个抽象类,其含有俩个纯虚函数,再定义它的子类,根据每个子类的特性去编写它们自己的函数,最后,定义父类的指针去调用子类实现所需的功能。

三、代码实现:

#include<iostream>
#include<string>
using namespace std;
class shape
{
public:
	virtual void setvalues(float a=0,float b=0)=0;
	virtual float area()=0;
};
class rectangle:public shape
{
private:
	float di,high;
public:
	void setvalues(float a,float b)
	{
		di=a;
		high=b;
	}
	float area()
	{
		return di*high;
	}
};
class rectriangle:public shape
{
private:
	float di,high;
public:
	void setvalues(float a,float b)
	{
		di=a;
		high=b;
	}
	float area()
	{
		return (di*high)/2;
	}
};
class square:public shape
{
private:
	float bian;
public:
	void setvalues(float a,float b)
	{
		bian=a;
	}
	float area()
	{
		return bian*bian;
	}
};
class round:public shape
{
private:
	float r;
public:
	void setvalues(float a,float b=0)
	{
	    r=a;
	}
	float area()
	{
		return 3.1415*r;
	}
};
int main()
{	
	float di,high;
	float d,h;
	float a;
	float r;
	cin>>di>>high>>d>>h>>a>>r;
	shape *p;
	rectangle j;
	rectriangle s;
	square z;
	round y;
	p=&j;
	if(di<0||high<0)
	{
		cout<<"Set Value Error!"<<endl;
		exit(0);
	}
	p->setvalues(di,high);
	cout<<p->area()<<endl;
	p=&s;
	if(d<0||h<0)
	{
		cout<<"Set Value Error!"<<endl;
		exit(0);
	}
	p->setvalues(d,h);
	cout<<p->area()<<endl;
	p=&z;
	if(a<0)
	{
		cout<<"Set Value Error!"<<endl;
		exit(0);
	}
	p->setvalues(a);
	cout<<p->area()<<endl;
	p=&y;
	if(r<0)
	{
		cout<<"Set Value Error!"<<endl;
		exit(0);
	}
	p->setvalues(r);
	cout<<p->area()<<endl;
	return 0;
}

一、问题描述:

定义描述学生的student类,包含受保护两个数据成员,分辨是描述姓名的,string类型和描述学号的,int类型,构造函数有两个形参,用于设定这两个数据成员的值,此外包含6个成员函数,用于设定姓名和学号的函数,void setnameid(), 用于显示姓名和学号的函数void displaynameid(),以及四个纯虚函数void setmajor() ,string getmajor() , void setadvisor()  和 string getadvisor();

由学生类派生本科生类understud,新增受保护数据成员,描述专业,string类型,构造函数具有三个形参,重新定义函数void setmajor() 和string getmajor(),用于设置专业和获取专业;

由本科生类派生研究生类poststud,新增私有数据成员,描述导师姓名,string类型,构造函数具有四个形参,且具有缺省值,学生姓名缺省值为“***”,学号缺省值为-1,专业缺省值为“###”,导师姓名缺省值为“&&&”,重新定义函数void setadvisor()  和 string getadvisor(),用于设置导师属性和获取导师属性值;

在主函数中定义相应的指针对象和普通对象,请问可以定义哪些(哪个)类的普通对象,为什么(在实验报告中回答),定义开关变量,int型,通过输入进行赋值,若该值为0,则输出研究生对象的默认属性值,若非零,则依次输入姓名、学号、专业和导师信息,并依次打印出来。

 

【输入形式】

0

1

姓名、学号、专业和导师信息

【输出形式】

姓名和学号

专业

导师姓名

二、解题思路:

首先,定义一个抽象类学生类作为父类,再定义一个子类大学生类,然后定义一个子类的子类研究生类,再父类中定义子类和孙子类所需的纯虚函数,在子类和孙子类中实现其所用到的行为函数,最后,利用父类的指针去调用实现子类以及孙子类所需要实现的行为,去验证代码的运行。

三、代码实现:

 

复制代码
 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 class student
 5 {
 6 protected:
 7     string name;
 8     int id;
 9 public:
10     student(string n,int i):name(n),id(i){}
11     void setnameid(string n,int i);
12     void displaynameid();
13     virtual void setmajor(string m)=0;
14     virtual string getmajor()=0;
15     virtual void setadvisor(string a)=0;
16     virtual string getadvisor()=0;
17 };
18 class understud:public student
19 {
20 protected:
21     string major;
22 public:
23     understud(string n,int i,string m):student(n,i)
24     {
25         major=m;
26     }
27     void setmajor(string m);
28     string getmajor();
29 };
30 class poststud:public understud
31 {
32 private:
33     string advisor;
34 public:
35     poststud(string n="***",int i=-1,string m="###",string a="&&&"):understud(n,i,m)
36     {
37         advisor=a;
38     }
39     void setadvisor(string a);
40     string getadvisor();
41 };
42 void student::setnameid(string n,int i)
43 {
44     name=n;
45     id=i;
46 }
47 void student::displaynameid()
48 {
49     cout<<name<<" "<<id<<endl;
50 }
51 void understud::setmajor(string m)
52 {
53     major=m;
54 }
55 string understud::getmajor()
56 {
57     return major;
58 }
59 void poststud::setadvisor(string a)
60 {
61     advisor=a;
62 }
63 string poststud::getadvisor()
64 {
65     return advisor;
66 }
67 int main()
68 {    
69     student *p;
70     poststud po;
71     int x;
72     cin>>x;
73     if(x==0)
74     {
75         p=&po;
76         p->displaynameid();
77         cout<<p->getmajor()<<endl;
78         cout<<p->getadvisor()<<endl;
79     }
80     else if(x==1)
81     {
82         string n,m,a;
83         int i;
84         cin>>n>>i>>m>>a;
85         p=&po;
86         p->setnameid(n,i);
87         p->setmajor(m);
88         p->setadvisor(a);
89         p->displaynameid();
90         cout<<p->getmajor()<<endl;
91         cout<<p->getadvisor()<<endl;
92     }
93     return 0;
94 }
复制代码

 

posted @   信2211-8李欣垚  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示