用c语言输出一个月的月历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ggjustnow/article/details/79310797

一.基本思路

1.日历的大致形状

                                     

2.细节的实现

       (1)首先需要打印年月和月历的周一到周日
(2)判断每个月的1号是周几,这样利用固定的算法就可以依次求出
2、3、4、、、等是星期几
(3)其中还需要判断在什么时候进行换行处理。以及判断 是否是润年

二.代码实现

1.标题的输入和输出这个可以很简答就写出来

2.判断每个月的1号是周几

其中有一个固定的公式:
temp=(y-1)+ (y-1)/ 4 - (y-1)/100+(y-1)/400+days
week = temp%7

注释:y代表年数;days表示这一年的第几天;

例如2014年1月1号,
temp = 2014-1 + (2014-1)/ 4 - (2014-1) / 100 + (y-1) / 400 + 1
week = temp%7
计算出来就是周三

3.现在又出来一个问题,已知年月日如何计算days呢?

(1)判断是否是润年

(year % 4 == 0 && year % 100 !=0 ) || ( year % 400 == 0);若为真则是闰年

2)从1到12月份,每个月的天数是知道的

可以将其写入到一个数组中,然后利用switch选择相应的case。
m[11] = {31,28,31,30,31,30,31,31,30,31,30,31}
switch month {
case 1:
days = ;
break;
case 2:
判断是否是闰年
for循环
                          ................


4.接下来输出其他日子

(1)1号位置的确定

利用for循环,输出空格

(2)换行问题

再次利用for循环,如果(week+日数-1 % 7) == 0,为换行判断条件。

(3)日数递增的临界条件

即每个月的最后一天是多少。



代码如下:

       

#include<stdio.h>

#define bool int//自定义bool类型
#define true 1
#define false 0

bool IsLeap(int year);
int GetWeek(int year,int month);
void main()
{
    int y,m,week,i;
    printf("输入yyyy-mm:");
    scanf("%d%d",&y,&m);
    printf("      %d年%d月\n",y,m);
    printf("=====================\n");
    printf(" 一 二 三 四 五 六 日\n");
    week = GetWeek(y,m);
    if(week == 0)
        week = 7;									//若week == 0,将其视作7,以便留下足够的空格

    for (i = 1;i < week; i++)
    {
        printf("   ");								//三个字符为一个单位,保证第一行与周数对应
    }
    int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//以数组方式统计每个月的天数
    if (IsLeap(y) == true)							//若为闰年,将2月份的天数修改为29
        month[1] = 29;
    for(i=1;i<=month[m-1];i++)						//利用for循环,依次输出日数,并且若加上通过计算week+i-1%7来判断是否该换行
    {
        printf("%3d",i);
        if((i+week-1) % 7 == 0)						
            printf("\n");
    }
	printf("\n=====================\n");
}

bool IsLeap(int year)
{
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))//判断是否为闰年的条件
        return true;
    else
        return false;
}

int GetWeek(int year,int month)
{
    int m[12] = {31,28,31,30,31,30,31,31,30,31,30,31};			//以数组记录每个月的天数
    int day=0,week,i;
    switch (month)
    {
        case 1:
            day = 1;
            break;
        case 2:
            day = m[0] + 1;
            break;
        case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12:
            if (IsLeap(year) == true)
                m[1] = 29;
            for (i=0;i<month-1;i++)
            {
                day = day + m[i];
            }
            day = day + 1;
            break;

    }
    week = ((year-1) + (year-1)/4 - (year-1)/100 + (year-1)/400 + day) % 7;
    return week;
}


猜你喜欢

转载自blog.csdn.net/ggjustnow/article/details/79310797