Используйте операторы с и без пробела в C # - PullRequest
0 голосов
/ 09 мая 2019

Я делаю программу, в которой вы можете рассчитать сумму. И получить из этого результат теперь, когда он работает, когда я запускаю оператор 1 + 1, но не без пробелов, таких как 1 + 1. Теперь я хочу, чтобы он работал в обоих случаях. Кто-нибудь может мне с этим помочь? Поскольку я не знаю, возможно ли это в моем коде.

Я подумал об удалении всех пробелов в моей строке, а затем о разделении каждого символа. Поэтому сначала замените (замените) все пробелы в вашей строке на string.Empty, а затем разделите на пустой символ.

Может быть, кто-то может мне помочь?

Это мой код

    private char[] SPACE = new char[] { ' ' };
    private void GetAnswer(string clipboardText)
    {
        //Loop through all questions and answers
        foreach (question q in questionList)
        {
            //If we have found an answer that is exactly the same show an Notification

            //Startwith zoekt naar alle vragen die matchen vanaf het begin van de zin en Endwith alle vragen die matchen vanaf het eind van de zin//
            if (q._question.StartsWith(clipboardText) || q._question.EndsWith(clipboardText))
            {
                ShowNotification(q._question, q._answer);
                break;
            }
        }
        var parts = clipboardText.Split(SPACE);
        var isValid = true;
        Double a, b;

        // Make sure it's format A # B
        if (parts.Length != 3)
            return;

        // Parse first number
        isValid = Double.TryParse(parts[0], out a);
        if (!isValid)
            return;

        var validOperators = new char[] { '+', '-', ':', 'x' };

        // Parse operator
        if (parts[1].Length != 1)
            return;
        var op = parts[1][0];
        if (!validOperators.Contains(op))
            return;

        // Parse 2nd number
        isValid = Double.TryParse(parts[2], out b);
        if (!isValid)
            return;

        // Now calculate the answer
        string answer = null;
        switch (op)
        {
            case '+':
                answer = (a + b).ToString();
                break;
            case '-':
                answer = (a - b).ToString();
                break;
            case ':':
                if (b == 0)
                    answer = "NaN";
                else
                    answer = (a / b).ToString();
                break;
            case 'x':
                answer = (a * b).ToString();
                break;
            default:
                throw new InvalidOperationException();
        }

        // Show the answer
        ShowNotification(clipboardText, answer);
    }

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Ваша мысль об удалении всех пробелов - это хороший подход.Пробелы не нужны для правильного выражения.

После удаления всех пробелов вы должны разбить строку на возможные символы.Число является допустимым символом, и любой из операторов тоже.Затем вы должны оценить символы и сделать расчет.

Попробуйте поискать статьи о "Infix Parser".Потому что это то, что вы хотите сделать.У вас есть термин в инфиксной записи и вы хотите его проанализировать.Хорошим началом чтения может быть такой ответ: https://stackoverflow.com/a/13856790/797200

1 голос
/ 09 мая 2019

Если вам нужен способ заменить текст пробелом перед синтаксическим анализом выражения, вы можете сначала удалить пробел из выражения, затем проверить, какой оператор использовался, и разделить выражение на него, как показано ниже:

    //var parts = clipboardText.Split(SPACE); this should be commented since you need to remove spaces
    var textWithoutSpace = clipboardText.Replace(" ", "");
    var isValid = true;
    Double a, b;
    char currentOperator = '\0';
    //No need for this
    // Make sure it's format A # B
    //if (parts.Length != 3)
        //return;
    var validOperators = new char[] { '+', '-', ':', 'x' };

    foreach(var validOperator in validOperators)
    {
        if(textWithoutSpace.Contains(validOperator))
        {
            currentOperator = validOperator;
            break;
        }
    }
    if(currentOperator == '\0') {return;}

    var parts = textWithoutSpace.Split(currentOperator);
    //Then continue your work to take parts[0] and parts[1] and apply the operator

Однако приведенный выше код предполагает только то, что вам нужно проанализировать выражения в форме (операнд B), в случае, если вам нужно проанализировать более сложные операции, вам нужно найти готовую библиотеку, которая обрабатывает грязную работу за вас,или для реализации некоторых алгоритмов, выполняющих эту задачу, один из них:

Алгоритм маневрового двора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...