Data.cpp老师的作业,叫咱编写一个存放日期的data类

要重载一些运算符,最讨厌的就是减号了,不知道编的对不对,哪位好心的叔叔阿姨帮忙测试一下。

#include <iostream>
using std::cout; 
using std::ostream;
using std::istream;
using std::endl;
using std::cin;

class Data
{
private:
 int year;
 int mouth;
 int day;
public:
    Data ():year(2000),mouth(1),day(1){};
 Data (int, int, int);
 void set(int, int, int);
 void get(int &, int &, int &);
 void show();
 Data operator + (int);
 Data operator - (int);
 int operator - (Data &);
 Data operator ++ ();
 Data operator ++ (int);
 Data operator -- ();
 Data operator -- (int);
 friend ostream & operator << (ostream &, Data &);
 friend istream & operator >> (istream &, Data &);
 bool operator == (Data &);
 bool operator != (Data &);
 bool operator < (Data &);
 bool operator > (Data &);
 bool operator <= (Data &);
 bool operator >= ( Data &);
 friend int max(int, int);
};

inline int max(int x,int y)
{
 return (x>=y)?x:y;
}

int l1[13] = {31,31,28,31,30,31,30,31,31,30,31,30,31};   //贫年12月,1月...12月;数组第一个放12月在重载“-”号可方便编写
int l2[13] = {31,31,29,31,30,31,30,31,31,30,31,30,31};   //闰年12月,1月...12月

/*****************************************************
                       构造函数
*****************************************************/

Data :: Data (int x, int y, int z)                    //构造函数
{
 if (x<1900 || x>2099)
  year = 2000;
 else year = x;
 if (y<1 || y>12)
  mouth = 1;
 else mouth = y;
    if ((year%4==0 && year%100 !=0) || (year%400==0))
 {
  if (z<1 || z > l2[mouth])
   day = 1;
  else day = z;
 }
 else
 {
  if (z<1 || z > l1[mouth])
   day = 1;
  else day = z;
 }
}

/***********************************************************
                           set函数
************************************************************/

void Data :: set(int x = 2000, int y = 1, int z = 1)     //set函数
{
 if (x<1900 || x>2099)
  year = 2000;
 else year = x;
 if (y<1 || y>12)
  mouth = 1;
 else mouth = y;
    if ((year%4==0 && year%100 !=0) || (year%400==0))
 {
  if (z<1 || z > l2[mouth])
   day = 1;
  else day = z;
 }
 else
 {
  if (z<1 || z > l1[mouth])
   day = 1;
  else day = z;
 }
}

/**********************************************
                get函数
***********************************************/
void Data :: get(int &x, int &y, int &z)                  //get函数
{
 x = year;
 y = mouth;
 z = day;
}

/**********************************************
                show函数
***********************************************/

void Data :: show ()                                              //show函数
{
 cout << year << "年" << mouth << "月" << day << "日" << endl;
}


/**********************************************
            重载运算符(Data)+int
***********************************************/
Data Data :: operator + (int x)                             //重载运算符Data+int
{
 Data r;
 r.day = day + x;
 r.year = year;
 r.mouth = mouth;
 if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
 {
loop1: while (1)
  {
      if (r.day > l2[r.mouth])
   {
       r.day -= l2[r.mouth];
       r.mouth ++;
       if (r.mouth >12)
    {
        r.mouth -=12;
        r.year ++;
     if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
      goto loop1;
     else goto loop2;
    }
   }
   else break;
  }
 }
 
 else
 {
loop2: while (1)
  {
      if (r.day > l1[r.mouth])
   {
       r.day -= l1[r.mouth];
       r.mouth ++;
       if (r.mouth >12)
    {
        r.mouth -=12;
        r.year ++;
     if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
      goto loop1;
     else goto loop2;
    }
   }
   else break;
  }
 }
return r;
}


/**********************************************
             重载(Data)-int
***********************************************/

Data Data :: operator - (int x)                                    //重载Data-int
{
 Data r;
 r.day = day -x;
 r.mouth = mouth;
 r.year = year;
 if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
 {
loop3: while (1)
  {
   if (r.day < 1)
   {
    r.day += l2[r.mouth-1];
    r.mouth--;
    if (r.mouth < 1)
    {
     r.mouth += 12;
     r.year --;
     if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
      goto loop3;
     else goto loop4;
    }
   }
   else break;
  }
 }
 else
 {
loop4: while (1)
  {
   if (r.day < 1)
   {
    r.day += l2[r.mouth-1];
    r.mouth--;
    if (r.mouth < 1)
    {
     r.mouth += 12;
     r.year --;
     if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
      goto loop3;
     else goto loop4;
    }
   }
   else break;
  }
 }
 return r;
}


/**********************************************
            重载 (Data)-(Data)
***********************************************/
int Data :: operator - (Data &x)                        //重载两Data-Data
{                                                       //方法:将Data x升降至Data this所经过的日期,先降升年,再降升月,再降升日。
 int r =0;
 int i, t = max(year,x.year);
 r = day - x.day;                                    //计算日差

 if (mouth > x.mouth)                                           //计算月差开始
 {
  if ((t==0 && t%100 !=0) || t%400==0)
      for (i = x.mouth; i<mouth; i++)
       r += l2[i];
  else
   for (i = x.mouth; i<mouth; i++)
    r += l1[i];
 }
 else
 {
  if ((t==0 && t%100 !=0) || t%400==0)
      for (i = mouth; i < x.mouth; i++)
       r -= l2[i];
  else
   for (i = mouth; i < x.mouth; i++)
       r -= l1[i];
 }                                                             //计算月差结束

 if (year > x.year)                                       //计算年差开始
 {
  for (i=x.year; i<year; i++)
  {
   if ((i%4==0 && i%100 !=0) || (i%400==0))
       r += 366;
   else
    r += 365;
  }
 }
 else
 {
  for (i=year; i < x.year; i++)
  {
   if ((i%4==0 && i%100 !=0) || (i%400==0))
       r -= 366;
   else
    r -= 365;
  }
 }                                                         //计算年差结束
 return r;     //好难,其实应该先计算年差,再算月差,再算日差,不过因为日差比较简单,所以放在最前,不影响结果。
}


/**********************************************
                重载 ++(Data)
***********************************************/
Data Data :: operator ++ ()                                   //重载++Data
{
 if ((year%4==0 && year%100 !=0) || (year%400==0))
 {
  if (++day > l2[mouth])
  {
   day = 1;
   ++mouth;
  }
  if (mouth > 12)
  {
   mouth =1;
   ++year;
  }
 }
    else
 {
  if (++day > l1[mouth])
  {
   day = 1;
   ++mouth;
  }
  if (mouth > 12)
  {
   mouth =1;
   ++year;
  }
 }
 return *this;
}


/**********************************************
                重载 (Data)++
***********************************************/
Data Data :: operator ++ (int)                          //重载Data++
{
 Data temp(* this);
 day ++;
 if ((year%4==0 && year%100 !=0) || (year%400==0))
 {
  if (day > l2[mouth])
  {
   day = 1;
   ++mouth;
  }
  if (mouth > 12)
  {
   mouth =1;
   ++year;
  }
 }
    else
 {
  if (day > l1[mouth])
  {
   day = 1;
   ++mouth;
  }
  if (mouth > 12)
  {
   mouth =1;
   ++year;
  }
 }
 return temp;
}


/**********************************************
                重载  --(Data)
***********************************************/
Data Data :: operator -- ()                             //重载--Data
{
 day --;
 if ((year%4==0 && year%100 !=0) || (year%400==0))
 {
  if (day < 1)
  {
   mouth--;
   day = l2[mouth];
  }
  if (mouth < 1)
  {
   year--;
   mouth = 12;
  }
 }
 else
 {
  if (day < 1)
  {
   mouth--;
   day = l1[mouth];
  }
  if (mouth < 1)
  {
   year--;
   mouth = 12;
  }
 }
 return *this;
}


/**********************************************
              重载 (Data)--
***********************************************/
Data Data:: operator -- (int)                                          //重载Data--
{
 Data temp(*this);
 day--;
 if (day < 1)
 {
  mouth--;
  if ((year%4==0 && year%100 !=0) || (year%400==0))
   day = l2[mouth];
  else
   day = l1[mouth];
 }
 if (mouth < 1)
 {
  mouth = 12;
  year --;
 }
 return temp;
}


/**********************************************
               重载 << (Data)
***********************************************/
ostream & operator << (ostream &output, Data &x)                          //重载<<
{
 output << x.year << "年" << x.mouth << "月" << x.day << "日" << endl;
 return output;
}


/**********************************************
               重载 >> (Data)
***********************************************/
istream & operator >> (istream &input, Data &x)                           //重载>>
{
 input >> x.year >> x.mouth >> x.day;
 return input;
}

/**********************************************
               重载 (Data)==(Data)
***********************************************/
bool Data :: operator == (Data &x)                                         //重载==
{
 bool r = false;
 if (year == x.year && mouth == x.mouth && day == x.day)
  r = true;
 return r;
}


/**********************************************
               重载 (Data)!=(Data)
***********************************************/
bool Data :: operator != (Data &x)                                        //重载!=
{
 bool r = true;
 if (year == x.year && mouth == x.mouth && day == x.day)
  r = false;
 return r;
}

/**********************************************
               重载 (Data)<(Data)
***********************************************/
bool Data :: operator < (Data &x)                                     //重载<
{
 bool r = true;
 if (year > x.year)
  r = false;
 if (year == x.year && mouth > x.mouth)
  r = false;
 if (year == x.year && mouth == x. mouth && day >= x.day)
  r = false;
 return r;
}

/**********************************************
               重载 (Data)>(Data)
***********************************************/
bool Data :: operator > (Data &x)                                     //重载>
{
 bool r = true;
 if (year < x.year)
  r = false;
 if (year == x.year && mouth < x.mouth)
  r = false;
 if (year == x.year && mouth == x. mouth && day <= x.day)
  r = false;
 return r;
}


bool Data :: operator <= (Data &x)                           //重载<=
{
 bool r = true;
 if (year > x.year)
  r = false;
 if (year == x.year && mouth > x.mouth)
  r = false;
 if (year == x.year && mouth == x. mouth && day > x.day)
  r = false;
 return r;
}

bool Data :: operator >= (Data &x)                            //重载>=
{
 bool r = true;
 if (year < x.year)
  r = false;
 if (year == x.year && mouth < x.mouth)
  r = false;
 if (year == x.year && mouth == x. mouth && day < x.day)
  r = false;
 return r;
}

int main()
{
 cout << "please test the program" << endl;
 return 0;
}

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
抱歉,我是一个自然语言处理模型,无法提供代码实现。但是,我可以指导您如何实现这个问题。 1. Rinex O文件和Rinex N文件读取类设计 您可以使用C++中的文件流(fstream)来读取Rinex文件。具体步骤如下: 1)打开Rinex文件,使用ifstream来读取文件内容; 2)读取文件头,根据Rinex文件格式解析文件头中的各个字段; 3)读取广播星历参数、周内秒、观测量等内容,根据Rinex文件格式解析文件内容; 4)关闭文件。 您可以设计两个类,分别用于读取Rinex O文件和Rinex N文件。这两个类可以继承一个基类,共用一些公共函数和数据结构。例如: ```C++ class RinexFile { public: RinexFile(const char *filename); virtual ~RinexFile(); virtual bool ReadHeader() = 0; virtual bool ReadData() = 0; virtual void PrintHeader() = 0; virtual void PrintData() = 0; protected: ifstream file_; RinexHeader header_; vector<RinexData> data_; }; class RinexOFile : public RinexFile { public: RinexOFile(const char *filename); bool ReadHeader() override; bool ReadData() override; void PrintHeader() override; void PrintData() override; }; class RinexNFile : public RinexFile { public: RinexNFile(const char *filename); bool ReadHeader() override; bool ReadData() override; void PrintHeader() override; void PrintData() override; }; ``` 其中,RinexHeader和RinexData分别表示文件头和数据。您需要设计这些数据结构,以便存储Rinex文件中的各种字段。 2. 文件头等必要的数据结构设计 文件头包含了许多信息,您需要设计一个结构体来存储这些信息。具体字段可以参考Rinex文件格式的说明文档。例如: ```C++ struct RinexHeader { string version; string type; string satellite_system; string pgm; string run_by; string marker_name; string marker_number; string observer; string agency; string receiver_number; string receiver_type; string antenna_number; string antenna_type; string approx_position_xyz; string antenna_delta_hen; int epoch_interval; int leap_seconds; string time_system; string comment; }; ``` 广播星历参数、周内秒、观测量等内容的数据结构也需要设计。例如: ```C++ struct RinexData { string prn; double epoch_time; double clock_bias; double clock_drift; double clock_drift_rate; double iode; double crs; double delta_n; double m0; double cuc; double e; double cus; double sqrt_a; double toe; double cic; double omega0; double cis; double i0; double crc; double omega; double omega_dot; double idot; double codes[3]; double phases[3]; double snrs[3]; }; ``` 3. 主函数main.cpp编写 主函数需要创建RinexOFile和RinexNFile对象,并调用它们的函数来读取文件内容并输出。例如: ```C++ int main() { RinexOFile o_file("C:\\test\\rinexo.20o"); o_file.ReadHeader(); o_file.PrintHeader(); o_file.ReadData(); o_file.PrintData(); RinexNFile n_file("C:\\test\\rinexn.20n"); n_file.ReadHeader(); n_file.PrintHeader(); n_file.ReadData(); n_file.PrintData(); return 0; } ``` 注意:您需要根据您的实际情况修改文件路径和文件名。同时,您需要编写ReadHeader、ReadData、PrintHeader和PrintData函数来实现具体的读取和输出功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可爱的小灵儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值