功能概述:从键盘输入年份和月份,然后从控制台输出这个月的月历。然后询问是否继续,继续按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;
}