c++之复数类运算_miaomiao328的博客-程序员宝宝_c++复数运算

技术标签: c++学习笔记  剑指offer面试题  复数 运算符重载  c++ 函数重载  

在写之前本人头脑是懵的,因为完全忘记了复数是什么,原谅我高中数学不好大笑


那么我们大体回顾一下复数,即a+bi,那么关于它的运算法则大体有以下几种。


1.加法法则

  复数的加法按照以下规定的法则进行:设z1=a+bi,z2=c+di是任意两个复数,则它们的和是

 (a+bi)+(c+di)=(a+c)+(b+d)i;返回值类型也应为复数(complex)

2.减法法则
 复数的减法按照以下规定的法则进行:设z1=a+bi,z2=c+di是任意两个复数,则它们的差是 (a+bi)-(c+di)=(a-c)+(b-d)i.
两个复数的差依然是复数,它的实部是原来两个复数实部的差,它的虚部是原来两个虚部的差。

返回值类型也应为复数(complex)


3.乘法法则
规定复数的乘法按照以下的法则进行:设z1=a+bi,z2=c+di(a、b、c、d∈R)是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i.

返回值类型也应为复数(complex)


其实就是把两个复数相乘,类似两个多项式相乘,展开得: ac+adi+bci+bdi^2,因为i^2=-1,所以结果是(ac-bd)+(bc+ad)i 。
两个复数的积仍然是一个复数。
4.除法法则
满足(c+di)(x+yi)=(a+bi)的复数x+yi(x,y∈R)叫复数a+bi除以复数c+di的商
运算方法:可以把除法换算成乘法做,在分子分母同时乘上分母的共轭. 所谓共轭你可以理解为加减号的变换,互为共轭的两个复数相乘是个实常数 . 运算结果为:
(ac+bd)/(c^2+d^2)+(bc-ad)/(c^2+d^2)i

返回值类型也应为复数(complex)


除此以外本人也加进去了一些别的运算如:前置++,后置++,前置--,后置--,+=,
-=,以及判断两个复数是否相等。

代码实现如下
#include<iostream>
<span style="font-size:24px;"><span style="font-size:24px;">#include <cstdlib>

using namespace std;

class Complex
{
public:
	Complex(double r,double i);
	Complex operator+(const Complex c);
	Complex operator-(const Complex &c);
	Complex  operator *(const Complex &c);
	Complex operator/(const Complex &c);
	Complex &operator+=(const Complex c);
	Complex &operator-=(const Complex c);
	bool operator==(const Complex &c);
	Complex operator++();
	Complex operator++(int);
	Complex operator--();
	Complex operator--(int);

	void print(Complex &c);
	//~Complex();//析构函数

private:
	double _real;
	double _image;
};

Complex::Complex(double r=0.0,double i=0.0)
{
	_real=r;//复数实部
	_image=i;//复数虚部
}
Complex Complex:: operator+(const Complex c)//两复数相加
{
	Complex tmp;
	tmp._real =_real+c._real ;
	tmp._image =_image+c._image ;
	return tmp;
}
Complex Complex::operator-(const Complex &c)//两复数相减                                    c的值在函数内部不需要改变,所以采用常引用
{
	Complex tmp;
	tmp._real =_real-c._real ;
	tmp._image =_image-c._image ;
	return tmp;
}
Complex Complex::operator*(const Complex &c)//(a+bi)(c+di)=(ac-bd)+(bc+ad)i.
{
	Complex tmp;
	tmp._real=_real*c._real-_image*c._image;
	tmp._image= _image*c._real +_real*c._image;
	return tmp;
}
Complex Complex::operator/(const Complex &c)//(a+bi)(c-di)/(c+di)(c-di)
	(ac+bd)/(c^2+d^2)+(bc-ad)/(c^2+d^2)i
{ 
	Complex tmp;
	double deno=c._real*c._real+c._image*c._image;//有理化后的分母denominator   
	tmp._real=deno*((_real*c._real)+(_image*c._image));
	tmp._image=deno*((_image*c._real )-(_real*c._image));
	return tmp;
}
Complex& Complex ::operator+=(const Complex c)//加上自身
{
	this->_real += c._real ;
	this->_image += c._image ;
	return *this;
}
Complex& Complex::operator-=(const Complex c)//加上自身
{
	this->_real -= c._real ;
	this->_image -= c._image ;
	return *this;
}
bool Complex::operator==(const Complex &c)//判断两个复数是否相等
{
	return(_real==c._real)&&(_image==c._image);
}
Complex Complex::operator++()//前置++
{
	this->_real+=1;
	this->_image+=1;
	return *this;
}
Complex Complex::operator++(int)//后置++
{
	Complex tmp(*this);//拷贝构造用来保存原来的值
	this->_real++;
	this->_image++;
	return tmp;//返回临时变量所以不能以引用作为返回值
}
Complex	Complex::operator--()//前置--
{
	this->_real-=1;
	this->_image-=1;
	return *this;
}
Complex Complex::operator--(int)//后置--
{
	
	Complex tmp(*this);//拷贝构造用来保存原来的值
	this->_real--;
	this->_image--;
	return tmp;//返回临时变量所以不能以引用作为返回值
}

void Complex::print(Complex &c)
{
	cout<<c._real<<"+ "<<c._image<<"i"<<endl;
}

int main()
{
	Complex *c=NULL;
	Complex c1(6.0,5.0);
	Complex c2(3.0,4.0);
	Complex ret;
	cout<<(c1==c2)<<endl;//输出c1,c2是否相等
	c->print(c1);//输出c1+c2
	c->print(c2);
	cout<<"c1+c2=";
	ret=c1+c2;
	c->print(ret);
	c->print (c1);//输出c1自加
	ret=++c1;   
	c->print(ret);//
	system("pause");
	return 0;</span>
}</span></span>
部分运行结果:

那么我们简单总结一下运算符重载的几个特点
 1.赋值运算符的重载是对一个已经存在的对象进行复制
       2.运算符重载不改变运算符的优先级/结合性/操作符个数
       3.几个C++不能重载的运算符:   .* (点乘)  , ::(作用域解析符) /, sizeof  ,  ?:(条件运算符)   .
    


相信你也看出来,这个程序运用最多的便是运算符重载,其次还用到隐含的this指针那么下一篇可能会对这两个进行深一步的理解。
                     未完待续!




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wodeqingtian1234/article/details/51838888

智能推荐

ubuntu 11.4 笔记_weixin_33690367的博客-程序员宝宝

安装:http://letgoof.me/2011/install-ubuntu-11-04-from-harddisk-under-windows7/Grub:title Install Ubuntu 11.04 root (hd0,0) kernel (hd0,0)/vmlinuz boot=casper iso-scan/filename=/ubuntu-11.04-deskto...

第二章 栈、队列、链表(解密QQ号,回文、纸牌游戏、模拟链表)_dengjiongao3127的博客-程序员宝宝

深刻理解这些数据结构的思想,数据结构与算法是紧密联系在一起的一、队列新学期开始了,小哈是小哼的新同,小哼向小哈询问QQ号,小哈当然不会直接告诉小哼。所以小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则。规则是这样的:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数再放到这串数的末尾,再将第5个数删除……直到剩下最后一个数,将最后一个数也...

getquerystring 中文乱码、HTML获取链接中的参数--------解决中文乱码_weixin_30877227的博客-程序员宝宝

getquerystring 中文乱码、HTML获取链接中的参数--------解决中文乱码var points = position.split(',');var url = '"/mapView/patrol?name=event&amp;lon=' + points[0] + '&amp;lat=' + points[1] + '&amp;id=' + value...

深度学习21天实战实战caffe学习<查看机器已经安装的环境>_女王の专属领地的博客-程序员宝宝

补充一下安装吧~因为发现很多人都很头疼那个这个问题,尤其是这种别人安装到半路,跑路的!!!目前我上手的机器以及有了这些个零件,我就只能看看配置了,这个过程很痛苦,因为你不知道,前人对他做了什么,你就像改bug一样,慢慢来~~~:PART1:查看已经安装的相关版本Ubuntu14.04python:[email protected]:~$ python --version

基于Matlab神经网络语音情感识别系统_索炜达.猿创的博客-程序员宝宝_语音情感识别系统

基于Matlab神经网络语音情感识别系统,五种基本情感:'生气','高兴','中性','悲伤','害怕'。

[转]一些鲜为人知却非常实用的数据结构_iteye_13946的博客-程序员宝宝

一些鲜为人知却非常实用的数据结构 作为程序猿(媛),你必须熟知一些常见的数据结构,比如栈、队列、字符串、链表、二叉树、哈希,但是除了这些常见的数据结构以外,还有没有其他不是很有名,但却非常实用的数据结构呢,有人在 stackoverflow 上问了这样一个问题,得到了很多热心观众的回答,我们今天就来看看那些鲜为人知却非常实用的数据结构吧。首先,维基百科上的一个页面列举了常见...

随便推点

STL常用容器_刘群阳的博客-程序员宝宝

序列式容器:vector list deque stack queue heap priority_queue slist关联式容器:set map multiset multimap hashtable hash_set hash_map hash_multiset hash_multimap

xcode解决断点调试无效问题_诺yi的博客-程序员宝宝

Product---->Edit Scheme------>选择Info----->将Info里面的“Build Configuration”选择“debug”,将“Debugger”选择“LLDB”,解决xcode断点调试无效的问题。

poj~2823(单调队列入门)_YOYCod的博客-程序员宝宝

如果当初看单调队列先从这题开始做的话,应该会快点理解吧。题意就是求区间最值,这是单调队列最简单的应用。Sliding Window题意:给你n个数和区间长度k,求区间遍历到第i个数时的最小和最大值,所以是n-k+1个值。由于n的范围是10^6,普通嵌套for肯定超时,这里就用到了单调队列。单调队列只需要遍历一遍,虽然中间有出队入队的操作具体的看代码和注释吧:

linux安装问题小结及git的配置_周月省的博客-程序员宝宝

安装虚拟机 vm_wavare, 后提示安装系统 提示intel VT-x 未开启(intel 的vritual teanolig 虚拟技术 支持多操作系统 linux / windows等),解决方法 打开 开关 设置选为 enablle解决links:...

java.util.Optional学习笔记_程序员欣宸的博客-程序员宝宝

java.util.Optional是Java 8新增的类,可以帮我们把判空的代码写得更优雅,一起来了解一下吧。

终止Android中HandlerThread的方法_余龙飞的博客-程序员宝宝_handlerthread 停止

尊重原创作者,转载请注明出处:http://blog.csdn.net/gemmem/article/details/7932655如果我们在 activity中start了一个HandlerThread,那么这个线程会启动一个looper消息循环,当activity退出了,这个HandlerThread线程并没有终止,还是在那里做looper死循环,这当然不是我们愿意看到的。我们

推荐文章

热门文章

相关标签