显示任意一年的月历的程序

4 篇文章 0 订阅
3 篇文章 0 订阅

功能概述:从键盘输入年份和月份,然后从控制台输出这个月的月历。然后询问是否继续,继续按1退出按2。



程序很简单,我把代码贴出来,其中有详细注释,看不懂的留言吧~~


源代码:
// 日历2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>

//功能:输入星期几如果为0说明是周一前一天也就是周日
// 如果是8则是周日后一天也就是周一
int weekround(int x)
{
  if(x==0) return 7;
  else if(x==8) return 1;
  else return x;

}

//只要给它这个月第一天是星期几,以及这个月一共几天就能输出这个月的日历
void output(int week,int days)
{
   int i;
   printf("  日  一  二  三  四  五  六\n");
   for(i=0;i<week%7;i++)
      printf("    ");
   for(i=1;i<=days;i++)
   {
       printf("M",i);
  if(week==6)
  printf("\n");
  week++;
  week=weekround(week);

   }
}

void caculate(int y,int m)   
{
   int t,week=4,k,sum=0; //week存放星期几,初值为4因为2099年1月1日是周4
   int mon_1[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //这是平年每个月的天数
   int mon_2[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //这是闰年每个月的天数,就2月不同

   //下面的循环的功能:计算出输入的年份的1月1日是星期几
   //用的是倒推的方法,
   for(t=2099;t>y;t--) //t--是向前一年
   {
     if(t%4==0&&t0!=0||t@0==0)//如果是闰年366天 366%7=2  也就是说倒推星期要减去2
 {
    week--; //每次减完星期都要运行一次weekround() 以确保星期的正确
week=weekround(week);
week--;
week=weekround(week);

 
 }
else //平年 365%7=1 所以减1天
{
   week--;
week=weekround(week);
 
}
   }

    if(t%4==0&&t0!=0||t@0==0) //闰年
{
  for(k=0;k<=m-2;k++) //算出当前这个月以前一共多少天。eg:这是六月 就算出1--5月一共多少天
  sum+=mon_2[k]; //算出的天数放在sum中

  for(k=1;k<=sum;k++) //从这一年的第一天开始计算这个月第一天的星期,每一天增加1(废话)。
  {
      week++;
  week=weekround(week);
  }
  output(week,mon_2[m-1]); //输出

}
    else //平年,同上
{
  for(k=0;k<=m-2;k++)
  sum+=mon_1[k];

  for(k=1;k<=sum;k++)
  {
      week++;
  week=weekround(week);
  }
  output(week,mon_1[m-1]); 
}

}

int main(int argc, char* argv[])   //主函数负责输入数据
{
label:
int year,month,c;
printf("请输入年(1900--2099)\n");
scanf("%d",&year);
if(year>2099||year<1900) 
{
   printf("输入有误\n");
return 0;
}
printf("请输入月(1--12)\n");
    scanf("%d",&month);
if(month>12||month<1)
{
   printf("输入有误\n");
return 0;
}
caculate(year,month);
printf("\n");
    
printf("是否继续?是--1,否--2\n");
scanf("%d",&c);
if(c==1) goto label;
return 0;
}







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值