复数是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#复数类的总结的更多相关文章

  1. [GeekBand] C++学习笔记(1)——以复数类为例

    本篇笔记以复数类(不含指针的类)为例进行面向对象的学习 ========================================================= 复数类的声明: class ...

  2. 复数类(C++练习一)

    写一个复数类,实现基本的运算,目的熟悉封装与数据抽象. 类的定义 #include <iostream> #include <vector> using namespace s ...

  3. C++习题 复数类--重载运算符2+

    Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+ ...

  4. C++习题 复数类--重载运算符+

    Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.将运算符函数重载为非成员.非友元的普通函数.编写程序,求两个复数之和. Input ...

  5. 15.C++-操作符重载、并实现复数类

    首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...

  6. C++ 实验 使用重载运算符实现一个复数类

    实验目的: 1.掌握用成员函数重载运算符的方法 2.掌握用友元函数重载运算符的方法 实验要求: 1.定义一个复数类,描述一些必须的成员函数,如:构造函数,析构函数,赋值函数,返回数据成员值的函数等. ...

  7. 定义一个复数(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 ...

  8. 侯捷《C++面向对象开发》——动手实现自己的复数类

    前言 最近在看侯捷的一套课程<C++面向对象开发>,刚看完第一节introduction之后就被疯狂圈粉.感觉侯捷所提及所重视的部分也正是我一知半解的知识盲区,我之前也写过一些C++面向对 ...

  9. YTU 2443: C++习题 复数类--重载运算符3+

    2443: C++习题 复数类--重载运算符3+ 时间限制: 1 Sec  内存限制: 128 MB 提交: 1368  解决: 733 题目描述 请编写程序,处理一个复数与一个double数相加的运 ...

随机推荐

  1. Epson Pos Printer for .net

    注:因发现各网站爬虫随意收集文章,故做此声明:版权归原作者(Leaf.Duan)所有,转载还请著名出处,谢谢 设备信息 Epson TM-T88IV Thermal Printer,爱普生 TM-T8 ...

  2. Python开课复习9-28

    一.什么是迭代器#迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 举例: l=[1,2,3] count=0 while co ...

  3. java.io.IOException: java.sql.SQLException: ORA-01502: index 'BTO.PK_xxxxx' or partition of such index is in unusable state

    最近由于数据库的全备出问题了,所以一直在观察. 刚好发现很多不需要的数据,就删了几百个G的数据吧. 今天突然就报这个问题. java.io.IOException: java.sql.SQLExcep ...

  4. 第31章:MongoDB-索引--复合索引

    ①复合索引 对多个字段创建索引被称为复合索引或者组合索引 ②创建组合索引 创建组合索引(以后台模式创建) db.user.ensureIndex({"username": 1, & ...

  5. silverlight导出图片文件

    新建一个Silverlight应用程序,添加下面两个控件: image控件:image1: Button控件:Click="Button1_Click"; code-Behind代 ...

  6. 事件同步(一)-——CreateEvent( )事件对象实现线程同步

    事件对象分为两类:人工重置事件对象和自动重置事件对象.对于人工重置事件对象,可以同时有多个线程等待到事件对象,成为可调度线程. 对于自动重置事件对象,等待该事件对象的多个线程只能有一个线程成为可调度线 ...

  7. mac终端的命令都失效的解决方法

    step1. 在terminal里面输入: export PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin&qu ...

  8. day37(类加载器)

    类的加载器:将class文件加载到JVM中执行这个文件. Java中将类加载器分成三类: 引导类加载器:     JAVA_HOME/jre/lib/rt.jar | 扩展类加载器:     JAVA ...

  9. centos网络配置(手动设置,自动获取)的2种方法3

    不知道为什么最近一段时间网络特别的慢,还老是断,断的时候,局域网都连不上,当我手动设置一下ip后就可以了,搞得我很无语.下面是2种设置网络连接的方法,在说怎么设置前,一定要做好备份工作,特别是对于新手 ...

  10. noip第26课作业

    1.    信使 [问题描述] 战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系.信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位).指挥部设在第一个哨所.当指 ...