用C++编写一个小型复数计算器 请用面向对象方法设计并实现一个小型复数计算器,包括如下功能: 实
用C++编写一个小型复数计算器请用面向对象方法设计并实现一个小型复数计算器,包括如下功能:实现复数的设置和显示实现复数加减乘除功能,并显示运算结果实现用运算符==进行复数...
用C++编写一个小型复数计算器
请用面向对象方法设计并实现一个小型复数计算器,包括如下功能:
实现复数的设置和显示
实现复数加减乘除功能,并显示运算结果
实现用运算符 = = 进行复数的相等比较,并显示比较结果 展开
请用面向对象方法设计并实现一个小型复数计算器,包括如下功能:
实现复数的设置和显示
实现复数加减乘除功能,并显示运算结果
实现用运算符 = = 进行复数的相等比较,并显示比较结果 展开
2个回答
展开全部
#include<iostream>
#include<string>
using namespace std;
typedef float REAL;
#define MAX_BUF_LEN 256
typedef struct COMPLEX
{
REAL r; // 实部
REAL i; // 虚部
};
class Complex
{
private:
COMPLEX *cp;
public:
Complex()
{
cp = (COMPLEX*)malloc(sizeof(COMPLEX));
memset(cp, 0, sizeof(COMPLEX));
}
Complex(const Complex & c)
{
cp = (COMPLEX*)malloc(sizeof(COMPLEX));
cp->r = c.cp->r;
cp->i = c.cp->i;
}
~Complex()
{
if (cp)
{
free(cp);
cp = 0;
}
}
static bool ParseComplex(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;
}
static 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;
}
bool Parse(const char * strCp, const int len)
{
return ParseComplex(cp, strCp, len);
}
void Print()
{
Print(*cp);
}
Complex & operator = (const Complex & c)
{
cp->r = c.cp->r;
cp->i = c.cp->i;
return *this;
}
bool operator == (const Complex & c)
{
return c.cp->r == cp->r && c.cp->i == cp->i;
}
Complex operator + (const Complex & c)
{
Complex tmp;
tmp.cp->r = cp->r + c.cp->r;
tmp.cp->i = cp->i + c.cp->i;
return tmp;
}
Complex operator - (const Complex & c)
{
Complex tmp;
tmp.cp->r = cp->r - c.cp->r;
tmp.cp->i = cp->i - c.cp->i;
return tmp;
}
Complex operator * (const Complex & c)
{
Complex tmp;
tmp.cp->r = cp->r * c.cp->r;
tmp.cp->i = cp->i * c.cp->i;
return tmp;
}
Complex operator / (const Complex & c)
{
Complex tmp;
if (0 != c.cp->r && 0 != c.cp->i)
{
tmp.cp->r = cp->r / c.cp->r;
tmp.cp->i = cp->i / c.cp->i;
}
return tmp;
}
};
void main()
{
const int calCnt = 4;
const char calSimbol[calCnt][3] = { "+", "-", "*", "/" };
enum CALCULATIONS{ ADD , MINUS, MUL, DIV };
const int inputCpCnt = 2;
char strCp[inputCpCnt][MAX_BUF_LEN];
const int inputcp = calCnt;
Complex cp[calCnt + inputCpCnt];
while (1)
{
for (int i = 0; i < inputCpCnt; i++)
{
cout << "请输入第 " << i + 1 << "个复数: ";
cin >> strCp[i];
getchar();
if (!cp[inputcp + i].Parse(strCp[i], strlen(strCp[i])))
{
cout << "无效输入!" << endl;
continue;
}
}
cp[ADD] = cp[inputcp] + cp[inputcp + 1];
cp[MINUS] = cp[inputcp] - cp[inputcp + 1];
cp[MUL] = cp[inputcp] * cp[inputcp + 1];
cp[DIV] = cp[inputcp] / cp[inputcp + 1];
for (int i = 0; i < calCnt; i++)
{
cp[inputcp].Print();
cout <<" "<< calSimbol[i]<<" ";
cp[inputcp + 1].Print();
cout << " = ";
cp[i].Print();
cout << endl;
}
cp[inputcp].Print();
if (cp[inputcp] == cp[inputcp + 1])
cout << " == ";
else
cout << " != ";
cp[inputcp + 1].Print();
cout << endl;
};
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询