CalcExpression VisitParenthesesExpression(CalcParenthesesExpression expr, int baseRow, int baseColumn) { CalcExpression arg = expr.Arg; CalcExpression expression2 = this.Visit(arg, baseRow, baseColumn); if (arg != expression2) { return(new CalcParenthesesExpression(expression2)); } return(expr); }
public IEnumerable <MathsExercises> GetExample(int age) { // return _context.Exercises.ToArray<MathsExercises>(); var rng = new Random(); int SettingId = rng.Next(1, 101); Guid guid = Guid.NewGuid(); for (int i = 0; i < 5; i++) { MathsExercises item = new MathsExercises(); item.SettingId = SettingId;// guid.ToString(); item.Formula = Logic.GetRandomFormula(); item.UserAnswer = ""; item.RightAnswer = CalcParenthesesExpression.CalculateParenthesesExpression(item.Formula); item.CreateTime = DateTime.Now; item.SaveTime = null; // { HashValue = guid.ToString(),Formula = "1+2", Anwser = "", CreateTime = DateTime.Now, SaveTime = null _context.Exercises.Add(item); } _context.SaveChanges(); return(_context.Exercises.Where(item => item.SettingId == SettingId).ToList()); // return Enumerable.Range(1, 5).Select(index => new MathsExercise.Models.MathsExercises // { // // DateFormatted = DateTime.Now.AddDays(index).ToString("d"), // // TemperatureC = rng.Next(-20, 55), // // Summary = Summaries[rng.Next(Summaries.Length)] // ID = index, // HashValue = index.ToString(), // Formula="1+2", // Anwser ="", // CreateTime = DateTime.Today , // SaveTime = DateTime.Now // }); }
public static void ExtractAllReferenceExpression(ICalcEvaluator evaluator, CalcExpression root, List <CalcReferenceExpression> nodes) { if (root is CalcBinaryOperatorExpression) { CalcBinaryOperatorExpression expression = root as CalcBinaryOperatorExpression; ExtractAllReferenceExpression(evaluator, expression.Left, nodes); ExtractAllReferenceExpression(evaluator, expression.Right, nodes); } else if (root is CalcParenthesesExpression) { CalcParenthesesExpression expression2 = root as CalcParenthesesExpression; ExtractAllReferenceExpression(evaluator, expression2.Arg, nodes); } else if (root is CalcExternalNameExpression) { CalcExternalNameExpression expression3 = root as CalcExternalNameExpression; ICalcSource source = expression3.Source; if (source != null) { CalcExpression expression4 = source.GetDefinedName(expression3.Name, -1, -1); if (expression4 != null) { ExtractAllReferenceExpression(evaluator, expression4, nodes); } } } else if (root is CalcFunctionExpression) { CalcFunctionExpression expr = root as CalcFunctionExpression; Worksheet worksheet = evaluator as Worksheet; if (worksheet != null) { CalcEvaluatorContext context = new CalcEvaluatorContext(worksheet, false, worksheet.ActiveRowIndex, worksheet.ActiveColumnIndex, 1, 1); object obj2 = new CalcEvaluator().Evaluate(expr, context, true, true); if (obj2 is CalcReference) { CalcReference reference = obj2 as CalcReference; int row = reference.GetRow(0); int rowCount = reference.GetRowCount(0); int column = reference.GetColumn(0); int columnCount = reference.GetColumnCount(0); ICalcSource source2 = null; CalcReference reference2 = reference.GetSource(); // hdt MethodInfo info = reference2.GetType().GetRuntimeMethod("GetContext", null); if (info != null) { source2 = info.Invoke(reference2, null) as ICalcSource; } if (source2 == null) { source2 = worksheet; } CalcExternalRangeExpression expression6 = CreateExternalRangeExpressionByCount(source2, row, column, rowCount, columnCount, false, false, false, false); nodes.Add(expression6); } } } else if (root is CalcReferenceExpression) { nodes.Add(root as CalcReferenceExpression); } }
/// <summary> /// 由中序式转换成后序式,再用栈来进行计算 /// </summary> /// <param name="expression">表达式</param> /// <returns></returns> public static float CalcByCalcParenthesesExpression(string expression) { string result = new CalcParenthesesExpression().CalculateParenthesesExpression(expression); return(float.Parse(result)); }
public IEnumerable <VMathsExercise> GetQuestion(string hashvalue, int amount, string operation, int quantityarithmetic, string maxValueType, int maxValue) { #region Initial paramter if (hashvalue.Length != 36) { // wrong value for hashvalue; return(null); } int _amount = 20; List <string> operations = new List <string>(); int _quantityarithmetic = 2; // ensure quantity is valid data. switch (amount) { case 5: _amount = amount; break; case 10: _amount = amount; break; case 30: _amount = amount; break; case 40: _amount = amount; break; case 50: _amount = amount; break; default: _amount = 20; break; } Char[] items = operation.ToLower().ToCharArray(); foreach (char item in items) { if (item == 'a') { operations.Add("+"); continue; } if (item == 'b') { operations.Add("-"); continue; } if (item == 'c') { operations.Add("*"); continue; } if (item == 'd') { operations.Add("/"); continue; } } //ensure operations has one action at least. if (operations.Count <= 0) { operations.Add("+"); } //ensure quantityarithmetic is between 1 and 5; switch (quantityarithmetic) { case 1: _quantityarithmetic = quantityarithmetic; break; case 3: _quantityarithmetic = quantityarithmetic; break; case 4: _quantityarithmetic = quantityarithmetic; break; case 5: _quantityarithmetic = quantityarithmetic; break; default: _quantityarithmetic = 2; break; } // string _maxValueType = "2"; int _maxValue = maxValue < 1?20:maxValue; Setting setting = new Setting(); setting.CreateTime = DateTime.Now; setting.Amount = _amount; setting.QuantityOfOperation = _quantityarithmetic; setting.MaxValue = _maxValue; setting.GUIDValue = hashvalue; setting.Operations = ""; foreach (string item in operations) { setting.Operations += item; } // _context.Setting.Add(setting); // _context.SaveChanges(); SettingBll settingBll = new SettingBll(this._context); if (settingBll.Insert(setting)) { setting = settingBll.GetOne(hashvalue); } else { return(null); } #endregion MathsExercisesBll exerBll = new MathsExercisesBll(this._context); List <MathsExercises> Exercises = new List <MathsExercises>(); for (int i = 0; i < _amount; i++) { // Console.WriteLine("I=" + i.ToString()); MathsExercises item = new MathsExercises(); item.SettingId = setting.ID; item.Formula = Logic.GetRandomFormula(operations, _quantityarithmetic, _maxValueType, _maxValue); item.UserAnswer = ""; item.RightAnswer = CalcParenthesesExpression.CalculateParenthesesExpression(item.Formula); item.CreateTime = DateTime.Now; item.SaveTime = null; // { HashValue = guid.ToString(),Formula = "1+2", Anwser = "", CreateTime = DateTime.Now, SaveTime = null // _context.Exercises.Add(item); Exercises.Add(item); } exerBll.Create(Exercises); List <MathsExercises> result = exerBll.GetData(setting.ID); List <VMathsExercise> rtn = new List <VMathsExercise>(); foreach (MathsExercises question in result) { VMathsExercise item = new VMathsExercise(); item.ID = question.ID; item.Formula = question.Formula; item.SettingId = question.SettingId; item.CreateTime = question.CreateTime; item.RightAnswer = question.RightAnswer; rtn.Add(item); } return(rtn); }
public virtual CalcExpression Visit(CalcExpression expr, int baseRow, int baseColumn) { CalcConstantExpression expression = expr as CalcConstantExpression; if (expression != null) { return(this.VisitConstantExpression(expression)); } CalcCellExpression expression2 = expr as CalcCellExpression; if (expression2 != null) { return(this.VisitCellExpression(expression2, baseRow, baseColumn)); } CalcRangeExpression expression3 = expr as CalcRangeExpression; if (expression3 != null) { return(this.VisitRangeExpression(expression3, baseRow, baseColumn)); } CalcUnaryOperatorExpression expression4 = expr as CalcUnaryOperatorExpression; if (expression4 != null) { return(this.VisitUnaryOperatorExpression(expression4, baseRow, baseColumn)); } CalcBinaryOperatorExpression expression5 = expr as CalcBinaryOperatorExpression; if (expression5 != null) { return(this.VisitBinaryOperatorExpression(expression5, baseRow, baseColumn)); } CalcFunctionExpression expression6 = expr as CalcFunctionExpression; if (expression6 != null) { return(this.VisitFunctionExpression(expression6, baseRow, baseColumn)); } CalcExternalCellExpression expression7 = expr as CalcExternalCellExpression; if (expression7 != null) { return(this.VisitExternalCellExpression(expression7, baseRow, baseColumn)); } CalcExternalRangeExpression expression8 = expr as CalcExternalRangeExpression; if (expression8 != null) { return(this.VisitExternalRangeExpression(expression8, baseRow, baseColumn)); } if (expr is CalcSharedExpression) { CalcExpression expression9 = (expr as CalcSharedExpression).Expression; CalcExpression expression10 = this.Visit(expression9, baseRow, baseColumn); if (expression10 == expression9) { return(expr); } return(new CalcSharedExpression(expression10)); } CalcParenthesesExpression expression11 = expr as CalcParenthesesExpression; if (expression11 != null) { return(this.VisitParenthesesExpression(expression11, baseRow, baseColumn)); } CalcNameExpression expression12 = expr as CalcNameExpression; if (expression12 != null) { return(this.VisitNameExpression(expression12, baseRow, baseColumn)); } CalcExternalNameExpression expression13 = expr as CalcExternalNameExpression; if (expression13 != null) { return(this.VisitExternalNameExpression(expression13, baseRow, baseColumn)); } CalcSheetRangeExpression expression14 = expr as CalcSheetRangeExpression; if (expression14 != null) { return(this.VisitSheetRangeExpression(expression14, baseRow, baseColumn)); } return(expr); }