Автоматическая реализация DFA не работает с использованием Java - PullRequest
0 голосов
/ 06 октября 2018

Я сейчас учусь в своем университете, на автоматах DFA и NFA, и на том, как реализовать некоторые из них с использованием кода Java.

У меня возникли некоторые проблемы с этим упражнением: у нас 4 различных лабораторных хода(T1, T2, T3 и T4), и нам нужно написать код, чтобы распознать, соответствует ли конкретная строка (состоящая из номера студенческого номера университета и его имени, например, 123321Johnson) T2 или T3.

Мы знаем, что:

  • T1 - ход тех, у кого есть нечетный номер значка и фамилия между «A» и «K»
  • T2 - этоповорот четных номеров и фамилий между «A» и «K»
  • T3 - поворот нечетных номеров и фамилий между «L» и «Z»
  • T4 - поворотчетные номера и фамилии между «L» и «Z»

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

Напримеравтомат должен принимать "1232324Gac" или "1232323Lum", но не "121234Lum" или "121233Gac".

Вот код, который я написал:

import java.util.Scanner;

public class Es3 {

    static Scanner sc = new Scanner(System.in);
    String s = sc.next();
    public static boolean scan(String s)
    {
        int state = 0;                      
        int i = 0;                              

        while (state >= 0 && i < s.length()) {
            final char ch = s.charAt(i++);
            switch (state) {
            case 0:
                if (ch >= 0 && ch <= 9)
                    state = 1;
                else
                    state = -1;
                break;

            case 1:
                if (ch >=0 && ch <=9)
                    state = 1;
                else if (ch >='a' && ch <='k')
                    if ((s.charAt(i--))%2==0)
                        state = 2;
                    else
                        state = -1;
                else if (ch >='l' && ch <='z')
                    if ((s.charAt(i--))%2==1)
                        state = 3;
                    else
                        state = -1;
                else
                    state = -1;
                break;

            case 2:
                if (ch >='a' && ch <='z')
                    state = 2;
                else
                    state = -1;
                break;

            case 3:
                if (ch >='a' && ch <='z')
                    state = 3;
                else 
                    state = -1;
                break;
            }
        }
        return (state == 2 || state == 3);      
    }

    public static void main(String[] args)
    {
        System.out.println(scan(args[0]) ? "OK" : "NO");
    }
}

Очевидно, код не работает, но важно показать общую цель упражнения.

Может ли кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 07 октября 2018

Причина, по которой ваш алгоритм не работал, заключается в том, что вы пытались сравнить char значения с int значениями, что не дало бы ожидаемого результата.Кроме того, когда вы проверяли, находится ли значение char в определенном диапазоне букв, вы не учитывали заглавные буквы.

import java.util.Scanner;

public class Es3 
{
    static Scanner sc = new Scanner(System.in);
    String s = sc.next();
    public static boolean scan(String s)
    {
        int state = 0;
        int i = 0;

        while (state >= 0 && i < s.length()) {
            final char ch = s.charAt(i++);
            switch (state) {
            case 0:
                // Compare the char to the char values of the numbers
                if (ch >= '0' && ch <= '9')
                    state = 1;          
                else
                    state = -1;
                break;

            case 1:  
                // Same here, compare the char to the char values of the numbers
                if (ch >= '0' && ch <= '9')
                    state = 1;
                // Check if the char is capital, as well as lowercase
                else if ((ch >= 'a' && ch <= 'k') || (ch >= 'A' && ch <= 'K'))
                    // Convert the char to an int before performing the calculations
                    if ((Character.getNumericValue(s.charAt(i-1)))%2 == 0)
                        state = 2;
                    else
                        state = -1;
                // Check if the char is capital as well
                else if ((ch >= 'l' && ch <= 'z') || (ch >= 'L' && ch <= 'Z'))
                    // Convert from char to int before calculating
                    if ((Character.getNumericValue(s.charAt(i-1)))%2 == 1)
                        state = 3;
                    else
                        state = -1;
                else
                    state = -1;
                break;

            case 2:
                // Check if the char is capital as well
                if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
                    state = 2;
                else
                    state = -1;
                break;

            case 3:
                // Check if the char is capital as well
                if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
                    state = 3;
                else 
                    state = -1;
                break;
            }
        }
        System.out.println("State "+state);
        return (state == 2 || state == 3);      
    }

    public static void main(String[] args)
    {
        System.out.println(scan(args[0]) ? "OK" : "NO");
    }
}

Я думаю, что приведенный выше код должен делать то, что вы пытаетесьделать.

...