简体   繁体   中英

C# calculate multiple values from textbox

I am a student and got a task where I will have to make a program that solves first-grade equations. I will start of by making a textbox where I can write down different numbers of all the arithmetics, for example, 3+4*8 (it doesn't have to follow the priority rules) and then when I press the "go" button I get the answer.

I tried using the split method from this question/answer: C# read and calculate multiple values from textbox and it worked for addition but then I tried to use the same script and change it up a little to make it work for multiplication and subtraction but it did not work.

The scripts that I have tried are:

string[] parts = tbxTal.Text.Split('+');

        int intSumma = 0;

        foreach (string item in parts)
        {
            intSumma = intSumma + Convert.ToInt32(item);
        }
        lblSvar.Text = intSumma.ToString();

Also tried using switch (+) after the split but it did not work since there is not + left after te splitt

Any Idea on how I can make a textbox that calculates everything inside of it? My teacher gave me a tip to use the split method and case method together.

Without giving the answer overtly, I would suggest that you keep a variable for the accumulator, operator, and operand. From there you can use a for loop to keep reading until you've evaluated all of the expression, then return the accumulator.

double Evaluate(string expression) {
    double accumulator = 0;
    double operand = 0;
    string operator = string.Empty;
    int index = 0;

    while (index < expression.Length) {
        operand = ExtractNextNumericValue(ref index, expression);
        operator = ExtractNextOperator(ref index, expression);

        // We now have everything we need to do the math
        ...
    }
    return accumulator;
}

public double ExtractNextNumericValue(ref index, string expression) {
    // Use IndexOf on the string, use the index as a start location
    // Make sure to update ref to be at the end of where you extracted your value
    // You know that the value will come before an operator, so look for '+', '-', '*', '/'
    ...
}

Change below line of code from this article C# read and calculate multiple values from textbox like this:

string[] parts = textBox1.Text.Split('+');

Replace above line with below line

 string[] parts = textBox1.Text.Split('+','*','-');

One thing that should help you with creating a calculator like this is reversed Polish notation . Accepted answer to this question is a working calculator that can handle order of operations etc.

Code from mentioned post:

    static void Main(string[] args)
    {
        String str = "5 + ( ( 1 + 2 ) *  4 ) −3";
        String result=LengyelFormaKonvertalas(str);
        Console.WriteLine(result.ToString());
        Console.ReadLine();
    }

    static String LengyelFormaKonvertalas(String input) // this is the rpn method
    {
       Stack stack = new Stack();
       String str = input.Replace(" ",string.Empty);
       StringBuilder formula = new StringBuilder();
       for (int i = 0; i < str.Length; i++)
       {
           char x=str[i];
           if (x == '(')
               stack.Push(x);
           else if (IsOperandus(x)) // is it operand
           {
               formula.Append(x);
           }
           else if (IsOperator(x))  // is it operation
           {
               if (stack.Count>0 && (char)stack.Peek()!='(' && Prior(x)<=Prior((char)stack.Peek()) )
               {
                   char y = (char)stack.Pop();
                   formula.Append(y);
               }
               if (stack.Count > 0 && (char)stack.Peek() != '(' && Prior(x) < Prior((char)stack.Peek()))
               {
                   char y = (char)stack.Pop();
                   formula.Append(y);
               }
               stack.Push(x);
           }
           else
           {
              char y=(char)stack.Pop();
              if (y!='(')
              {
                  formula.Append(y);
              }
           }
       }
       while (stack.Count>0)
       {
           char c = (char)stack.Pop();
           formula.Append(c);
       }
       return formula.ToString();
    }

    static bool IsOperator(char c)
    {
        return (c=='-'|| c=='+' || c=='*' || c=='/');
    }
    static bool IsOperandus(char c)
    {
        return (c>='0' && c<='9' || c=='.');
    }
    static int Prior(char c)
    {
        switch (c)
        {
            case '=':
                return 1;
            case '+':
                return 2;
            case '-':
                return 2;
            case '*':
                return 3;
            case '/':
                return 3;
            case '^':
                return 4;
            default:
                throw new ArgumentException("Rossz paraméter");                                          
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM