2017-03-27 16 views
3

入力は、値によってソートされなければならないローマ数字の文字列になります。また、このタスクは、フォームを整数にローマ数字から数を変換するローマ数字の文字列をソート

これまでのところ、私は私のクラス

#include<iostream> 
#include<string> 
using namespace std; 

class RomanNumbers 
{ 
public: 
    RomanNumbers(string = ""); 

    void setRoman(string); 

    int convertToDecimal(); 

    void printDecimal(); 

    void printRoman(); 


private: 

    string roman; 

    int decimal; 

}; 

作成した

や関数、C++のクラスを使用して完了する必要がありますが、私の質問は:どのようにはなら変換したローマ数字を含む新しい文字列を作成することができず、文字列をソートすることができないので、ソートします。どんな助けもありがとう。

template <class RandomAccessIterator, class Compare> 
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp); 

例aの:あなたの問題に取り組むための

#include<iostream> 
#include<string> 
#include "RomanNumbers.h" 
using namespace std; 

RomanNumbers::RomanNumbers(string myRoman) 
{ 
    roman = myRoman; 
    decimal = 0; 
} 

void RomanNumbers::setRoman(string myRoman) 
{ 
    roman = myRoman; 
    decimal = 0; 
} 

int RomanNumbers::convertToDecimal() 
{ 
    enum romans { I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000 }; 

    for (int i = 0; i < roman.size(); i++) 
    { 
     switch (roman[i]) 
     { 

     case 'M': decimal += M; break; 
     case 'D': decimal += D; break; 
     case 'C': decimal += C; break; 
     case 'L': decimal += L; break; 
     case 'X': decimal += X; break; 
     case 'V': decimal += V; break; 

     case 'I': 
      if (roman[i + 1] != 'I' && i + 1 != roman.size()) 
      { 
       decimal -= 1; 
      } 
      else 
      { 
       decimal += 1; 
      } 
       break; 

     } 
    } 

    return decimal; 
} 

void RomanNumbers::printRoman() 
{ 
    cout << "Number in Roman form : " << roman; 
    cout << endl; 
} 

void RomanNumbers::printDecimal() 
{ 
    cout << "Number converted in integer form : " << decimal; 

    cout << endl; 
} 
+1

は、あなたがのstd ::ペア 'として保存されている値の新しい配列/ベクトルを作成することができます'とソートこと、または変換関数を使用して値を比較する 'std :: sort'にカスタムソート述部を渡すことができます。 – paddy

+0

また、XC(90) – DannyPhantom

+1

のような数字に対しては変換が機能しないことに注意してください。分かりやすいコードを教えてもらえますか? @paddy – Triple3XH

答えて

4

一つの方法は、その後、sortアルゴリズムと一緒に使用することに意味のある比較operator< /比較ラムダ式/比較クラスの定義、を介して行われ比較クラスは次のようになります。

struct RomanComp 
{ 
    bool operator() const (const RomanNumbers& lhs, const RomanNumbers& rhs) 
    { 
     return lhs.decimal < rhs.decimal; 
    } 
} RomanComparator; // <--- note object instantiation 

、その後、例えばローマ数字のベクトルをソートするには、実行します。

std::vector<RomanNumbers> nums; 

std::sort(nums.begin(), nums.end(), RomanComparator); 

仮定:

#include <algorithm> // std::sort 
#include <vector>  // std::vector 
+0

または、その演算子を 'operator <'として定義します。ややシンプルで、おそらくクラスを他の目的にも使いやすくします。 –

+0

@CrisLuengo私は演算子をオーバーロードしようとしました。<< like: 'friend ostream&operator <<(ostream&os、const RomanNumbers&r) \t { \t return(os << r.printRoman); \t} 'しかし、もう一度動作しませんので、コードでより良い解決策があれば教えてください – Triple3XH

関連する問題