运算符重载-复数的加法

本文介绍了一个简单的C++程序,用于实现复数的加法运算,并通过字符串输入解析复数的实部和虚部。该程序定义了一个复数类,实现了加法运算符重载,并提供了打印复数的方法。

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

#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
class Complex {
public:
     Complex (int r=0, int i=0) : m_r (r), m_i (i) {}
     const Complex operator+ (const Complex& c) const 
     {
        return Complex (m_r + c.m_r, m_i + c.m_i);
     }
    void print (void) const 
    {
        if(m_i == 0)
            cout << m_r;
        else if(m_i == 1 && m_r == 0)
            cout << 'i';
        else if(m_i == -1 && m_r == 0)
            cout<< '-' << 'i';
        else if(m_r != 0 && m_i == 1)
            cout << m_r << '+' << 'i';
        else if(m_r != 0 && m_i == -1)
            cout << m_r << '-' << 'i';
        else if(m_r != 0 && m_i > 1)
            cout << m_r << '+' << m_i << 'i';
    }
 private:
 int m_r; // 实部
 int m_i; // 虚部

};
void fun(string s,int &r,int &i)
{
    int j;
    r = i = 0;
    char buf[256];
    int len = s.length();
    int signPos = -1,    // +/-号位置
        iPos = -1;        // 结尾的i的位置
    for (j = len-1; j >-1; j--)
    {
        if ('i' == s[j])
            iPos = j;
        else if ('+' == s[j] || '-' == s[j])
        {
            signPos = j;
            break;
        }
    }
    if (0 == iPos)   // 纯虚数i
    {
        r = 0;
        i = 1;
    } 
    else if (0 < iPos)   // 复数
    {
        // 实部
        if (0 < signPos)
        {
            for(j = 0;j < signPos;++j)
            {
                r = r*10 + s[j] - '0';  
            }
        }
        // 虚部
        if (signPos + 1 == iPos)   // 虚数部分 = -i / +i
            i = '+' == s[signPos] ? 1 : -1;
        else
        {
            for(j = signPos+1;j < len-1;++j)
            {
                i = i*10 + s[j] - '0';  
            }
        }      
    }
    else // 纯实数
    {
       for(j = 0;j < len;++j)
       {
            r = r*10 + s[j] - '0';  
       }
    }  


/*  for(j = 0;j < len;++j)
    {
        if(s[j] == '+')
            break;
        r = r*10 + s[j] - '0';  
    }
    for(++j;j < len;++j)
    {
        if(s[j] == 'i')
        {
            if(i == 0)
                i = 1;
            break;
        }   
        i = i*10 + s[j] - '0';  
    }
*/
}

int main () 
{
    int r,i;
    string s;
    cin >> s;
    fun(s,r,i);
    Complex t(r,i);
    while(true)
    {
        cin >> s;
        if(s == "0")
            break;
        fun(s,r,i);
        Complex c1(r,i);
        t = t+c1;
    }
    t.print();
    return 0;

} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值