2016-08-11 2 views
3

Der Versuch, eine sehr einfache römische Ziffer zu Dezimal-Konverter zu implementieren, aber scheint nicht, einen Weg für das Programm zu finden, um -1 zurückzugeben, wenn nicht römische Ziffern in der Zeichenfolge sind. Das habe ich bisher.Römische Zahl zu Dezimal

#include <stdio.h> 
#include <ctype.h> 

int convertFromRoman(const char *s) 
{ 

int i = 0; 
int total = 0; 

while (s[i] != '\0') { 

    if (isalpha(s[i]) == 0) { 
     return -1; 
    } 

    if (toupper(s[i]) == 'I') { 
     total += 1; 
    } 

    if (toupper(s[i]) == 'V') { 
     total += 5; 
    } 

    if (toupper(s[i]) == 'X') { 
     total += 10; 
    } 

    if (toupper(s[i]) == 'L') { 
     total += 50; 
    } 

    if (toupper(s[i]) == 'C') { 
     total += 100; 
    } 

    if (toupper(s[i]) == 'D') { 
     total += 500; 
    } 

    if (toupper(s[i]) == 'M') { 
     total += 1000; 
    } else { 
     return -1; 
    } 

    i++; 
} 

if (total == 0) { 
    return -1; 
} 

return total; 
} 



int main() 
{ 
    printf("%d\n", convertFromRoman("XVII")); 
    printf("%d\n", convertFromRoman("ABC")); 
} 

Der erste sollte 17 zurückgeben und der zweite sollte -1 zurückgeben. Beide geben jedoch -1 zurück, aber wenn ich die else-Anweisung entferne, gibt die erste 17 zurück, und die zweite gibt 100 zurück.

Jede Hilfe wird geschätzt.

+1

Wir lösen keine Hausaufgaben für Sie. Wahrscheinlich keine gute Idee, deine erste Zeile als '// Hausarbeit' zu haben. –

+3

Danke für deinen Kommentar @CharlieFish. Fragte niemanden, es zu lösen! War nur auf der Suche nach einem Rat, was ich vermisst habe/verweisen Sie mich auf einige Unterlagen. Leg die Hausaufgaben einfach rein, also habe ich keine vollständige Antwort bekommen, denn das ist keine gute Art zu lernen! – Mikey

+4

Verwenden Sie 'else if'. (aber Ihre Logik hat ein falsches Ergebnis von "IV") – BLUEPIXY

Antwort

4

ändern if()if()if()else zu if()else if()else if()else

if (toupper(s[i]) == 'I') { 
     total += 1; 
    } 

    else if (toupper(s[i]) == 'V') { 
     total += 5; 
    } 

    else if (toupper(s[i]) == 'X') { 
     total += 10; 
    } 

    .... 

    else if (toupper(s[i]) == 'M') { 
     total += 1000; 
    } else { 
     return -1; 
    } 
+0

Oder wenn du OP willst, kannst du 'switch (toupper (s [i]))' verwenden, um die Dinge etwas zu verbessern einfacher. – RastaJedi

+1

@RastaJedi Es gibt viele Verbesserungen des OP-Codes. Für mich würde ich etwas mit [@Tibbonargan] machen (http://stackoverflow.com/a/38886941/2410359). OP hatte Probleme mit 'if'' else if' 'else', also konzentriert sich diese Antwort darauf. BTW sollte es 'switch (toupper ((unsigned char) s [i]))' sein, um UB zu vermeiden, sollte 's [i]' negativ sein. – chux

+0

Ja, ich schaute nur auf seine Antwort; es ist ziemlich geschickt. Das ist gut zu wissen ... Ich öffnete den Mann nur schnell und sah den Prototyp als 'int topper (int c);', aber ich schätze, viele Funktionen, die mit Charakteren arbeiten, spezifizieren sie auch als 'int'. t sie. – RastaJedi

2

nicht wirklich eine Antwort, nur ein bisschen Spaß/alternative Art und Weise auf das Problem zu betrachten. Es löst das Problem, wenn Sie nicht in Erwägung ziehen, nur "Ziffern" -Werte hinzuzufügen.

char *romanNumerals = "IVXLCDM"; 
int values[] = { 1, 5, 10, 50, 100, 500, 1000 }; 

int convertFromRoman(const char *s) { 
    int val = 0; 
    for (int i = 0; s[i]; i++) { 
     char *idx; 
     if (NULL == (idx = strchr(romanNumerals, toupper(s[i])))) { 
      return -1; 
     } 
     val += values[idx - romanNumerals]; 
    } 
    return val; 
} 
Verwandte Themen