c++中文件顺序存储以及complex复数类加减乘除符号的重载,在这里输入输出符号用的友元函数

c++中文件顺序存储以及complex复数类±*/= != ,<< >>符号的重载,在这里输入输出符号用的友元函数

complex复数类相±*/并使用重载

第一次写博客,一枚在校大学生,物联网工程专业。
整个代码是我们c++的实验报告,写完收获很大,想把自己的错误,以及走过的歪路分享给大家,写的不好的地方还望大家海涵。
整体思想:
1.为了防止存储数据类型的不同,我使用了template
2.complex复数类的±*/=!= ==,并使用array类进行验证。
3.最后验证完将几个数据还有一个float类顺序存储到文件中。

上代码

下面展示一些 内联代码片

//main函数
#include <iostream>
#include "complex.h"
#include <array>
#include <fstream>//顺序文件存储,打开文件用的
#include <cstdlib>
using namespace std;

int main()
{
    Complex<float>s1;
    Complex<float>s2;//float类型为了去调试template<typename T>
    Complex<double>arr1[1]={Complex<double>(0.0,0.0)};//数组初始化
    Complex<double>arr2[1]={Complex<double>(0.0,0.0)};//数组初始化
    Complex<double>arr3[1]={Complex<double>(0.0,0.0)};//数组初始化
    arr1[1].setReal(1.1);
    arr1[1].setImag(2.2);
    arr2[1].setReal(3.3);
    arr2[1].setImag(4.4);//直接将数据存入arr里
    cout << "       实验9"<<endl;
   
    float r1,i1,r2,i2;//定义float
    cout<<"array类已定义"<<endl;
    cout<<"输出array类+-*/的结果"<<endl;
    //对array类进行+-*/= !=  ==进行预算
    arr3[1]=arr1[1]+arr2[1];
    cout<<"add="<<arr3[1]<<endl;
    arr3[1]=arr1[1]-arr2[1];
    cout<<"subtract="<<arr3[1]<<endl;
    arr3[1]=arr1[1]*arr2[1];
    cout<<"muitiply="<<arr3[1]<<endl;
    arr3[1]=arr1[1]/arr2[1];
    cout<<"divide="<<arr3[1]<<endl;
    arr3[1]=arr1[1];
    cout<<"arr3=arr1,arr3="<<arr3[1]<<endl;
  
    if(arr1==arr2)
    {
        cout<<"arr1==arr2"<<endl;
    }
    else
    {
        cout<<"arr1!=arr2"<<endl;
    }
    cout<<"arr1="<<arr1[1]<<endl;
    cout<<"arr2="<<arr2[1]<<endl;
    cout<<"arr3="<<arr3[1]<<endl;输出三组arr的数据
    ofstream outClientFile("clients.txt",ios::out);打开文件clients,如果没有就自动建立了一个,就算里边有内容也没有关系,下边存储的时候会自动覆盖。
    if(!outClientFile)
    {
        cerr<<"File could not be opened!"<<endl;
        exit(1);
    }//判断文件是否成功打开
    outClientFile<<arr1[1]<<endl;
    outClientFile<<arr2[1]<<endl;
    outClientFile<<arr3[1]<<endl;//将三个arr存入文件中
    cout<<"请输入两组复数(complex<float>):"<<endl;//下边是用复数float进行一个输入,用下重载的>>.
    cin>>r1>>i1;
    cin>>r2>>i2;
    //将实部虚部输入
    s1.setReal(r1);
    s1.setImag(i1);
    s2.setReal(r2);
    s2.setImag(i2);
    cout<<"将五个对象的内容存储于一个顺序文件中"<<endl;
    cout<<"3个array类,2个complex类"<<endl;
    //将float类的复数存入文件
    outClientFile<<s1<<endl;
    outClientFile<<s2<<endl;
    return 0;
}

// complex.h
#ifndef COMPLEX_H_INCLUDED
#define COMPLEX_H_INCLUDED
#include <iostream>

using namespace std;
template<typename T>//这个可以让你使用任意类的输入,不管是int,还是double
class Complex
{
    friend ostream& operator<<(ostream &output ,Complex<T> &t)
    {
        output << t.real <<" + " << t.imag <<"i";
         return output;
    }
    friend istream& operator>>(istream &input ,Complex<T> &c)
    {
        input >>c.real;
        input >>c.imag;
        return input;
    }//对输入输出进行重载,并使用友元函数
public:
    Complex(T=0.0,T=0.0);//初始化
    ~Complex();//析构函数
    void setReal(T);
    T getReal();
    void setImag(T);
    T getImag();//建立复数的实部虚部,对数据进行封装
    
    Complex operator+(Complex<T> );
    Complex operator-(Complex<T> );
    Complex operator*(Complex<T> );
    Complex operator/(Complex<T> );
    Complex operator=(Complex<T> );
    bool operator==(Complex<T> &);
    bool operator!=(Complex<T> &);
    //上边是对符号的重载
private:
    T real;
    T imag;

};
template class Complex<double>;//你的main函数里用什么类型需要提前在这里声明
template class Complex<float>;

#endif  //COMPLEX_H_INCLUDED

下面展示一些 内联代码片

// complex.cpp
#include<iostream>
#include"complex.h"//声明我要用complex里声明的函数

using namespace std;
template<typename T>//每个函数使用前都要声明,它可以使用任何类型的数据int,double,都可以
Complex<T>::Complex(T r,T i)
{
    real=r;
    imag=i;
}//初始化
template<typename T>
Complex<T>::~Complex()
{

}//析构函数
template<typename T>
void Complex<T>::setReal(T r)
{
    real=r;
}//set实部
template<typename T>
T Complex<T>::getReal()
{
    return real;
}//get实部
template<typename T>
void Complex<T>::setImag(T i)
{
    imag=i;
}//set虚部
template<typename T>
T Complex<T>::getImag()
{
    return imag;
}get虚部
template<typename T>
Complex<T> Complex<T>::operator+(Complex<T> m)
{
    Complex temp;
    temp.real=this->real+m.real;
    temp.imag=this->imag+m.imag;
    return temp;

}//+号重载
template<typename T>
Complex<T> Complex<T>::operator-(Complex<T> m)
{
    Complex temp;
    temp.real=real-m.real;
    temp.imag=imag-m.imag;
    return temp;

}//-号重载
template<typename T>
Complex<T> Complex<T>::operator*(Complex<T> m)
{
    Complex temp;
    temp.real=real*m.real-imag*m.imag;
    temp.imag=imag*m.real+real*m.imag;
    return temp;

}//*号重载
template<typename T>
Complex<T> Complex<T>::operator/(Complex<T> m)
{
    Complex temp;
    temp.real=(real*m.real+imag*m.imag)/(m.real*m.real+m.imag*m.imag);
    temp.imag=(imag*m.real-real*m.imag)/(m.real*m.real+m.imag*m.imag);
    return temp;

}//除号重载
template<typename T>
Complex<T> Complex<T>::operator=(Complex<T> c1)
{
    real=c1.real;
    imag=c1.imag;
    return *this;//这块一定要注意,因为我前边会用到等号,但用意并不是使用重载的等号,所有这里return *this,这样会不妨碍后边使用等号的重载
}//等号重载
template<typename T>
bool Complex<T>::operator==(Complex<T> &c2)
{
    Complex temp;
    if(temp.real==c2.real&&temp.imag==c2.imag)
        return 1;
    else
        return 0;
}//==的重载
template<typename T>
bool Complex<T>::operator!=(Complex<T> &c3)
{
    Complex temp;
    if(temp.real!=c3.real)
        return 1;
    else
        return 0;
}//!=的重载

在这里插入图片描述
整体思路与解释,我已经写在了代码的后边,第一次写博客,小白一只,有写的不好的地方望大佬们海涵。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值