Пример #1
0
        public double Solve()
        {
            switch (Operator)
            {
            case "v":
                break;

            case "+":
                result = LeftNumber.Solve() + RightNumber.Solve();
                break;

            case "-":
                result = LeftNumber.Solve() - RightNumber.Solve();
                break;

            case "*":
                result = LeftNumber.Solve() * RightNumber.Solve();
                break;

            case "/":
                result = LeftNumber.Solve() / RightNumber.Solve();
                break;

            default:
                throw new Exception("Call Parse first.");
            }
            return(result);
        }
Пример #2
0
        /// <summary>
        /// 四則運算事件
        /// </summary>
        /// <param name="newNumber">待處理數字</param>
        /// <param name="nextOperator">下次要執行的運算子</param>
        public void OperateEvent(NumberField newNumber, IOperator nextOperator)
        {
            //RightNumber一定會變null
            //無限大時,Expression的處理被Compute負責了(?)
            if (newNumber.isInput == false)
            {
                //如果等號後input, LeftNumber不變,並將RightNumber清空
                RightNumber = null;
                Operator    = nextOperator;
            }
            else if (LeftNumber == null && Operator != null && RightNumber != null)
            {
                //等號後Input + Interrupt的狀況
                LeftNumber  = newNumber;
                Operator    = nextOperator;
                RightNumber = null;
            }
            else if (LeftNumber == null && Operator == null && RightNumber == null)
            {
                //第一次輸進數字,不做運算
                LeftNumber = newNumber;
                Operator   = nextOperator;
            }
            else if (LeftNumber != null && Operator != null && RightNumber == null)
            {
                //左數 四則運算 右數
                LeftNumber = Compute(LeftNumber, newNumber);
                Operator   = nextOperator;
            }
            else if (LeftNumber != null && Operator != null && RightNumber != null)
            {
                //negate case
                LeftNumber  = newNumber;
                Operator    = nextOperator;
                RightNumber = null;
            }

            //這個階段若LeftNumber.NaN 為true ,代表除到0了
            if (!LeftNumber.NaN)
            {
                Expression = $"{LeftNumber.ToString()} {nextOperator.Mark()}";
            }

            //無限大處理,後續還未做
            if (LeftNumber.NaN)
            {
                Expression += $" 0 {Operator.Mark()}";
            }
        }
Пример #3
0
 public override bool CheckExplode(int pairCount)
 {
     //To reduce a snailfish number, you must repeatedly do the first action in this list that applies to the snailfish number:
     //If any pair is nested inside four pairs, the leftmost such pair explodes.
     if (pairCount > 4)
     {
         Explode();
         return(true);
     }
     else
     {
         if (LeftNumber.CheckExplode(pairCount + 1))
         {
             return(true);
         }
         if (RightNumber.CheckExplode(pairCount + 1))
         {
             return(true);
         }
         return(false);
     }
 }
Пример #4
0
        public double Solve()
        {
            switch (Operator)
            {
            case "v":
                break;

            case "#":
                result = LeftNumber.Solve() / RightNumber.Solve() * -1;
                break;

            case "x":
                result = LeftNumber.Solve() * RightNumber.Solve() * -1;
                break;

            case "+":
                result = LeftNumber.Solve() + RightNumber.Solve();
                break;

            case "-":
                result = LeftNumber.Solve() - RightNumber.Solve();
                break;

            case "*":
                result = LeftNumber.Solve() * RightNumber.Solve();
                break;

            case "/":
                result = LeftNumber.Solve() / RightNumber.Solve();
                break;

            default:
                break;
            }
            return(result);
        }
Пример #5
0
 public override void AddToLeft(int number)
 {
     LeftNumber.AddToLeft(number);
 }
Пример #6
0
 public override bool CheckSplit() => LeftNumber.CheckSplit() || RightNumber.CheckSplit() || false;
Пример #7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="value">Input olarak gelen string değer</param>
        /// <param name="operand">İşlem önceliğine göre gelen operator</param>
        /// <returns></returns>
        public string Resolve(string value, char operand)
        {
            ///Eğer input içerisinde +- ve -+ ifadeleri var ise -'ye dönüştürülüyor.
            while (value.Contains("+-") || value.Contains("-+"))
            {
                value = value.Replace("+-", "-");
                value = value.Replace("-+", "-");
            }

            while (value.Contains(operand))
            {
                OperandIndex = value.LastIndexOf(operand);

                if (value.StartsWith('-') && MinusControl(value))
                {
                    return(value);
                }
                for (int i = OperandIndex + 1; i < value.Length; i++) // OPERANDIN SAĞ TARAFINDAKİ SAYIYI BULMA İŞLEMİ
                {
                    if (value[OperandIndex + 1] == '+' && !RightPlusLimit)
                    {
                        RightPlusLimit = true;
                    }
                    else if (value[i] == '-' && !RightLimit)
                    {
                        RightNumber += value[i].ToString();
                        RightLimit   = true;
                    }
                    else if (OperatorControl(value[i]))
                    {
                        RightNumber += value[i].ToString();
                        RightLimit   = true;
                    }
                    else
                    {
                        i = value.Length; //Çıkış
                    }
                }
                for (int i = OperandIndex - 1; i >= 0; i--) // OPERANDIN SOL TARAFINDAKİ SAYIYI BULMA İŞLEMİ
                {
                    if (value[OperandIndex - 1] == '+' && !LeftPlusLimit)
                    {
                        LeftNumber   += value[i].ToString();
                        LeftPlusLimit = true;
                    }
                    else if (value[i] == '-' && !LeftLimit)
                    {
                        LeftNumber += value[i].ToString();
                        RightLimit  = true;
                        i           = 0; //Çıkış
                    }
                    else if (OperatorControl(value[i]))
                    {
                        LeftNumber += value[i].ToString();
                    }
                    else
                    {
                        i = 0; //Çıkış
                    }
                }

                LeftNumber = ReverseForLeftNumber(LeftNumber);
                string changeValue = LeftNumber + operand + RightNumber;
                LeftNumber = LeftPlusLimit == true?LeftNumber.Remove(LeftNumber.Length - 1, 1) : LeftNumber;

                string sonuc = CalculateOperand.Calculate(LeftNumber, RightNumber, operand);
                value          = value.Replace(changeValue, sonuc);
                LeftNumber     = string.Empty;
                RightNumber    = string.Empty;
                LeftLimit      = false;
                RightLimit     = false;
                LeftPlusLimit  = false;
                RightPlusLimit = false;
            }
            return(value);
        }