2016-10-16 3 views
-3
 decimal sum; 
     int index; 

     Console.WriteLine("Enter numbers you want to calculate:"); 
     string Expression = Console.ReadLine(); 

     if (Expression.Contains("+")) 
     { 
      index = Expression.IndexOf("+"); 
      int secondnumber = index + 1; 
      decimal a = decimal.Parse(Expression.Substring(0, index)); 
      decimal b = decimal.Parse(Expression.Substring(secondnumber)); 
      sum = a + b; 
      Console.WriteLine("{0}={1}", Expression, sum.ToString("0.###")); 
     } else if (Expression.Contains("-")) 
     { 
      index = Expression.IndexOf("-"); 
      int secondnumber = index + 1; 
      decimal a = decimal.Parse(Expression.Substring(0, index)); 
      decimal b = decimal.Parse(Expression.Substring(secondnumber)); 
      sum = a - b; 
      Console.WriteLine("{0}={1}", Expression, sum.ToString("0.###")); 
     } else if (Expression.Contains("/")) 
     { 
      index = Expression.IndexOf("/"); 
      int secondnumber = index + 1; 
      decimal a = decimal.Parse(Expression.Substring(0, index)); 
      decimal b = decimal.Parse(Expression.Substring(secondnumber)); 
      sum = a/b; 
      Console.WriteLine("{0}={1}", Expression, sum.ToString("0.###")); 
     } else if (Expression.Contains("*")) 
     { 
      index = Expression.IndexOf("*"); 
      int secondnumber = index + 1; 
      decimal a = decimal.Parse(Expression.Substring(0, index)); 
      decimal b = decimal.Parse(Expression.Substring(secondnumber)); 
      sum = a * b; 
      Console.WriteLine("{0}={1}", Expression, sum.ToString("0.###")); 
     } else 
     { 
      Console.WriteLine("ERROR"); 
     } 

Проблема в том, что я не могу упростить код, не запуская его, и он бросает исключения. Любая помощь была бы оценена. Мне также нужна помощь в методе .IndexOf, так или иначе, вне ее выбора if? Я потянулся, но он продолжает испортиться.Мне нужна помощь, упрощающая эту программу

+0

Что такое ваш вклад? –

ответ

2

Поскольку все «если блоки» по той же схеме:

  • Разделить на операторе 1 символа
  • Разбирает десятичный слева и десятичную справа от оператора
  • Выполнить функция на них

можно хранить функции в Dictionary:

var functionsByOperator = new Dictionary<char, Func<decimal, decimal, decimal>>(); 
functionsByOperator['+'] = (left, right) => left + right; 
functionsByOperator['*'] = (left, right) => left * right; 
// etc 

Тогда остальная часть кода становится менее repetetive:

// the below array is required for the IndexOfAny method later on 
char[] operators = new List<char>(functionsByOperator.Keys).ToArray(); 

Console.WriteLine("Enter numbers you want to calculate:"); 
string Expression = Console.ReadLine(); 

int index = Expression.IndexOfAny(operators); 
if (index < 0) 
{ 
    Console.WriteLine("ERROR"); 
    return; 
} 

decimal a = decimal.Parse(Expression.Substring(0, index)); 
decimal b = decimal.Parse(Expression.Substring(index + 1)); 
char oper = Expression[index]; 
decimal sum = functionsByOperator[oper](a, b); 
Console.WriteLine("{0}={1}", Expression, sum.ToString("0.###")); 
Смежные вопросы