运行结果如下:

思路:
1.打印出开头和主函数,即:

2.判断是否为闰年:

是闰年则返回366天,不是闰年则返回365天。
3.判断月份:

4.打印日历:


打印日历中最难的是求出本月份的一号是星期几,求某一天是星期几,可以先选择某一天作为基准(start_day),例如1900年1月1日是星期一,用要求的那一天(day)与start_day所差天数,加上start_day的星期数 除以7的余数,就是所求(day)的星期数。
5.用到的其他代码:

代码如下:
#include <stdio.h>
#include <stdlib.h>
//1900年1月1日 是 星期一
void begin(int year, int month);
void putout(int year, int month);
int run(int year);
void underline();
void space();
void linefeed();
int day(int year, int month);
int main() {
int year, month;
printf("请输入年份:");
scanf("%d", &year);
printf("\n请输入月份:");
scanf("%d", &month);
begin(year, month);
putout(year,month);
return 0;
}
//打印开头
void begin(int year, int month) {
printf("\n %d 年 %d 月 \n",year,month);
linefeed();
underline();
linefeed();
printf(" 日 一 二 三 四 五 六 \n");
}
//打印日历
void putout(int year,int month) {
int start_year = 1900, start_day = 1, k = 1900;
int i = 0, j = 0;
int num1 = 0; //1900年到当前年份中所有的整年天数相加
int week = 0; //当前月份1号为星期几
int num2 = 0; //当前月份的总天数
int all_day = 0; //1900年1月1日到当前月份1号的总天数
int now_year_day = 0; //当前年月份,从当前年份1月1日到本月一月一日的天数
num2 = day(year, month);
//1900年到当前年份中所有的整年天数相加
for (k = 1900; k < year; k++)
{
num1 += run(k);
}
//条件为小于本月份,不加本月份的天数
for (i = 1; i < month; i++)
{
now_year_day += day(year, i); //用day函数累加求得本年本月1月1日之前的总天数
}
//从1970年1月1日到本年1月1日的总天数
all_day = num1 + now_year_day;
week = (all_day + start_day) % 7;
//打印空格(第一个为周日,j从0开始即可)
for (j = 0; j < week; j++)
space();
//打印日期并实现逢7换行
j = week;
for (i = 1; i <= num2; i++)
{
printf("%5d", i);
j++;
if (j % 7 == 0)
linefeed();
}
linefeed();
underline();
}
//计算此前的月份共有多少天
int day(int year, int month) {
int num3;
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
{
return 31;
}
else if (month == 4 || month == 6 || month == 9 || month == 11)
{
return 30;
}
else if (month == 2)
{
num3 = run(year);
if (num3 == 366)
return 29;
else
return 28;
}
else
printf("输入的月份不存在!");
}
//判断是否为闰年
int run(int year) {
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return 366;
else
return 365;
}
//打印日历下划线
void underline() {
printf("------------------日历------------------\n");
}
//打印空格
void space() {
printf(" ");
}
//换行
void linefeed() {
printf("\n");
}