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图案如下:
现假设一个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--) { cin >> x1 >> y1 >> x2 >> y2; CRectangle rect1 (x1, y1, x2, y2) ; cin >> x1 >> y1 >> x2 >> y2; CRectangle 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 ; }
可根据需要,添加构造函数和析构函数。
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 ; }