2017-02-24 120 views
-2

我基本上试图做一个程序,将罗马数字变成十进制,这是为了验证只有罗马数字被接受为输入。有没有更好的方法来解决这个问题?

我相信有这样做的更有效的方法。我对编程非常陌生。

int main() 
{ 
    string valid = {"IIIIIVIIXIILIICIIDIIMIVIIVVIVXIVLIVCIVDIVMIXIIXVIXXIXLIXCIXDIXMILIILVILXILLILCILDILMICIICVICXICLICCICDICMIDIIDVIDXIDLIDCIDDIDMIMIIMVIMXIMLIMCIMDIMMVIIVIVVIXVILVICVIDVIMVVIVVVVVXVVLVVCVVDVVMVXIVXVVXXVXLVXCVXDVXMVLIVLVVLXVLLVLCVLDVLMVCIVCVVCXVCLVCCVCDVCMVDIVDVVDXVDLVDCVDDVDMVMIVMVVMXVMLVMCVMDVMMXIIXIVXIXXILXICXIDXIMXVIXVVXVXXVLXVCXVDXVMXXIXXVXXXXXLXXCXXDXXMXLIXLVXLXXLLXLCXLDXLMXCIXCVXCXXCLXCCXCDXCMXDIXDVXDXXDLXDCXDDXDMXMIXMVXMXXMLXMCXMDXMMLIILIVLIXLILLICLIDLIMLVILVVLVXLVLLVCLVDLVMLXILXVLXXLXLLXCLXDLXMLLILLVLLXLLLLLCLLDLLMLCILCVLCXLCLLCCLCDLCMLDILDVLDXLDLLDCLDDLDMLMILMVLMXLMLLMCLMDLMMCIICIVCIXCILCICCIDCIMCVICVVCVXCVLCVCCVDCVMCXICXVCXXCXLCXCCXDCXMCLICLVCLXCLLCLCCLDCLMCCICCVCCXCCLCCCCCDCCMCDICDVCDXCDLCDCCDDCDMCMICMVCMXCMLCMCCMDCMMDIIDIVDIXDILDICDIDDIMDVIDVVDVXDVLDVCDVDDVMDXIDXVDXXDXLDXCDXDDXMDLIDLVDLXDLLDLCDLDDLMDCIDCVDCXDCLDCCDCDDCMDDIDDVDDXDDLDDCDDDDDMDMIDMVDMXDMLDMCDMDDMMMIIMIVMIXMILMICMIDMIMMVIMVVMVXMVLMVCMVDMVMMXIMXVMXXMXLMXCMXDMXMMLIMLVMLXMLLMLCMLDMLMMCIMCVMCXMCLMCCMCDMCMMDIMDVMDXMDLMDCMDDMDMMMIMMVMMXMMLMMCMMDMMM"}; 

    string s; 
    while (true) { 
     cout << "Please enter a roman numeral or Q to quit the program: "; 
     cin >> s; 

     if (valid.find(s) != string::npos) { 
      int num; 
      num = intConversion(s); 
      cout << num << "\n"; 
     } 
     else if (s == "Q") { 
      cout << "Thank you for using the program." << "\n"; 
      break; 
     } else { 
      cout << "Invalid letter!" << "\n"; 
     } 
    } 
    return 0; 
    system("pause"); 
} 
+0

这确实属于在以下网页:http://codereview.stackexchange.com/ –

+0

BTW,你的算法将测试用例失败:IIIII,这是不是一个合法的罗马数。此外,八是一个有效的数字,将失败你的测试。 –

回答

1

valid字符串是可怕的丑陋和不必要的开销。我建议彻底摆脱它,只要intConversion()返回一个错误,如果输入不能被转换。

bool intConversion(const string &s, int *num) 
{ 
    // parse s and set *num as needed... 
    return true or false accordingly; 
} 

int main() 
{ 
    string s; 
    while (true) { 
     cout << "Please enter a roman numeral or Q to quit the program: "; 
     cin >> s; 
     if (s == "Q") { 
      cout << "Thank you for using the program." << "\n"; 
      break; 
     } 

     int num; 
     if (intConversion(s, &num)) 
      cout << num << "\n"; 
     } else { 
      cout << "Invalid input!" << "\n"; 
     } 
    } 

    system("pause"); 
    return 0; 
} 
0

我找到了解决方法。

int main() 
{ 
string valid = {"IVXLCDM"}; 

string s; 
while (true) { 
    cout << "Please enter a roman numeral or Q to quit the program: "; 
    cin >> s; 

    if (valid.find_last_of(s) != string::npos) { 
     int num; 
     num = intConversion(s); 
     cout << num << "\n"; 
    } 
    else if (s == "Q") { 
     cout << "Thank you for using the program." << "\n"; 
     break; 
    } else { 
     cout << "Invalid letter!" << "\n"; 
    } 
} 
return 0; 
system("pause"); 

}

相关问题