亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

自動機 DFA 實現無法使用 Java

自動機 DFA 實現無法使用 Java

qq_遁去的一_1 2021-11-03 11:01:24
我現在正在我的大學學習 DFA 和 NFA 自動機以及如何使用 Java 代碼實現其中的一些。我在這個練習中遇到了一些麻煩:我們有 4 個不同的實驗室回合(T1、T2、T3 和 T4),我們需要編寫代碼來識別特定的字符串(由學生的大學徽章編號和他的名稱,例如,123321Johnson) 對應于 T2 或 T3。我們知道:T1 輪到徽章編號和姓氏在“A”和“K”之間的奇數T2是“A”和“K”之間偶數徽章數字和姓氏的輪換T3是“L”和“Z”之間的奇數徽章號碼和姓氏的輪換T4是“L”和“Z”之間偶數徽章數字和姓氏的輪換我們也知道字符串必須由至少一個數字和至少一個字母組成。例如,自動機必須接受"1232324Gac"or"1232323Lum"但不接受"121234Lum"or "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 回答

?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

您的算法不起作用的原因是因為您試圖將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");

    }

}

我認為上面的代碼應該做你想做的事情。


查看完整回答
反對 回復 2021-11-03
  • 1 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號