Есть ли какой-либо возможный способ проверить, какой элемент Split() используется?

#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" , это не сработало бы.