2017-02-24 16 views
-2

私は基本的に、ローマ数字を10進数に変換するプログラムを作成しようとしています。これは、ローマ数字のみが入力として受け入れられていることを確認することです。これにアプローチするより良い方法はありますか?

私はこれを行うより効率的な方法があると確信しています。私はプログラミングにはとても新しいです。

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

ところで、あなたのアルゴリズムは、テストケースのために失敗します:有効なローマではありませんIIIII、数。また、VIIIはあなたのテストに失敗する有効な数字です。 –

答えて

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

}

関連する問題