6-1 使用成员函数重载复数类的运算符+
分数 2
全屏浏览题目
切换布局
作者 李廷元
单位 中国民用航空飞行学院
类Complex声明了一个复数类,有两个数据成员realPart(代表复数的实部)和imgPart(代表复数的虚部),并定义了成员函数实现了重载运算符“+”以实现两个复数对象的相加操作。成员函数Show用来输出复数的实部和虚部。请完成对运算符“+”的重载操作。
函数接口定义:
Complex& Complex::operator+(Complex& com);
参数com为复数类Complex的对象的引用,函数的返回值为当前对象与com对象相加后的值。
裁判测试程序样例:
#include<iostream> using namespace std; class Complex { public: Complex(double realPart = 0, double imgPart = 0) { this->realPart = realPart; this->imgPart = imgPart; } Complex& operator+(Complex& com); void Show() { cout << realPart << " " << imgPart << endl; } private: double realPart, imgPart; }; int main() { int r1, i1; //第1个复数对象的实部和虚部 int r2, i2; //第1个复数对象的实部和虚部 cin >> r1 >> i1; cin >> r2 >> i2; Complex c1(r1, i1); //构造第1个复数对象c1 Complex c2(r2, i2); //构造第2个复数对象c2 c1 = c1 + c2; c1.Show(); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
1. 3 4 2. 10 20
输出样例:
13 24
1. Complex &Complex::operator+(Complex& com) 2. { 3. com.realPart=com.realPart+this->realPart; 4. com.imgPart=com.imgPart+this->imgPart; 5. return com; 6. }
6-2 重载+-运算符
分数 3
全屏浏览题目
切换布局
作者 李廷元
单位 中国民用航空飞行学院
请根据程序的输出结果,重载类A的+和-运算符。
类和函数接口定义:
class A { public: A(int x = 0, int y = 0) : x(x), y(y) {} void show() const; A operator+(A& a); //重载+运算符 A operator-(A& a); //重载-运算符 private: int x, y; };
裁判测试程序样例:
#include <iostream> using namespace std; class A { public: A(int x = 0, int y = 0) : x(x), y(y) {} void show() const; A operator+(A& a); A operator-(A& a); private: int x, y; }; void A::show() const { cout << "(x,y) = " << "(" << x << "," << y << ")" << endl; } /* 请在这里填写答案 */ int main() { A a1(1, 2); A a2(4, 5); A a; cout << "a1:"; a1.show(); cout << "a2:"; a2.show(); a = a1 + a2; cout << "a:"; a.show(); a = a1 - a2; cout << "a:"; a.show(); return 0; }
输入样例:
本题无输入。
输出样例:
1. a1:(x,y) = (1,2) 2. a2:(x,y) = (4,5) 3. a:(x,y) = (5,7) 4. a:(x,y) = (-3,-3)
1. A A::operator+(A& a) 2. { 3. A temp; 4. temp.x=x+a.x; 5. temp.y=y+a.y; 6. return temp; 7. } 8. A A::operator-(A& a) 9. { 10. A temp; 11. temp.x=x-a.x; 12. temp.y=y-a.y; 13. return temp; 14. }
6-3 大整数求和(运算符重载)
分数 5
全屏浏览题目
切换布局
作者 何振峰
单位 福州大学
BigInt类表示不超过100位的无符号大整数。试重载>>,<<和+,以支持无符号大整数的输入、输出与求和(假设结果仍是一个不超过100位的无符号大整数)。
重载面向BigInt类对象的运算符:
>> << +
裁判测试程序样例:
#include <iostream> #include <string> using namespace std; /* 请在这里填写答案 */ int main(){ BigInt a, b, c; cin>>a>>b; c=a+b; cout<<a<<"+"<<b<<"="<<c<<endl; return 0; }
输入样例:
1. 123456789 2. 987654321
输出样例:
123456789+987654321=1111111110
1. class BigInt 2. { 3. private: 4. string str; 5. public: 6. BigInt() {} 7. BigInt(string s) 8. { 9. str=s; 10. } 11. 12. friend ostream&operator<<(ostream &os, BigInt &bigint) 13. { 14. os<<bigint.str; 15. return os; 16. } 17. friend istream&operator>>(istream &is,BigInt &bigint) 18. { 19. is>>bigint.str; 20. return is; 21. } 22. friend BigInt operator+( BigInt &bigint1, BigInt &bigint2); 23. }; 24. 25. BigInt operator+( BigInt &bigint1, BigInt &bigint2) 26. { 27. string a=bigint1.str; 28. string b=bigint2.str; 29. string temp; 30. if(a.size()>b.size()) 31. { 32. temp=a; 33. a=b; 34. b=temp; 35. } 36. 37. char *sum=new char[b.size()+2]; 38. int carry=0; 39. int count=0; 40. int m,n,k; 41. int al,bl; 42. for (al=a.size()-1,bl=b.size()-1; al>=0; al--,bl--) 43. { 44. m=a[al]-'0'; 45. n=b[bl]-'0'; 46. k=m+n+carry; 47. if(k > 9) 48. { 49. carry=1; 50. k-=10; 51. sum[count]=k+'0'; 52. } 53. else 54. { 55. sum[count]=k+'0'; 56. carry=0; 57. } 58. count++; 59. } 60. if(a.size()==b.size() && carry==1) sum[count]='1'; 61. if(a.size()==b.size() && carry==0) count--; 62. 63. int sizeDif=b.size()-a.size(); 64. int i=sizeDif-1; 65. for(bl!=0; i>=0; i--) 66. { 67. k=b[i]-'0'+carry; 68. if(k>9) 69. { 70. carry=1; 71. k-=10; 72. sum[count]=k+'0'; 73. 74. } 75. else 76. { 77. sum[count]=k+'0'; 78. carry=0; 79. } 80. count++; 81. if(i==0 && carry==1) sum[count]='1'; 82. if(i==0 && carry==0) count--; 83. } 84. sum[count+1]='\0'; 85. int j; 86. char t; 87. int x=count; 88. for(j=0; j<=count/2; j++) 89. { 90. 91. t=sum[j]; 92. sum[j]=sum[x]; 93. sum[x]=t; 94. x--; 95. } 96. string st(sum); 97. return BigInt(st); 98. };
6-4 学生成绩的输入和输出(运算符重载)
分数 5
全屏浏览题目
切换布局
作者 何振峰
单位 福州大学
现在需要输入一组学生的姓名和成绩,然后输出这些学生的姓名和等级。
输入时,首先要输入学生数(正整数)N。接着输入N组学生成绩,每组成绩包括两项:第一项是学生姓名,第二项是学生的成绩(整数)。
输出时,依次输出各个学生的序号(从1开始顺序编号),学生姓名,成绩等级(不小于60为PASS,否则为FAIL)
函数接口定义:
面向Student类对象的流插入和流提取运算符
裁判测试程序样例:
#include <iostream> #include <string> using namespace std; /* 请在这里填写答案 */ int main(){ int i, repeat; Student st; cin>>repeat; for(i=0;i<repeat;i++){ cin>>st; cout<<st<<endl; } return 0; }
输入样例:
1. 3 2. Li 75 3. Zhang 50 4. Yang 99
输出样例:
1. 1. Li PASS 2. 2. Zhang FAIL 3. 3. Yang PASS
1. class Student{ 2. public : 3. Student ( string ,int); 4. 5. friend istream & operator >>(istream&,Student &); 6. friend ostream & operator <<(ostream&,Student &); 7. private: 8. string name; 9. int score; 10. }; 11. 12. 13. Student::Student( string name="def",int score=0){} 14. 15. istream &operator >>(istream & is ,Student &s ) 16. { 17. is>> s.name>>s.score; 18. return is; 19. } 20. ostream &operator <<(ostream & os ,Student &s) 21. { 22. static int sum;sum=sum+1; 23. os<<sum<<". "<<s.name<<" "; 24. if(s.score>=60)os<<"PASS"; 25. else{os<<"FAIL";} 26. 27. return os; 28. }
6-5 Point类的运算
分数 5
全屏浏览题目
切换布局
作者 杨军
单位 四川师范大学
定义Point类,有坐标x,y两个私有成员变量;对Point类重载“+”(相加)、“-”(相减)和“==”(相等)运算符,实现对坐标的改变,要求用友元函数和成员函数两种方法实现。对Point类重载<<运算符,以使得代码 Point p; cout<<p<<endl;可以输出该点对象的坐标。
函数接口定义:
实现Point类。
裁判测试程序样例:
/* 请在这里填写答案 */ int main(int argc, char const *argv[]) { Point p1(2,3); cout<<p1<<endl; Point p2(4,5); cout<<p2<<endl; Point p3 = p1+p2; cout<<p3<<endl; p3 = p2-p1; cout<<p3<<endl; p1 += p2; cout<<p1<<endl; cout<<(p1==p2)<<endl; return 0; }
输入样例:
无
输出样例:
在这里给出相应的输出。例如:
1. 2,3 2. 4,5 3. 6,8 4. 2,2 5. 6,8 6. 0
1. #include<bits/stdc++.h> 2. using namespace std; 3. class Point 4. { 5. int x,y; 6. public: 7. Point(int xx=0, int yy=0):x(xx),y(yy) {} 8. friend Point operator+(Point &c1, Point &c2); 9. friend Point operator-(Point &c1, Point &c2); 10. friend Point operator+=(Point &c1, Point &c2); 11. friend bool operator==(Point &c1, Point &c2); 12. friend ostream &operator<<(ostream &out, Point &c); 13. }; 14. 15. Point operator+(Point &c1, Point &c2) 16. { 17. return Point(c1.x+c2.x, c1.y+c2.y); 18. } 19. 20. Point operator-(Point &c1, Point &c2) 21. { 22. return Point(c1.x-c2.x, c1.y-c2.y); 23. } 24. 25. Point operator+=(Point &c1, Point &c2) 26. { 27. return Point(c1.x+=c2.x, c1.y+=c2.y); 28. } 29. 30. bool operator==(Point &c1, Point &c2) 31. { 32. if(c1.x==c2.x && c1.y==c2.y) return 1; 33. else return 0; 34. } 35. 36. ostream &operator<<(ostream &out, Point &c) 37. { 38. out<<c.x<<","<<c.y; 39. return out; 40. }
6-7 矩阵运算
分数 10
全屏浏览题目
切换布局
作者 范鹏程
单位 内蒙古师范大学
根据main函数中矩阵对象的定义与使用,定义相关的矩阵类Array,并利用运算符重载的方法实现矩阵的加法与输入输出操作。(为简化问题,矩阵中元素为2位以内整数,要求矩阵按照行列的格式输出,每个元素占3位宽度)
类定义:
class Array /* 请在这里填写答案 */
测试程序样例:
int main() { Array arr1,arr2,arr3; cin>>arr1; cin>>arr2; cout<<arr1<<endl; cout<<arr2<<endl; arr3=arr1+arr2; cout<<arr3; return 0; }
输入样例:
1. 1 2 3 4 5 6 2. 7 8 9 1 11 12
输出样例:
1. 1 2 3 2. 4 5 6 3. 4. 7 8 9 5. 1 11 12 6. 7. 8 10 12
1. #include<bits/stdc++.h> 2. using namespace std; 3. class Array 4. { 5. private: 6. int a,b,c,d,e,f; 7. public: 8. Array(int A=0,int B=0,int C=0,int D=0,int E=0,int F=0) 9. { 10. a=A; 11. b=B; 12. c=C; 13. d=D; 14. e=E; 15. f=F; 16. } 17. friend istream & operator>>(istream &in,Array &A) 18. { 19. in>>A.a>>A.b>>A.c>>A.d>>A.e>>A.f; 20. return in; 21. } 22. friend ostream & operator<<(ostream &out,Array &A) 23. { 24. out<<setw(3)<<setfill(' ')<<A.a<<setw(3)<<setfill(' ')<<A.b<<setw(3)<<setfill(' ')<<A.c<<endl<<setw(3)<<setfill(' ')<<A.d<<setw(3)<<setfill(' ')<<A.e<<setw(3)<<setfill(' ')<<A.f<<endl; 25. } 26. friend Array operator+(Array &a1, Array &a2) 27. { 28. return Array (a1.a+a2.a,a1.b+a2.b,a1.c+a2.c,a1.d+a2.d,a1.e+a2.e,a1.f+a2.f); 29. } 30. };
6-8 时钟模拟
分数 10
全屏浏览题目
切换布局
作者 范鹏程
单位 内蒙古师范大学
一个Time类,数据成员有时、分、秒。要求模拟秒表,每次走一秒,满60秒进位,秒又从零开始计数。满60分进位,分又从零开始计数。输出时、分和秒的值。(使用重载++运算符实现)
时间类定义:
class MyTime
测试程序样例:
/* 请在这里填写答案 */ int main() { MyTime t1,t2(23,59,59),t3; cin>>t3; ++t1; cout<<t1<<endl; ++t2; cout<<t2<<endl; ++t3; cout<<t3<<endl; return 0; }
输入样例:
12 35 59
输出样例:
1. 0:0:1 2. 0:0:0
1. #include<bits/stdc++.h> 2. using namespace std; 3. class MyTime 4. { 5. private: 6. int h, m, s; 7. public: 8. MyTime() 9. { 10. h = 0; 11. m = 0; 12. s = 0; 13. } 14. MyTime(int h,int m,int s):h(h),m(m),s(s) 15. {} 16. MyTime operator++() 17. { 18. this->s++; 19. if (this->s >= 60) 20. { 21. this->s = 0; 22. this->m++; 23. } 24. if (this->m >= 60) 25. { 26. this->m = 0; 27. this->h++; 28. } 29. if (this->h >= 24) 30. { 31. this->h= 0; 32. } 33. } 34. friend istream& operator>>(istream& is, MyTime& t) 35. { 36. is >> t.h >> t.m >> t.s; 37. return is; 38. } 39. friend ostream& operator<<(ostream& os, MyTime& t) 40. { 41. os << t.h <<":" << t.m<<":" << t.s; 42. } 43. };
6-9 日期类的设计与实现
分数 10
全屏浏览题目
切换布局
作者 范鹏程
单位 内蒙古师范大学
使用重载运算符(++,+=,<<等)实现日期类的操作。功能包括:
1)设置日期,如果日期设置不符合实际,则设置为默认日期(1900年1月1日)
2)在日期对象中向日期添加1或者加若干天(加入日期值后根据实际的日期进行月份、年份的变化)
3)重载流插入运算符进行日期的输出,其中月份要用名称表示
###定义类MyDate:
class MyDate
主测试程序样例:
#include <string> #include <iostream> using namespace std; /* 请在这里填写答案 */ int main() { int m,d,y; MyDate d1,d2,d3; cin>>m>>d>>y; d1.setDate(m,d,y); cin>>m>>d>>y; d2.setDate(m,d,y); cin>>m>>d>>y; d3.setDate(m,d,y); cout << "d1 is " << d1 << "\nd2 is " << d2; cout << "\n\nd1 += 7 is " << ( d1 += 7 ); cout << "\n\n d2 is " << d2; cout << "\n++d2 is " << ++d2; cout << "\n\nTesting the prefix increment operator:\n"<< " d3 is " << d3 << endl; cout << "++d3 is " << ++d3 << endl; cout << " d3 is " << d3; cout << "\n\nTesting the postfix increment operator:\n"<< " d3 is " << d3 << endl; cout << "d3++ is " << d3++ << endl; cout << " d3 is " << d3 <<endl; }
输入样例:
在这里给出一组输入。例如:
1. 13 38 100 2. 12 31 2009 3. 2 28 2000
输出样例:
在这里给出相应的输出。例如:
1. d1 is January 1, 1900 2. d2 is December 31, 2009 3. 4. d1 += 7 is January 8, 1900 5. 6. d2 is December 31, 2009 7. ++d2 is January 1, 2010 8. 9. Testing the prefix increment operator: 10. d3 is February 28, 2000 11. ++d3 is February 29, 2000 12. d3 is February 29, 2000 13. 14. Testing the postfix increment operator: 15. d3 is February 29, 2000 16. d3++ is February 29, 2000 17. d3 is March 1, 2000
1. class MyDate{ 2. private: 3. int m,d,y; 4. public: 5. MyDate(int pm=1,int pd=1,int py=1900) 6. { 7. m=pm;d=pd;y=py; 8. } 9. void setDate(int m,int pd,int year) 10. { 11. bool rn=false; 12. rn = ((0 == year % 4) && (0 != year % 100)) || (0 == year % 400); 13. bool err=((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&pd>31)|| 14. ((m==4||m==6||m==9||m==11)&&pd>30)||(m==2&&rn&&pd>29||!rn&&m==2&&pd>28)||m>12; 15. if(err) 16. { 17. m=1;d=1;y=1900; 18. }else 19. { 20. this->m=m;d=pd;y=year; 21. } 22. } 23. MyDate operator++() 24. { 25. bool rn=false; 26. rn = ((0 == y % 4) && (0 != y % 100)) || (0 == y % 400); 27. ++d; 28. bool err=((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&d>31)|| 29. ((m==4||m==6||m==9||m==11)&&d>30)||(m==2&&rn&&d>29||!rn&&m==2&&d>28); 30. if(err) 31. { 32. d=1; 33. m++; 34. if(m>12) 35. { 36. m=1; 37. y++; 38. } 39. } 40. return *this; 41. } 42. MyDate operator++(int) 43. { 44. MyDate md=*this; 45. operator++(); 46. return md; 47. } 48. MyDate operator+=(int day) 49. { 50. for (int i = 0; i <day ; ++i) 51. { 52. operator++(); 53. } 54. return *this; 55. } 56. friend ostream& operator<<(ostream & outd,MyDate md); 57. }; 58. ostream& operator<<(ostream & outd,MyDate md) 59. { 60. string month[12]={"January","February","March","April","May","June","July", 61. "August","September","October","November","December"}; 62. outd<<month[md.m-1]<<' '<<md.d<<", "<<md.y; 63. return outd; 64. }