c++提取复数的实部和虚部

清泛原创

#include<iostream>
#include<string>
using namespace std;
 
typedef float REAL;
#define MAX_BUF_LEN 256
 
typedef struct COMPLEX
{
    REAL r;    // 实部
    REAL i;    // 虚部
};
 
bool Parse(COMPLEX * cp, const char * strCplx, const int len)
{
    memset(cp, 0, sizeof(COMPLEX));
    char buf[MAX_BUF_LEN];
 
    int signPos = -1,    // +/-号位置
        iPos = -1;        // 结尾的i的位置
    for (int i = len-1; i >-1; i--)
    {
        if ('i' == strCplx[i])
            iPos = i;
        else if ('+' == strCplx[i] || '-' == strCplx[i])
        {
            signPos = i;
            break;
        }
    }
    if (0 == iPos)   // 纯虚数i
    {
        cp->r = 0;
        cp->i = 1;
    }
    else if (0 < iPos)   // 复数
    {
        // 实部
        if (0 < signPos)
        {
            memset(buf, 0, sizeof(MAX_BUF_LEN));
            memcpy(buf, strCplx, signPos);
            cp->r = atof(buf);
        }
        // 虚部
        if (signPos + 1 == iPos)   // 虚数部分 = -i / +i
            cp->i = '+' == strCplx[signPos] ? 1 : -1;
        else
        {
            memset(buf, 0, sizeof(MAX_BUF_LEN));
            memcpy(buf, strCplx + signPos, iPos - signPos);
            cp->i = atof(buf);
        }      
    }
    else // 实数
    {
        memset(buf, 0, sizeof(MAX_BUF_LEN));
        memcpy(buf, strCplx, len);
        cp->r = atof(buf);
    }  
    return true;
}
 
void Print(COMPLEX & cp)
{
    if (0 != cp.i) // 复数
    {
        if (0 == cp.r)       // 纯虚数
        {
            if (-1 == cp.i)
                cout << "-i";
            else if (1 == cp.i)
                cout << "i";
            else
                cout << cp.i << "i";               
        }
        else
        {
            // 实部
            cout << cp.r;
            // 虚部
            if (-1 == cp.i)
                cout << "-i";
            else if(1 == cp.i)
                cout << "+i";
            else
            {
                if (0 < cp.i)
                    cout << "+";
                cout << cp.i << "i";
            }
        }
    }
    else// 实数
        cout << cp.r;  
}
int main()
{
    char strCp[MAX_BUF_LEN];
    COMPLEX * cp = (COMPLEX*)malloc(sizeof(COMPLEX));
    while (1)
    {
        cin >> strCp;
        getchar();
        if(ParseComplex(cp, strCp, strlen(strCp)))
        {
            Print(*cp);
            cout << endl;
        }
 
    }
    free(cp);
}

c++ 复数

分享到:
评论加载中,请稍后...
回到顶部