3

そのため、マヤのカレンダーを C++ でコーディングすることになっている割り当てがあり、カレンダーに次の機能が含まれるようにします。

argv[1] | argv[2]        |  argv[3]        | output
m+d     | Mayan date     |  number of days | Mayan date
m-d     | Mayan date     |  number of days | Mayan date
m-m     | Mayan date     |  Mayan date     | number of days
g=      | Gregorian date |                 | Mayan date
m=      | Mayan date     |                 | Gregorian date

最初の操作 m+d には、マヤの日付と日数が必要です。この操作は、マヤの日付に日数を加算して、マヤの日付を出力として生成します。2 番目の操作 md は、マヤの日付から日数を減算して、出力としてマヤの日付を生成します。3 番目の操作 mm は、マヤの 2 つの日付の間の日数を計算します。4 番目の演算 g= は、グレゴリオ暦の日付をマヤ暦の日付に変換します。最後の操作 m= は、マヤの日付をグレゴリオ暦の日付に変換します。

マヤ暦の単位は、次のように設定されています。

Days                  Long Count period         Long Count unit
1                                               1 Kin
20                    20 Kin                    1 Uinal
360                   18 Uinal                  1 Tun
7,200                 20 Tun                    1 Ka'tun
144,000               20 Ka'tun                 1 Bak'tun
2,880,000             20 Bak'tun                1 Pictun
57,600,000            20 Pictun                 1 Kalabtun
1,152,000,000         20 Kalabtun               1 K'inchiltun
23,040,000,000        20 K'inchiltun            1 Alautun

マヤ暦オブジェクトの初期化に問題があります。これが私がこれまでに持っているものです:

class MayanDate {
// Bak'tun, Ka'tun, etc stuff ...
unsigned int Kin = 1;
unsigned int Uinal = 20;
unsigned int Tun = 360;
unsigned int Katun = 7200;
unsigned int Baktun = 144000;
unsigned int Pictun = 2880000;
unsigned int Kalabtun = 57600000;
unsigned long Kinchiltun = 1152000000;
unsigned long Alautun = 23040000000;


public:

        MayanDate();
        MayanDate( unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);

        void set( unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);
        MayanDate &operator++();
        int operator-( const MayanDate &) const;
        MayanDate operator+( unsigned int ) const;
        MayanDate operator-( unsigned int) const;
        bool operator==( const MayanDate & ) const;
        bool operator!=(const MayanDate & m ) const;
        void get_string( char*, unsigned int) const;
};

クラスを初期化するときに、ユニットが表す日数と等しくなるようにユニットを設定できるようにしたいので、ユニットを操作しやすくなります。

上記のコードはコンパイルされておらず、その理由がわかりません。私が間違っていることへの指針は非常に役に立ちます。

4

1 に答える 1

2

クラスのデータはマヤスタイルで保持する必要があると思います。次のように、Mayaエポックの開始から日数を変換する機能が必要です。

void toMayan(long long d)
{
  kin = d % 20; d /= 20;
  unial = d % 18; d /= 18;
  tun = d %20; d /= 20;
  //...
}

そして、逆変換は簡単です。kin + 20 * (unial + 18 * (tun + 20 * (...)))

次に、ある日付から別の日付までのグレゴリオ暦の日数を計算する方法を知っておく必要があります。たとえば、JavaのDateクラスソース(http://www.docjar.com/html/api/java/util/Date.java.html)を見ることができます。

そして最後に、カレンダー間の日数の差を計算するには、グレゴリオ暦のマヤの日付を知っている必要があります。1つの日付を日数に変換し、差を減算(または加算)してから、他の日付に変換します。

于 2012-04-25T03:59:54.613 に答える