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