2015-04-14 35 views
0

我正在從一個程序轉換到羅馬到十進制。我必須驗證兩件事:一種是輸入的字符是M或D或C或L或X或V或I,換句話說對處理有效。C++羅馬添加形式轉換

。第二,我必須確保更大的字符值先走了,如果沒有打印和錯誤信息,並讓用戶再次嘗試(這是我堅持的部分)

例如,如果我想輸入9並輸入IX,它應該顯示一條錯誤消息,因爲它不在Additive form中。它應該是VIIII。我該如何編碼,以便比較字符以便知道較大的字母值是否在第一位等等?

我一直得到不正確的驗證。
有沒有辦法給字符串中的字母賦值?我想在比較他們作爲int值,我知道如何和從那裏驗證輸入格式。

void RomanNum::setRomanNumber() //get input and calculate decimal equivalent 
{ 
    //I 1, V 5, X 10, L 50, C 100, D 500, M 1000 
    int value = 0; 
    string input; 
    char current, next; 
    enum validationData { M, D, C, L, X, V, I }; 
    bool validationCharacters = true; 
    //bool validationAdditiveForm = true; 

    getline(cin, input, '\n'); 

    for (int i = 0; i < input.length(); i++) //calculate each Roman letter at a time 
    { 
     current = input[i]; 
     next = current + 1; 
     if (current >= validationData(next)) 
     { 
      switch (input[i]) 
      { 
       case 'M': 
        value += 1000; 
        break; 
       case 'D': 
        value += 500; 
        break; 
       case 'C': 
        value += 100; 
        break; 
       case 'L': 
        value += 50; 
        break; 
       case 'X': 
        value += 10; 
        break; 
       case 'V': 
        value += 5; 
        break; 
       case 'I': 
        value += 1; 
        break; 
       default: 
        validationCharacters = false; 
        break; 
      } 
     } 
     else 
     { 
      cout << "\nInvalid order. Bigger values go first\n"; 
     } 
    } 
} 
+0

不要忘了IX或IV是有效的羅馬數字。祝你好運! – Docteur

+0

是的,但我的老師希望它在後代的順序。多數民衆贊成在這裏@Docteur Docteur – Meeeeee

+0

正如Docteur所說:「祝你好運」。你需要嘗試自己想出一個解決方案。如果你的想法有問題,請到這裏來問問。如果你想知道哪一個最優雅,請在codereview姐妹網站上提問。 – stefan

回答

2

我會推薦一個std::map<char, int>來保存字符和值之間的映射。

通過地圖,您可以將輸入字符串(字符序列)轉換爲一系列值(std::vector<int>)。從那裏開始,它只是一個單獨的檢查來查看向量是否被排序,以及單個函數調用來添加所有值。 (我會留下找到正確的功能作爲作業)

+0

我以另一種效率低下的方式做了它,因爲我還沒有學習如何使用地圖。感謝您的提示。 – Meeeeee

+0

你確實可以寫'if(character =='D')vec.push_back(1000); else if(character =='C'...'instead。 – MSalters