C#复数类的总结
复数是C#中没有的,不能直接调用的。但是我们可以通过封装,构造自己的复数形式。这里我自己封装了一个Complex类,也不知道写得如何。可能还有一些东西没有考虑。
不过这里包含了复数的基本晕算了了,包括加减乘除、取模运算、计算相位角等!详细信息其直接阅读代码。都包含注释了。
/// <summary>
/// 复数类
/// </summary>
public class Complex
{
private double real;//实部
private double image;//虚部
/// <summary>
/// 获取或设置实部
/// </summary>
public double Real
{
get { return real; }
set { real = value; }
}
/// <summary>
/// 获取或者设置虚部
/// </summary>
public double Image
{
get { return image; }
set { image = value; }
}
public Complex(double real, double image)
{
this.real = real;
this.image = image;
}
public Complex() { }
/// <summary>
/// 取共轭
/// </summary>
public Complex Conjugate()
{
//Complex complex = new Complex();
//complex.real = this.real;
//complex.image = -complex.image;
//return complex;
return new Complex(this.real, -this.image);
}
/// <summary>
/// 加法重载函数
/// </summary>
/// <param name="C">加数</param>
/// <param name="c">加数</param>
/// <returns>复数相加的结果</returns>
public static Complex operator +(Complex C, Complex c)
{
//Complex com = new Complex();
//com.real = C.real + c.real;
//com.image = C.image + c.image;
//return com;
return new Complex(c.real + C.real, C.image + c.image);
}
/// <summary>
/// 复数的加法,可以同时实现多个复数相加
/// 其实跟直接用+号来相加的结果是一样的,
/// 个人只是想多学习可变参数的用法
/// </summary>
/// <param name="complexs"></param>
/// <returns></returns>
public Complex Add(params Complex[] complexs)
{
if (complexs.Length == 0)
{
throw new Exception("输入的参数不能为空!");
}
Complex com = new Complex();
foreach (Complex c in complexs)
{
com = com + c;
}
return com;
}
/// <summary>
/// 复数的减法重载函数
/// </summary>
/// <param name="C">被减数</param>
/// <param name="c">减数</param>
/// <returns>复数相减后的结果</returns>
public static Complex operator -(Complex C, Complex c)
{
//Complex com = new Complex();
//com.real = C.real -c.real;
//com.image = C.image - c.image;
//return com;
return new Complex(C.real - c.real, C.image - c.Image);
}
/// <summary>
/// 双等号函数的重载
/// </summary>
/// <param name="C"></param>
/// <param name="c"></param>
/// <returns>如果相等返回true,否则返回fasle</returns>
public static bool operator ==(Complex C, Complex c)
{
return (C.real == c.real && C.image == c.image);
}
/// <summary>
/// 不等号函数的重载
/// </summary>
/// <param name="C"></param>
/// <param name="c"></param>
/// <returns></returns>
public static bool operator !=(Complex C, Complex c)
{
return (C.real != c.real || C.image != c.image);
}
/// <summary>
/// 复数的相减,可以同时实现多个复数相减
/// 其实跟直接用-号来相加的结果是一样的,
/// 个人只是想多学习可变参数的用法
/// </summary>
/// <param name="complexs">数的集合</param>
/// <returns>相减操作后的复数</returns>
public Complex Minus(params Complex[] complexs)
{
if (complexs.Length == 0)
{
throw new Exception("输入的参数不能为空!");
}
Complex com =complexs[0];
for (int i = 1; i < complexs.Length; i++)
{
com = com - complexs[i];
}
return com;
}
/// <summary>
/// 复数的乘法运算
/// </summary>
/// <param name="c"></param>
/// <param name="C"></param>
/// <returns></returns>
public static Complex operator *(Complex c, Complex C)
{
//(a+b*i)*(c+d*i)=(ac-bd)+(ad+bc)*i
return new Complex(c.real * C.real-c.image*C.image, c.real*C.image+c.image * C.real);
}
public Complex Multiplicative(params Complex[] complexs)
{
if (complexs.Length == 0)
{
throw new Exception("输入的参数不能为空!");
}
Complex com = complexs[0];
for (int i = 1; i < complexs.Length; i++)
{
com += complexs[i];
}
return null;
}
/// <summary>
/// 复数除法
/// </summary>
/// <param name="C"></param>
/// <param name="c"></param>
/// <returns></returns>
public static Complex operator /(Complex C, Complex c)
{
if (c.real == 0 && c.image == 0)
{
throw new Exception("除数的虚部和实部不能同时为零(除数不能为零)");
}
double real = (C.real * c.real + c.image * C.image)/(c.real*c.real+c.image+c.image);
double image=(C.image*c.real-c.image*C.real)/(c.real*c.real+c.image+c.image);
return new Complex(real,image);
}
/// <summary>
/// 复数除法运算
/// </summary>
/// <param name="complexs">一系列复数</param>
/// <returns>除法运算后的结果</returns>
public Complex Divison(params Complex[] complexs)
{
if (complexs.Length == 0)
{
throw new Exception("输入的参数不能为空!");
}
foreach (Complex com in complexs)
{
if (com.image==0&&com.real==0)
{
throw new Exception("除数的实部和虚部不能同时为零!");
}
}
Complex COM = new Complex();
COM = complexs[0];
for (int i = 1; i < complexs.Length; i++)
{
COM = COM / complexs[i];
}
return COM;
}
/// <summary>
/// 取模运算
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
public double Mod(Complex c)
{
return Math.Sqrt(c.real * c.real + c.image * c.image);
}
/// <summary>
/// 判断复数是否相等
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public override bool Equals(object obj)
{
if (obj is Complex)
{
Complex com = (Complex)obj;
return (com.real == this.real && com.image == this.image);
}
return false;
}
/// <summary>
/// 计算复数相位角
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
public static double GetAngle(Complex c)
{
return Math.Atan2(c.real, c.image);
}
public override string ToString()
{
//string str = null;
//if (this.image == 0)
//{
// str = "=";
//}
//else if (this.image > 0)
//{
// str = ">";
//}
//switch (str)
//{
// case ">":
// if (this.real == 0)
// {
// return string.Format("{0}i", this.image);
// }
// return string.Format("{0}+{1}i", this.real, this.image);
// case "=":
// return string.Format("{0}",this.real);
// default:
// if (this.real == 0)
// {
// return string.Format("{0}i", this.image);
// }
// return string.Format("{0}+{1}i", this.real, this.image);
//}
return string.Format("<{0} , {1}>", this.real, this.image);
}
}
第一次发博文,也知道自己的水平菜菜的,慢慢进步。。
C#复数类的总结的更多相关文章
- [GeekBand] C++学习笔记(1)——以复数类为例
本篇笔记以复数类(不含指针的类)为例进行面向对象的学习 ========================================================= 复数类的声明: class ...
- 复数类(C++练习一)
写一个复数类,实现基本的运算,目的熟悉封装与数据抽象. 类的定义 #include <iostream> #include <vector> using namespace s ...
- C++习题 复数类--重载运算符2+
Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+ ...
- C++习题 复数类--重载运算符+
Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.将运算符函数重载为非成员.非友元的普通函数.编写程序,求两个复数之和. Input ...
- 15.C++-操作符重载、并实现复数类
首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...
- C++ 实验 使用重载运算符实现一个复数类
实验目的: 1.掌握用成员函数重载运算符的方法 2.掌握用友元函数重载运算符的方法 实验要求: 1.定义一个复数类,描述一些必须的成员函数,如:构造函数,析构函数,赋值函数,返回数据成员值的函数等. ...
- 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl
因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Compl ...
- 侯捷《C++面向对象开发》——动手实现自己的复数类
前言 最近在看侯捷的一套课程<C++面向对象开发>,刚看完第一节introduction之后就被疯狂圈粉.感觉侯捷所提及所重视的部分也正是我一知半解的知识盲区,我之前也写过一些C++面向对 ...
- YTU 2443: C++习题 复数类--重载运算符3+
2443: C++习题 复数类--重载运算符3+ 时间限制: 1 Sec 内存限制: 128 MB 提交: 1368 解决: 733 题目描述 请编写程序,处理一个复数与一个double数相加的运 ...
随机推荐
- asio的网络通讯代码练手
asio的网络基本模板(单例模式 消息队列 ) // MyAsio.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include < ...
- 【转载】 了解实时媒体的播放(RTP/RTCP 和 RTSP)
http://blog.csdn.net/span76/article/details/12913307 离线媒体只是用 Http协议去读取服务器端文件而已,而对于实时直播如何实现, 这里就要用到 R ...
- NOIP2017提高组day2T1题解(奶酪)
题目链接:奶酪 这道题还是很水的,在下拿了满分. 并没有用什么高级的算法,我讲一下基本思路. 我们把每个洞都视为一个节点. 我们读入相关数据后,就先进行预处理,通过每个节点的信息和题目的规定,建立一张 ...
- windows无法卸载jdk的解决方法
装了java之后非常纠结的就是无法卸载,总不能因为卸载一个jdk去重装系统,但是看着它残存在那又非常不爽, 因为卸载会牵扯注册表等琐碎的东西,,,后来在官网发现神器一枚,此神器就是java卸载工具. ...
- mysql之练习题4
准备表: create table class(cid int primary key auto_increment, caption ) not null unique); INSERT into ...
- GDBT
理论知识: 第四范式自主研发算法GBDT(Gradient Boosting Decision Tree) GBDT是一种基分类器为决策树的集成学习方法.决策树是一种常见的机器学习算法,GBDT中使用 ...
- 2019.01.21 bzoj2989: 数列(二进制分组+主席树)
传送门 二进制分组入门题. 主席树写错调题2h+2h+2h+体验极差. 题意简述:给一堆点,支持加入一个点,询问有多少个点跟(x,y)(x,y)(x,y)曼哈顿距离不超过kkk. 思路:题目要求的是对 ...
- 2018.12.18 bzoj5296: [Cqoi2018]破解D-H协议(bsgs)
传送门 bsgsbsgsbsgs基础题. 考虑到给的是原根,因此没无解的情况. 于是只需要每次把a,ba,ba,b解出来. 然后可以通过预处理节省一部分时间. 代码: #include<bits ...
- 2.7 Sobel导数
OpenCV函数 Sobel(src_gray,grad_x/grad_y,ddepth,x_order,y_order,scale,delta,BORDER_DEFAULT ) Scharr( ) ...
- C中的volatile用法[转载]
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进 ...