2014-11-04 85 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

什么具体不返回一个值?你不能指望任何人在没有暗示从哪里开始寻找问题的情况下翻阅一段代码。你能否进一步解释哪些工作不正常? – 2014-11-04 04:02:22

+0

当用户输入罗马数字时,它会检查它是否合法,在第一种方法中。所以如果它合法,它将返回什么用户输入 – bscouth 2014-11-04 04:23:30

回答

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方法,我认为这是没有必要的。你可以在main while循环中包含它来查找用户错误。

+0

非常感谢,现在我非常清楚! – bscouth 2014-11-04 05:26:58

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循环:

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 2014-11-04 05:25:07

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”的任何值。

  • 它的长度大于零,因此它进入循环。
  • 它的长度在第一个条件中再次不为零,因此它进入elseIf
  • 由于该值不是“q”,因此else部分也不会执行。
  • 因此,它返回到循环的开始&再次检查条件,如果长度大于零。

所以,你有一个无限循环。再次通过你的逻辑&删除任何不必要的条件。您也可以使用break;语句来终止循环。