CPP2022-27-运算符重载(下)

简介: CPP2022-27-运算符重载(下)

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. }
相关文章
|
7月前
|
编译器 C++
CPP的常量引用
CPP的常量引用
59 0
|
机器学习/深度学习 人工智能 网络协议
CPP2022-23-函数进阶-函数指针
CPP2022-23-函数进阶-函数指针
251 0
|
7月前
|
存储 C++
CPP的类和对象
CPP的类和对象
48 1
|
7月前
|
编译器 C++
CPP的函数重载
CPP的函数重载
66 0
|
Serverless C语言
CPP2022-16-宏、函数重载与函数模板(上)
CPP2022-16-宏、函数重载与函数模板
177 0
|
7月前
|
编译器 C语言 C++
define与const关键字的多种用法
define与const关键字的多种用法
77 0
|
7月前
|
C语言
详解C语言可变参数列表(stdarg头文件及其定义的宏)
详解C语言可变参数列表(stdarg头文件及其定义的宏)
103 0
|
7月前
|
存储 编译器 程序员
【新手解答2】深入探索 C 语言:变量名、变量 + 函数声明 vs 函数定义 + main的声明 + 头文件和源文件的关系
【新手解答2】深入探索 C 语言:变量名、变量 + 函数声明 vs 函数定义 + main的声明 + 头文件和源文件的关系
119 0