#c# #string #split #calculator
#c# #строка #сплит #калькулятор
Вопрос:
У меня есть этот код:
string expresie = Console.ReadLine();
char[] separatori = {' ', '-'};
string[] elementeExpresie = expresie.Split(separatori);
int elem0 = int.Parse(elementeExpresie[0]);
int elem1 = int.Parse(elementeExpresie[1]);
int elem2 = int.Parse(elementeExpresie[2]);
/////////////////////////////////////////////////////////////////////////////////////////
int operatie1 = 0;
if (separatori[0] == ' ')
{
operatie1 = elem0 elem1;
}
else if (separatori[0] == '-')
{
operatie1 = elem0-elem1;
}
int operatie2 = 0;
if(separatori[1] == ' ')
{
operatie2 = operatie1 elem2;
}
else if(separatori[1] == '-')
{
operatie2 = operatie1-elem2;
}
Console.WriteLine(operatie2);
Я должен написать программу, похожую на калькулятор, где пользователь вставляет арифметическое выражение в консоль, и в конце он должен показать результаты вычисления. Вторая часть кода не работает, потому что мне нужно проверить, какой элемент char[] используется; » » или «-«. И это на самом деле мой вопрос: есть ли какой-либо возможный способ проверить, какой элемент Split() используется?
Exemple: string mathExpression = "10 11 - 5"
Вывод на консоль: 16
PS: Это для школьного домашнего задания, и мне нужно использовать этот .split
метод.
Комментарии:
1. Нет, нет способа определить, какой разделитель
string.Split
используется. Можете ли вы вместо этого разделить на пробелы, если пользователь всегда вводит1 2
и никогда1 2
?2. Split удаляет разделитель, используемый для разделения, из возвращаемых строк. Вы не можете использовать split, чтобы определить, какой разделитель использовался в процессе разделения.
3. Вы должны разделить на пробелы (просто не передавайте никаких параметров
Split
), а затем изучить каждую часть, чтобы определить, является ли это числом или оператором.4. Вместо простого использования
Split
используйте набор регулярных выражений для маркирования вашего ввода. Например, токены будут иметь вид («10″, числовой), (» «, оператор), («11», числовой), («-«, оператор), («5», числовой). Затем, как только вы получите набор токенов, преобразуйте их в нужное вам выражение5. Рассмотрите возможность разделения на операторы, по одному за раз. Рассмотрим
10 11-5-2 6 7-4
. Разделение надает
10
,11-5-2
,6
,7-4
. Затем просмотрите результаты, чтобы увидеть, есть ли оставшийся оператор в строке или нет. Если есть, разделите его (чтобы это11-5-2
стало11
,5
и2
). Это очень сложный способ синтаксического анализа этой строки
Ответ №1:
Замените ваши операторы дополненными операторами и разделите на символ pad.
Например
var pad = "";
var input = "1 2";
var operators = new string[] { " ", "-" };
foreach (var operator in operators)
{
input = input.Replace(operator, pad operator pad);
}
var tokens = input.Split( new string[] { pad } , StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(tokens[0]); // Outputs "1"
Console.WriteLine(tokens[1]); // Outputs " "
Console.WriteLine(tokens[2]); // Outputs "2"
Ответ №2:
Одна из идей заключается в разделении на пробелы, чтобы у вас был набор операндов и операторов. Затем вы можете сделать что-то вроде приведенного ниже:
string expression = Console.ReadLine();
string[] expParts = expression.Split();
int operand1 = int.Parse(expParts[0]);
string operator1 = expParts[1];
int operand2 = int.Parse(expParts[2]);
string operator2 = expParts[3];
int operand3 = int.Parse(expParts[4]);
int result = operand1;
if (operator1 == " ")
{
result = operand2;
}
else if (operator1 == "-")
{
result -= operand2;
}
if (operator2 == " ")
{
result = operand3;
}
else if (operator2 == "-")
{
result -= operand3;
}
Console.WriteLine(result);
Недостатком здесь является то, что для этого требуется точный формат строки ( "10 11 - 5"
) . Если бы кто-то вошел "10 11-5"
, это не сработало бы.