Преобразование числового значения в римскую цифру

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

public static void main (String[]args){
    Scanner in = new Scanner(System.in);
    int input = in.nextInt();
    String s = "";
}
private static int promptUserForNumber(Scanner inScanner) {
    System.out.print ("Enter a number between 1 and 3999 (0 to quit): ");
    int input = inScanner.nextInt();
    if((input < 1 && input > 3999) && input != 0){
        System.out.println("Error, number must be between 1 and 3999");
         if (input == 0){
            System.out.println("Goodbye");
         }  
        }
    return input;
}
public static String convertNumberToNumeral(int input) {    
    String s = "";
    Scanner in = new Scanner(System.in);
    while (input >= 1000){
        s += "M";
        input -= 1000;
    }
    while (input >= 900){
        s += "CM";
        input -= 900;
    }
    while (input >= 500){
        s += "D";
        input -= 500;
    }
    while (input >= 400){
        s += "CD";
        input -= 400;
    while (input >= 100){
        s += "C";
        input -= 100;
    }
    while (input >= 90){
        s += "XC";
        input -= 90;
    }
    while (input >= 50){
        s += "L";
        input -= 50;
    }
    while (input >= 40){
        s += "XL";
        input -= 40;
    }
    while (input >= 10){
        s += "X";
        input -= 10;
    }
    while (input >= 9){
        s += "IX";
        input -= 10;
    }
    while (input >= 5){
        s += "V";
        input -= 5;
    }
    while (input >= 4){
        s += "IV";
        input -= 4;
        }
    while (input >= 1){
        s += "I";
        input -= 1;
    }
    }
    return s;
}

На данный момент существует бесконечный цикл, и я не знаю, где я ошибаюсь. На выходе должно быть введено числовое значение от 0 до 3999, а затем на следующей строке должно быть выведено римское число. Спасибо!


person Michael    schedule 25.10.2014    source источник
comment
проверьте свои фигурные скобки!   -  person isnot2bad    schedule 25.10.2014
comment
Вы не вызываете какой-либо метод из основного, поэтому ваша программа завершается после того, как пользователь ввел значение для input.   -  person borisjo    schedule 25.10.2014
comment
Я проверил свои фигурные скобки! они все в правильном месте, мне нужно добавить еще один метод с выводом? Пожалуйста помоги! Я ужасно разбираюсь в методах!   -  person Michael    schedule 25.10.2014


Ответы (3)


    while (input >= 400){
    s += "CD";
    input -= 400;

} Здесь нужен еще один "}"

person Shimmbo    schedule 25.10.2014

Я не знаю, оставили ли вы какой-то код или нет, но этот код никуда вас не приведет, так как основной метод не вызывает другие методы.

Что вы хотите сделать, так это вызвать другие методы, которые можно сделать таким образом:

System.out.println(convertNumberToNumeral(promptUserForNumber(in)));

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

    while (input >= 500){
        s += "D";
        input -= 500;
    }
    while (input >= 400){
        s += "CD";
        input -= 400;
    } // You forgot this curly bracket and you have 
      // to delete one curly bracket at the end of your method
    while (input >= 100){
        s += "C";
        input -= 100;
    }

Ваш код также плохо написан. Много неиспользуемого кода. Я изменил это на это:

public class RomanNumbers{
static String s = "";
static Scanner scan;

public static void main (String[] args){
    scan = new Scanner(System.in);
    System.out.println(convertNumberToNumeral(promptUserForNumber()));
}

private static int promptUserForNumber() {
    System.out.print ("Enter a number between 1 and 3999 (0 to quit): ");
    int input = scan.nextInt();

    if(input < 0 && input > 3999){
        System.out.println("Error, number must be between 1 and 3999");
    } else if(input == 0) {
        System.out.println("Goodbye");
    }
    return input;
}

public static String convertNumberToNumeral(int input) {    
    while (input >= 1000){
        s += "M";
        input -= 1000;
    }
    while (input >= 900){
        s += "CM";
        input -= 900;
    }
    while (input >= 500){
        s += "D";
        input -= 500;
    }
    while (input >= 400){
        s += "CD";
        input -= 400;
    }
    while (input >= 100){
        s += "C";
        input -= 100;
    }
    while (input >= 90){
        s += "XC";
        input -= 90;
    }
    while (input >= 50){
        s += "L";
        input -= 50;
    }
    while (input >= 40){
        s += "XL";
        input -= 40;
    }
    while (input >= 10){
        s += "X";
        input -= 10;
    }
    while (input >= 9){
        s += "IX";
        input -= 10;
    }
    while (input >= 5){
        s += "V";
        input -= 5;
    }
    while (input >= 4){
        s += "IV";
        input -= 4;
        }
    while (input >= 1){
        s += "I";
        input -= 1;
    }
    return s;
}
}
person borisjo    schedule 25.10.2014
comment
Я исправил свой код, но теперь во втором методе, почему сканирование появляется как ошибка, говоря, что оно не может быть разрешено, а в третьем методе s не может быть разрешено методу ни в одном из циклов while. - person Michael; 26.10.2014
comment
Какую ошибку вы получаете для scan? Также s следует читать нормально, поскольку он объявлен в классе и, следовательно, доступен для всех методов. - person borisjo; 27.10.2014

public static void main (String[]args){
    Scanner in = new Scanner(System.in);
    int i = promptUserForNumber(in);
    if (i != -1) {
        //convertNumberToNumeral
    } else {
        //invalid no is entered
    }
}
private static int promptUserForNumber(Scanner inScanner) {
    System.out.print ("Enter a number between 1 and 3999 (0 to quit): ");
    int input = inScanner.nextInt();
    if((input < 1 && input > 3999) || input == 0) {
        System.out.println("Error, number must be between 1 and 3999");
         return -1;
    }
    return input;
}

Кроме того, вам не хватает одного }, как уже указал Джимми.

person Tirath    schedule 25.10.2014