数组中的元素(当从字典值中复制时)被反转

Elements in array (when reproduced from a dictionary value) are reversed

我的目标是用 c# 制作一个数学表达式解释器,例如,如果您键入“A=3”,它会将 A 保存为字典键,将 3 保存为其值,该程序具有更多功能,因此如果您键入“B=3”,然后键入“A=B+3”,然后键入“Show(A)”,它必须显示“6”作为答案。

一切正常,直到我键入“A=10”“B=10”“C=A+B”和最后“Show(C)”之类的内容,因为变量的值是两位数(或更多) ) numbers 在这种情况下,当产生最终结果时,数字保存在字符串中,如“01+01”而不是“10+10”(因为 A 和 B 值是 10 所以 A+B 应该是 10+10),所以有点颠倒了。

我尝试反转字符串然后评估答案,但效果不佳,只是出于某种原因它给了我“1+1”!

备注:

  1. 表达式求值由“return Convert.ToInt32(new DataTable().Compute(result, null));”

  2. 因为字符串在 c# 中是不可变的,所以当方法中出现“A+B”或“3+5”等每个表达式时,我创建了一个新的空字符串,如 (string result = " " ;) 然后在“result = ValidExpression[i] + result.Remove(counter, 0);”的帮助下,我用值更改变量(注意=如果输入的所有元素都是数字,答案是正确的) 像 "A" 和 "23" 并将它们放入新字符串中,然后计算最终字符串。但正如我所说,它将 23 保存为 32,所以答案是错误的。

这是我的代码,错误可能在 LongProcessing 方法中。 感谢您的帮助。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
using System.Data;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Welcome To The Program\nCorrect Syntax:");
            Console.WriteLine("A=10\nB=15\nC=A+B\nD=13/4-2+A-C+B\nShow(D)");
            Console.WriteLine("\nEnter your input:");

            Expression E = new Expression();
            string expression = "start";
            while (expression != "exit")
            {
                expression = Console.ReadLine();
                // for show command
                if (expression.Contains("Show") == true)
                    try { E.Show(expression[5]); }
                    catch (Exception e)
                    {
                        Console.WriteLine("input is not correct, Can not show anything. please try again");
                    }

                if (E.Validation(expression) == false)
                    Console.WriteLine("input is not correct, please try again");
                else
                    E.Processing(expression);
            }
            Console.ReadKey();
        }
    }

    class Expression
    {
        public Dictionary<Char, String> Variables = new Dictionary<Char, String>();
        public Expression()
        { }

        public Boolean Validation(string expression)
        {
            // true if c is a letter or a decimal digit; otherwise, false  &&  true if c is a decimal digit; otherwise, false.
            if (!Char.IsLetterOrDigit(expression[0]) || Char.IsDigit(expression[0]))
                return false;
            else
                return true;
        }

        public void Processing(String ValidExpression)
        {
            // Update Dictionary with new values per key
            if (Variables.ContainsKey(ValidExpression[0]))
                Variables.Remove(ValidExpression[0]);

            string temp = "                ";
            if (ValidExpression.Length > 2 && !ValidExpression.Contains("Show") && !ValidExpression.Contains("exit"))
            {
                // removing the variable name and "=" from the string
                for (int i = 2; i < ValidExpression.Length; i++)
                    temp = ValidExpression[i] + temp.Remove(i, 0);

                Variables.Add(ValidExpression[0], LongProcessing(temp).ToString());
            }
        }
         
        // something is wrong in this method
        public int LongProcessing(String ValidExpression)
        {
            string temp;
            int counter = 0;
            string result = "                   ";
            for (int i = 0; i < ValidExpression.Length; i++)
            {
                //changing variables (letters) with values
                if (Char.IsLetter(ValidExpression[i]))
                {
                    if (Variables.ContainsKey(ValidExpression[i]))
                    {
                        Variables.TryGetValue(ValidExpression[i], out temp);
                        for (int j = 0; j < temp.Length; j++)
                        {
                            result = temp[j] + result.Remove(counter, 0);
                            counter++;
                        }
                    }
                }
                else
                {
                    result = ValidExpression[i] + result.Remove(counter, 0);
                    counter++;
                }
            }
            // checks if all of the string elements are numbers
            if (ValidExpression.All(char.IsDigit))
                return Convert.ToInt32(ValidExpression);
            else
            {
                return Convert.ToInt32(new DataTable().Compute(result, null));
            }
        }
        
        public void Show(Char ValidExpression)
        {

            Console.WriteLine(Variables[ValidExpression]);
        }
    }
}

这里有一些建议:

首先查看“Processing”中“temp”的值。为了帮助调试,请添加“Console.WriteLine”语句。

public void Processing(String ValidExpression)
{
    // Update Dictionary with new values per key
    if (Variables.ContainsKey(ValidExpression[0]))
        Variables.Remove(ValidExpression[0]);

    string temp = "                ";
    if (ValidExpression.Length > 2 && !ValidExpression.Contains("Show") && !ValidExpression.Contains("exit"))
    {
        // removing the variable name and "=" from the string
        for (int i = 2; i < ValidExpression.Length; i++)
        {
            temp = ValidExpression[i] + temp.Remove(i, 0);
            Console.WriteLine("    temp: " + temp); //added for debugging
        }
                    

        Variables.Add(ValidExpression[0], LongProcessing(temp).ToString());
    }

}

其他几件事:

  • 永远不会通知用户如何退出。

  • 有一个名为“Expression”的class和一个名为 “表达”。这很可能会造成混淆。

您可能还想看看这个 post:how to convert a string to a mathematical expression programmatically

这是坏的:

for (int i = 2; i < ValidExpression.Length; i++)
  temp = ValidExpression[i] + temp.Remove(i, 0);

temp.Remove(i, 0) 是一个非操作,你不妨写 temp

所以让我们绘制循环:

Assume ValidExpression is "A=10"

Temp starts out as "                "
First iteration, temp is "1                " 
Second iteration, temp is "01                "

任何从左到右通过字符串、逐个字符、拉出一个字符并将其粘贴在不断增长的字符串开头的操作都会反转字符串

也许您的意思是不使用循环而是使用 temp = ValidExpression.Substring(2) ?