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); }
/// <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()}"; } }
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); } }
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); }
public override void AddToLeft(int number) { LeftNumber.AddToLeft(number); }
public override bool CheckSplit() => LeftNumber.CheckSplit() || RightNumber.CheckSplit() || false;
/// <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); }