题目
1.编写程序,输入一个年份和一个月份,输出月份在该年份的日历。

思路

首先要算出对应月份的第一天是周几,确定打印位置后,后面的自动增加,依次打印即可。同时打印到周六时,就打印一个换行符。

代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//所给日期距离年初的天数
int day_count(int y,int m,int d)
{
    int i,days=0;
    int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    for(i=0;i<m;i++)
    {
        days+=a[i];
    }
    days+=d;
    if(m>2 && (y%4==0 && y%100!=0 || y%400==0))
    {
        days++;
    }
    return days;
}

//算出每个月的第一天是周几
int weekdays(int y1,int m1)
{
    int d1=1,y2=2018,m2=2,d2=18,a,b,c=0,i,days,flag;
    a=day_count(y1,m1,d1);
    b=day_count(y2,m2,d2);
    if(y1<y2)
    {
        for(i=y1;i<y2;i++)
        {
            if(i%4==0 && i%100!=0 || i%400==0)
            {
                c++;
            }

        }
        days=b-a+(y2-y1)*365+c;
    }else{
        for(i=y2;i<y1;i++)
        {
            if(i%4==0 && i%100!=0 || i%400==0)
            {
                c++;
            }

        }
        days=a-b+(y1-y2)*365+c;
    }

    if((y1<y2) || (y1==y2 && m1<m2) ||(y1==y2 && m1==m2 && d1<d2))
    {
        flag=(7-days%7)%7;
    }else{
        flag=days%7;
    }
    return flag;
}


int main()
{
    int y,m,k,i,flag=0;
    int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    printf("请输入年月:");
    while(fflush(stdin),scanf("%d %d",&y,&m)!=EOF)
    {
        printf("日  一  二  三  四  五  六\n");
        k=weekdays(y,m);
        for(i=k;i>0;i--)//因为每个位置占4个空格,所以是周几,就循环几次
        {
            printf("    ");
        }
        if(m==2)//如果是二月,又是闰年,flag为1
        {
            flag=(y%4==0 && y%100!=0 || y%400==0);
        }
        for(i=1;i<=a[m]+flag;i++,k++)
        {
            printf("%-4d",i);
            if(k%6==0)//周六换行
            {
                printf("\n");
            }
            if(k==7)
            {
                k=0;
            }

        }
        printf("\n请输入年月:");
    }

    system("pause");
}

执行结果
图片说明