@VanilaSpirit

Калькулятор из string выражения c#?

Написать функция, которая в string принимает вражение типа "1+2+3+4-5", а выдает готовый результат. Из операций возьмем только - и +.
Вышла такая функция:
static int EvaluateExpression(string formula)
        {
            string[] numbers = formula.Split(new char[] { '+', '-' });
            string[] symbols = formula.Split(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' });
 
            int result = int.Parse(numbers[0]);
 
            for (int i = 0; i < numbers.Length; i++)
            {
                    switch(symbols[i])
                    {
                        case "+":
                            result += int.Parse(numbers[i]);
                            break;
                        case "-":
                            result -= int.Parse(numbers[i]);
                            break;
                    }
            }
 
            return result; 
        }


Но как к ней теперь правильно реализовать след. условия:
-Не должно быть символов кроме 0-9,+,- (т.е. не должно быть а-Я, *, /)
-Избежать возможности добавления двух операций(и более) подряд. (т.е. "1+2+3+-+4").

Первое условие можно вполне выполнить через Regex, а вот со вторым не пойму. Не хочется делать по return на каждое условие. Как тут можно поступить, что бы избежать такого?
  • Вопрос задан
  • 1254 просмотра
Решения вопроса 1
twobomb
@twobomb
static int EvaluateExpression(string formula)
        {
            string[] numbers = formula.Split(new char[] { '+', '-' }).Where(e=>e.Trim()  != "").ToArray();
            string[] symbols = Regex.Matches(formula, "[+-]").Cast<Match>().Select(e => e.Value).ToArray();
			if(numbers.Length != symbols.Length+1)
				throw new FormatException("Не верное количество знаков");
            int result;
            int i = -1;
            try
            {
                result = int.Parse(numbers[0]);
				for (i = 0; i < symbols.Length; i++){
						switch(symbols[i])
						{
							case "+":
								result += int.Parse(numbers[i+1]);
								break;
							case "-":
								result -= int.Parse(numbers[i+1]);
								break;
						}
				}
			}catch(FormatException e){
                throw new FormatException(String.Format("Не верное число '{0}'", numbers[i+1]));
			}
 
            return result; 
        }
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
yarosroman
@yarosroman Куратор тега C#
C# the best
Самое простое, проверка на содержание в строке последовательностей ++ -- -+ +- и все. А вообще преобразуйте выражение в обратную польскую нотацию и без проблем ещё и умножение и деление добавите без проблем и ошибки сразу найдете
Ответ написан
Комментировать
AncientD
@AncientD
software developer
VanilaSpirit Усложняете себе жизнь товарищи. Какие-то сплиты, регулярки... Зачем ? В условии стоит регулярку использовать ?
Ну и мой вариант сломается если поставить подряд два знака подряд + или -
например 1+-2+3

static private string SomeFunc(string formula)
        {
            char[] allowSymbols = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-' };

            int result = 0;

            for (int i = 0; i < formula.Length - 1; i++)
            {
                // если текущий соответстует любому из доступых
                if (allowSymbols.Any(x=> x.Equals(formula[i]))) 
                {
                    switch (formula[i])
                    {
                        case '+':
                            result += int.Parse(formula[i+1].ToString());
                            i++;
                            break;
                        case '-':
                            result -= int.Parse(formula[i+1].ToString());
                            i++;
                            break;
                        default:
                            // запись первого символа, можно через индекс 0, но так красиво я считаю.
                            result = int.Parse(formula[i].ToString()); 
                            break;
                    }
                }
                else
                {
                    return "wrong symbol";
                }
            }

            return result.ToString();
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы