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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~