A.三维坐标点的平移(运算符重载)

题目描述

定义一个三维点Point类,利用友元函数重载"++“和”–"运算符,并区分这两种运算符的前置和后置运算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class point
{
int x;
int y;
int z;
public:
point(int X=0,int Y=0,int Z=0);
{x=X;y=Y;z=Z;}
friend point operator ++(point &a);
friend point operator ++(point &,int);
friend point operator --(point &);
friend point operator --(point &,int);
void show()
{
cout<<"x="<<x<<' '<<"y="<<y<<''<<"z="<<z<<endl;
}
}

要求如下:
1.实现Point类;
2.编写main函数,初始化1个Point对象,将这个对象++或–后赋给另外一个对象,并输出计算后对象的坐标信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include<iostream>
#include<cstring>
using namespace std;

class point
{
protected:
int x;
int y;
int z;
public:
point(int X = 0, int Y = 0, int Z = 0)
{
x = X;
y = Y;
z = Z;
}
void set(int _x, int _y, int _z)
{
x = _x;
y = _y;
z = _z;
}
friend point operator++(point& a)
{
a.x++;
a.y++;
a.z++;
return a;
}
friend point operator++(point& a, int x)
{
point p(a);
a.x++;
a.y++;
a.z++;
return p;
}
friend point operator--(point& a)
{
a.x--;
a.y--;
a.z--;
return a;
}
friend point operator--(point& a, int x)
{
point p(a);
a.x--;
a.y--;
a.z--;
return p;
}
void show()
{
cout << "x=" << x << ' ' << "y=" << y << ' ' << "z=" << z << endl;
}
};

int main()
{
int x, y, z;
cin >> x >> y >> z;
point p1(x, y, z);
point p2;
p1++;
p1.show();
p1.set(x, y, z);
p2 = p1;
p2.show();
p1.set(x, y, z);
(++p1).show();
p1.show();
p1.set(x, y, z);
p1--;
p1.show();
p1.set(x, y, z);
p1.show();
p1.set(x, y, z);
(--p1).show();
p1.show();


return 0;
}

B.货币加减(运算符重载)

题目描述

定义CMoney类,包含元、角、分三个数据成员,友元函数重载‘+’、’-’,实现货币的加减运算(假设a-b中a的金额始终大于等于b的金额),重载输入及输出,实现货币的输入,输出
读入最初的货币值,对其不断进行加、减操作,输出结果。
可根据需要,为CMoney类添加构造函数或其它成员函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include<iostream>
#include<cstring>
using namespace std;

class CMoney
{
protected:
int yuan;
int corn;
int coin;
public:
CMoney(){}
CMoney(int y,int cr,int ci):yuan(y),corn(cr),coin(ci){}
friend CMoney operator +(CMoney& a, CMoney& b)
{
CMoney c;
int c1, c2, sum;
c1 = a.yuan * 100 + a.corn * 10 + a.coin;
c2 = b.yuan * 100 + b.corn * 10 + b.coin;
sum = c1 + c2;
c.yuan = sum / 100;
c.corn = (sum / 10) % 10;
c.coin = sum % 10;


return c;
}
friend CMoney operator-(CMoney& a, CMoney& b)
{
CMoney c;
int c1, c2, sum;
c1 = a.yuan * 100 + a.corn * 10 + a.coin;
c2 = b.yuan * 100 + b.corn * 10 + b.coin;
sum = c1 - c2;
c.yuan = sum / 100;
c.corn = (sum / 10) % 10;
c.coin = sum % 10;
return c;
}
friend ostream& operator <<(ostream& out, CMoney& a)
{
out << a.yuan << "元" << a.corn << "角" << a.coin << "分" << endl;
return out;
}
friend istream& operator>>(istream& input, CMoney& a)
{
input >> a.yuan >> a.corn >> a.coin;
return input;
}

};

int main()
{
int t;
int y, j, f;
string a;
cin >> t;
while (t--)
{
cin >> y >> j >> f;
CMoney m1(y, j, f);
CMoney m;
cin >> a;
while(a!="stop")
{
if (a == "add")
{
cin >> y >> j >> f;
CMoney m2(y, j, f);
m = m1 + m2;
}
else if (a == "minus")
{
cin >> y >> j >> f;
CMoney m2(y, j, f);
m = m1 - m2;
}
m1 = m;
cin >> a;
}
cout << m;
}
return 0;
}

C.时钟调整(运算符前后增量)

题目描述

假定一个时钟包含时、分、秒三个属性,取值范围分别为0~11,0~59,0~59,具体要求如下:
1、用一元运算符++,并且是前增量的方法,实现时钟的调快操作。例如要把时钟调快5秒,则执行5次”  ++<对象> “ 的操作
2、用一元运算符–,并且是后增量的方法,实现时钟的调慢操作。例如要把时钟调慢10秒,则执行10次” <对象>-- “的操作
3、用构造函数的方法实现时钟对象的初始化,用输出函数实现时钟信息的输出
clock和time是系统内部函数,所以不要用来做类名或者其他

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
class CClock
{
protected:
int hour;
int minute;
int second;
public:
CClock(int h, int m, int s) :hour(h), minute(m), second(s) {}
void show()
{
cout << hour << ":" << minute << ":" << second << endl;
}
CClock operator++()
{
second++;
if (second > 59)
{
second = 0;
minute++;
}
if (minute > 59)
{
minute = 0;
hour++;
}
if (hour > 11)
{
hour = 0;
}
return *this;
}
CClock operator--(int)
{
CClock temp(*this);
second--;
if (second < 0)
{
second = 59;
minute--;
}
if (minute < 0)
{
minute = 59;
hour--;
}
if (hour < 0)
hour = 11;
return *this;
}
};
int main()
{
int hour, minute, second;
int t;
cin >> hour >> minute >> second;
CClock c(hour, minute, second);
cin >> t;
while (t--)
{
int tmp;
cin >> tmp;
int num = abs(tmp);
while (num--)
{
if (tmp > 0)
{
++c;
}
else
{
c--;
}
}
c.show();
}
return 0;
}

D.X的放大与缩小(运算符重载)

题目描述

X字母可以放大和缩小,变为n行X(n=1,3,5,7,9,…,21)。例如,3行x图案如下:
image.png

现假设一个n行(n>0,奇数)X图案,遥控器可以控制X图案的放大与缩小。遥控器有5个按键,1)show,显示当前X图案;2)show++, 显示当前X图案,再放大图案,n+2;3)++show,先放大图案,n+2,再显示图案;4)show–,显示当前X图案,再缩小图案,n-2;5)–show,先缩小图案,n-2,再显示图案。假设X图案的放大和缩小在1-21之间。n=1时,缩小不起作用,n=21时,放大不起作用。

用类CXGraph表示X图案及其放大、缩小、显示。主函数模拟遥控器,代码如下,不可修改。请补充CXGraph类的定义和实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int main()
{
int t, n;
string command;
cin >> n;
CXGraph xGraph(n);
cin >> t;
while (t--)
{
cin >> command;
if (command == "show++")
{
cout << xGraph++ << endl;
}
else if(command == "++show")
{
cout << ++xGraph << endl;
}
else if (command == "show--")
{
cout << xGraph-- << endl;
}
else if (command == "--show")
{
cout << --xGraph << endl;
}
else if (command == "show")
{
cout << xGraph << endl;
}
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include<iostream>
#include<cstring>
using namespace std;

class CXGraph
{
private:
int n;
public:
CXGraph(int _n):n(_n){}
friend CXGraph operator ++(CXGraph& a)
{
if(a.n!=21)
{
a.n+=2;
}
return a;
}
friend CXGraph operator ++(CXGraph& a, int)
{
CXGraph b=a;
if (a.n != 21)
{
a.n+=2;
}
return b;
}
friend CXGraph operator --(CXGraph& a)
{
if (a.n != 1)
{
a.n-=2;
}
return a;
}
friend CXGraph operator --(CXGraph& a, int)
{
CXGraph b = a;
if (a.n != 1)
{
a.n-=2;
}
return b;
}
friend ostream& operator<<(ostream& out, CXGraph const& a)
{
int i, j, k;
k = a.n;
for(i=0;i<(a.n+1)/2;i++)
{
for (j = 0; j < (a.n - k) / 2; j++)
{
out << " ";
}
for (j = k; j > 0; j--)
{
out << "X";
}
out << endl;
k -= 2;
}
k = 3;
for (i = (a.n + 1) / 2; i < a.n; i++)
{
for (j = (a.n - k) / 2; j > 0; j--)
{
out << " ";
}
for (j = 0; j < k; j++)
{
out << "X";
}
out << endl;
k += 2;
}
return out;
}
};

int main()
{
int t, n;
string command;
cin >> n;
CXGraph xGraph(n);
cin >> t;
while (t--)
{
cin >> command;
if (command == "show++")
{
cout << xGraph++ << endl;
}
else if (command == "++show")
{
cout << ++xGraph << endl;
}
else if (command == "show--")
{
cout << xGraph-- << endl;
}
else if (command == "--show")
{
cout << --xGraph << endl;
}
else if (command == "show")
{
cout << xGraph << endl;
}
}
return 0;
}

E.矩形关系(运算符重载)

题目描述

假设坐标采用二维平面坐标。

定义点类CPoint,包含属性x,y(整型)。方法有:带参构造函数,getX,getY分别返回点的x坐标,y坐标。
定义矩形类CRectangle,包含属性:矩形的左上角坐标leftPoint,右下角坐标rightPoint。类中方法有:
1)带参构造函数,初始化矩形的左上角、右下角
2)重载>运算符,参数为CPoint点对象,假设为p,若p在矩形内,返回true,否则返回false。
3)重载>运算符,第一个矩形若包含第二个矩形(部分边界可以相等),返回true,否则返回false。(要求该函数调用2)实现)
4)重载==运算符,判断两个矩形是否一致,返回true或false。
5)重载*运算符,判断两个矩形是否有重叠部分,返回true或false。
6)重载类型转换运算符,计算矩形的面积并返回,面积是整型。
7)重载<<运算符,输出矩形的两个角坐标,具体格式见样例。
输入2个矩形,计算面积,判断矩形的关系。主函数如下,不可修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int main()
{
int t, x1, x2, y1, y2;
cin >> t;
while (t--)
{
// 矩形1的左上角、右下角
cin >> x1 >> y1 >> x2 >> y2;
CRectangle rect1(x1, y1, x2, y2);
// 矩形2的左上角、右下角
cin >> x1 >> y1 >> x2 >> y2;
CRectangle rect2(x1, y1, x2, y2);
// 输出矩形1的坐标及面积
cout << "矩形1:" << rect1 << " " << (int)rect1 << endl;
// 输出矩形2的坐标及面积
cout << "矩形2:" << rect2 << " " << (int)rect2 << endl;
if (rect1 == rect2)
{
cout << "矩形1和矩形2相等" << endl;
}
else if (rect2 > rect1)
{
cout << "矩形2包含矩形1" << endl;
}
else if (rect1 > rect2)
{
cout << "矩形1包含矩形2" << endl;
}
else if (rect1 * rect2)
{
cout << "矩形1和矩形2相交" << endl;
}
else
{
cout << "矩形1和矩形2不相交" << endl;
}
cout << endl;
}
return 0;
}

可根据需要,添加构造函数和析构函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;

class CPoint
{
private:
int x;
int y;
public:
CPoint() {}
CPoint(int _x, int _y) :x(_x), y(_y) {}
int getX()
{
return x;
}
int getY()
{
return y;
}
};

class CRectangele
{
private:
CPoint leftPoint;
CPoint rightPoint;
public:
CRectangele() {}
CRectangele(int x1, int y1, int x2, int y2) :leftPoint(x1, y1), rightPoint(x2, y2) {}
friend ostream& operator<<(ostream& out, CRectangele& a)
{
out << a.leftPoint.getX() << " " << a.leftPoint.getY() << " " << a.rightPoint.getX() << " " << a.rightPoint.getY();
return out;
}
bool operator>(CPoint& p)
{
if (p.getX() >= leftPoint.getX() && p.getX() <= rightPoint.getX() && p.getY() >= rightPoint.getY() && p.getY() <= leftPoint.getY())
return true;
else
return false;
}
bool operator>(CRectangele& r)
{
if (r.leftPoint.getX() >= leftPoint.getX() && r.leftPoint.getX() <= rightPoint.getX() && r.leftPoint.getY() >= rightPoint.getY() && r.leftPoint.getY() <= leftPoint.getY() && r.rightPoint.getX() >= leftPoint.getX() && r.rightPoint.getX() <= rightPoint.getX() && r.rightPoint.getY() >= rightPoint.getY() && r.rightPoint.getY() <= leftPoint.getY())
{
return true;
}
else
{
return false;
}
}
bool operator==(CRectangele& r)
{
if (leftPoint.getX() == r.leftPoint.getX() && leftPoint.getY() == r.leftPoint.getY() && rightPoint.getX() == r.rightPoint.getX() && rightPoint.getY() == r.rightPoint.getY())
{
return true;
}
else
{
return false;
}
}
bool operator*(CRectangele& r)
{
if (abs(((leftPoint.getX() + rightPoint.getX()) / 2) - ((r.leftPoint.getX() + r.rightPoint.getX()) / 2)) <= (((rightPoint.getX() - leftPoint.getX()) + (r.rightPoint.getX() - r.leftPoint.getX())) / 2) &&
abs(((leftPoint.getY() + rightPoint.getY()) / 2) - ((r.leftPoint.getY() + r.rightPoint.getY()) / 2)) <= (((leftPoint.getY() - rightPoint.getY()) + (r.leftPoint.getY() - r.rightPoint.getY())) / 2))
return true;
else
return false;

}
operator int()
{
int sum;
sum = (rightPoint.getX() - leftPoint.getX()) * (leftPoint.getY() - rightPoint.getY());
return sum;
}
};



int main()
{
int t, x1, x2, y1, y2;
cin >> t;
while (t--)
{
cin >> x1 >> y1 >> x2 >> y2;
CRectangele rect1(x1, y1, x2, y2);
cin >> x1 >> y1 >> x2 >> y2;
CRectangele rect2(x1, y1, x2, y2);
cout << "矩形1:" << rect1 << " " << (int)rect1 << endl;
cout << "矩形2:" << rect2 << " " << (int)rect2 << endl;
if (rect1 == rect2)
{
cout << "矩形1和矩形2相等" << endl;
}
else if (rect2 > rect1)
{
cout << "矩形2包含矩形1" << endl;
}
else if (rect1 > rect2)
{
cout << "矩形1包含矩形2" << endl;
}
else if (rect1 * rect2)
{
cout << "矩形1和矩形2相交" << endl;
}
else
{
cout << "矩形1和矩形2不相交" << endl;
}
cout << endl;
}
return 0;
}