首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用C#创建一个简单的公式计算器

用C#创建一个简单的公式计算器
EN

Stack Overflow用户
提问于 2018-09-01 14:34:57
回答 2查看 3.2K关注 0票数 1

这是我的一些家庭作业。我必须创建一个计算器应用程序,它要求用户输入,然后计算它。输入必须采用公式格式。例如:“x=3+8”、“x=6-3”或x=“6-3*9”。我解决这个问题的方法是首先分解用户输入的字符串,并将其存储到char数组中:

代码语言:javascript
运行
复制
private char[] userInput;
string input = Console.ReadLine();
input = input.Replace(" " ,"");
userInput = input.ToCharArray();

此时,userInput将包含来自输入的所有字符。接下来,我通过循环数组来查找方程的变量,这应该会给出它找到的第一个字母字符:

代码语言:javascript
运行
复制
char var = 'x';
for (int i = 0; i < userInput.Length; i++)
{
     char c = userInput[i];
     if (Char.IsLetter(c)){
         var = c;
         break;
     }
}

下一步,我将用变量一端和另一端的所有数字和运算符来分解方程,用'=‘分隔,然后将所有数字和运算符添加到一个新的char数组中:

代码语言:javascript
运行
复制
//get '=' position
int equalPos = 0;
for (int i = 0; i < userInput.Length; i++)
{
    char c = userInput[i];
    if (Char.IsSymbol(c))
    {
       if (c.Equals('='))
          {
              equalPos = i;
              break;
           }
     }
}
//add equation to new array
rightSide = new char[userInput.Length-equalPos];
int a = 0;
for (int i = equalPos + 1; i < userInput.Length; i++)
{
    char c = userInput[i];
    rightSide[a] = c;
    a++;
}

此时,rightSide数组将包含所有的数字和运算符作为字符。我可以使用System.Data.DataTable().Compute()来计算这一部分。但是,如果我不被允许使用任何库,我如何实现它?方程式应该只包含一个变量(总是出现在方程式的左侧),四个基本运算符(+-/*),并且没有括号。

EN

回答 2

Stack Overflow用户

发布于 2018-09-01 20:35:33

如果首先通过=操作符拆分字符串,则会得到字符串的左右两端。因此,在等式的右侧,如果方程是'x =6*2+ 1',我们就有'6 *2+ 1',所以我们可以计算它并使用循环和开关遵循标准的BIDMAS规则:

我已经删除了所有的错误检查,这个解决方案适用于当用户输入形式为'x ={方程}‘或’{方程}= x‘的完美方程时。

还要注意的是,string是一个char[]

代码语言:javascript
运行
复制
//get user input
Console.Write("Enter equation:");
string input = Console.ReadLine();
string[] splitInput = input.Split('=');
int index = char.IsLetter(splitInput[0].Replace(" ", "")[0]) ? 1 : 0;
string sideWithEquation = splitInput[index];

//Compute right hand side
string[] equation = sideWithEquation.Split(' ');

使用BIDMAS,忽略括号和索引,首先计算除法和乘法。

代码语言:javascript
运行
复制
    //compute for * and /
    for (int i = 1; i < equation.Length - 1; i++)
    {
        string item = equation[i];
        int num = 0;
        switch (item)
        {
           case "*":
                num = Convert.ToInt32(equation[i - 1]) * Convert.ToInt32(equation[i + 1]);
                break;
            case "/":
                num = Convert.ToInt32(equation[i - 1]) / Convert.ToInt32(equation[i + 1]);
                break;
        }
        if (num > 0)
        {
             equation[i - 1] = "";
             equation[i] = "";
             equation[i + 1] = num.ToString();
         }
     }

然后我们计算加法和减法

代码语言:javascript
运行
复制
//Now compute for + and -
 equation = string.Join(" ", equation).Split(' ');
 for (int i = 1; i < equation.Length - 1; i++)
 {
      string item = equation[i];
      int num = 0;
      switch (item)
      {
           case "+":
              num = Convert.ToInt32(equation[i - 1]) + Convert.ToInt32(equation[i + 1]);
              break;
           case "-":
              num = Convert.ToInt32(equation[i - 1]) - Convert.ToInt32(equation[i + 1]);
              break;
      }
      if (num > 0)
      {
            equation[i - 1] = "";
            equation[i] = "";
            equation[i + 1] = num.ToString();
      }
  }

然后再次向用户显示x的值

代码语言:javascript
运行
复制
  string total = string.Join("", equation);     
  //display what x is
  Console.WriteLine($"x = {int.Parse(total)}" ); 
票数 0
EN

Stack Overflow用户

发布于 2018-09-01 20:56:22

你的答案可以分为两部分First如何将字符数组转换为string类型Second如何将字符串转换为first part的可执行代码块使用以下方法:

代码语言:javascript
运行
复制
char[] chars;
string s = new string(chars);

对于Second part,IT是DIFFiCULT,如果没有任何预先编写的代码就无法找到这样做的方法,那么您必须使用Microsoft.CSharp.CSharpCodeProvider动态编译代码。特别是,搜索CompileAssemblyFromFile

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52125547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档