Решаю задачу, в ней нужно считать математическое выражение введённое пользователем (например 2+2, 15*10...) и посчитать его. меня интересует как это сделать лучше всего, а то предполагаю, что запускать цикл проверки каждого элемента полученной строки и от их значений принимать какие-то действия не является лучшим вариантом...
static void Main(string[] args)
{
Console.WriteLine("введите выражение. например 8+2");
string[] tmp = new string[1];
tmp[0] = Console.ReadLine();
char operation = ' '; // будет хранить символ операции
int signPos = tmp[0].IndexOf('/');
// IndexOf - ищет первое вхождение указаного символа (возвращает его позицию),
// если символа в строке нету - возвращает -1
if (signPos == -1)
{
signPos = tmp[0].IndexOf('*');
if (signPos == -1)
{
signPos = tmp[0].IndexOf('+');
if (signPos == -1)
{
signPos = tmp[0].IndexOf('-');
}
}
}
// если условие будет истинным, то в пользовательском вводе присутствует знак
if (signPos != -1)
{
operation = tmp[0][signPos];
// разбиваем строку на подстроки (таким образом получаем массив строк содержащие в себе нужные операнды)
tmp = tmp[0].Split(operation);
int[] operands = new int[2]; // будет хранить в себе значения операндов
try
{
for (int i = 0; i < operands.Length; i++)
{
operands[i] = Convert.ToInt32(tmp[i]);
}
}
catch (FormatException ex)
{
Console.WriteLine("Ошибка в вводе!!!");
Console.WriteLine(ex.Message);
}
Console.WriteLine();
switch (operation)
{
case '/':
{
if (operands[1] != 0)
{
Console.WriteLine(operands[0] / operands[1]) ;
}
else
{
Console.WriteLine("Ошибка в вводе!!! Делитель равен 0");
}
break;
}
case '*':
{
Console.WriteLine(operands[0] * operands[1]) ;
break;
}
case '-':
{
Console.WriteLine(operands[0] - operands[1]) ;
break;
}
case '+':
{
Console.WriteLine(operands[0] + operands[1]) ;
break;
}
}
}
else
{
Console.WriteLine("Неправильный ввод!!!");
}
Console.ReadKey();
}
Либо же эту задачу можно реализовать используя регулярные выражения:
static void Main(string[] args)
{
string userInput = Console.ReadLine();
//Console.WriteLine(Regex.IsMatch(userInput, @"^\d+[+|-|*|\\]\d+$"));
if (Regex.IsMatch(userInput, @"^\d+[+|-|*|\\]\d+$"))
{
int a = Convert.ToInt32(Regex.Match(userInput, @"^\d+").Value);
int b = Convert.ToInt32(Regex.Match(userInput, @"\d+$").Value);
switch (Regex.Match(userInput, @"[+|-|*|\\]").Value)
{
case "-":
Console.WriteLine($"{a} - {b} = {a - b}");
break;
case "+":
Console.WriteLine($"{a} + {b} = {a + b}");
break;
case "*":
Console.WriteLine($"{a} * {b} = {a * b}");
break;
case "/":
Console.WriteLine($"{a} / {b} = {a / b}");
break;
}
}
else
{
Console.WriteLine("UncorrectInput");
}
Console.ReadKey();
}
спасибо всем!