2014-04-05 5 views
0

일부 수업 숙제의 경우 로마 숫자를 십진수 형식으로 변환하는 프로그램을 작성해야합니다. 나는 IV 나 IX 같은 예외 문자가없는 한 정당한 변환을 할 수있다. 이러한 예외는 어떻게 확인합니까? 내 시도는 현재 문자와 다음 문자를 십진수로 변환 한 다음 비교하고, 다음 문자 (오른쪽에서 왼쪽으로)가 더 작 으면 그것을 뺍니다. 문제는 이것으로부터 한계점을 벗어난다는 것입니다.십진수로 로마 숫자 예외 적용

내 현재 코드는 이것이다 :

Scanner keyboard = new Scanner(System.in); 
    String roman; 
    int decimal = 0; 
    int number = 0; 

    System.out.print("Enter a Roman Numeral to convert to decimal form: "); 

    roman = keyboard.next(); 
    roman = roman.toUpperCase(); 

    for (int count = roman.length()-1; count >= 0; count--) 
    { 
     char numeral = roman.charAt(count); 
     switch (numeral){ 
     case 'I': 
     decimal = 1; 
     break; 
     case 'V': 
     decimal = 5; 
     break; 
     case 'X': 
     decimal = 10; 
     break; 
     case 'L': 
     decimal = 50; 
     break; 
     case 'C': 
     decimal = 100; 
     break; 
     case 'D': 
     decimal = 500; 
     break; 
     case 'M': 
     decimal = 1000; 
     break; 
     default: 
     System.out.println("Error: Invalid character detected."); 
     break; 
     } 
     number = number + decimal; 
    } 

    System.out.println("The decimal equivalent is: " + number); 
    System.out.println("Later!"); 

난 아직 초보자 그리고 난 이런 종류의 문제에 표시되는 정보의 대부분은 단순히 이해하지 않는 고급 솔루션을 사용합니다. 나는 캐릭터를 비교할 필요가 있다는 것을 알고 있지만, 결국에는 한계를 벗어나지 않는 방법으로 이것을 어떻게 수행해야할지 모르겠다.

편집 : 해결! 질문을 게시 한 후에 통찰력에 시달리고 문제를 직접 해결했습니다. 이 코드는 작동하지만 개선 방법에 대한 통찰력에 감사드립니다!

Scanner keyboard = new Scanner(System.in); 
    String roman; 
    int decimal = 0; 
    int number = 0; 
    int last = 0; 

    System.out.println("This program converts Roman Numerals to decimal form."); 
    System.out.println("Note: Roman Numerals are I, V, X, L, C, D and M."); 
    System.out.println("All letters entered will be treated as capitalized."); 
    System.out.print("Enter a Roman Numeral to convert to decimal form: "); 

    roman = keyboard.next(); 
    roman = roman.toUpperCase(); 

    for (int count = roman.length()-1; count >= 0; count--) 
    { 
     char numeral = roman.charAt(count); 
     switch (numeral){ 
     case 'I': 
     decimal = 1; 
     break; 
     case 'V': 
     decimal = 5; 
     break; 
     case 'X': 
     decimal = 10; 
     break; 
     case 'L': 
     decimal = 50; 
     break; 
     case 'C': 
     decimal = 100; 
     break; 
     case 'D': 
     decimal = 500; 
     break; 
     case 'M': 
     decimal = 1000; 
     break; 
     default: 
     System.out.println("Error: Invalid character detected."); 
     System.exit(0); 
     break; 
     } 
     if (decimal >= last){ 
     number = number + decimal; 
     } 
     else { 
     number = number - decimal; 
     } 
     last = decimal; 
    } 

    System.out.println("The decimal equivalent is: " + number); 
    System.out.println("Later!"); 
+0

게시 된 코드에 문제가없는 것 같습니다. – aliteralmind

+0

문제는 항목이 IV 인 경우 V에서 4를 빼는 대신 I와 V를 추가하기 때문에 4가 아닌 6이 인쇄됩니다. 지금은 문제를 해결했지만 곧 해결책을 게시 할 것입니다. 같은 배. – user3501859

+1

답변으로 작업 코드를 게시해야합니다. – Gorgsenegger

답변

0

그럼, 진수는 ##.##, 당신은 아마 numdemical을 변경해야하므로 정수, ##입니다.

숫자를 이미 설정 한대로 설정하고 예외 문자에 대한 확인을 추가하십시오. 그러나 먼저 존재하는지 확인하십시오.

if(this character is not the first && the previous character is an exception) 
    adjust the number as necessary 

이렇게하면 범위를 벗어나는 예외가 발생하지 않습니다.

+0

답장을 보내 주셔서 감사합니다! 원래 게시물을 편집 할 때 사용했던 것보다 더 유용하다고 생각합니까? – user3501859

+0

귀하의 구현은 내가 제안한 것보다 더 훌륭하고 우아합니다. 당신의 길은'현재의 문자 -1 '을 검사 할 필요가 없습니다. 왜냐하면 당신의 * 현재 * 문자는 그 전에 읽은 * 문자의 이전 문자이기 때문입니다. 경계 밖으로 인덱스 예외가 발생할 가능성을 완전히 피할 수 있습니다. 똑똑한. – aliteralmind

+0

난 그냥 질문을 upvoted, 나는 당신이 그것을 게시 할 때, 당신의 대답을 upvote거야. – aliteralmind

관련 문제