前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【编码狂想】解谜OOP:通过实战揭秘面向对象编程的奥秘

【编码狂想】解谜OOP:通过实战揭秘面向对象编程的奥秘

作者头像
SarPro
发布2024-02-20 13:32:12
1000
发布2024-02-20 13:32:12
举报
文章被收录于专栏:【计网】Cisco【计网】Cisco
🌐第一部分 引用篇
😎1.1 编写函数实现两数交换(引用方式)

描述

编写一个函数,实现两个整数的交换,要求采用引用的方式实现。

输入描述:

键盘输入 2 个整数 m 和 n

输出描述:

输出交换后 m 和 n 的值,中间使用空格隔开

示例1

代码语言:javascript
复制
输入:
10
20
输出:
20 10

💡解决如下:

代码语言:javascript
复制
#include <iostream>
#include <utility>

using namespace std;

//引用交换
void swap(int &a,int &b){
    int t=a;
    a=b;
    b=t;
}

int main(){
    int a,b;
    cin>>a;
    cin>>b;

    int &aa=a;
    int &bb=b;
    swap(aa,bb);
    cout<<a<<" "<<b<<endl;
    return 0;
}

😎1.2 编写函数实现字符串翻转(引用方式)

描述

编写一个函数,实现字符串的翻转,要求采用引用的方式实现。

输入描述:

输入一个字符串

输出描述:

输出翻转后的字符串

示例1

代码语言:javascript
复制
输入:
abc
输出:
cba

💡解决如下:

代码语言:javascript
复制
#include <iostream>
#include <cstring>

using namespace std;

//翻转字符串
void func(string &s){
    int slen=s.length();
    char c;
    for(int i=0;i<slen/2;i++){
        c=s[i];
        s[i]=s[slen-i-1];
        s[slen-i-1]=c;
    }
}
int main(){
    string s;
    getline(cin,s);

    string &ss=s;
    func(ss);
    
    cout<<s<<endl;
    return 0;
}

🌐第二部分 封装篇

😎2.1 设计立方体类

描述

采用封装的思想设计一个立方体类(Cube),成员变量有:长(length)、宽(width)、高(height),都为 int 类型;

成员方法有:获取表面积的方法(getArea)、获取体积的方法(getVolume)。

输入描述:

键盘输入立方体的长(length)、宽(width)、高(height),都为 int 类型,范围[1, 100]

输出描述:

输出立方体的长(length)、宽(width)、高(height)、面积、体积,中间使用空格隔开。

例如:3 4 5 60

示例1

代码语言:javascript
复制
输入:
3
4
5
输出:
3 4 5 94 60

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;
//Cube类
class Cube{
private:
    int length;
    int width;
    int height;
public:
    Cube(int l,int w,int h){//构造函数1
        length=l;
        width=w;
        height=h;
    }
    Cube(){}//构造函数2
    int getArea(){
        return (length*width+length*height+width*height)*2;
    }
    int getVolume(){
        return length*width*height;
    }
    void Disp(){
        cout<<length<<" "<<width<<" "<<height<<" "<<getArea()<<" "<<getVolume()<<endl;
    }

};

int main(){
    int l,w,h;
    cin>>l;
    cin>>w;
    cin>>h;

    Cube cube(l,w,h);
    cube.Disp();
    
    return 0;
}

😎2.2 点和圆的关系

描述

有圆类(Circle)和点类(Pointer),请在圆类中实现一个 isPointerInCircle方法,该方法传入一个点类对象,判断点和圆的关系,并在该方法中输出。

点类(Pointer): 成员变量:x轴坐标(int x) y轴坐标(int y) 成员方法:成员变量的公共访问方法 圆类(Circle): 成员变量:圆心(Point center) 半径(int radius) 成员方法:成员变量的公共访问方法 判断点和圆关系的方法(isPointerInCircle) 点和圆的关系: 1.点在圆外 2.点在圆上 3.点在圆内

输入描述:

键盘输入两个整数,分别是点的 x 坐标和 y 坐标(圆的参数已经给定)

输出描述:

圆类中实现 isPointInCircle 方法,在该方法中输出点和圆的关系,

如果点在圆外,则输出“out”;

如果点在圆上,则输出“on”;

如果点在圆内,则输出“in”。

示例1

代码语言:javascript
复制
输入:
5
5
输出:
on

💡解决如下:

代码语言:javascript
复制
#include <iostream>
#include <cmath>

using namespace  std;
//点类
class Point{
private:
    int x,y;
public:
    Point(int a,int b){//构造函数1
        x=a;y=b;
    }
    Point(){}//构造函数2

    int getX(){
        return x;
    }
    int getY(){
        return y;
    }
};
//圆类
class Circle{
private:
    Point center;
    int r;
public:
    Circle(Point point,int a){//构造函数1
        center=point;//拷贝
        r=a;
    }
    Circle(){}//构造函数2
    
    void isPointerInCircle(Point point){
        //计算点与圆心的距离
        double d=sqrt(pow((center.getX()-point.getX()),2) + pow((center.getY()-point.getY()),2));
        if(d==r) cout<<"on"<<endl;
        else if (d>=r) cout<<"out"<<endl;
        else cout<<"in"<<endl;
    }
};

int main(){
    int x,y;
    cin>>x;
    cin>>y;

    Point point(x,y);

    Point point2(5,0);
    int r=5;//固定圆心(5,0),半径r=5

    Circle circle(point,r);
    circle.isPointerInCircle(point2);

    return 0;
}

😎2.3 比较长方形的面积大小

描述

给出两个长方形的长和宽,实现长方形类的一个比较面积大小的方法,判定哪个面积大。

输入描述:

输入4个整数,前两个表示第一个长方形的长和宽,后两个表示第二个长方形的长和宽。

输出描述:

如果前者面积大,输出1,否则输出0。

示例1

代码语言:javascript
复制
输入:
4 3 2 1
输出:
1

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;
//长方形类
class Rentangle{
private:
	int lenth;
	int width;
public:
	Rentangle(int l,int w){
		lenth=l;width=w;
	}
	Rentangle(){}

	int getArea(){
		return lenth*width;
	}
};
int main(){
	int l1,l2,l3,l4;
	cin>>l1>>l2>>l3>>l4;

	Rentangle rentangle1(l1,l2),rentangle2(l3,l4);
	if(rentangle1.getArea()>rentangle2.getArea()) cout<<1<<endl;
	else cout<<0<<endl;
}

😎2.4 长方形的关系

描述

给出两个长方形的长和宽(长不一定大于宽),实现长方形类的一个方法,判定前者是否能完全覆盖后者。

输入描述:

输入4个整数,前两个表示第一个长方形的长和宽,后两个表示第二个长方形的长和宽。

输出描述:

如果前者能完全覆盖后者输出"yes"否则输出"no"

示例1

代码语言:javascript
复制
输入:
5 4 2 3
输出:
yes

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;
//长方形类
class Rentangle{
private:
	int lenth;
	int width;
public:
	Rentangle(int l,int w){
		lenth=l;width=w;
	}
	Rentangle(){}

	int getL(){
		return lenth;
	}
	int getW(){
		return width;
	}
};
//判断
void Disp(Rentangle r1,Rentangle r2){
	if((r1.getL()>=r2.getL() && r1.getW()>=r2.getW()) || (r1.getW()>=r2.getL() && r1.getL()>=r2.getW())){
		cout<<"yes"<<endl;
	}
	else cout<<"no"<<endl;
}

int main(){
	int l1,l2,l3,l4;
	cin>>l1>>l2>>l3>>l4;

	Rentangle rentangle1(l1,l2),rentangle2(l3,l4);
	Disp(rentangle1,rentangle2);

	return 0;
}

🌐第三部分 构造函数篇

😎3.1 构造函数

描述

现有一个人类(Person),成员变量:姓名(string name)和年龄(int age),请给 Person 添加一个支持两个参数的构造函数,并对姓名和年龄两个成员进行初始化。

输入描述:

键盘输入用户名和年龄

输出描述:

通过 Person 类的showPerson()成员方法输出 Person 对象的姓名和年龄,中间使用空格隔开

示例1

代码语言:javascript
复制
输入:
zhangsan
20
输出:
zhangsan 20

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;
//Person类
class Person{
private:
    string name;
    int age;
public:
    Person(){}//构造函数1
    Person(string s,int n){
        name=s;age=n;
    }
    void showPerson(){
        cout<<name<<" "<<age<<endl;
    }
};

int main(){
    string s;
    int n;
    getline(cin,s);
    cin>>n;

    Person person(s,n);
    person.showPerson();

    return 0;
}

😎3.2 数组类的构造函数

描述

现在有一个数组类,请实现它的构造函数。

输入描述:

第一行一个整数n,表示数组的大小。

第二行n个整数,表示数组。

输出描述:

输出这个数组。

示例1

代码语言:javascript
复制
输入:
3
1 2 3
输出:
1 2 3

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;
//Array类
class Array{
	private:
	int n;
	int *array;
	public:
	Array(int *a,int maxSize){
		n=maxSize;
		array=new int[n];
		for(int i=0;i<n;i++){
			array[i]=a[i];
		}
	}
	Array(){}
	~Array(){
		delete [] array;
	}
	
	void Disp(){
		for(int i=0;i<n;i++){
			cout<<array[i]<<" ";
		}
		cout<<endl;
	}
};
int main(){
	int maxSize;
	cin>>maxSize;
	int *a=new int[maxSize];
	for(int i=0;i<maxSize;i++){
		cin>>a[i];
	}

	Array array(a,maxSize);
	array.Disp();

	return 0;
}

🌐第四部分 拷贝构造函数篇

😎4.1 浅拷贝和深拷贝

描述

现有一个 Person 类,成员变量:姓名(string name)和年龄(int age),请给 Person 添加一个拷贝构造函数,让程序能够正确运行。

输入描述:

键盘输入用户名和年龄

输出描述:

通过 Person 类的showPerson()成员方法输出 Person 对象的姓名和年龄,中间使用空格隔开

示例1

代码语言:javascript
复制
输入:
zhangsan
20
输出:
zhangsan 20

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;
//Person类
class Person{
    private:
    string name;
    int age;
    public:
    //构造函数
    Person(){}
    Person(string s,int n){
        name=s;age=n;
    }
    //拷贝构造函数
    Person(Person &other){
        name=other.name;
        age=other.age;
    }
    //析构函数
    ~Person(){}

    void showPerson(){
        cout<<name<<" "<<age<<endl;
    }
};

void showPerson(Person p){//person赋值给p靠的就是拷贝构造函数
    p.showPerson();
}

int main(){
    string s;
    int n;
    getline(cin,s);
    cin>>n;

    Person person(s,n);
    //person.showPerson();
    showPerson(person);

    return 0;
}

😎4.2 数组类的拷贝构造函数

描述

现有一个数组类Array,请你设计一个正确的拷贝构造函数。

输入描述:

第一行一个整数n,表示数组的大小。

第二行n个整数,表示数组。

输出描述:

输出这个数组。

示例1

代码语言:javascript
复制
输入:
3
1 2 3
输出:
1 2 3

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;
//数组类
class Array{
	private:
	int *array;
	int n;

	public:
	//构造函数
	Array(){}
	Array(int *a,int maxSize){
		n=maxSize;
		array=new int[n];
		for(int i=0;i<n;i++){
			array[i]=a[i];
		}
	}
	//拷贝构造函数
	Array(const Array &other){
		n=other.n;//不要忘了

		array=new int[n];
		for(int i=0;i<n;i++){
			array[i]=other.array[i];
		}
	}
	//析构函数
	~Array(){
		delete [] array;
	}

	void Disp(){
		for(int i=0;i<n;i++){
			cout<<array[i]<<" ";
		}
		cout<<endl;
	}
};

void func(Array a){
	a.Disp();
}

int main(){
	int maxSize;
	cin>>maxSize;
	int *a=new int[maxSize];
	for(int i=0;i<maxSize;i++){
		cin>>a[i];
	}

	Array array(a,maxSize);
	func(array);

	delete [] a;
	return 0;
}

🌐第五部分 友元篇

😎5.1 友元全局函数

描述 在现有代码的基础上,使用友元全局函数,让程序能够正常运行。 输入描述:输出描述: 输出年龄

💡解决如下:

代码语言:javascript
复制
#include <iostream>
using namespace std;

class Person {
    // write your code here......
    friend void showAge(Person& p);//就加这一句哈哈

    public:
        Person(int age) {
            this->age = age;
        }

    private:
        int age;
};

void showAge(Person& p) {
    cout << p.age << endl;
}

int main() {

    Person p(10);
    showAge(p);

    return 0;
}

😎5.2 友元类

描述

现在有一个手机类phone与我的手机类myphone。

在现有代码的基础上,使用友元类,让程序能够正常运行。

输入描述:

输入一个整数,表示价格。

输出描述:

输出价格。

示例1

代码语言:javascript
复制
输入:
1000
输出:
1000

💡解决如下:

代码语言:javascript
复制
#include<bits/stdc++.h>

using namespace std;

class phone{
	// write your code here......
	friend class myphone;//就加这一句哈哈,这里不是friend int getprice();

	private:
		int price;
	public:
		phone(int x){
			price=x;
		}
		phone(){}
}; 
class myphone{
	private:
		phone a;
	public:
		myphone(int x):a(x){
		}
		int getprice(){
			return a.price;
		}
};
int main(){
	int p;
	cin>>p;

	myphone a(p);

	cout<<a.getprice();
	return 0;
}

🌐第六部分 继承篇

😎6.1 子类中调用父类构造

描述

有父类 Base,内部定义了 x、y 属性。有子类 Sub,继承自父类 Base。子类新增了一个 z 属性,并且定义了 calculate 方法,在此方法内计算了父类和子类中 x、y、z 属性三者的乘积。请补全子类构造方法的初始化逻辑,使得该计算逻辑能够正确执行。

输入描述:

三个整数:x, y, z

输出描述:

三个整数的乘积:x*y*z

示例1

代码语言:javascript
复制
输入:
1
2
3
输出:
6

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;

class Base {
    private:
        int x;
        int y;

    public:
        //构造函数
        Base(int x, int y) {
            this->x = x;
            this->y = y;
        }
        Base(){}

        int getX() {
            return x;
        }
        int getY() {
            return y;
        }

};

class Sub : public Base {
    private:
        int z;

    public:
        //构造函数
        Sub(int x, int y, int z) :Base(x, y) {
            // write your code here
            this->z=z;
        }
        Sub():Base(){}

        int getZ() {
            return z;
        }

        int calculate() {
            return Base::getX()*Base::getY()*z;
        }

};

int main() {
    int x, y, z;
    cin >> x;
    cin >> y;
    cin >> z;

    Sub sub(x, y, z);
    cout << sub.calculate() << endl;
    
    return 0;
}

😎6.2 重写子类计算逻辑

描述

在父类 Base 中定义了计算方法 calculate(),该方法用于计算两个数的乘积(X*Y)。请在子类 Sub 中重写该方法,将计算逻辑由乘法改为除法(X/Y)。注意,当分母为0时输出“Error”。

输入描述:

两个整数

输出描述:

两个整数的商(int类型,不考虑小数部分)

示例1

代码语言:javascript
复制
输入:
6
2
输出:
3

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;

class Base {
private:
    int x;
    int y;

public:
    Base(int x, int y) {
        this->x = x;
        this->y = y;
    }

    int getX() {
        return x;
    }

    int getY() {
        return y;
    }

    virtual void calculate() {
        cout << x*y << endl;
    }

};

class Sub : public Base {

public:
    Sub(int a,int b):Base(a,b){}
    void calculate() {
        if(Base::getY()==0) cout<<"Error"<<endl;//考虑分母为0的情况
        else cout << double(Base::getX()/Base::getY()) << endl;
    }
};

int main() {

    int x, y;
    cin >> x;
    cin >> y;

    Sub sub(x, y);
    sub.calculate();
    
    return 0;
}

😎6.3 构建长方体类

描述

现在有长方形类(rectangle),请以此为基类构建长方体类(cuboid)并实现求体积的getvolume方法。

输入描述:

输入三个整数x,y,z分别表示长宽高。

输出描述:

输出长方体的体积。

示例1

代码语言:javascript
复制
输入:
3 2 1
输出:
6

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;

class rectangle{
	private:
		int length;
		int width;

	public:
		//构造函数
		rectangle(int x,int y){
			length=x;
			width=y;
		}
		rectangle(){}

		int area(){
			return length*width;
		}
};

class cuboid:public rectangle{
	private:
		int height;
	public:
		//构造函数
		cuboid(int x,int y,int z):rectangle(x,y){
			this->height=z;
		}

		int getvolume(){
			return rectangle::area()*this->height;
		}
		
};
int main(){
	int x,y,z;
	cin>>x>>y>>z;

	cuboid a(x,y,z);
	cout<<a.getvolume();

	return 0;
}

😎6.4 求长方体表面积

描述

现在有长方形类(rectangle),请以此为基类构建长方体类(cuboid)并实现求表面积的area方法。

输入描述:

输入三个整数x,y,z分别表示长宽高。

输出描述:

第一行输出一个整数表示长方体的底面积。

第二行输出一个整数表示长方体的表面积。

示例1

代码语言:javascript
复制
输入:
3 2 1
输出:
6
22

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;

class rectangle{
	private:
		int length,width;
	public:
		//构造函数
		rectangle(int x,int y){
			length=x;
			width=y;
		}
		rectangle(){}

		int getlength(){
			return length;
		}
		int getwidth(){
			return width;
		}
		virtual int area(){
			return length*width;
		}
};
class cuboid:public rectangle{
	private:
		int height;
	public:
		//构造函数
		cuboid(int x,int y,int z):rectangle(x,y){
			this->height=z;
		}

		int area(){
			return 2*(rectangle::area()+rectangle::getlength()*this->height+rectangle::getwidth()*this->height);
		}
};
int main(){
	int x,y,z;
	cin>>x>>y>>z;

	cuboid a(x,y,z);
	cout<<a.rectangle::area()<<'\n'<<a.area();

	return 0;
}

🌐第七部分 多态篇

😎7.1 多态实现计算器功能

描述

完善下面的代码,使程序能够正常运行。要求 BaseCalculator 类中提供 getResult() 函数(无需实现),在 AddCalculator 类中实现两个成员相加(m_A + m_B),在 SubCalculator 类中实现两个成员相减(m_A - m_B)

输入描述:

输出描述:

程序已经给定输出

代码语言:javascript
复制
#include <iostream>
using namespace std;

class BaseCalculator {
    public:
        int m_A;
        int m_B;
        // write your code here......
        
};

// 加法计算器类
class AddCalculator : public BaseCalculator {
    // write your code here......
    
};

// 减法计算器类
class SubCalculator : public BaseCalculator {
    // write your code here......
    
};


int main() {

    BaseCalculator* cal = new AddCalculator;
    cal->m_A = 10;
    cal->m_B = 20;
    cout << cal->getResult() << endl;
    delete cal;

    cal = new SubCalculator;
    cal->m_A = 20;
    cal->m_B = 10;
    cout << cal->getResult() << endl;
    delete cal;

    return 0;
}

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;

class BaseCalculator {
    public:
        int m_A;
        int m_B;
        // write your code here......
        BaseCalculator() : m_A(0), m_B(0) {}
        virtual int getResult() const=0;
};

// 加法计算器类
class AddCalculator : public BaseCalculator {
    // write your code here......

    int getResult() const{
        return m_A+m_B;
    }
    
};

// 减法计算器类
class SubCalculator : public BaseCalculator {
    // write your code here......

    int getResult() const{
        return m_A-m_B;
    }
};


int main() {

    BaseCalculator* cal = new AddCalculator;
    cal->m_A = 10;
    cal->m_B = 20;
    cout << cal->getResult() << endl;
    delete cal;

    cal = new SubCalculator;
    cal->m_A = 20;
    cal->m_B = 10;
    cout << cal->getResult() << endl;
    delete cal;

    return 0;
}

😎7.2 多态实现求面积体积

描述

现在有长方形类(rectangle),和以此为基类构建的长方体类(cuboid),运用多态在两个类中实现getval方法,在长方形类中是求面积功能,在长方体类中是求体积功能。

输入描述:

输入三个整数�,�,�x,y,z分别表示长宽高。

输出描述:

第一行输出一个整数表示长方体的面积。

第二行输出一个整数表示长方体的体积。

示例1

代码语言:javascript
复制
输入:
3 2 1
输出:
6
6

💡解决如下:

代码语言:javascript
复制
#include <iostream>

using namespace std;

class rectangle{
	private:
		int length;
		int width;
	public:
		//构造函数
		rectangle(int x,int y){
			length=x;
			width=y;
		}
		rectangle(){}

		int getlength(){
			return length;
		}
		int getwidth(){
			return width;
		}
		// write your code here...
		virtual int getval(){
			return length*width;
		}
        
};
class cuboid:public rectangle{
	private:
		int height;
	public:
		//构造函数
		cuboid(int x,int y,int z):rectangle(x,y){
			this->height=z;
		}
		// write your code here...
		int getval(){
			return rectangle::getval()*this->height;
		}
        
};
int main(){
	int x,y,z;
	cin>>x>>y>>z;
	cuboid a(x,y,z);
	rectangle b(x,y);
	
	rectangle *p=&b;
	cout<<p->getval()<<'\n';
	
	p=&a;
	cout<<p->getval();
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 😎1.1 编写函数实现两数交换(引用方式)
  • 😎1.2 编写函数实现字符串翻转(引用方式)
  • 🌐第二部分 封装篇
    • 😎2.1 设计立方体类
      • 😎2.2 点和圆的关系
        • 😎2.3 比较长方形的面积大小
          • 😎2.4 长方形的关系
          • 🌐第三部分 构造函数篇
            • 😎3.1 构造函数
              • 😎3.2 数组类的构造函数
              • 🌐第四部分 拷贝构造函数篇
                • 😎4.1 浅拷贝和深拷贝
                  • 😎4.2 数组类的拷贝构造函数
                  • 🌐第五部分 友元篇
                    • 😎5.1 友元全局函数
                      • 😎5.2 友元类
                      • 🌐第六部分 继承篇
                        • 😎6.1 子类中调用父类构造
                          • 😎6.2 重写子类计算逻辑
                            • 😎6.3 构建长方体类
                              • 😎6.4 求长方体表面积
                              • 🌐第七部分 多态篇
                                • 😎7.1 多态实现计算器功能
                                  • 😎7.2 多态实现求面积体积
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档