繁体   English   中英

Palindrome.java与方法

[英]Palindrome.java with methods

该程序运行时不会引发任何异常,但是无论输入内容如何,​​结果始终是相同的:““空白”是回文。“ 每次输入都是回文,我只是想知道是否有人对为什么会这样有任何建议? 这是程序的代码:

class Palindrome
{
    public static void main(String args[])
    {
        int num = 0;
        int dig1 = 0;
        int dig2 = 0;
        int dig3 = 0;
        int dig4 = 0;
        int dig5 = 0;
        boolean digits = true;

        retrieveInput(num);
        check(num,dig1,dig2,dig3,dig4,dig5);
        display(digits,num);
    }

    public static int retrieveInput(int num)
    {
        String number;
        number = JOptionPane.showInputDialog("Enter A Five Digit Number.");
        num = Integer.parseInt(number);

        while(num < 9999 || num > 99999)
        {
            JOptionPane.showMessageDialog(null, num + " Is Not A Five Digit Number",
                "ERROR", JOptionPane.ERROR_MESSAGE);        
            number = JOptionPane.showInputDialog("Enter A Five Digit Number.");
            num = Integer.parseInt(number);

        }
        return num;
    }

    public static boolean check(int num,int dig1,int dig2,int dig3,int dig4,int dig5)
    {
        boolean digits;

        dig1 = num / 10000;
        dig2 = num % 10000 / 1000;
        dig3 = num % 10000 % 1000 / 100;
        dig4 = num % 10000 % 1000 % 100 /10;
        dig5 = num % 10000 % 1000 % 100 % 10 / 1;

        if (dig1 == dig5 && dig2 == dig4)
            digits = true;
        else
            digits = false;

        return digits;
    }

    public static void display(boolean digits, int num)
    {
        num = retrieveInput(num);
        if (digits = false)
            JOptionPane.showMessageDialog(null, num + " is a palindrome");
        else
            JOptionPane.showMessageDialog(null, num + " is not a palindrome");
    }
}

display(boolean, int)的第二行,您尝试将布尔值与=运算符进行比较。 会将 digits 设置false我想您是想说:

        if (digits == false)

if语句需要布尔值作为输入,即if(bool) 您不需要像if(bool == true)那样检查它是true还是false,因为bool == true总是等于bool bool == true是完全多余的。 但是,您bool == false总是与bool相反。 ! 运算符会翻转以下布尔值,例如!true得出false 因此!bool总是与bool相反,与bool == false相同。

因此,您只需要:

        if (!digits)

这样做也是一种良好的做法。

使代码更短的另一种方法是使用三元运算符 这不一定是最好的选择,但是我个人喜欢这样:

更换

if (digits = false)
    JOptionPane.showMessageDialog(null, num + " is a palindrome");
else
    JOptionPane.showMessageDialog(null, num + " is not a palindrome");

JOptionPane.showMessageDialog(null, num + " is " + (digits ? "not " : "") + "a palindrome");

有关三元运算符的更多信息,请参见以下页面:

需要注意的另一件事是,您不需要将输入处理为整数,因为您永远不会在算术语句中使用数字; 您只能将数字相互比较。 在此工作代码中,我将其作为字符串处理,因此它要短得多:

import javax.swing.*;

class Palindrome
{
    public static void main(String args[])
    {
        display();
    }

    /**
     * Returns a five-digit string
     */
    public static String retrieveInput()
    {
        String number = JOptionPane.showInputDialog("Enter A Five Digit Number:"); //get input
        while(number.length() != 5) //continue to get input while it is not five digits
        {
            JOptionPane.showMessageDialog(null, number + " Is Not A Five Digit Number",
                "ERROR", JOptionPane.ERROR_MESSAGE);        
            number = JOptionPane.showInputDialog("Enter A Five Digit Number:");
        }
        return number; //return the input
    }

    /**
     * Returns whether the given five digit string is a palindrome
     */
    public static boolean check(String number)
    {
        return (number.charAt(0) == number.charAt(4) && number.charAt(1) == number.charAt(3)); //checks to see if the first character equals the fifth character and the second character equals the fourth character
    }

    public static void display()
    {
        String number = retrieveInput(); //gets input

        if(check(number)) //if it is a palindrome
        {
            JOptionPane.showMessageDialog(null, number + " is a palindrome"); //say it is a palindrome
        }
        else
        {
            JOptionPane.showMessageDialog(null, number + " is not a palindrome"); //say it isn't a palindrome
        }
    }
}

您的代码有几个缺陷:

/* The goal of this method is to receive user input and return the
 * entered value. For this you don't need the num input parameter.
 */
public static int retrieveInput(int num)
{
    String number;
    number = JOptionPane.showInputDialog("Enter A Five Digit Number.");
    num = Integer.parseInt(number);

    while(num < 9999 || num > 99999)
    {
        JOptionPane.showMessageDialog(null, num + " Is Not A Five Digit Number",
            "ERROR", JOptionPane.ERROR_MESSAGE);        
        number = JOptionPane.showInputDialog("Enter A Five Digit Number.");
        num = Integer.parseInt(number);

    }
    return num;
}

/* Check takes a number and returns if the number is a palindrome or not.
 * The digits of the number are calculated within the method and thus 
 * shouldn't be parameters. (You didn't use these anyway)
 */
public static boolean check(int num,int dig1,int dig2,int dig3,int dig4,int dig5)
{
    boolean digits;

    /* If you removed the paremeters, you've to declare the variables here,
     * e.g. int dig1 = num / 10000
     */
    dig1 = num / 10000;
    dig2 = num % 10000 / 1000;
    dig3 = num % 10000 % 1000 / 100; // This is not needed, because it's not used anywhere
    dig4 = num % 10000 % 1000 % 100 /10;
    dig5 = num % 10000 % 1000 % 100 % 10 / 1;

    /* The pattern you used here is basically
     * if cond == true then return true else return false
     * You never have to use this pattern, since you can
     * directly return conditions
     */
    if (dig1 == dig5 && dig2 == dig4)
        digits = true;
    else
        digits = false;

    return digits;
}

/*
 * This method displays a popup to the user that states if a given number
 * is a palindrome or not. It expects the result and the number as paremeters.
 */
public static void display(boolean digits, int num)
{
    /* You are (again) retrieving the input here, although the input
     * is passed to this method.
     */
    num = retrieveInput(num);

    /* As The Guy with The Hat pointed out in his answer,
     * = is the assignment operator. For comparisons you have to use
     * == instead.
     */
    if (digits = false)
        JOptionPane.showMessageDialog(null, num + " is a palindrome");
    else
        JOptionPane.showMessageDialog(null, num + " is not a palindrome");
}

/*
 * Here is the general control flow of your program
 */
public static void main(String args[])
{
    // These variable declarations can be removed, since you aren't using,
    // nor need them.
    int num = 0;
    int dig1 = 0;
    int dig2 = 0;
    int dig3 = 0;
    int dig4 = 0;
    int dig5 = 0;
    boolean digits = true;

    retrieveInput(num); // you are retrieving the input, but not storing it
    check(num,dig1,dig2,dig3,dig4,dig5); // you are checking, but not storing the result
    display(digits,num);
}

更正的版本:

public static void main(String args[]) {
    int num = retrieveInput();
    boolean isPal = check(num);
    display(num, isPal);
}

public static int retrieveInput() {
    String number = JOptionPane
            .showInputDialog("Enter A Five Digit Number.");
    int num = Integer.parseInt(number);

    while (num < 9999 || num > 99999) {
        JOptionPane.showMessageDialog(null, num
                + " Is Not A Five Digit Number", "ERROR",
                JOptionPane.ERROR_MESSAGE);
        number = JOptionPane.showInputDialog("Enter A Five Digit Number.");

    }
    return num;
}

public static boolean check(int num) {
    int dig1 = num / 10000;
    int dig2 = num % 10000 / 1000;
    // int dig3 = num % 10000 % 1000 / 100;
    int dig4 = num % 10000 % 1000 % 100 / 10;
    int dig5 = num % 10000 % 1000 % 100 % 10 / 1;

    return dig1 == dig5 && dig2 == dig4
}

public static void display(int num, boolean isPal) {
    if (isPal)
        JOptionPane.showMessageDialog(null, num + " is a palindrome");
    else
        JOptionPane.showMessageDialog(null, num + " is not a palindrome");
}

请注意,我基本上没有更改程序的核心。 接下来,您可能要检查用户是否输入了非数字字符或允许使用n个长度的数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM