第九周项目一 复数问题 增加一目- 与重载<<和>>

本文详细阐述了复数的概念,通过C++编程语言实现复数类,包括基本的算术运算,如加减乘除,以及与实数的运算,并通过测试函数验证其实现效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题及代码

ALL rights reserved.                      
*文件名称: 初学对象6                  
作者:李长鸿                   
*完成时间:2015.513             
*问题描述: 复数问题               
*/

<pre class="cpp" name="code">#include<iostream>
using namespace std;
class Complex
{
public:
    Complex()
    {
        real=0;
        imag=0;
    }
    Complex(double r,double i)
    {
        real=r;
        imag=i;
    }
    Complex operator-(int)
    {
        return Complex(0-real,0-imag);
    }
    friend Complex operator+(const Complex &c1,const Complex c2);
    friend Complex operator-(const Complex &c1,const Complex c2);
    friend Complex operator*(const Complex &c1,const Complex c2);
    friend Complex operator/(const Complex &c1,const Complex c2);
    friend Complex operator+(const Complex &c1,const double d);
    friend Complex operator-(const Complex &c1,const double d);
    friend Complex operator*(const Complex &c1,const double d);
    friend Complex operator/(const Complex &c1,const double d);
    friend istream &operator>>(istream &in,const Complex &c1);
    friend ostream &operator<<(ostream &out,const Complex &c1);
private:
    double real;
    double imag;
};
//下面定义成员函数
Complex operator+(const Complex &c1,const Complex c2)
{
    return Complex(c1.real+c2.real,c1.imag+c2.imag);
}
Complex operator-(const Complex &c1,const Complex c2)
{
    return Complex(c1.real-c2.real,c1.imag-c2.imag);
}
Complex operator*(const Complex &c1,const Complex c2)
{
    return Complex(c1.real*c2.real,c1.imag*c2.imag);
}
Complex operator/(const Complex &c1,const Complex c2)
{
    return Complex(c1.real/c2.real,c1.imag/c2.imag);
}
Complex operator+(const Complex &c1,const double d)
{
    return Complex(c1.real+d,c1.imag);
}
Complex operator-(const Complex &c1,const double d)
{
    return Complex(c1.real-d,c1.imag);
}
Complex operator*(const Complex &c1,const double d)
{
    return Complex(c1.real*d,c1.imag);
}
Complex operator/(const Complex &c1,const double d)
{
    return Complex(c1.real/d,c1.imag);
}


ostream& operator<<(ostream &out,const Complex &c1)
{
    out<<"("<<c1.real;
    if(c1.imag>=0)out<<"+";
    out<<c1.imag<<"i)"<<endl;
    return out;
}
//下面定义用于测试的main()函数
int main()
{
    Complex c1(3,4),c2(5,-10),c3;
    cout<<"-c1="<<c1-4<<"-c2="<<c2-1;
    cout<<"c1="<<c1;
    cout<<"c2="<<c2;
    cout<<"c1+c2="<<c1+c2;
    cout<<"c1-c2="<<c1-c2;
    cout<<"c1*c2="<<c1*c2;
    cout<<"c1/c2="<<c1/c2;
    cout<<endl;
    double d=7.77;
    Complex c(7,7);
    cout<<"c="<<c1;
    cout<<"d="<<d<<endl;
    cout<<"c+d="<<c+d;
    cout<<"c-d="<<c-d;
    cout<<"c*d="<<c*d;
    cout<<"c/d="<<c/d;
    return 0;
}




 

总结:声明时不是少写&就是少写<<或>>,磕磕绊绊总是不会再少写了

/ 编写复数类模板Complex,其数据成员realimage的类型未知,定义相应 // 的成员函数,包括构造函数、返回实部的函数、返回虚部的函数、重载加法运 // 算符、重载减法运算符以及重载输出运算符。 // 温馨小帖示:参考"相关知识"中的"示例程序"。 #include <iostream> // 编译预处理命令 using namespace std; // 使用命名空间std /************************************************************************ // 数据成员: T real; // 实部 T image; // 虚部 // 成员函数: Complex(T r = 0, T i = 0); // 构造函数 T GetReal() const; // 返回实部 T GetImage() const; // 返回虚部 Complex<T> operator+(const Complex<T> &z); // 加法运算符重载函数(成员函数) // 非成员函数: Complex<T> operator-(const Complex<T> &z1, const Complex<T> &z2); // 减法运算符重载函数(非成员函数) ostream &operator<<(ostream &out, const Complex<T> &z); // 输出运算符重载函数(非成员函数) ************************************************************************/ // 声明复数类模板 template <class T> class Complex { private: // 数据成员 // 在下面对realimage进行声明 // 温馨小帖示:参考"相关知识"中"编程要求"的"数据成员、成员函数及 // 重载运算符具体如下"中第2-3行。 /********* Begin *********/ T real; // 实部 T image; // 虚部 /********* End *********/ public: // 公有函数 Complex(T r = 0, T i = 0): real(r), image(i){ }// 构造函数 T GetReal() const { return real; } // 返回实部 T GetImage() const { return image; } // 返回虚部 // 在下面对加法运算符重载函数operator+()进行声明 // 温馨小帖示:参考"相关知识"中"编程要求"的"数据成员、成员函数及 // 重载运算符具体如下"中第9行。 /********* Begin *********/ Complex<T> operator+(const Complex<T> &z); /********* End *********/ }; // 在下面定义成员函数及相关函数的定义 // 输出运算符重载函数(非成员函数) template <class T> ostream &operator<<(ostream &out, const Complex<T> &z)// 重载运算符<< { // 温馨小贴士: // (1)本运算符重载函数要求输出运算符"<<",输出格式为"实部+虚部i",例如:2+3i, 2-3i, -2+3i, 8, -8, 8i, -5i, 0 // (2)在输出完复数后不用加换行符 // (3)z的实部应写为"z.GetReal()",z的虚部应写为"z.GetImage()" // (4)在本函数体代码中,输出流对象不应cout,而应是形参out,例如"cout << 0;"应改为"out << 0;" /********* Begin *********/ if (z.GetReal() != 0) { // z.GetReal()非0,对z.GetImage()进行讨论(为负,为0,为正),可能输出示例:2-3i, 8, -8, 2+3i if (z.GetImage() < 0) out << z.GetReal() << z.GetImage() << "i";//虚部为负,例如2-5i else if (z.GetImage() == 0) out << z.GetReal(); // 虚部为0,例如3 else out << z.GetReal() << "+" << z.GetImage() << "i"; // 虚部为正,例如2+5i } else { // z.GetReal()为0,对z.GetImage()进行讨论(为0,非0),可能输出示例:0, 8i, -5i if (z.GetImage() == 0) out << 0; // 虚部为0,例如0 else out << z.GetImage() << "i"; // 虚部非0, 例如5i, -8i } /********* End *********/ return out; // 返回输出流对象 } // 加法运算符重载函数(成员函数) template <class T> Complex<T> Complex<T>::operator+(const Complex<T> &z2) { // 温馨小贴士: // (1)本运算符重载函数要求返回复数(*this)z2之; // (2)现在复数类型应加上模板参数,也就是应写为"Complex<T>"; // (3)(*this)的实部可写为"this->real",(*this)的实虚应写为"this->image"; // (4)z2的实部应写为"z2.GetReal()",z2的虚部应写为"z2.GetImage()"; // (5)参考"相关知识"中"运算符重载基础"的"示例程序"中第16行。 /********* Begin *********/ return Complex<T>(this->real + z2.GetReal(), this->image + z2.GetImage()); /********* End *********/ } // 减法运算符重载函数(非成员函数) template <class T> Complex<T> operator-(const Complex<T> &z1, const Complex<T> &z2) { // 温馨小贴士: // (1)本运算符重载函数要求返回复数z1z2之差; // (2)现在复数类型应加上模板参数,也就是应写为"Complex<T>"; // (3)z1的实部应写为"z1.GetReal()",z1的虚部应写为"z1.GetImage()"; // (4)z2的实部应写为"z2.GetReal()",z2的虚部应写为"z2.GetImage()"; // (5)参考"相关知识"中"运算符重载基础"的"示例程序"中第16行。 /********* Begin *********/ return Complex<T>(z1.GetReal() - z2.GetReal(), z1.GetImage() - z2.GetImage()); /********* End *********/ }
05-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值