所以我有一个任务,我应该用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采用玛雅日期和天数。该 操作会增加玛雅日期生成玛雅人的天数 日期作为输出。第二个操作m-d减去天数 从玛雅日期开始产生玛雅日期作为输出。第三 operation m-m计算两个玛雅日期之间的天数。 第四个操作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;
};
我希望能够将单位设置为等于我初始化类时它们所代表的天数,因此使用它们会更容易。
我上面的代码没有编译,我无法弄清楚原因。任何指向我做错的指示都会非常有帮助。
答案 0 :(得分:2)
我认为你应该用Mayan风格在你的班级中保存数据。您必须能够将从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)。
最后一个 - 您必须知道格里高利形式的任何玛雅日期,以计算日历之间的天数差异。将一个日期转换为天,减去(或添加)差异,然后转换为其他。