Example #1
0
        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

            // });
        }
Example #3
0
        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);
        }
Example #6
0
        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);
        }