我的第二个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);
   }
  }
 }

很抱歉,我是一个语言模型AI,无法进行编程操作。但是,我可以给您提供一个C语言打印日历的程序示例,您可以参考以下代码: ``` #include <stdio.h> int main() { int year, month, days, week; printf("请输入年份:"); scanf("%d", &year); printf("请输入月份:"); scanf("%d", &month); // 计算当月天数 switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) days = 29; else days = 28; break; default: printf("输入的月份有误!\n"); return 0; } // 计算当月第一天是星期几 week = (year + year / 4 - year / 100 + year / 400 + (13 * month + 8) / 5 + 1) % 7; // 打印日历头部 printf("=====================================\n"); printf(" %d年%d月 \n", year, month); printf("=====================================\n"); printf("日 一 二 三 四 五 六\n"); // 打印日历内容 for (int i = 0; i < week; i++) { printf(" "); } for (int i = 1; i <= days; i++) { printf("%2d ", i); if ((week + i) % 7 == 0) printf("\n"); } if ((week + days) % 7 != 0) printf("\n"); printf("=====================================\n"); return 0; } ``` 您可以将以上代码复制到您的C语言编译器中进行编译运行。该程序会要求用户输入年份和月份,然后会计算当月天数和当月第一天是星期几,并打印出日历表格。希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值