SCU-C++习题集 第四章部分

实现矩阵加法

使用运算符重载 定义矩阵加法和流输入、流输出算符。

#include <iostream>
using namespace std;
class M{                                         //定义矩阵类
public:
   M();                                         
    friend M operator+(M &a,M &b);        //重载运算符“+”
    friend istream &operator>>(istream &in,M &c1);
    friend ostream &operator<<(ostream &out,M &c1);                                  
private:
   int mat[2][3];
 };

M::M()                                      //定义构造函数
{for(int i=0;i<2;i++)
  for(int j=0;j<3;j++)
   mat[i][j]=0;
}

M operator+(M &a,M &b)                //定义重载运算符“+”函数
{M c;
 for(int i=0;i<2;i++)
   for(int j=0;j<3;j++)
     {c.mat[i][j]=a.mat[i][j]+b.mat[i][j];}
 return c;
}

istream & operator >>(istream &cin, M &c1){                                 
 for(int i=0;i<2;i++){ 
 for(int j=0;j<3;j++){
 	cin>>c1.mat[i][j];
 }
}
return cin;
}

ostream & operator <<(ostream &cout, M &c1){                            for (int i=0;i<2;i++)
  {for(int j=0;j<3;j++)
   {cout<<c1.mat[i][j]<<" ";
   }
   cout<<endl;
    }
    return cout;
{
int main(){
    M a, b, c;
    cin >> a;
    cin >> b;
    c = a + b;
    cout << c;
    return 0;
}

实现复数运算

使用运算符重载 加减乘除和流输入、流输出,实现复数运算。

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

class Complex{
public:
Complex() { real = 0; imag = 0; }
Complex(double r, double i) { real = r; imag = i; }
Complex operator + (Complex c2);
Complex operator - (Complex c2);
Complex operator * (Complex c2);
Complex operator / (Complex c2);
friend ostream& operator << (ostream&, Complex&);
friend istream& operator >> (istream&, Complex&);
Complex ( int r){ real = r; imag = 0; }
private:
double real;
double imag;
};

Complex Complex::operator + (Complex c2){
return Complex(real + c2.real, imag + c2.imag);
}
Complex Complex::operator - (Complex c2){
return Complex(real - c2.real, imag - c2.imag);
}
Complex Complex::operator * (const Complex c2) {
	Complex tmp(real * c2.real - imag * c2.imag, real * c2.imag + imag * c2.real);
	return tmp;
}
Complex Complex::operator / (const Complex c2){
	 Complex c3; 
    c3.real = (real * c2.real + imag * c2.imag) / (c2.real*c2.real + c2.imag * c2.imag);
    c3.imag = (imag * c2.real - real * c2.imag) / (c2.real*c2.real + c2.imag * c2.imag);
     return c3;
}
ostream& operator << (ostream& output,Complex& c){
if (c.real != 0){
    if (c.imag > 0){
        if (c.imag == 1) {
             output << c.real << "+" << "i";
        }
        else{
            output << c.real << "+" << c.imag << "i";
        }
    }
    else if (c.imag < 0){
        if (c.imag == -1){
            output << c.real << "-" << "i";
        }
        else{
            output << c.real << c.imag << "i";
        }
    }
    else{
         output << c.real;
    }
}
else{
    if (c.imag == 0){
        output << 0;
    }
    else if (c.imag == 1){
        output << "i";
    }
    else if (c.imag == -1){
        output << "-i";
    }
    else{
        output << c.imag << "i";
    }
}
return output;
}
istream& operator >> (istream& input, Complex& c){
input >>c.real >>c.imag;
return input;
}
int main(){
    Complex a, b, c;
    cin >> a >> b;
    c = a + b + 5;
    cout << c << endl;
    c = a - b - 5;
    cout << c << endl;
    c = a * b * 5;
    cout << c << endl;
    c = a / b / 5;
    cout << c << endl;
    return 0;
}

程序补充

一、重载“()”与构造

与前第三章的补充题二对比知道重载函数和引用函数的区别

#include <iostream> 
using namespace std;
class A {
public:
    int v;
    // 你的代码添加在这里
    A(){v=0;}//构造
	int& operator()(){//重载()运算符 把v 的值进行返回
		return v;
		//return this->v;//或者使用this指到当前对象
	}
};
int main(){
    int n;
    cin >> n;
    A a;
    cout << a.v << endl;
    a() = n;//重载了()
    cout << a.v << endl;
    return 0;
}
二、重载“=”与构造
#include <iostream>
using namespace std;
class A{
public:
    int value;
    A(int n = 0){//带参构造
        value = n;
    }
    // 你的代码添加在这里 
A& operator=(const A& a){//重载等号,因为双目运算符需要确定主体为前者
    	value= 5*a.value;
	}
};
int main(){
    int x;
    cin >> x;
    A a(x);
    A b;//默认构造
    b = a;//观察知此处应该重载才能进行倍数运算
    cout << b.value << endl;
    return 0;
} 

用类模板设计一个通用类数组模块

#include<iostream>
#include<string>
using namespace std;
template <typename T>//声明类
class Array{
public:
   Array(int n){
   xn=n;
   cout<<"分配"<<n<<"个数组元素"<<endl;
   }     
   T& operator[](int i){//重载运算符[],连接数组元素与数
   	return a[i];
   } 
  ~Array(){//析构函数
  	cout<<"释放数组"<<endl;
  }                                  
private:
	int xn;
   T a[100];
};
template<typename T>
void mysort(Array<T>&a,int n){//冒泡排序
int j=0,m=0;
for (j = 0; j < n; j++) {
	for ( m = 0; m < n-1; m++) {
		T temp;
		if (a[m] > a[m+1]) {
			temp = a[m];
			a[m] = a[m + 1];
			a[m + 1] = temp;
			}
		}
	}
}
int main(){
    int n;
    cin >> n;
    Array<int> a(n);//指明实际变量类型int ,说明需要使用类模板
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    mysort(a, n); // 排序 
    for (int i = 0; i < n; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
    return 0;
}

复制构造连接两个类

定义一个Teacher(教师)类和一个Student(学生)类,二者有共同的数据成员name(姓名)、age(年龄)、addr(地址),编写这两个类

#include <iostream>
# include <string>
using namespace std;
class Teacher; //声明老师类
class Student{
public:
	int age;
	string name;
	string addr;
void get_value();
};
void Student::get_value(){
	  
	cin>>name;cin>>age;
	cin>>addr;
}
class Teacher{
private:
int age;
string name;
string addr;
public:
Teacher (){};
void display();
Teacher(const Student & s);//复制构造函数
};

void Teacher::display(){
cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
cout<<"addr:"<<addr<<endl;
}
Teacher ::Teacher(const Student & s){//复制构造函数把学生的对象复制到老师的对象 
age=s.age;
name=s.name;
addr=s.addr;
}

int main(){
    Teacher t;
    Student s;
    s.get_value();
    t = s;
    t.display();
    return 0;
}

实现一个时间类

#include <iostream>
#include <iomanip>
using namespace std;
class Time{
public:
Time() { hour = 0; minute = 0; sec = 0; }
Time operator++();//重载前++
Time operator++(int);//重载后++
friend ostream& operator << (ostream&, Time&);
friend istream& operator >> (istream&, Time&);
private:
int hour;
int minute;
int sec;
};
Time Time::operator ++(){//前置单目运算符重载函数
sec++;
if (sec >= 60) {
sec = sec - 60; minute++;
if (minute >= 60) {
minute = minute - 60;
hour++; hour = hour % 24;
  }
}
return *this;}

Time Time::operator++(int){
Time temp(*this);
// 保存修改前的对象做返回值
++(*this);
return temp;}

ostream& operator << (ostream& output,Time& T){
cout << setw(2) << setfill('0') <<T.hour << ":" << setw(2) << setfill('0') <<T.minute << ":" << setw(2) << setfill('0') <<T.sec;
return output;}

istream& operator >> (istream& input, Time& T){
input >>T.hour >>T.minute>>T.sec;
return input;}

int main(){
    Time t, t1, t2;
    cin >> t;
    t1 = t++;
    t2 = ++t;
    cout << t << endl;
    cout << t1 << endl;
    cout << t2 << endl;
    return 0;
}

重载实现分数运算 加减乘除

#include<iostream>
#include<cmath>
using namespace std;
class Fraction{
	public:
		Fraction(){}
		Fraction(const int &a){
			top=a;den=1;
		}
friend ostream& operator << (ostream&, Fraction&);
friend istream& operator >> (istream&, Fraction &);
Fraction operator +(const int &i);
Fraction operator -(const int &i);
Fraction operator *(const int &i);
Fraction operator /(const int &i);
Fraction operator +(Fraction &p);
Fraction operator -(Fraction &p);
Fraction operator *(Fraction &p);
Fraction operator /(Fraction &p);
		private:
			int top;
			int den;	
};

void swap(int &x, int &y) {
	int tem;
	tem = x;
	x = y;
	y = tem;
}//交换 

int calculator(int a, int b) {
	int tem1 = abs(a), tem2 = abs(b);
	while (tem1 != tem2) {
		if (tem1 > tem2) {
			tem1 = tem1 - tem2;
		}
		else {
			swap(tem1, tem2);
		}
	}
	return tem1;
}//求最大公因数 

Fraction Fraction::operator +(const int &i){
	Fraction temp,p(i);
	if(p.den==den){
		temp.top=top+p.top;
		temp.den=den;
	}//同分母 
	else{
		temp.top=p.top*den+top*p.den;
		temp.den=den*p.den;
	}//通分 
	return temp;
}
Fraction Fraction::operator +(Fraction &p){
	Fraction temp;
	if(p.den==den){
		temp.top=top+p.top;
		temp.den=den;
	}//同分母 
	else{
		temp.top=p.top*den+top*p.den;
		temp.den=den*p.den;
	}//通分 
	return temp;
}

Fraction Fraction::operator -(const int &i){
	Fraction temp,p(i);
	if(p.den==den){
		temp.top=top-p.top;
		temp.den=den;
	}//同分母 
	else{
		temp.top=top*p.den-p.top*den;
		temp.den=den*p.den;
	}//通分 
	return temp;
}

Fraction Fraction:: operator -(Fraction &p){
	Fraction temp;
	if(p.den==den){
		temp.top=top-p.top;
		temp.den=den;
	}//同分母 
	else{
		temp.top=top*p.den-p.top*den;
		temp.den=den*p.den;
	}//通分 
	return temp;
}

Fraction Fraction ::operator *(const int &i){
	Fraction temp,p(i);
	temp.top=top*p.top;
		temp.den=den*p.den; 
	return temp;
}

Fraction Fraction:: operator *(Fraction &p){
	Fraction temp;
	temp.top=top*p.top;
		temp.den=den*p.den;
	return temp;
}

Fraction Fraction::operator /(const int &i){
	Fraction temp,p(i);
	temp.top=top*p.den;
		temp.den=den*p.top;
	return temp;
}

Fraction Fraction::operator /(Fraction &p){
Fraction temp;
	temp.top=top*p.den;
		temp.den=den*p.top;
	return temp;
}	
ostream& operator << (ostream& cout,Fraction& F)
{int x=calculator(F.top,F.den);
F.top/=x;
F.den/=x;
if(F.den==1){
		cout<<F.top<<endl;
	}
 else if(F.den==-1){
		cout<<"-"<<F.top;
	}
	else if (F.top < 0 && F.den < 0) {
		cout <<abs(F.top) <<"/"<<abs(F.den);
	}
	else if (F.top > 0 && F.den < 0){
		cout <<"-"<<F.top <<"/"<<abs(F.den);
	}
	else if (F.top > 0 && F.den > 0){
		cout <<F.top <<"/"<<F.den;
	}
	else if (F.top < 0 && F.den > 0){
		cout <<"-"<<abs(F.top) <<"/"<<F.den;
	}
return cout;}

istream& operator >> (istream& input, Fraction& F1)
{
input >>F1.top >>F1.den;
return input;}


int main()
{
    Fraction a, b, c;
    cin >> a >> b;
    c = a + b + 1;
    cout << c << endl;
    c = a - b - 1;
    cout << c << endl;
    c = a * b * 1;
    cout << c << endl;
    c = a / b / 1;
    cout << c << endl;
    return 0;
}

对等号重载实现分数的化简

#include <iostream> 
#include <cstring> 
#include <cstdlib>
using namespace std;
class Fraction{ 
private:
int _s, _m;
public:
void Print() { cout << _s << "/" << _m << endl; }
// 在此处补充你的代码
Fraction operator=(const string & s){
    int i;
    int len=s.length();
    char *p=new char[len+1];
    for (i=0;i<len;i++){
    	p[i]=s[i];
	}
	p[i]='\0';
_s=atoi(p) ;
	if(*(++p)>'9'||*(++p)<'0'){
		 p++;
	};
_m=atoi(p);
		
	int tem1 = abs(_s), tem2 = abs(_m),tem;
	while (tem1 != tem2) {
		if (tem1 > tem2) {
			tem1 = tem1 - tem2;
		}
		else {
			tem = tem1;
	tem1 = tem2;
	tem2 = tem;
	}
}

if(_m<0){
	_s=-_s;
	_m=-_m; 	
}
_s/=tem1;
_m/=tem1;
    return *this;
}
};

int main() {
Fraction a;
a = "3/5"; a.Print();
a = "48/-72"; a.Print();
return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值