C#复数类Complex的封装
2015-07-20 21:31
621 查看
C#复数类Complex的封装
----------------------------------------------------------------------------------------------------------------------------------------------------------本文作者:随煜而安
时间:
二零一五年七月二十日
----------------------------------------------------------------------------------------------------------------------------------------------------------
本文给出使用C#语言对于复数类Complex的封装。包括大多数基本的运算及方法,个人感觉总结的蛮全的。话不多说,直接上代码!
----------------------------------------------------------------------------------------------------------------------------------------------------------本文作者:随煜而安
时间:
二零一五年七月二十日
----------------------------------------------------------------------------------------------------------------------------------------------------------
本文给出使用C#语言对于复数类Complex的封装。包括大多数基本的运算及方法,个人感觉总结的蛮全的。话不多说,直接上代码!
/// <summary> /// 复数类 /// </summary> public class Complex { #region 字段 //复数实部 private double real = 0.0; //复数虚部 private double imaginary = 0.0; #endregion #region 属性 /// <summary> /// 获取或设置复数的实部 /// </summary> public double Real { get { return real; } set { real = value; } } /// <summary> /// 获取或设置复数的虚部 /// </summary> public double Imaginary { get { return imaginary; } set { imaginary = value; } } #endregion #region 构造函数 /// <summary> /// 默认构造函数,得到的复数为0 /// </summary> public Complex() :this(0,0) { } /// <summary> /// 只给实部赋值的构造函数,虚部将取0 /// </summary> /// <param name="dbreal">实部</param> public Complex(double dbreal) :this(dbreal,0) { } /// <summary> /// 一般形式的构造函数 /// </summary> /// <param name="dbreal">实部</param> /// <param name="dbImage">虚部</param> public Complex(double dbreal, double dbImage) { real = dbreal; imaginary = dbImage; } /// <summary> /// 以拷贝另一个复数的形式赋值的构造函数 /// </summary> /// <param name="other">复数</param> public Complex(Complex other) { real = other.real; imaginary = other.imaginary; } #endregion #region 重载 //加法的重载 public static Complex operator +(Complex comp1, Complex comp2) { return comp1.Add(comp2); } //减法的重载 public static Complex operator -(Complex comp1, Complex comp2) { return comp1.Substract(comp2); } //乘法的重载 public static Complex operator *(Complex comp1, Complex comp2) { return comp1.Multiply(comp2); } //==的重载 public static bool operator ==(Complex z1, Complex z2) { return ((z1.real == z2.real) && (z1.imaginary == z2.imaginary)); } //!=的重载 public static bool operator !=(Complex z1, Complex z2) { if (z1.real == z2.real) { return (z1.imaginary != z2.imaginary); } return true; } /// <summary> /// 重载ToString方法,打印复数字符串 /// </summary> /// <returns>打印字符串</returns> public override string ToString() { if (Real == 0 && imaginary == 0) { return string.Format("{0}", 0); } if (Real == 0 && (imaginary != 1 && imaginary != -1)) { return string.Format("{0} i", imaginary); } if (imaginary == 0) { return string.Format("{0}", Real); } if (imaginary == 1) { return string.Format("i"); } if (imaginary == -1) { return string.Format("- i"); } if (imaginary < 0) { return string.Format("{0} - {1} i", Real, -imaginary); } return string.Format("{0} + {1} i", Real, imaginary); } #endregion #region 公共方法 /// <summary> /// 复数加法 /// </summary> /// <param name="comp">待加复数</param> /// <returns>返回相加后的复数</returns> public Complex Add(Complex comp) { double x = real + comp.real; double y = imaginary + comp.imaginary; return new Complex(x, y); } /// <summary> /// 复数减法 /// </summary> /// <param name="comp">待减复数</param> /// <returns>返回相减后的复数</returns> public Complex Substract(Complex comp) { double x = real - comp.real; double y = imaginary - comp.imaginary; return new Complex(x, y); } /// <summary> /// 复数乘法 /// </summary> /// <param name="comp">待乘复数</param> /// <returns>返回相乘后的复数</returns> public Complex Multiply(Complex comp) { double x = real * comp.real - imaginary * comp.imaginary; double y = real * comp.imaginary + imaginary * comp.real; return new Complex(x, y); } /// <summary> /// 获取复数的模/幅度 /// </summary> /// <returns>返回复数的模</returns> public double GetModul() { return Math.Sqrt(real * real + imaginary * imaginary); } /// <summary> /// 获取复数的相位角,取值范围(-π,π] /// </summary> /// <returns>返回复数的相角</returns> public double GetAngle() { #region 原先求相角的实现,后发现Math.Atan2已经封装好后注释 ////实部和虚部都为0 //if (real == 0 && imaginary == 0) //{ // return 0; //} //if (real == 0) //{ // if (imaginary > 0) // return Math.PI / 2; // else // return -Math.PI / 2; //} //else //{ // if (real > 0) // { // return Math.Atan2(imaginary, real); // } // else // { // if (imaginary >= 0) // return Math.Atan2(imaginary, real) + Math.PI; // else // return Math.Atan2(imaginary, real) - Math.PI; // } //} #endregion return Math.Atan2(imaginary, real); } /// <summary> /// 获取复数的共轭复数 /// </summary> /// <returns>返回共轭复数</returns> public Complex Conjugate() { return new Complex(this.real, -this.imaginary); } #endregion }
相关文章推荐
- C#之Lamba表达式
- C#的开始
- C# DEBUG 调试信息打印及输出详解
- C#产生正态分布、泊松分布、指数分布、负指数分布随机数(原创)
- C#高级编程四十三天----Lambda表达式
- C# 文件操作方法
- BC#45 1004 && HDU 5275【差值方法】
- C#写入对象或集合类型数据到xml文件的方法
- C#反射
- C#简单写入xml文件的方法
- .NET: C#: 获取当前路径
- C#.NET里面抽象类和接口有什么区别?
- C# in depth ( 第三章 用泛型实现参数化类型)
- C#下文件转换到二进制流再到十六进制的转换流程
- 设置c#项目obj路径的方法
- C#中this的用法,你用过几种?
- C#字典的遍历方法
- C#索引器的使用
- C#简单总结
- C#设计模式学习笔记-单例模式