实验12 运算符重载

1-三维坐标点的平移

#include<iostream>
#include<iomanip>
using namespace std;
class point
{
	int x;
	int y;
	int z;
public:
	point()
	{
		x = 0; y = 0; z = 0;
	}
	point(int a,int b,int c):x(a),y(b),z(c){}
	void setpoint(point &a) {
		x = a.x; y = a.y; z = a.z;
	}
	friend point& operator ++(point& a) {
		a.x++;
		a.y++;
		a.z++;
		return a;
	}
	friend point operator ++(point& a, int) {
		point temp(a);
		a.x++;
		a.y++;
		a.z++;
		return temp;
	}
	friend point& operator --(point& a) {
		a.x--;
		a.y--;
		a.z--;
		return a;
	}
	friend point operator --(point& a, int) {
		point temp(a);
		a.x--;
		a.y--;
		a.z--;
		return temp;
	}
	void show() {
		cout << "x=" << x << " y=" << y << " z=" << z << endl;
	}
};
int main() {
	int x, y, z;
	cin >> x >> y >> z;
	point p(x, y, z);
	point p1(p);
	p1++;
	p1.show();
	p1.setpoint(p);
	point p2(p1++);
	p2.show();
	p1.setpoint(p);
	(++p1).show();
	p1.setpoint(p);
	point p3(++p1);
	p3.show();
	p1.setpoint(p);
	p1--;
	p1.show();
	p1.setpoint(p);
	point p4(p1--);
	p4.show();
	p1.setpoint(p);
	(--p1).show();
	p1.setpoint(p);
	point p5(--p1);
	p5.show();
}

2-矩阵相加

#include<iostream>
#include<iomanip>
using namespace std;
class matrix
{
	int m, n;
	int** data;
public:
	matrix() { m = 0; n = 0; data = NULL; }
	matrix(int m1, int n1) {
		m = m1;
		n = n1;
		data = new int* [m];
		for (int i = 0; i < m; i++) {
			data[i] = new int[n];
		}
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++)
			{
				cin >> data[i][j];
				data[i][j] = data[i][j];
			}
		}
	}
	matrix& operator +(matrix& a) {
		for (int i = 0; i < m; i++) {
			for (int j = 0; i < n; j++) {
				a.data[i][j] += data[i][j];
			}
		}
		return a;
	}
	void show() {
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; i++) {
				if (j == n - 1) cout << data[i][j] << endl;
				else cout << data[i][j] << " ";
			}
		}
	}
	~matrix() { if (data != NULL) delete[]data; }
};
int main() {
	int t, m, n;
	cin >> t;
	while (t--) {
		cin >> m >> n;
		matrix m1(m, n);
		cin >> m >> n;
		matrix m2(m, n);
		(m1 + m2).show();
	}
}

3-字符串比较

//#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<iomanip>
#include<string>
#include<string.h>
using namespace std;
class str {
	char* p;
public:
	str() { p = NULL; }
	str(char* s){
		p = new char[strlen(s) + 1];
		strcpy(p, s);
	}
	friend bool operator >(str& a, str& b) {
		if (strcmp(a.p, b.p)>0) return 1;
		else return 0;
	}
	friend bool operator ==(str& a, str& b) {
		if (!strcmp(a.p, b.p)) return true;
		else return false;
	}
	friend bool operator <(str& a, str& b) {
		if (strcmp(a.p, b.p) < 0) return true;
		else return false;
	}
	~str() { if (p != NULL) delete p; }
	void show() {
		cout << p << endl;
	}
};
int main() {
	char p1[100], p2[100], p3[100];
	cin.getline(p1,100);
	cin.getline(p2,100);
	cin.getline(p3,100);
	str s1(p1);
	str s2(p2);
	str s3(p3);
	if (s1 > s2) s1.show();
	else s2.show();
	if (s1 < s3) s1.show();
	else s3.show();
	if (s2 == s3) s2.show();
	else s3.show();
}

4- 四进制加法

#include<iostream>
using namespace std;
#include<cmath>
class quartnary
{
	int num;
public:
	quartnary() { num = 0; }
	quartnary(int m) :num(m) {}
	void set(int a) { num = a; }
	quartnary& operator +(quartnary& a) {
		int sum, s, n = 0, _sum = 0;
		sum = num + a.num;
		s = sum;
		while (s) {	
			s= s/ 10;
			n++;
		}
		for (int i = 0; i < n + 1; i++) {
			if (sum % 10 >= 4) 		 
				sum = (sum / 10 + 1) * 10 + sum % 10 - 4;
			_sum += sum % 10 * pow(10, i);	 
			sum /= 10;		
		}
		num = _sum;
		return *this;
	}
	void show() { cout << num << endl; }
};
int main() {
	int t, num;
	cin >> t ;
	quartnary* p;
	quartnary a;
	p = new quartnary[t];
	for(int i=0;i<t;i++){
		cin >> num;
		p[i].set(num);
	}
	for (int i = 0; i < t; i++) {
		a = a + p[i];
	}
	a.show();
}

5-学生生日差值计算

#include<iostream>
using namespace std;
#include<string>
#include<stdlib.h>
class Student
{
	string name;
	int year;
	int month;
	int day;
public:
	Student(){}
	void set(string n, int a, int b, int c) { name = n; year = a; month = b; day = c; }
	Student(string n,int a,int b,int c ):name(n),year(a),month(b),day(c){}
	int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	int judge(int y)
	{
		if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) {
			days[2] = 29;
			return 366;
		}
		else {
			days[2] = 28;
			return 365;
		}
	}
	int operator -(Student& s) {
		int startyear = year < s.year ? year : s.year;
		int sum1 = day,sum2=s.day;
		for (int i = startyear; i < year; i++) {
			sum1 +=judge(i);
		}
		judge(year);
		for (int i = 1; i < month; i++) {
			sum1 += days[i];
		}
		for (int i = startyear; i < s.year; i++) {
			sum2 += judge(i);
		}
		judge(s.year);
		for (int i = 1; i < month; i++)
			sum2 += days[i];
		return sum1 - sum2;
	}
	string getname() { return name; }
};
int main() {
	int t,year,month,day;
	string name;
	cin >> t;
	Student *S = new Student[t];
	Student s1;
	for (int i = 0; i < t; i++) {
		cin >> name >> year >> month >> day;
		S[i].set(name, year, month, day);
	}
	int m=0, n=0,max=0;
	for (int i = 0; i < t; i++) {
		for (int j = i + 1; j < t; j++)
		{
			if (abs(S[i] - S[j]) > max) {
				max = abs(S[i] - S[j]);
				m = i; n = j;
			}
		}
	}
	if (m > n) { int t = m; m = n; n = t; }
	cout << S[m].getname() << "和" << S[n].getname() << "年龄相差最大,为" << abs(S[m] - S[n]) << "天。" << endl;
}
//#include<iostream>
//#include<iomanip>
//using namespace std;
//
//class Date {
//    int year, month, day;
//    int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//public:
//    Date(int y = 0, int m = 0, int d = 0) :year(y), month(m), day(d) {}
//    void judge1(int y) {
//        if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
//            days[2] = 29;
//        else
//            days[2] = 28;
//    }
//    long judge2(int y) {
//        if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
//            return 366;
//        else
//            return 365;
//    }
//    Date operator+(int d) {
//        Date t(*this);
//        d += t.day;
//        judge1(t.year);
//        while (d > days[t.month]) {
//            d -= days[t.month];
//            t.month++;
//            if (t.month == 13) {
//                t.month = 1;
//                t.year++;
//                judge1(t.year);
//            }
//        }
//        t.day = d;
//        return t;
//    }
//    Date operator-(int d) {
//        Date t(*this);
//        d = t.day - d;
//        judge1(t.year);
//        while (d <= 0) {
//            t.month--;
//            if (t.month == 0) {
//                t.month = 12;
//                t.year--;
//                judge1(t.year);
//            }
//            d += days[t.month];
//        }
//        t.day = d;
//        return t;
//    }
//    long operator-(const Date& date) {
//        int startyear = year < date.year ? year : date.year;
//
//        long sum1 = day;
//        for (int i = startyear; i < year; i++)
//            sum1 += judge2(i);
//        judge1(year);
//        for (int i = 1; i < month; i++)
//            sum1 += days[i];
//
//        long sum2 = date.day;
//        for (int i = startyear; i < date.year; i++)
//            sum2 += judge2(i);
//        judge1(date.year);
//        for (int i = 1; i < date.month; i++)
//            sum2 += days[i];
//
//        return sum1 - sum2;
//    }
//    void print() {
//        cout << year << "-" << setfill('0') << setw(2) << month << "-" << setfill('0') << setw(2) << day << endl;
//    }
//};
//
//int main() {
//    Date d1(2022, 12, 31), d2(2022, 1, 1), d3;
//    d3 = d1 + 1;
//    d3.print();
//    d3 = d2 - 1;
//    d3.print();
//    cout << d1 - d2 << endl;
//}

6-时钟调整

#include<iostream>
using namespace std;
#include<string>
#include<stdlib.h>
class clo
{
	int hour;
	int minute;
	int second;
public:
	clo(){}
	clo(int h,int m,int s):hour(h),minute(m),second(s){}
	clo& operator++() {
		if (second == 59) {
			second = 0;
			if (minute == 59) {
				minute = 0;
				if (hour == 11)
					hour = 0;
				else hour += 1;
			}
			else
				minute += 1;
		}
		else second += 1;
		return *this;
	}
	clo operator --(int) {
		if (second == 0) {
			second = 59;
			if (minute == 0) {
				minute = 59;
				if (hour == 0)
					hour = 59;
				else hour -= 1;
			}
			else minute -= 1;
		}
		else second -= 1;
		return *this;
	}
	void show() {
		cout << hour << ":" << minute << ":" << second << endl;
	}
};
int main() {
	int hour, minute, second,t,time;
	cin >> hour >> minute >> second;
	clo c(hour, minute, second);
	cin >> t;
	while (t--) {
		cin >> time;
		if (time > 0) while (time--) ++c;
		else if (time < 0) while (abs(time)) { c--; time--; }
		c.show();
	}
}
//老师的代码
#include <iostream>
using namespace std;

class point{
 int x,y,z;
public:
  point(int x=0,int y=0,int z=0):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){
      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){
      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 p(x,y,z),p1,p2;

  p1=p;
  p2=p1++;
  p1.show();
  p2.show();

  p1=p;
  p2=++p1;
  p1.show();
  p2.show();

  p1=p;
  p2=p1--;
  p1.show();
  p2.show();

  p1=p;
  p2=--p1;
  p1.show();
  p2.show();
}
====================================================================================
#include <iostream>
using namespace std;

class Cmatrix
{
private:
    int m, n, **data;
public:
    Cmatrix(int m1, int n1): m(m1), n(n1){
        data=new int*[m];
        for(int i=0; i<m; ++i){
            data[i]=new int[n];
            for(int j=0; j<n; ++j)
                cin>>data[i][j];
        }
    }
    Cmatrix(const Cmatrix &x): m(x.m), n(x.n){
        data=new int*[m];
        for(int i=0; i<m; ++i){
            data[i]=new int[n];
            for(int j=0; j<n; ++j)
                data[i][j]=x.data[i][j];
        }
    }
    void print() const
    {
        for(int i=0; i<m; ++i)
            for(int j=0; j<n; ++j)
                cout<<data[i][j]<<(j==n-1 ? "\n" : " ");
    }
    Cmatrix operator+(const Cmatrix &x)
    {
        Cmatrix c(*this);
        for(int i=0; i<m; ++i)
            for(int j=0; j<n; ++j)
                c.data[i][j]+=x.data[i][j];
        return c;
    }
    ~Cmatrix(){
      for(int i=0; i<m; i++ )
         delete []data[i];
      delete []data;
    }
};

int main()
{
    int t, m, n;
    cin>>t;
    while(t--)
    {
        cin>>m>>n;
        Cmatrix x1(m, n);
        Cmatrix x2(m, n);
        (x1+x2).print();
    }

    return 0;
}
====================================================================================
一、按题目要求,使用字符指针处理字符串
#include<iostream>
#include<cstring>
using namespace std;

class str{
    char *p;
public:
    str(){p=new char[30];}
    str(char *s){p=new char[strlen(s)+1];strcpy(p,s);}
    friend bool operator>(str &,str &);
    friend bool operator<(str &,str &);
    friend bool operator==(str &,str &);
    void show(){cout<<p<<endl;}
};
bool operator>(str &a,str &b){
    if(strcmp(a.p,b.p)>0){
        return true;
    }
    return false;
}
bool operator<(str &a,str &b){
    if(strcmp(a.p,b.p)<0){
        return true;
    }
    return false;
}
bool operator==(str &a,str &b){
    if(strcmp(a.p,b.p)==0){
        return true;
    }
    return false;
}

int main()
{   int len=30;
    char p[len];

    cin.getline(p,len);
    str A(p);
    cin.getline(p,len);
    str B(p);
    cin.getline(p,len);
    str C(p);

    if(A>B)
        A.show();
    else
        B.show();

    if(A<C)
        A.show();
    else
        C.show();

    if(B==C)
        B.show();
    else
        C.show();

    return 0;
}


二、用string处理字符串
#include<iostream>
#include<cstring>
using namespace std;

class str{
    string p;
public:
    str(){}
    str(string s){p=s;}
    friend bool operator>(str &,str &);
    friend bool operator<(str &,str &);
    friend bool operator==(str &,str &);
    void show(){cout<<p<<endl;}
};
bool operator>(str &a,str &b){
    if(a.p>b.p){
        return true;
    }
    return false;
}
bool operator<(str &a,str &b){
    if(a.p<b.p){
        return true;
    }
    return false;
}
bool operator==(str &a,str &b){
    if(a.p==b.p){
        return true;
    }
    return false;
}

int main()
{
    string p;
    getline(cin,p);
    str A(p);
    getline(cin,p);
    str B(p);
    getline(cin,p);
    str C(p);

    if(A>B)
        A.show();
    else
        B.show();

    if(A<C)
        A.show();
    else
        C.show();

    if(B==C)
        B.show();
    else
        C.show();

    return 0;
}

====================================================================================
#include <iostream>
using namespace std;

class Number{
   int value;
public:
   Number(int n):value(n){}
   void operator+(const Number& a){
      int x,y,temp,result=0,jinwei=0,quanzhi=1;
      x=value;
      y=a.value;


      while(x+y+jinwei){
        temp=(x%10)+(y%10)+jinwei;

        if(temp>=4){
           jinwei=1;
           temp-=4;
        }
        else
           jinwei=0;

        result+=temp*quanzhi;

        quanzhi*=10;
        x/=10;
        y/=10;
      }
      value=result;
   }
   void show(){cout<<value;}
};

int main(){
  int t,x;
  cin>>t;
  cin>>x;
  Number temp(x);
  while(--t){
    cin>>x;
    Number a(x);
    temp+a;
  }
  temp.show();
}
====================================================================================
一、利用sort排序:
#include<iostream>
#include<algorithm>
using namespace std;

class Student;
class Date
{
    int year,month,day;
public:
    Date(int y=0,int m=0,int d=0):year(y),month(m),day(d){}
    void setData(int y,int m,int d){
        year=y;
        month=m;
        day=d;
    }
    int isLeap(int y)const{
        if((y%400==0)||(y%4==0&&y%100!=0))
            return 1;
        return 0;
    }
    int sumOfMonth(int y,int m)const
    {
        int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        if(m==2)
            month[2]=29;
        return month[m];
    }
    int sumOfDay(int y) const  //y表示年份,计算与y-1-1之间相隔的天数
    {
        int i,j;
        int sum=day;
        for( i=y; i<year; i++ )
            sum+=365+isLeap(i);
        for( i=1; i<month; i++ )
           sum+=sumOfMonth(year,i);
        return sum;
    }
    int getyear()const{return year;}
};

class Student
{
    string name;
    Date date;
public:
    Student(string n="",int y=0,int m=0,int d=0):date(y,m,d),name(n){}
    void setData(string n,int y,int m,int d){
        name=n;
        date.setData(y,m,d);
    }
    string getName(){
        return name;
    }
    friend int operator - (const Student& s1, const Student& s2){
        int y1=s1.date.getyear(),y2=s2.date.getyear(),y;
        y=(y1<y2)?y1:y2;  //获得日期s1,s2中较小的年份
        return s1.date.sumOfDay(y)-s2.date.sumOfDay(y);
    }
};

bool cmp(const Student& s1, const Student& s2) {
    if(s1-s2<0)
        return true;
    return false;
}

int main()
{
    int t,year,month,day;
    string name;

    cin>>t;
    Student stu[t];
    for(int i=0;i<t;i++){
        cin>>name>>year>>month>>day;
        stu[i].setData(name,year,month,day);
    }

    sort(stu,stu+t,cmp);
    int maxOfNum=stu[t-1]-stu[0];
    cout<<stu[0].getName()<<"和"<<stu[t-1].getName()<<"年龄相差最大,为"<<maxOfNum<<"天。"<<endl;

    return 0;
}


//
二、自己手动排序
#include<iostream>
using namespace std;

class Date
{
    int year,month,day;
public:
    Date(int y=0,int m=0,int d=0):year(y),month(m),day(d){}
    void setData(int y,int m,int d){
        year=y;
        month=m;
        day=d;
    }
    int isLeap(int y){
        if((y%400==0)||(y%4==0&&y%100!=0))
            return 1;
        return 0;
    }
    int sumOfMonth(int y,int m)
    {
        int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        if(m==2)
         month[2]=29;
        return month[m];
    }
    int sumOfDay()  //比较和1900-1-1之间相隔的天数
    {
        int i,j;
        int sum=day;
        for( i=1990; i<year; i++ )
            sum+=365+isLeap(i);
        for( i=1; i<month; i++ )
           sum+=sumOfMonth(year,i);
        return sum;
    }
};

class Student
{
    string name;
    Date date;
public:
    Student(string n="",int y=0,int m=0,int d=0):date(y,m,d),name(n){}
    void setData(string n,int y,int m,int d){
        name=n;
        date.setData(y,m,d);
    }
    int operator - (Student &s){
        return abs(date.sumOfDay()-s.date.sumOfDay());
    }
    string getName(){
        return name;
    }
};

int main()
{
    int t,i,j;
    int maxi,maxj,maxOfNum=0,year,month,day;
    string name;

    cin>>t;
    Student *stu=new Student[t];
    for(i=0;i<t;i++){
        cin>>name>>year>>month>>day;
        stu[i].setData(name,year,month,day);
    }

    for(i=0;i<t;i++){   //穷举法
        for(j=i+1;j<t;j++){
           if(stu[i]-stu[j]>maxOfNum){
              maxOfNum=stu[i]-stu[j];
              maxi=i;
              maxj=j;
            }
        }
    }
    cout<<stu[maxi].getName()<<"和"<<stu[maxj].getName()<<"年龄相差最大,为"<<maxOfNum<<"天。"<<endl;

    return 0;
}
====================================================================================
#include <iostream>
using namespace std;

class Clock
{
    int h,m,s;
public:
    Clock(int h=0,int m=0,int s=0):h(h),m(m),s(s){}

    Clock& operator++(){
        s++;
        if(s==60)
        {   s=0;
            m++;
            if(m==60)
            {  m=0;
               h++;
                if(h==12)
                    h=0;
           }
       }
      return *this;
    }

    Clock& operator--(int)
    {   s--;
        if(s<0)
        {   s=59;
            m--;
            if(m<0)
            {   m=59;
                h--;
                if(h<0)
                    h=11;
            }
        }
        return *this;
    }

    void print()
    {
        cout<<h<<":"<<m<<":"<<s<<endl;
    }
};

int main()
{
    int t,h,m,s,n;

    cin>>h>>m>>s;
    Clock a(h,m,s);

    cin>>t;
    while(t--)
    {
        cin>>n;

        if(n>0){
           for(int i=0;i<n;++i)
              ++a;
        }
        if(n<0){
            for(int i=0;i<-n;++i)
                a--;
        }

        a.print();
    }

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值