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);
}
上一篇:浮点数在内存中的表示
下一篇:VC MFC工具栏(CToolBar)控件