C++题目练习06

C++题目练习06

6.1 构造函数、重载赋值运算符练习:设计矩形类rectangle

定义并实现一个矩形类 rectangle,有长(length)、宽(wide) 两个属性,
成员函数 area() 计算矩形的面积,成员函数 setlength()、getlength()、setwide()、getwide() 分别设置和获取 length 或者 wide 的值,
成员函数 display() 输出矩形的信息(长,宽,面积),
要求定义构造函数、拷贝构造函数、赋值运算符函数,能使用对象数组。

#include <iostream>
using namespace std;

class rectangle {
	private:
		double length = 0, wide = 0;
	public:
		rectangle(double l, double w) {
			length  = l;
			wide = w;
		}
		rectangle() {

		}
		rectangle(rectangle &c) {
			this->length = c.length;
			this->wide = c.wide;
		}
		double area() {
			return length * wide;
		}
		void setlength(double l) {
			length = l;
		}
		double getlength() {
			return length;
		}
		void setwide(double w) {
			wide = w;
		}
		double getwide() {
			return wide;
		}
		void display() {
			cout << "message of the rectangle:length=" << length << " wide=" << wide << " area=" << area() << endl;
		}
};


int main( ) {
	rectangle r1( 3, 4 );     // 定义一个矩形 r1,长为 3,宽为 4
	r1.display();     // 输出矩形r1的有关信息

	rectangle r2;     // 定义一个矩形r2
	r2 = r1;
	r2.display();     // 输出矩形 r2 的有关信息
	r2.setlength( 10 );   // 把矩形 r2 的长 length 改为 10
	r2.setwide( 20 );     // 把矩形 r2 的宽 wide 改为 20
	r2.display();     // 再输出矩形 r2 的有关信息

	rectangle r3( r1 );
	r3.display();     // 输出矩形 r3 的有关信息

	rectangle r4[4];     // 定义矩形数组 r4
	for ( int i = 0; i < 4; i ++ )    // 输出矩形数组 r4 中各个矩形的信息
		r4[i].display();

	return 0;
}


6.2 实现两个计数器相加减的运算

设计一个计数器类 Counter,它只有一个用于计数的数据成员 cnt,该计数器的有效计数范围是 0 ~ 65535,实现两个计数器相加减的运算。

#include <iostream>
using namespace std;

class Counter {
	private:
		double cnt;
	public:
		Counter(double a) {
			if (a >= 0 && a <= 65535)
				cnt = a ;

		}
		Counter() {
			cnt = 0;
		}
		~Counter() {
		}
		Counter operator+(Counter &c) {
			return Counter(cnt + c.cnt);
		}
		Counter operator-(Counter &c) {
			return Counter(cnt - c.cnt);
		}
		double getcount() {
			return cnt;
		}
		void display() {
			cout << "counter = " << cnt << endl;
		}
};

int main() {
	Counter a(100), b(200), c, d;

	c = a + b;
	c.display();

	d = b - a;
	d.display();

	return 0;
}


6.3 实现两坐标点的加、减运算

建立一个二维坐标系的类TwoCoor,用x、y表示坐标值,均为整型。请实现两坐标点的加、减运算。

#include <iostream>
using namespace std;

class TwoCoor {
	private:
		int x, y;
	public:
		TwoCoor(int a, int b) {
			x = a;
			y = b;
		}
		TwoCoor() {
			x = 0;
			y = 0;
		}
		~TwoCoor() {
		}
		TwoCoor operator+(TwoCoor &c) {
			return TwoCoor(x + c.x, y + c.y);
		}
		TwoCoor operator-(TwoCoor &c) {
			return TwoCoor(x - c.x, y - c.y);
		}
		void display() {
			cout << "(" << x << "," << y << ")" << endl;
		}
};

int main() {
	TwoCoor p1(1, 2), p2(-1, 1), p3, p4;

	p3 = p1 + p2;
	p4 = p1 - p2;

	p3.display();
	p4.display();

	return 0;
}

6.4 运算符重载练习3:Rational

实现 有理数 Rational 类 的 + 加法 和 - 减法

#include <cmath>
#include <iostream>
using namespace std;

/// 声明有理数类
class Rational {
	public:
		/// 带默认参数的构造函数
		Rational ( int x = 0, int y = 1 ) : num(x), den(y) { }

		void Print( );

		Rational operator+ ( Rational &a );  /// 重载运算符"+"

		Rational operator- ( Rational &a ); /// 重载运算符"-"

	private:
		int  num, /// 分子
		     den; /// 分母
		void Optimi();  /// 分数化简
};

void Rational::Optimi() {
	if ( num == 0 ) { /// 若分子为0,则置分母为1后返回
		den = 1;
		return;
	}

	/// 初值
	int gcd = (abs(num) > abs(den) ? abs(num) : abs(den));
	/// 若为0,则返回
	if ( gcd == 0 )
		return;

	int i;
	/// 用循环找最大公约数
	for ( i = gcd; i > 1;  i -- )
		if ( ( num % i == 0 ) && ( den % i == 0 ) )
			break;

	/// i为最大公约数,将分子、分母均整除它,重新赋值
	num /= i;
	den /= i;
	/// 若分子和分母均为负数,则结果为正,所以均改为正
	if ( num < 0 && den < 0 ) {
		num = -num;
		den = -den;
	} else if ( num < 0 || den < 0 )  {
		/// 若分子和分母中只有一个为负数,则调整为分子取负,分母取正
		num = - abs(num);
		den = abs(den);
	}
}

/// 输出有理数
void Rational::Print( ) {
	cout << num;
	/// 当分子不为0且分母不为1时才显示"/分母"
	if ( num != 0 && den != 1 )
		cout << "/" << den ;
}

Rational Rational::operator+(Rational &a) {
	Rational r;
	r.num = a.num * den + a.den * num;
	r.den = a.den * den;
	r.Optimi();
	return r;
}

Rational Rational::operator-(Rational &a) {
	Rational r;
	r.num = num * a.den - den * a.num;
	r.den = a.den * den;
	r.Optimi();
	return r;
}

int main() {
	Rational r1(3, 14), r2(9, 15), r3, r4;
	r1.Print();
	cout << endl;

	r2.Print();
	cout << endl;

	r3 = r1 + r2; /// 使用重载了的运算符“+”
	r3.Print();
	cout << endl;

	r4 = r1 - r2; /// 使用重载了的运算符“-”
	r4.Print();
	cout << endl;

	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值