2014-11-04 3 views
0

Я пишу программу, которая переводится с римских цифр на десятичные числа.Почему код не отвечает и продолжает работать?

По какой-то причине он не возвращает значение при проверке ввода пользователя. Однако это уже исправлено:

, с которым я сейчас сталкиваюсь: код не отвечает мне на номер (он показывает пустой экран после ввода).

Как это исправить? Есть ли проблема в моем коде? Я просто стартер, поэтому то, что я узнал, - это просто базовый материал.

public static void main(String[] args) { 
     // Fill in the body 
     Scanner in= new Scanner(System.in); 
     String user = promptUserForNumeral(in); 
     while (user.length()!=0) { 
      int numb= convertNumeralToNumber(user); 
      System.out.println("The numeral "+user+ " is the decimal number "+numb); 
      user = promptUserForNumeral(in); 
     } 
    } 
private static String promptUserForNumeral(Scanner inScanner) { 
    // Fill in the body 
    System.out.println("Enter a roman numeral (Q to quit): "); 
    String i = inScanner.nextLine(); 
    while (i.length()<=0) { 
     System.out.println("ERROR! You must enter a non-empty line!"); 
     System.out.println("Enter a roman numeral (Q to quit): "); 
     i = inScanner.nextLine(); 
    } 
    if (i.equalsIgnoreCase("q")) { 
     System.out.println("Goodbye!"); 
     System.exit(0); 
    } 
    return i; 

} 
private static int convertNumeralToNumber(String numeral) { 
    // Fill in the body 
    int numb = 0; 
    int n=0; 
    int ch=0; 
    while (n<numeral.length()) { 
     char l= numeral.charAt(n); 
     numb=convertCharacterToNumber(l); 
     if (numb<0) { 
      System.out.println("Cannot be define"); 
      n++; 
     } 
     else if (n==numeral.length()) { 
      ch+=numb; 
     } 
     else { 
      int nnumb=convertCharacterToNumber(numeral.charAt(n)); 
      if (nnumb>numb) { 
       ch+=nnumb-numb; 
       n++;      
      } 
      else { 
       ch+=numb; 
      } 
     } 
    } 
    if (ch>3999) { 
     System.out.println("Input number must be less than 3999"); 
     numb=ch; 
    } 
    return numb; 


} 


private static int convertCharacterToNumber(char numeral) { 
    // Fill in the body 
    int n=0; 
    if (numeral=='m' || numeral =='M') { 
     return 1000; 
    } 
    else if (numeral=='d' || numeral=='D') { 
     return 500; 
    } 
    else if (numeral=='c' || numeral=='C') { 
     return 100; 
    } 
    else if (numeral=='l' || numeral=='L') { 
     return 50; 
    } 
    else if (numeral=='x' || numeral=='X') { 
     return 10; 
    } 
    else if (numeral=='v' || numeral=='V') { 
     return 5; 
    } 
    else if (numeral=='i' || numeral=='I') { 
     return 1; 
    } 
    else { 
     return -1; 
    } 

}  

}

+1

Что конкретно не возвращает значение? Вы не можете ожидать, что кто-либо прольет стену кода без намека на то, где начать искать проблему. Не могли бы вы объяснить, что не работает? –

+0

, когда пользователь вводит римский номер, он проверяет, является ли он законным или нет, что в первом методе. поэтому, если он будет законным, он вернет какой пользовательский ввод – bscouth

ответ

0
public class stringTest { 
public static void main(String[] args) { 
    // Fill in the body 
    Scanner in= new Scanner(System.in); 
    String user = promptUserForNumeral(in); 
    while (user.length()!=0) { 
     int numb= convertNumeralToNumber(user); 
     System.out.println("The numeral "+user+ " is the decimal number "+numb); 
     user = promptUserForNumeral(in); 
    } 
} 
private static String promptUserForNumeral(Scanner inScanner) { 
    // Fill in the body 
    System.out.println("Enter a roman numeral (Q to quit): "); 
    String i = inScanner.nextLine(); 
    while (i.length()>=0) { 
     if (i.length()==0) { 
      System.out.println("ERROR! You must enter a non-empty line!"); 
      System.out.println("Enter a roman numeral (Q to quit): "); 
      i = inScanner.nextLine(); 
     } 
     else if (i.equalsIgnoreCase("q")) { 
      System.out.println("Goodbye!"); 
      System.exit(0); 
     } 
     else return i; // in your program the while is never ending, so it does not return any value. 
    } 
    return ""; 
} 
private static int convertNumeralToNumber(String numeral) { 
    // Fill in the body 
    int preNumber = 0; 
    int curNumber = 0; 
    int n=0; 
    int ch=0; 
    while (n<numeral.length()) { 
     char l= numeral.charAt(n); 
     curNumber=convertCharacterToNumber(l); 
     if (curNumber<0) { 
      System.out.println("Cannot be define"); 
      System.exit(0); 
     } 
     else { 
      // I have changed the logic to evaluated decimal Number equivalent to Roman Literal 
      if(preNumber < curNumber && n != 0) ch = curNumber - ch; 
      else ch += curNumber; 
      preNumber = curNumber; 
     } 
     n++; 
    } 
    return ch; 
} 


private static int convertCharacterToNumber(char numeral) { 
    // Fill in the body 
    if (numeral=='m' || numeral =='M') { 
     return 1000; 
    } 
    else if (numeral=='d' || numeral=='D') { 
     return 500; 
    } 
    else if (numeral=='c' || numeral=='C') { 
     return 100; 
    } 
    else if (numeral=='l' || numeral=='L') { 
     return 50; 
    } 
    else if (numeral=='x' || numeral=='X') { 
     return 10; 
    } 
    else if (numeral=='v' || numeral=='V') { 
     return 5; 
    } 
    else if (numeral=='i' || numeral=='I') { 
     return 1; 
    } 
    else { 
     return -1; 
    } 

}  
} 

Возможно, вы, возможно, изучите метод promptUserForNumeral, я думаю, что это не обязательно. Вы можете включить это в основной цикл while, чтобы искать ошибки пользователя.

+0

Большое вам спасибо, теперь я так понятен! – bscouth

0

Проверить это

while (i.length()>=0) { 
    if (i.length()==0) { 
     System.out.println("ERROR! You must enter a non-empty line!"); 
     System.out.println("Enter a roman numeral (Q to quit): "); 
     i = inScanner.nextLine(); 
    } 
    else if (i.equalsIgnoreCase("q")) { 
     System.out.println("Goodbye!"); 
     System.exit(0); 
    } 
} 
return i; 

Это не будет бросить курить или ничего возвращать, а i.length()> 0, что возвращение мертв код, если пользователь не вошел q , Решение: укажите else с разрывом; то он будет работать.

else 
    break; 
0

Я бы переписать время цикла:

while (i.length()<=0) { 
    System.out.println("ERROR! You must enter a non-empty line!"); 
    System.out.println("Enter a roman numeral (Q to quit): "); 
    i = inScanner.nextLine(); 
} 
if (i.equalsIgnoreCase("q")) { 
    System.out.println("Goodbye!"); 
    System.exit(0); 
} 
return i; 
+0

Большое вам спасибо! – bscouth

0

У вас есть много избыточных условий. Проблема заключается в этом цикле:

while (i.length() >= 0) { 
     if (i.length() == 0) { 
      System.out.println("ERROR! You must enter a non-empty line!"); 
      System.out.println("Enter a roman numeral (Q to quit): "); 
      i = inScanner.nextLine(); 
     } else if (i.equalsIgnoreCase("q")) { 
      System.out.println("Goodbye!"); 
      System.exit(0); 
     } 
    } 

Примите любую ценность для меня как «V».

  • Это длина больше нуля, поэтому она входит в цикл.
  • В первом условии if это не равно нулю, поэтому оно переходит к elseIf
  • Поскольку значение не является «q», часть else также не выполняется.
  • Таким образом, он возвращается к началу цикла. & снова проверяет условие, если длина больше нуля.

Итак, у вас есть бесконечный цикл. Снова выполните свою логику & удалите все ненужные условия. Вы также можете использовать оператор break; для завершения цикла.

Смежные вопросы