2013-08-31 97 views
0

您好我無法在C++中將羅馬數字轉換爲正常數字,但代碼在一定程度上工作,但是如果輸入數字(XIV 14或LIV等)把15或55. 我試圖實現查找​​聲明,但我沒有真正的想法如何使用它來解決我的問題,這裏是我的代碼的副本到目前爲止;使用C++中的查找語句將羅馬數字轉換爲數字

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; 

}

如果有人可以幫助我這一點,將不勝感激,因爲我是一個初學者和編碼的C這一數額++代碼我花了大約2個星期的代碼。

+1

哇,2周?! :O – Doorknob

+2

您是否允許使用不同的技術來執行此操作?對我來說,想到的第一個是狀態機。 –

+0

不,我不這麼認爲,(對不起,我不知道什麼是狀態機) – Brenton

回答

1

看起來你有兩個問題:

首先,當你刪除您找到的數字,你是從input字符串,而不是你的romanNum串擦除。你應該從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. 您得到15個,因爲數字中的第一個unit字符串是"V"而不是"IV",因爲您按相反順序迭代。

  3. 難道你不是在尋找字符串是的前綴你的號碼?沒有任何地方。你會希望find方法返回0,而不是其他任何東西。