Это, вероятно, будет звучать как немой вопрос для многих из вас, но я новый студент, и я пытаюсь учиться. Это программа, которая принимает римский цифровой ввод от пользователя и преобразует его в десятичное значение. Я пытаюсь проверить эту программу, но я не знаю точно, что я должен сделать в своем основном методе, чтобы сделать это. У меня есть другие методы расчета, но теперь, как я должен проверить это? Позвольте мне показать вам, что у меня есть:
public class RomanNumeralConverter {
public String getUserInput() {
Scanner numberInput = new Scanner (System.in);
System.out.print("Enter a roman numeral in uppercase: ");
String userInput = numberInput.next();
numberInput.close();
return userInput;
}
public static void romanToDecimal(String userInput) {
int decimal = 0;
int lastNumber = 0;
userInput = userInput.toUpperCase();
for (int x = userInput.length() - 1; x >= 0 ; x--) {
char convertToDecimal = userInput.charAt(x);
switch (convertToDecimal) {
case 'M':
decimal = processDecimal(1000, lastNumber, decimal);
lastNumber = 1000;
break;
case 'D':
decimal = processDecimal(500, lastNumber, decimal);
lastNumber = 500;
break;
case 'C':
decimal = processDecimal(100, lastNumber, decimal);
lastNumber = 100;
break;
case 'L':
decimal = processDecimal(50, lastNumber, decimal);
lastNumber = 50;
break;
case 'X':
decimal = processDecimal(10, lastNumber, decimal);
lastNumber = 10;
break;
case 'V':
decimal = processDecimal(5, lastNumber, decimal);
lastNumber = 5;
break;
case 'I':
decimal = processDecimal(1, lastNumber, decimal);
lastNumber = 1;
break;
}
}
System.out.println(decimal);
}
public static int processDecimal(int decimal, int lastNumber, int lastDecimal) {
if (lastNumber > decimal) {
return lastDecimal - decimal;
} else {
return lastDecimal + decimal;
}
}
public static void main(String[] args) {
romanToDecimal(getUserInput);
}
}
Вы могли видеть, что я попытался подключить getUserInput
к romanToDecimal
но я знаю, что у меня нет этих параметров в основном методе, и я даже не думаю, что Java позволяет мне это делать. Но я думаю, что это то, что я пытаюсь сделать. На самом деле я хочу:
System.out.println("The number you entered is " + userInput
System.out.println("The converted number is " + romanToDecimal
Может, я должен положить это в отдельный метод?
Есть несколько изменений, которые вам нужны:
getUserInput
свой метод getUserInput
из main
, вам нужно либо сделать его static
либо создать экземпляр вашего класса. Я бы предложил сделать его статическим методом.romanToDecimal
выводит результат - но он был бы более аккуратным (на мой взгляд), если вместо этого он вернул результат, поэтому вы можете распечатать его в main
romanToDecimal(getUserInput)
вы пытаетесь использовать getUserInput
как если бы это переменная, но это метод. После изменения getUserInput
для static
и изменения romanToDecimal
для возврата String
вместо ее печати ваш main
метод может выглядеть следующим образом:
public static void main(String[] args) {
String input = getUserInput();
String result = romanToDecimal(input);
System.out.println("The number you entered is " + input);
System.out.println("The converted number is " + result);
}
Это будет хорошо, как программа. Когда вы romanToDecimal
в качестве метода, возвращающего результат, вы также можете легко написать для него единичные тесты, где вход был жестко закодирован в тест, и вы проверили результат. Например:
public void test5() {
String result = RomanNumeralConverter.romanToDecimal("V");
Assert.assertEquals(5, result);
}
... и еще много тестов для всего, о чем вы можете думать. (В зависимости от используемой единичной тестовой структуры вы можете написать один кусок тестового кода и точно указать входные и ожидаемые результаты в качестве параметров.)
Если вы поместите метод userInput в свой основной метод, передайте userInput в romanToDecimal (getUserInput); в основном методе он будет работать здесь, это код для основного метода
public static void main(String[] args) {
Scanner numberInput = new Scanner (System.in);
System.out.print("Enter a roman numeral in uppercase: ");
String userInput = numberInput.next();
numberInput.close();
romanToDecimal(userInput);'
}
}
Просто напишите модульные тесты, проверяя метод romanToDecimal с различными входами. В Java JUnit - самая популярная инфраструктура для этого.
Тест будет выглядеть примерно так:
@Test
public void testMyMethod() {
assertEquals("expected result", romanToDecimal("input"));
}
PS: Чтобы сделать это успешно, вам нужно вернуть строку в свой метод romanToDecimal!
getUserInput
- это имя функции. getUserInput()
является вызовом функции, называемой getUserInput
, не передающей ему никаких аргументов (пустая скобка). Это то, что вы хотите: вызовите эту функцию и используйте возвращаемую строку. romanToDecimal(getUserInput());
в вашей основной функции должно работать. Вы также можете сначала назначить его переменной, чтобы вы могли распечатать ее перед вызовом romanToDecimal
, а также заставить romatToDecimal возвращать строку, а не просто распечатывать ее. Тогда вы можете сделать что-то вроде этого:
public static void main(String argv[]) {
String input = getUserInput();
String output = romanToDecimal(input);
System.out.ptinln("You enetered: " + input + "\nThe converted number is: " + output);
}
О, и, как заметил кто-то, вам нужно сделать оба метода, которые вы вызываете статическими.
Сделайте это в основном методе:
String input = getUserInput();
romanToDecimal(input);
Это должно заставить код работать так, как должно.
попробуй это:
public static void main(String[] args) {
RomanNumeralConverter rnc = new RomanNumeralConverter();
String userInput = rnc.getUserInput(); // get user input
System.out.println(userInput); // print user input
Tests.romanToDecimal(userInput); // call the romanToDecimal static method to convert and print converted decimal
}