2016-08-11 4 views
3

매우 간단한 로마 숫자를 10 진수로 변환하려고 시도하지만 로마자가 아닌 숫자 문자가 문자열에있는 경우 프로그램이 -1을 반환하는 방법을 찾지 못하는 것 같습니다. 이것은 내가 지금까지 가지고있는 것이다.로마 숫자를 10 진수로

#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")); 
} 

첫 번째 것은 17을 반환하고 두 번째 것은 -1을 반환해야합니다. 그러나 둘 다 -1을 반환하지만 else 문을 제거하면 첫 번째 문은 17을 반환하고 두 번째 문단은 100을 반환합니다.

도움이 되었습니까?

+1

숙제는 해결되지 않습니다. 아마도 첫 번째 줄을'// Homework'라고하는 것은 좋지 않을 것입니다. –

+3

@CharlieFish에 대한 당신의 의견을 보내 주셔서 감사합니다. 아무도 그것을 해결할 것을 요구하지 않고 있었다! 제가 누락 된 부분에 대한 조언을 찾고 있었거나 일부 문서를 참조하고있었습니다. 숙제를 거기에 넣으면 배울 좋은 방법이 아니므로 완전한 대답을 얻지 못했습니다! – Mikey

+4

'else if'를 사용하십시오. (하지만 논리에 "IV"라는 잘못된 결과가 있음) – BLUEPIXY

답변

4

변경 if()if()if()else 답변, 문제를 보는 재미/다른 방법의 조금별로 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

또는 OP를 원한다면 당신은 약간의 것을 만들기 위해'switch (toupper (s [i]))'를 사용할 수있다. 더 간단 해. – RastaJedi

+1

@RastaJedi OP 코드에는 몇 가지 잠재적 인 개선 사항이 있습니다. 나를 위해, 나는 [@Tibrogargan] (http://stackoverflow.com/a/38886941/2410359)을 따라 뭔가를 할 것이다. OP는 'else'else if else에 문제가있어서이 문제에 초점을 맞 춥니 다. BTW는'switch (toupper (unsigned char) s [i]))'이어야합니다. UB가 음수가되도록해야합니다. – chux

+0

그래, 나는 그의 대답을보고 있었다. 그것은 꽤 멋지다. 그걸 알아두면 좋을 것 같습니다 ... 나는 그 사람을 열어서 프로토 타입을'int toupper (int c);'로 보았습니다 만, 문자로 작업하는 많은 함수가 그것들을'int'로 지정한다고 생각합니다. 그들. – RastaJedi

2

if()합니다. "숫자"값을 추가하기 만하면 주문을 고려하지 않으면 문제가 해결됩니다.

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; 
} 
관련 문제