C++:输出日历的算法

功能:只要输入四位数的年份和该年的元旦是星期几,就可以输出全年的日历。
思路提示:
(1)一年有12个月,所以,输出年历的算法是:
int month=1;
while (month<=12)
{
计算第month月的天数MAX_DAY;
输出天数是MAX_DAY的第month月的年历;
month++;
}
(2)根据大月、小月、闰年、平年,计算year第month月的天数MAX_DAY,算法是:
switch (month)
{
case 1:case3:case 5:case7:case 8:case10:case 12:
MAX_DAY=31;break;
case 2:
if (((year%4)= =0)&&((year%100)!=0)||(year%400= =0))
MAX_DAY=29;
else
MAX_DAY=28;
break;
case 4:case 6:case 9:case 11:
MAX_DAY=30;
break;
}
(3)输出日历
printf(“\n= = = = = = = = = =%2d月份= = = = = = = = = =\n”,month);
printf(“ SUN MON TUE WED THU FRI SAT\n”);
for (i=0;i<week;i++)
printf(“%4c”,’ ’);
for (day=1;day<=MAX_DAY;day++)
{
printf(“%4d”,day);
week++;
week%=7;
if (week= =0)
printf(“\n”);

}



#include"stdio.h"
#include"stdlib.h"
void setmonth(int r);
void main(void)
{
int year,month,day,a,b,i,j,d,x,mon,k;
printf(" 时间:2009-7-4   21:47 完成\n");
printf("----------------------------------------------------\n");
printf("     如果你想选择输出全年的日历,请选1!\n");
printf("    如果你想选择输出某个月的日历,请选2!\n");
printf("如果你想知道某年某月某日的具体是星期几,请选择3!\n");
printf("           你还要继续吗?请选择4!\n");
printf("           如果你要退出,请选择5!\n");
printf("-----------------------------------------------------\n");
do
{
printf("请选择:");
scanf("%d",&x);
   if(x==1)                             //判断输出全年日历的条件
   {
    month=12;                                
    printf("请输入年:");
    scanf("%d",&year);
   }
   if(x==2)                             //判断输出某个月的日历的条件
   {
    printf("请输入年、月:");
    scanf("%d%d",&year,&month);
   }
   if(x==3)                             //判断输出具体某天是星期几的条件
   {
    printf("请输入年、月、日:");
    scanf("%d%d%d",&year,&mon,&day);
    month=mon-1;
   }
   if(x==5)                       //退出的条件
    exit(100);
   a=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400)%7; //判断某年的第一天是星期几
   for(i=1,d=0;i<=month;i++)
    {
     switch(i)
     {
      case 1:
      case 3:
      case 5:
      case 7:
      case 8:
      case 10:
      case 12:d=31;break;
      case 2:if(!(year%4)&&(year%100)||!(year%400))    //判断是否是闰年
         d=29;
        else
         d=28;
        break;
      case 4:
      case 6:
      case 9:
      case 11:d=30;
     }
     b=a%7;                  //判断某月的第一天是星期几
     a+=d;                   //求总的天数
     if(x==1)                //判断输出全年的日历
     {
      printf("========================================================\n");
      setmonth(i);                  //调用输出的月份
      printf("************************************************\n");
      printf("========================================================\n");
      printf(" 星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
      for(j=1;j<=b;j++)
       printf("%8c",' ');
      for(j=1;j<=d;j++)
      {
       printf("%8d",j);
       if((j+b)%7==0)
        printf("\n");
      }
     }
     if(x==1)              //跟随条件一,每个月的末尾换行
     printf("\n");
    }
     if(x==2)              //输出一个月的日历
     {
      printf("========================================================\n");
      setmonth(i-1);     //调用月份的输出
      printf("************************************************\n");
      printf("========================================================\n");
      printf(" 星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
      for(j=1;j<=b;j++)
       printf("%8c",' ');
      for(j=1;j<=d;j++)
      {
       printf("%8d",j);
       if((j+b)%7==0)
        printf("\n");
      }
      printf("\n");
     }
     if(x==3)                        //输出具体某天是星期几
     {
      a+=day;
      a%=7;
      switch(a)
      {
       case 0:printf("%d-%d-%d是星期天!",year,mon,day);break;
       case 1:printf("%d-%d-%d是星期一!",year,mon,day);break;
       case 2:printf("%d-%d-%d是星期二!",year,mon,day);break;
       case 3:printf("%d-%d-%d是星期三!",year,mon,day);break;
       case 4:printf("%d-%d-%d是星期四!",year,mon,day);break;
       case 5:printf("%d-%d-%d是星期五!",year,mon,day);break;
       default:printf("%d-%d-%d是星期六!",year,mon,day);
      }
      printf("\n");
     }
     printf("请选择继续还是要退出:");         //条件的判断
     scanf("%d",&k);
}while(k==4);
if(k==5)
   exit(100);
}
void setmonth(int r)
{
switch(r)
{
   case 1:printf("%4c一月份",' ');break;
   case 2:printf("%4c二月份",' ');break;
   case 3:printf("%4c三月份",' ');break;
   case 4:printf("%4c四月份",' ');break;
   case 5:printf("%4c五月份",' ');break;
   case 6:printf("%4c六月份",' ');break;
   case 7:printf("%4c七月份",' ');break;
   case 8:printf("%4c八月份",' ');break;
   case 9:printf("%4c九月份",' ');break;
   case 10:printf("%4c十月份",' ');break;
   case 11:printf("%2c十一月份",' ');break;
   default:printf("%2c十二月份",' ');
}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值