2014-12-01 106 views
0

我需要將羅馬數字轉換爲整數值,順序無關緊要。 (9 = VIIII)羅馬數字翻譯器中的隨機添加

在目前我開始從我的代碼中得到一個模糊因子,它在我實現X時開始於20,到達M時達到530。因爲當我= 531和V = 535,MDCLXVI = 1560.它和eclipse有時會說它不能運行,並且可以運行其他時間。

Here`s代碼

C int romanToInt(char *s) { 
    int n, k=0; 
    while(k<[MAX_LINE]) { 
    if(s[k]==’I’) { 
     n=n++ 
    } 
    if(s[k]==’v’) { 
     n=n+5 
    } 
    if(s[k]==’X’) { 
     n=n+10 
    } 
    if(s[k]==’L’) { 
     n=n+50 
    } 
    if(s[k]==’C’) { 
     n=n+100 
    } 
    if(s[k]==’D’) { 
     n=n+500 
    } 
    if(s[k]==’M’) { 
     n=n+1000 
    } 
    return n; 
    } 

感謝您的幫助。

+2

乍一看:你的v''是小寫字母。另外,獨立方括號中的[MAX_LINE]是什麼意思?而'n'似乎沒有初始化。 'int n,k = 0;'只將'k'初始化爲零。 – 2014-12-01 18:57:35

+1

最後,'n = n ++'是未定義的行爲。在void context中使用增量'n ++',或者使用賦值'n = n + 1'。兩者的組合在C中是不合法的。 – 2014-12-01 19:02:33

+1

9不是VIIII是IX,請注意4只在時鐘面上是IIII。 – 2014-12-01 19:14:02

回答

2

你初始化你的循環計數器k,但不是你的累加器n。初始化n = 0; C假定你知道你在做什麼,所以它不會自動地初始化int爲零,就像一些OOP語言一樣。所以,你可以從垃圾開始,這會拋出所有的計算。 秒:爲什麼n = n ++?用戶n + = 1或n ++

此外,for循環可能會比while循環更好,因爲它會強制您初始化您的計數器變量(如果您還沒有)並設置迭代次數的限制,所以很難有無限循環的機會。

最後,而不是所有那些ifs,考慮if/else if還是select/case。

哦,我確定它可能是一個錯字,但你的返回語句應該在循環結束後。您或者忘記在退貨聲明之前添加額外的大括號,或者我錯誤地計數。

1

這裏有幾件事情正在進行。

int n, k=0; 

你應該初始化兩個變量爲0。此刻,你只初始化kn很可能含有垃圾。

while(k<[MAX_LINE]) ... 

該語法不應編譯。但即使這樣做,這也不是你想要的。我假設MAX_LINE是您在fgets或類似函數中使用的最大緩衝區長度。但實際輸入通常較小並且包含C字符串,即由空字符'\0'終止的字符。之後的一切都將是垃圾。您的終止條件應該是while (s[k] != '´\0') ...。由於空字符'\0'的值爲零,因此可以將其寫爲while (s[k]) ...

if(s[k]==’I’) { 
    n=n++ 
} 

這句法遞增是不合法的C.(這是一個常見的錯誤,因爲它會編譯)如果你想inctement n,使用純n++。或者,您可以使用n = n + 1n += 1

if(s[k]==’v’) { 
    n=n+5 
} 

在這裏,你已經使用小寫'v',這是從大寫'V'不同。

return n; 

您無條件地從循環內返回,即在第一次迭代之後。這不是你想要的。循環後返回累計值。

除了你的情況,你會有一個無限循環:你的位置標記k永遠不會改變。你應該增加k作爲循環內的最後一件事。您也可以將while重寫爲for,並在更新部分中增加b。

所以,把他們放在一起:

int romanToInt(const char *s) 
{ 
    int n = 0; 
    int k = 0; 

    while (s[k]) { 
     if (s[k] == 'I') n++; 
     if (s[k] == 'V') n = n + 5; 
     if (s[k] == 'X') n = n + 10; 
     if (s[k] == 'L') n = n + 50; 
     if (s[k] == 'C') n = n + 100; 
     if (s[k] == 'D') n = n + 500; 
     if (s[k] == 'M') n = n + 1000; 
     k++; 
    } 
    return n; 
} 

這將積累的大寫字母所代表的羅馬數字(沒有做減法的事,如IV)和忽略一切。