某农业大学第六次实验(静态、友元、继承与派生)

news/2024/10/30 9:35:58/
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=&el;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
id: 2015013
name: Lisi
sex: m
age: 22
dept: College of Informatics
salary: 2000

#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;
}

http://www.ppmy.cn/news/460274.html

相关文章

HTML 表格学习指南 - 打造精美且高效的数据展示方式

引言 HTML 表格是一种常见且重要的网页元素&#xff0c;它能够以结构化的方式展示数据、信息和内容。在本详细指南中&#xff0c;我们将深入学习 HTML 表格的创建方法&#xff0c;包括表格的基本结构、样式设计、合并单元格、排序功能及无障碍访问性等&#xff0c;帮助你打造精…

【libdatachannel】Transport的设计实现

作为ice传输实现的基类 具有实际的作用。 D:\XTRANS\thunderbolt\ayame\ZHB_LIB_DATACHANNEL\src\impl\transport.cpp 最重要的是封装了对impl的调用 Transport 比较牛,抽象了传输的基础能力 发送(调用ice接口发送) send(message_ptr message);接收(通过ice收到后使用回调方…

java自行车DH32,中国国际自行车嘉年华之Enduro、DH装备篇

短短三天中国国际自行车嘉年华已经完美落下帷幕&#xff0c;展位之多令人眼花缭乱&#xff0c;相信许多车友依然意犹未尽&#xff0c;作为一个资深软尾玩家&#xff0c;除了欣赏美丽的单车宝贝、精彩刺激的比赛之外&#xff0c;最能吸引小编眼球当然要数AM和DH相关零配件和人身…

月入过万到底还配不配骑自行车?

自行车可能是2022年通胀率最高的东西了。 夜幕降临&#xff0c;北京繁忙的交通路口&#xff0c;身着紧身骑行服&#xff0c;踏着锁鞋的公路车大佬&#xff0c;排在车流的最前列&#xff0c;绿灯亮起&#xff0c;第一个冲了出去&#xff0c;将身后的电动车瞬间甩开了很远。 这是…

2020第三届进博会球第一自行车品牌辐轮王耐克迪卡侬火爆首秀

中国在全世界首创进口博览会&#xff0c;主动向全世界开放市场。每一届展会都吸引了包括众多世界500强在内的大牌企业蜂拥而至。进博会可以说是为全球优秀企业充分展示自我提供了一个高端的平台&#xff0c;其举办之时就是这些优秀品牌的一场年度盛会。 于2020年11月开幕的中国…

618运动装备推荐、运动必备好物清单

618电商节又要来啦&#xff0c;是不是又准备犒劳一下拼命打工的自己&#xff1f;相信很多朋友们就等着618大促一键清空了早早挑选好的购物车了&#xff0c;但如果你还没想好买什么&#xff0c;又正好准备选购运动装备&#xff0c;下面我就日常健身运动需要的一些必买的运动装备…

长途骑行装备

转帖&#xff1a;http://bbs.bikehome.net/diz/thread-1545-1-9.html 长途骑行装备 (穷人版) 注&#xff1a;我非常业余&#xff0c;骑过最好的车子也才700元&#xff0c;对自行车行家们的术语几乎一无所知&#xff0c;所以本文只适合那些贫穷的只能享受风光和骑行的自称为“民…

自行车中长距离骑行知识讲座

介绍 所谓中长距离骑行&#xff0c;一般来说&#xff0c;即&#xff1a;500---1500公里路程或一星期左右的骑行为中等距离骑行&#xff1b;1500公里或一星期以上的骑行称为长距离骑行。 主要内容&#xff1a; *自行车中长距离骑行的目的、意义&#xff1b; *骑行的装备&#…