关于(C++)数据结构复数计算器作业的拓展
- 复数计算器几乎是每个c++学习者都会遇到的一个典型的题目,但大多数的题解在处理复数的输入的时候都是将实部和虚部分开输入和存储,对于自己来说挺省事的,但对于使用者来说,比较局限,比较死板。为了实现输入的时候能够以复数的一般形式输入(即(-a,a,a-i,a-bi,a+bi,a+i,-i,i)形式输入,其中a,b为浮点数),对>>进行了以下重载。
- 总体的思路是将输入的内容保存到一个空间较大的字符数组中,然后对其进行识别。
- (已经定义了一个复数类,a,b分别为复数的实部和虚部)识别分为两个部分,一个是识别只有实部的复数,另一个识别含有虚部的复数(其中包括只有虚部、实部和虚部都有)从左到右依次读取,以+、-、i以及无符号作为识别的标志。
- 对于数字部分,整数部分采用自左向右累加,小数部分采用自右向左累加。以小数点“.”为标志。
- 由于输入形式多样,需要逐步根据输出的情况逐步修改代码。
- 这里并没有对错误的输入进行识别和相应的警示,需要可自行添加。
istream& operator >>(istream& is, Complex1& x)//输入任意形式的复数(-a,a,a-i,a-bi,a+bi,a+i,-i,i)
{
char m[100];
is >> m;
int a = strlen(m);
float n = 0;int flag = 1, j = 0, k;
if (m[a - 1] != 'i')//当复数只有实部,复数的形式为(a,-a)
{
if (m[0] == '-')
{
flag = -1;
j++;
}
else
{
flag = 1;
}
while ((m[j] >= '0' && m[j] <= '9') || m[j] == '.')//小数部分取值计算
{
int l;float o = 0;
if (m[j] == '.')
{
for (l = j; m[l] != '\0'; l++)
{
}
for (j = l-1; m[j] != '.'; j--)
{
o = o * 0.1 + m[j] - '0';
}
o = o * 0.1;
n = o + n;
j = l ;
break;
}
if (o == 0)
{
n = n * 10 + m[j] - '0';
j++;
}
}
x.a = n*flag;
return is;
}
else
{
for (j = 0; j < a;j++)
{
if (n != 0 && (m[j] == '-' || m[j] == '+'))
{
x.a = flag * n;
n = 0;
}
if (m[j] == '-')
{
flag = -1;
j++;
}
else if (m[j] == '+')
{
if (m[j] != 'i')
{
flag = 1;
j++;
}
}
else
{
if (m[j] != 'i')
{
flag = 1;
}
}
if (m[j] == 'i')
{
if (n == 0)
x.b = flag;
else
x.b = flag * n;
break;
}
while ((m[j] >= '0' && m[j] <= '9') || m[j] == '.')
{
int l; float o = 0;
for (l = j; m[l] != '-' && m[l] != '+'&&m[l]!='i'; l++)
{
}
if (m[j] == '.')
{
for (j = l-1; m[j] != '.'; j--)
{
o = o * 0.1 + m[j] - '0';
}
o = o * 0.1;
n = o + n;
j = l ;
break;
}
n = n * 10 + m[j] - '0';
j++;
}
--j;
}
}
}
第一次写博客,有不足的地方请多指教。
参考资料:(只是实现了a±bi的复数形式的识别)
C++课程设计复数计算器