请教一个关于“复数类”的问题

wjn161 2007-10-23 09:00:40
这是我写的一个关于复数类的代码,
实现复数的四则运算(+.-.*./)的重载
以及(I/O)输入输出的重载

我的问题出在除号“/”的重载,关于除法的运算输出结果总是0.不知道是否是算法出了问题。
本人新手,不知道问题在哪,请各位高手帮我改改。
#include<iostream.h>
#include<math.h>
class complex{
public:
complex(double r=0.0,double i=0.0){real=r;imag=i;}//构造函数
complex operator +(complex c2);//加号重载
complex operator -(complex c2);//减号重载
complex operator *(complex c2);//乘号重载
complex operator /(complex c2);//除号重载
friend ostream& operator<<(ostream& os,complex& c2); //重载输入输出
friend istream& operator>>(istream& is,complex& c2);
private:
double real;
double imag;
};
complex complex::operator +(complex c2)//实现加号重载
{
complex c;
c.real=c2.real+real;
c.imag=c2.imag+imag;
return c;
};
complex complex::operator -(complex c2)//实现减号重载
{
complex c;
c.real=real-c2.real;
c.imag=imag-c2.imag;
return c;
};
complex complex::operator *(complex c2)//实现乘号重载
//(a+bi)*(c+di)=(a*c-b*d)+(c*b+a*d)i
{
complex c;
c.imag=c2.real*imag+c2.imag*real;
c.real=c2.real*real-c2.imag*imag;
return c;
};
complex complex::operator /(complex c2)//实现除号重载
{
complex c;
double d=c2.real*c2.real+c2.imag*c2.imag;
c2.imag=imag*c2.real-real*c2.imag;
c2.real=real*c2.real+imag*c2.imag;
return c;
};

ostream& operator<<(ostream& os,complex& c2)//输出重栽
{
if(c2.imag!=0)
return os<<c2.real<<((c2.imag>=0.0)?"+":"-")<<fabs(c2.imag)<<"i";
else
return os<<c2.real;
};
istream& operator>>(istream& is,complex& c2)//输入重载
{
cout<<"Enter the real number:";
cin>>c2.real;
cout<<"Enter the imaginary number:";
cin>>c2.imag;
return is;
};
int main()
{

complex c1,c2;
complex c3=0;
cin>>c1;
cin>>c2;
cout<<"c1="<<c1<<endl;
cout<<"c2="<<c2<<endl;
cout<<"c1+c2="<<c1+c2<<endl;
cout<<"c1-c2="<<c1-c2<<endl;
cout<<"c1*c2="<<c1*c2<<endl;
cout<<"c1/c2="<<c1/c2<<endl;
return 0;
}


...全文
123 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjn161 2007-10-24
  • 打赏
  • 举报
回复
谢谢大家。我明白了。非常感谢。
c.imag=imag*c2.real-real*c2.imag;
c.real=real*c2.real+imag*c2.imag;

我运行的时候一直写成了c2.imag=……
c2.real=……
vcgaoshou 2007-10-24
  • 打赏
  • 举报
回复
complex complex::operator /(complex c2)//实现除号重载
{
complex c;
double d=c2.real*c2.real+c2.imag*c2.imag;
c.imag=imag*c2.real-real*c2.imag;
c.real=real*c2.real+imag*c2.imag;
return c;
};
wjn161 2007-10-24
  • 打赏
  • 举报
回复
我只是想明白为什么 加法,减法,乘法的结果都对,为什么到除法就是错的。无论用什么数字去试,结果都是0。
算法是这个。第一次发贴的时候写错了。
complex complex::operator /(complex c2)//实现除号重载
{
complex c;
double d = c2.real * c2.real + c2.imag * c2.imag;
c.imag = (imag * c2.real - real * c2.imag) / d;
c.real = (real * c2.real + imag * c2.imag) / d;
return c;
}

xiantongyuan 2007-10-24
  • 打赏
  • 举报
回复
complex complex::operator /(complex c2)//实现除号重载
{
complex c;
double d = c2.real * c2.real + c2.imag * c2.imag;
c.imag = (imag * c2.real - real * c2.imag) / d;
c.real = (real * c2.real + imag * c2.imag) / d;
return c;
}

还有一点就是操作符应该写成类的友元函数。
HW121 2007-10-24
  • 打赏
  • 举报
回复
试过,没问题。
wjn161 2007-10-24
  • 打赏
  • 举报
回复
谢谢一楼的。
complex complex::operator /(complex c2)//实现除号重载
{
complex c;
double d=c2.real*c2.real+c2.imag*c2.imag;
c.imag=(imag*c2.real-real*c2.imag)/d;
c.real=(real*c2.real+imag*c2.imag)/d;
return c;
};
一开始我要写的就是这个,只是后来发贴的时候打错了。
这样算出的结果还是不对的。
HappyTree 2007-10-23
  • 打赏
  • 举报
回复
复数的代码在标准库里边是可以找到的,不太复杂,建议去看看
你的编码也许运算没有问题,但细节上还是有不少需要注意的地方。
yyyuhan 2007-10-23
  • 打赏
  • 举报
回复
complex complex::operator /(complex c2)//实现除号重载
{
complex c;
double d=c2.real*c2.real+c2.imag*c2.imag;
c.imag=(imag*c2.real-real*c2.imag)/d;
c.real=(real*c2.real+imag*c2.imag)/d;
return c;
};

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧