using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ImaginaryNumber   //  本来写虚数的,一不小心写成完整的复数了
{
    class Complex   //  虚数类
    {
        private double Real;    //  实部
        private double Img;     //  虚部

        public double GetReal   // 获取实部
        {
            get { return Real; }
            set { Real = value; }
        }

        public double GetImg    // 获取虚部
        {
            get { return Img; }
            set { Img = value; }
        }

        public Complex() // 构造函数
        {
            Real = Img = 0;
        }

        public Complex(double real, double img) // 重载构造函数
        {
            Real = real;
            Img = img;
        }

        public void Print() // 输出虚数,符合书写习惯,且四舍五入保留小数点后4位数字
        {
            if (Real == 0 && Img == 0)      // 为零
                Console.WriteLine("0");
            else if (Real == 0)             // 只有虚部,纯虚数
                Console.WriteLine("{0}i", (double)Math.Round((double)Img, 4));
            else if (Img == 0)              // 只有实部,实数
                Console.WriteLine("{0}", (double)Math.Round((double)Real, 4));
            else if (Img < 0)               // 虚部为负
                Console.WriteLine("{0} - {1}i", (double)Math.Round((double)Real, 4), (double)Math.Round((double)-Img, 4));
            else                            // 标准的复数 
                Console.WriteLine("{0} + {1}i", (double)Math.Round((double)Real, 4), (double)Math.Round((double)Img, 4));
        }

        public static Complex operator +(Complex c1, Complex c2)   // 重载加号
        {
            return new Complex(c1.Real + c2.Real, c1.Img + c2.Img);
        }

        public static Complex operator -(Complex c)    // 重载取反符号
        {
            return new Complex(-c.Real, -c.Img);
        }

        public static Complex operator -(Complex c1, Complex c2)   // 重载减号
        {
            return new Complex(c1.Real - c2.Real, c1.Img - c2.Img);
        }

        public static Complex operator *(Complex c1, Complex c2)   // 重载乘号
        {
            return new Complex(c1.Real * c2.Real - c1.Img * c2.Img, c1.Real * c2.Img + c1.Img * c2.Real);
        }

        public static Complex operator /(Complex c1, Complex c2)   //  重载除号
        {
            return new Complex((c1.Real * c2.Real + c1.Img * c2.Img) * 1.0 / (c2.Real * c2.Real + c2.Img * c2.Img), (c1.Img * c2.Real - c1.Real * c2.Img) * 1.0 / (c2.Real * c2.Real + c2.Img * c2.Img));
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            // 随意测试
            Complex c1 = new Complex();
            Complex c2 = new Complex(5, 5);
            Complex c3 = new Complex(0, -2.3);
            Complex c4 = new Complex(3, 0);
            c4 = -c4;
            Console.Write("c1 = "); c1.Print();
            Console.Write("c2 = "); c2.Print();
            Console.Write("c3 = "); c3.Print();
            Console.Write("c4 = "); c4.Print();
            c1 = c2 + c3;
            c2 = c3 / c4;
            c3 = c1 * c2;
            c4 = c2 - c3;
            Console.Write("c1 = "); c1.Print();
            Console.Write("c2 = "); c2.Print();
            Console.Write("c3 = "); c3.Print();
            Console.Write("c4 = "); c4.Print();
            Console.ReadLine();
        }
    }
}