1

我需要将数值转换为罗马数字,但遇到了一些麻烦。当我测试我的代码并且用户输入一个数字时,代码会将其转换为罗马数字,但之后我无法再次出现提示;在放置不正确的整数后它会重新提示,但在正确的整数之后不会。我不知道如何做到这一点,以便用户可以继续转换值,直到他们选择 -1 退出。以下是我迄今为止提出的。

import java.util.Scanner;

public class arabicToRoman {
static String a = "";

public static void main (String[] args){

    Scanner input = new Scanner(System.in);
    System.out.println("Enter a number between 1 and 3999 (-1 to quit): ");

    while (!input.hasNext("-1")) {
        String a = input.next(); 

    try {
        Integer number = Integer.parseInt(a); 

        if ((number <= 3999) && (number > 0)) {
            System.out.println(arabicToRoman(number)); 

        } else if (number > 3999) {
            System.out.println("Error: number must be between 1 and 3999");

        } else if (number == 0) {
            System.out.println("Error: The Romans did not have a way to represent negative numbers or zero.");

        } else {
            System.out.println("Error: The Romans did not have a way to represent negative numbers or zero.");

        }
    } catch (NumberFormatException e) {
        System.out.println("You did not enter a number!");
    }
}  
}

public static String arabicToRoman(int arabic) {    
    while (arabic >= 1000){
        a += "M";
        arabic -= 1000;
    }
    while (arabic >= 900){
        a += "CM";
        arabic -= 900;
    }
    while (arabic >= 500){
        a += "D";
        arabic -= 500;
    }
    while (arabic >= 400){
        a += "CD";
        arabic -= 400;
    }
    while (arabic >= 100){
        a += "C";
        arabic -= 100;
    }
    while (arabic >= 90){
        a += "XC";
        arabic -= 90;
    }
    while (arabic >= 50){
        a += "L";
        arabic -= 50;
    }
    while (arabic >= 40){
        a += "XL";
        arabic -= 40;
    }
    while (arabic >= 10){
        a += "X";
        arabic -= 10;
    }
    while (arabic >= 9){
        a += "IX";
        arabic -= 10;
    }
    while (arabic >= 5){
        a += "V";
        arabic -= 5;
    }
    while (arabic >= 4){
        a += "IV";
        arabic -= 4;
        }
    while (arabic >= 1){
        a += "I";
        arabic -= 1;
    }
    return a;
}
}

输入后,似乎显示结果,但之后没有提示,但用户可以输入其他内容,它会读取它;如果它是另一个数字,则结果将添加到先前的结果中。

4

1 回答 1

0

由于满足条件return时调用的语句,您的代码无法正常工作。((number <= 3999) && (number > 0))return终止了循环。

相反,您可能想调用该方法arabicToRoman(int arabic)并简单地打印出结果。

我还会考虑重组您的代码以sentinel valuewhile循环条件中使用 a 并编辑代码,以便在给出非数字答案时它不会崩溃。由于您的代码现在是编写的,这样做会生成一个java.util.InputMismatchException.

Scanner input = new Scanner(System.in);
System.out.println("Enter a number between 1 and 3999 (-1 to quit):");

while (!input.hasNext("-1")) {

    String a = input.next(); // gets the next item from the Scanner

    try {
        Integer number = Integer.parseInt(a); // tries to 'cast' the String to an Integer

        if ((number <= 3999) && (number > 0)) {
            System.out.println(arabicToRoman(number)); // prints out the result

        } else if (number > 3999) {
            System.out.println("Error: number must be between 1 and 3999");

        } else if (number == 0) {
            System.out.println("Error: The Romans did not have a way to represent negative numbers or zero.");

        } else {
            System.out.println("Error: The Romans did not have a way to represent negative numbers or zero.");

        }
    } catch (NumberFormatException e) {
        System.out.println("You did not enter a number!");
    }
}

编辑:修复连接问题

编写的程序将结果存储在一个state variable通过调用相同的持久化中。这就是为什么每次调用该方法时,它都会打印附加到先前结果的当前结果。您想要编辑代码以不存储a为状态变量并返回arabicToRoman(int arabic)方法而不改变现有数据。在方法内声明变量将允许在方法终止时将其处理掉。

要进行此修复:

首先,在类中的方法之外删除这一行:

static String a = "";

然后,将您的arabicToRoman(int arabic)方法编辑为如下所示:

public static String arabicToRoman(int arabic) {
    String a = ""; // note this String declaration at the start of the method

    while (arabic >= 1000) {
        a += "M";
        arabic -= 1000;
    }
    while (arabic >= 900) {
        a += "CM";
        arabic -= 900;
    }
    while (arabic >= 500) {
        a += "D";
        arabic -= 500;
    }
    while (arabic >= 400) {
        a += "CD";
        arabic -= 400;
    }
    while (arabic >= 100) {
        a += "C";
        arabic -= 100;
    }
    while (arabic >= 90) {
        a += "XC";
        arabic -= 90;
    }
    while (arabic >= 50) {
        a += "L";
        arabic -= 50;
    }
    while (arabic >= 40) {
        a += "XL";
        arabic -= 40;
    }
    while (arabic >= 10) {
        a += "X";
        arabic -= 10;
    }
    while (arabic >= 9) {
        a += "IX";
        arabic -= 10;
    }
    while (arabic >= 5) {
        a += "V";
        arabic -= 5;
    }
    while (arabic >= 4) {
        a += "IV";
        arabic -= 4;
    }
    while (arabic >= 1) {
        a += "I";
        arabic -= 1;
    }
    return a;
}

我再次对此进行了测试,并且可以确认它会产生您所描述的正确行为。

为了清楚起见,这是最终产品的外观

于 2014-11-09T08:50:41.023 回答