#c# #console-application #calculator
#c# #консольное приложение #калькулятор
Вопрос:
Итак, у меня есть этот код, и я пытался адаптировать его для работы с любым количеством действительных чисел, похоже, что изучение веб-сайта MSFT не сработало, поэтому я здесь как последнее средство.
char operation;
String calculation;
double num1, num2, ans;
Console.WriteLine("Place your calculation in the form (x'symbol'y)");
calculation = Console.ReadLine();
num1 = double.Parse(calculation[0].ToString());
num2 = double.Parse(calculation[2].ToString());
operation = calculation[1];
switch (operation)
{
case ' ':
ans = num1 num2;
Console.WriteLine(num1 num2);
break;
case '-':
ans = num1 - num2;
Console.WriteLine(num1 - num2);
break;
case '/':
ans = num1 / num2;
Console.WriteLine(num1 / num2);
break;
case '*':
ans = num1 * num2;
Console.WriteLine(num1 * num2);
break;
}
Комментарии:
1. Просто подсказка: строка. Метод Split() должен хорошо подходить для вашей проблемы…
2. Просто:
decimal result = (decimal)(new DataTable().Compute(Console.ReadLine(), null))
. 😉3. При преобразовании вывода, введенного объектом, в double или decimal возникает исключение, результат должен быть проанализирован из строки:
double result = double.Parse(new DataTable().Compute(Console.ReadLine(), null).ToString());
@Tim Schmelter4. @Innat3: тогда гораздо лучше использовать
Convert.ToDecimal(....)
вместо преобразования строк, которые менее эффективны и также могут вызвать проблемы с локализацией. Поэтому сохранитеCompute
-result вobject
переменной, а затем используйтеConvert.ToDecimal
.5. @Tim Schmelter да, это тоже работает! Я не знал, что это более эффективно
Ответ №1:
Вот пример того, как заставить его работать с числами любой длины, используя регулярное выражение и следуя указанному вами формату. Как указано в комментариях, Compute() — гораздо более простой способ заставить его работать!
char operation;
string calculation;
double num1, num2, ans;
Regex validcheck = new Regex(@"^d ([ ]|[-]|[/]|[*])d $");
Regex findnumber = new Regex(@"d ");
Regex findoperation = new Regex(@"([ ]|[-]|[/]|[*])");
Console.WriteLine("Place your calculation in the form (x'symbol'y)");
calculation = Console.ReadLine();
if (validcheck.IsMatch(calculation))
{
num1 = double.Parse(findnumber.Matches(calculation)[0].Value);
num2 = double.Parse(findnumber.Matches(calculation)[1].Value);
operation = char.Parse(findoperation.Match(calculation).Value);
switch (operation)
{
case ' ':
ans = num1 num2;
Console.WriteLine(num1 num2);
break;
case '-':
ans = num1 - num2;
Console.WriteLine(num1 - num2);
break;
case '/':
ans = num1 / num2;
Console.WriteLine(num1 / num2);
break;
case '*':
ans = num1 * num2;
Console.WriteLine(num1 * num2);
break;
}
}
else
{
Console.WriteLine("The operation you inserted has an invalid format");
}
Console.Read();
Ответ №2:
На седьмой строке кода num2 = double.Parse(calculation[0].ToString());
вы должны были написать num2 = double.Parse(calculation[2].ToString());
вторую часть, которую я все еще пытаюсь проработать. Редактировать: вы изменили его, когда я опубликовал это.
Комментарии:
1. Да, спасибо, я тоже получил это всего секунду назад 🙂
2. @innat3 разве вы не можете использовать строковые методы, такие как Substring и indexOf ?
Ответ №3:
Сделал что-то подобное, за исключением того, что я использую только одно регулярное выражение, а затем индексирую групповые записи для чисел и операторов.
char operation;
String calculation;
double num1, num2, ans;
Console.WriteLine("Place your calculation in the form (x'symbol'y)");
calculation = Console.ReadLine();
Regex testRegex = new Regex(@"([0-9]*)([ -/*])([0-9]*)");
var match = testRegex.Match(calculation);
if (!match.Success)
{
Console.WriteLine("Invalid syntax");
return;
}
num1 = double.Parse(match.Groups[1].Value);
num2 = double.Parse(match.Groups[3].Value);
operation = match.Groups[2].Value[0];
switch (operation)
{
case ' ':
ans = num1 num2;
Console.WriteLine(num1 num2);
break;
case '-':
ans = num1 - num2;
Console.WriteLine(num1 - num2);
break;
case '/':
ans = num1 / num2;
Console.WriteLine(num1 / num2);
break;
case '*':
ans = num1 * num2;
Console.WriteLine(num1 * num2);
break;
}
Комментарии:
1. Ваш лучше, я просто новичок в регулярных выражениях :/