Проблема с автоматами простых условных операторов в C # - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь построить автомат, я несколько раз запускаю тест, и в коде, похоже, нет проблем, но все же я не получаю желаемый результат, то есть "CurrentState", который должен быть X3

ВводЯ даю, как следует

string[] input = new string[4] { "a", "a", "b", "z" };

Я упросту переходы. Однако ниже приводится таблица. Я даю A, A, B, что должно привести к X3 X1 A X1 ---------- X1 A X1 ------------ X1 B X3 ------ (он застрял на X1) Я также выполнил код, он должен попасть в область действия с x3Таблица перехода выглядит следующим образом:

states2    token actions    output
x1               a            x1
x1               b            x3
x2               a            x2
x2               b            x1
x3               a            x3
x3               b            x4
x4               a            x2
x4               b            x3

Вот код

 for (k = 0; k < input.Length; k++) //It is 4
        {
            if (input[k] == "z")
            {
                Console.WriteLine(currentState);
                break;
                //  Environment.Exit(0);
            }
            else
            {
                for (j = 0; j < tokenActions.Length; j++) //its 8 and same as states and output
                {

                    if (currentState == states2[j] && input[k] == tokenActions[j])
                    {
                        currentState = output[j];
                    }

                }
            }
        }

ОБНОВЛЕНИЕ: я замечаю, что состояние меняется только ОДИН РАЗ, что относится к первому токену и остается тем же после.,(мое наблюдение, это может быть неправильно)

1 Ответ

0 голосов
/ 13 ноября 2018

Вы сказали, что в вашем считывателе файлов произошла ошибка, но в вашем коде все еще есть ошибка .

Здесь я проинструктировал ваш код так, чтобы его действие былояснее.Перед запуском этой программы сделайте прогноз того, каким будет ее вывод .Затем запустите программу.Был ли вывод правильным?

public static void Main()
{
    string currentState = "x1";
    string[] input = {"a", "a", "b", "z"};
    string[] states2 = {"x1", "x1", "x2", "x2", "x3", "x3", "x4", "x4"};
    string[] tokenActions = {"a", "b", "a", "b", "a", "b", "a", "b" };
    string[] output = {"x1", "x3", "x2", "x1", "x3", "x4", "x2", "x3"};

    for (int k = 0; k < input.Length; k++) //It is 4
    {
        if (input[k] == "z")
        {
            Console.WriteLine("final state is {0}", currentState);
            break;
            //  Environment.Exit(0);
        }
        else
        {
            Console.WriteLine("new input {0}", input[k]);
            for (int j = 0; j < tokenActions.Length; j++) //its 8 and same as states and output
            {
                if (currentState == states2[j] && input[k] == tokenActions[j])
                {
                    Console.WriteLine("input is {0} current state is {1} new state is {2}", input[k], currentState, output[j]);
                    currentState = output[j];
                }
            }
        }
    }
}

Теперь вы видите свою ошибку?

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

...