Как вычислить знак оператора в строке?

Рейтинг: 0Ответов: 1Опубликовано: 04.10.2014

Всем привет. Есть нижеприведенный код. Моя задача разбить term (двучлен) на два одночлена. Метод IndexOf проверяет term на наличие знаков ('+', '-', '*', '/') и делает он это именно в таком порядке, как перечислено в массиве operators. Сначала он находит -3(+)3 и присваивает arithmeticSign = '+', затем находит (-)3+3 и пересваивает arithmeticSign = '-', а мне-то нужно, что бы он присваивал '+', так как плюс является оператором, а не минус. Как мне это реализовать?

WrathOfFlame решил эту проблему. Следующим образом:

// term это строка двучлен, например -3+2
    for (int i = 1; i < term.Length; i++) 
        {
        if (term[i] == '+' || term[i] == '-' || term[i] == '*' || term[i] == '/')
           {
        // Если перед знаком число, то это и будет моим оператором.
           if (term[i - 1] != 0 && Char.IsDigit(term, i - 1)) 
              {
               OperatorSign = term[i];

               monomials = term.Split(term[i]);

  // Operand1,Operand2 свойства, которые дают доступ к полям operand1,operand2
               Operand1 = monomials[0]; 
               Operand2 = monomials[1];

               if (monomials[0] == " " || monomials[1] == " ")
                  {
                   ErrReport();
                  }
               }
            }
        }

Появилась новая проблема, а именно с двучленами такого вида: -x-y или +x+y. При таких двучленах, эта строка заносит "monomials = term.Split(term[i]);" 3 элемента в массив(monomials[0]="", monomials[1]="x", monomials[2]="y") , а мне нужно два. Как бы разбить строку именно на том месте, где вышеупомянутый цикл находит оператор?

Благодарю за внимание.

Ответы

▲ 0Принят

UPD:

// monomial1 - строка, первый член
// monomial2 - строка, второй член
// term - строка двучлен, например -3+2

monomial1 = "";
monomial2 = "";
int index = -1; // позиция разделителя

for ( int i = 1; i < term.Length; i++) 
{
    if (term[i] == '+' || term[i] == '-' || term[i] == '*' || term[i] == '/')
    {
        // индекс не выходит за левую границу, т.к. i изначально присвоено значение 1
        if ( Char.IsDigit(term, i - 1))
        {
           OperatorSign = term[i];
           index = i;
           // обрываем цикл, на данный момент у нас есть только первый член
           break;
        }

    }

    // формируем первый член
    monomial1 += term[i];

}

// зная индекс разделителя, формируем второй член

   for ( int i = index+1; i < term.Length; i++) 
   {
        monimial2 += term[i];
   }

Знаю, что слегка коряво, но код будет справедлив для всех возможных комбинаций в двучлене. К примеру, ваше решение не работало бы для term = (-)3+(-)3.