2013-08-31 2 views
0

안녕하세요 저는 로마 숫자를 C++에서 일반 숫자로 변환하는 데 문제가 있습니다. 숫자는 숫자 (XIV 14 또는 LIV 등)를 입력하면 코드가 작동하지만 15 또는 55를 넣으십시오. find 문을 구현하려고했지만 실제로 문제를 해결하는 데 사용 방법을 모르겠습니다. 여기에 지금까지 내 코드 사본이 있습니다. 누군가가 내가 초보자와 C의 양을 코딩을 오전으로는 크게 이해할 수있을 것이다이 나를 도울 수 있다면C++에서 find 문을 사용하여 로마 숫자를 숫자로 변환

int convNum; 
int total = 0; 
string romanNum; 
const string units [10]= {"0","I","II","III","IV","V","VI","VII","VIII","IX"}; 
const string tens [10]= {"0","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"}; 
const string hundreds [10]= {"0","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"}; 
const string thousands [4]= {"0","M","MM","MMM"}; 
string input; 

while(!cin.eof()){ 
    cin>>romanNum; 
    if(cin.fail()){ 
     break; 
    }else{ 
     for(int i=0; i<romanNum.length(); i++){ 
      romanNum[i]=toupper(romanNum[i]); 
     } 
     for(int y=3; y > 0; y--){ 
      if(romanNum.find(thousands[y])!= string::npos){ 
       total += y*1000; 
       input.erase(0,thousands[y].length()); 
       break; 
      } 
     } 
     for(int y=9; y > 0; y--){ 
      if(romanNum.find(hundreds[y])!= string::npos){ 
       total += y*100; 
       input.erase(0,hundreds[y].length()); 
       break; 
      } 
     } 
     for(int y=9; y > 0; y--){ 
      if(romanNum.find(tens[y])!= string::npos){ 
       total += y*10; 
       input.erase(0,tens[y].length()); 
       break; 
      } 
     } 
     for(int y=9; y > 0; y--){ 
      if(romanNum.find(units[y])!= string::npos){ 
       total += y; 
       input.erase(0,units[y].length()); 
       break; 
      } 
     } 
     cout << total << endl; 
     total = 0; 
      } 

     for(int k=0; k < romanNum.length(); k++){ 
      input[k] = romanNum[k]; 
     } 


     }  


return 0; 

}

는 ++ 코드는 코드 주위에 이주 날 데려 갔어. 당신이 발견 한 숫자를 삭제하는 경우, 당신은 input 문자열 아닌 romanNum 문자열에서 삭제된다

첫째 : 당신이 두 가지 문제를 가지고있는 것처럼

+1

Woah, 2 주?! : O – Doorknob

+2

다른 기술을 사용하여 이것을 구현할 수 있습니까? 나에게있어 가장 먼저 떠오르는 것은 상태 머신이다. –

+0

아니요, 그렇게 생각하지 않아요. (미안 해요. 상태 머신이 무엇인지 전혀 모르겠군요.) – Brenton

답변

1

보인다. 대신 romanNum 문자열에서 삭제되어야한다 : 당신은 단지 시작 부분에 문자열의 아무 곳이나 결과를 검색하는 것처럼

romanNum.erase(0, thousands[y].length()); 

둘째, 그것은 보인다. 따라서 "LIV"의 예에서 units 목록을 검색 할 때 목록 끝에 "V"가 표시되고 5를 추가하면 "I"가 지워집니다 (항상 앞에서 지워지기 때문에). ..이 문제를 해결하는 한 가지 방법은 현재 문자열의 시작 부분에있는 결과를 받아 들일 수있는 목록으로 그래서, 대신 != string::npos을하는, 단지 == 0을 수행

if (romanNum.find(thousands[y]) == 0) { 
+0

괜찮습니다. 모든 진술을 올바르게 수정해야합니다. (나는 분명한 질문이다. 나는 그 순간에 곧바로 생각할 생각이 없다.) – Brenton

+0

내 마지막 회신에 대해 신경 쓰지 마라. 나는 변화를 구현했는데, 당신의 도움에 감사한다. – Brenton

0

내가 당신을 위해 디버깅을하지 않을 것이다, 나는 세 가지 문제점을 확인 만 할 것입니다.

  1. romanNum에서 검색 중이지만 문자를 지울 것입니다. 당신은 input에서 찾았습니다. 그게 같은 끈이 아니 겠니?

  2. 역순으로 반복하므로 숫자에있는 unit 문자열이 "V"이 아니기 때문에 "IV"이 아니므로 15가됩니다.

  3. 숫자가 인 문자열을 찾고 있지 않아야합니까? 어디에도 없습니다. find 메서드가 0이 아닌 다른 값을 반환하는 것이 좋습니다.

관련 문제