我的第二个C++作业——打印日历

//date.h

//选择输出日期前请先设置日期
//制作:杨忠学
//E_mail: yzx_xue@163.com
#include<iostream>
#include<iomanip>
#include<stdlib.h>
using namespace std;
int const NoLeapday[]={31,28,31,30,31,30,31,31,30,31,30,31};  //平年
int const Leapday[]={31,29,31,30,31,30,31,31,30,31,30,31};  //润年
char const *WeekDay[]={"日","一","二","三","四","五","六"};
class Tdate{
 public:
 void Menupri(void);
 void SetDay(void);
 void Dayadd(void); //日期加1
 void Daysub(void); //日期减1
 void Dayprint(void);
 int getyear() { return year;}
 int getmonth() { return month;}
 int getday() {return day;}
 int getdayofmonth(int y,int m);
 int Dayofweek(int y,int m,int d=1);
 int IsLeapYear() const{ return ( year%4==0 && year%100!=0 )||( year%400==0 ); }
 void pMonthRili(int y,int m);
 void pYearRil();
 Tdate(){week=Dayofweek(getyear(),getmonth(),getday());}
 private:
   int year;
   int month;
   int day;
   int week;
 };

//date.cpp

#include "data.h"
#include <iostream>
using namespace std;
 void Tdate::SetDay()
  {
  system("cls");
  cout<<"请输入年月日"<<endl;
  cin>>year>>month>>day;
  while(month>12||month<=0||day<=0||(IsLeapYear()&&(day>Leapday[month-1]))||!IsLeapYear()&&(day>NoLeapday[month-1]))  //判断输入是否正确
  {
  cout<<"输入错误!"<<endl<<"重新输入"<<endl;
  cin>>year>>month>>day;
  }
  }
 void Tdate::Menupri()
 {
   cout<<"   请选择菜单 "<<endl;
   cout<<"  0.退出"<<endl;
   cout<<"  1.输出日期"<<endl;
   cout<<"  2.设置日期"<<endl;
   cout<<"  3.日期加1"<<endl;
   cout<<"  4.日期减1"<<endl;
   cout<<"  5.输出年日历"<<endl;
   cout<<"  6.输出本月日历"<<endl;
  }
 void Tdate::Dayadd()
  {
  
  if((IsLeapYear()&&(day==Leapday[month-1]))||!IsLeapYear()&&(day==NoLeapday[month-1]))
   {
   day=1;
   if(month==12)
   { month=1;
    year++;
   }
   else
    month++;
   }
  else
   day++;
  cout<<"明天是:"<<year<<"-"<<month<<"-"<<day<<endl;
  }
  void Tdate::Daysub()
  {
  if(day==1)   //如果是1号
  { if(month==1) //如果是1月1号
   { month=12;
    year--;
   }
   else   //其他月
    month--;
   if(IsLeapYear()) //闰年
    day=Leapday[month-1];
   else    //平年
    day=NoLeapday[month-1];
  }
  else  //不是1号
   day--;  
  cout<<"昨天是:"<<year<<"-"<<month<<"-"<<day<<endl;
  }
  int Tdate::getdayofmonth(int y,int m)
  {
  if(IsLeapYear())
   return (Leapday[m-1]);
  else
   return(NoLeapday[m-1]);
  }
 
 int Tdate::Dayofweek(int y,int m,int d)
 {
  int new_year,new_month;
  new_year=y;
  new_month=m;
  if(m==1||m==2)
  {
  new_month+=12;
  new_year--;
  }
  return ((d+2*new_month+3*(new_month+1)/5+new_year+new_year/4-new_year/100+new_year/100)%7);
 }
 void Tdate::pYearRil() //从1月开始打印日历
 {
  for(int k=1;k<=12;k++)
   pMonthRili(getyear(),k);
 }
 void Tdate::pMonthRili(int y,int m)
  {
   int w=Dayofweek(getyear(),m,1); //计算1号是星期几
   cout<<"**********"<<y<<"年"<<m<<"月"<<"**********"<<endl;
   for(int i=0;i<=6;i++)
    cout<<setw(4)<<WeekDay[i];
   cout<<endl;  
   cout<<setw(4*w)<<"";
   for(i=1;i<=getdayofmonth(getyear(),m);i++)
   { cout<<setw(4)<<i;
    w++;
    if(w==7)
    { w=0;
     cout<<endl;
    }
   }
   cout<<endl<<"*****************************"<<endl;
  }
  
 void Tdate::Dayprint(void)
 {
  char p[10];
  week=Dayofweek(getyear(),getmonth(),day);
  strcpy(p,WeekDay[week==7?0:week]);
  cout<<"今天是:"<<year<<"-"<<month<<"-"<<day<<" 星期"<<p<<endl;
 }
void main()
 {
 Tdate myday;
 cout<<"请先设置日期!"<<endl;
 int index;
 while(1)
  {
  myday.Menupri(); //输出菜单
  cin>>index;
  switch(index)
   {
   case 1: myday.Dayprint();break;
   case 2: myday.SetDay(); break;
   case 3: myday.Dayadd();break;
   case 4: myday.Daysub();break;
   case 5: myday.pYearRil();break;
   case 6: myday.pMonthRili(myday.getyear(),myday.getmonth());break;
   default: exit(1);
   }
  }
 }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值