话不多说,直接上结果图
说明 :
程序不难,唯一一个难点就是怎么算每月是星期几,其余的代码比较多但不费脑筋(当然了作者脑壳笨第一次写的时候也花了不少时间,哈哈),特别适合学到函数这一章节,因为需要用到许多自定义的函数。让我们来看看详细的解题过程吧。
1.这是需要用到的自定义函数,后面都有注释说明,眼尖的好朋友肯定会看到1970和4,这就是我们要搞懂怎么算星期几的关键,当然也可以自己选一个早一点的时间点。方法下面会讲到先从最基本的切入。
2.我们的主函数,输出都在自定义函数里面去完成。
3.开始输出相当于给我们程序装修的代码
4.开始最重要的输出我们下面日期的代码(不好截屏直接上代码段),每一步基本上都注释了。
和最重要的是我们怎么求当月1号所占星期几。
就是 (两个时间点的天数之差+ 所设时间点的星期数) % 7 取余数
//2
//打印日历内容
void number(int year, int mouth)
{
//1970年1月1日是星期四
//num1为接收每个闰年多出来的一天,num2为接收输入的当前月份1号之前的所有天数
//num为当前月份天数
int n = 1970, num1 = 0, num2 = 0, num = 0;
int sum1 = 0, sum2 = 0;
int i=0, j=0;
//run函数 是否是闰年,是的话返回非0值
for (n; n < year; n++)
{
if (run(n))
{
num1++;
}
}
//用来计算输入的当年月份1号之前的所有天数
for (i = 1; i < mouth; i++)
{
num2 += day(year, i);
}
//上面run函数用过了n现在得,归为原值
n = N;
//得到当月1号星期数
sum1 = ( (year -n) * 365 + num1 + num2 + D) % 7;
//输出每个日期空格
for (i = 0; i < sum1 && sum1 != 7; i++)
{
space();
}
//当前月份天数
num = day(year, mouth);
j += sum1;
//j为统计7的倍数换行
//最后循环输出
for (i = 1; i <= num; i++)
{
printf("%4d", i);
j++;
if (j% 7 == 0)
{
printf("\n");
}
}
printf("\n");
}
5.这是上层函数所需要引用的函数
最后放上我们的原代码
如有不妥之处还请指出,谢谢。
希望对你有帮助。
温馨提醒因为采用了布尔类型,布尔类型是c99开始的,所以用VC++6.0编译器的话会报错.
#include <stdio.h>
#include <stdbool.h>
#define N 1970 //自己可以选个先前时间点
#define D 4 //1970年1月1号是星期四
void yearmouth(int year, int mouth); //打印相应年份和月份下划线以及下面的中文星期
void year1(int i, int j); //打印年份月份
void underline(); //打印下划线
void week(); //打印中文星期
void number(int year, int mouth);//打印日历内容
bool run(int year);//判断闰年
int day(int year, int mouth);//当前月份1号之前的所有天数
void space(); //空格
//
int main()
{
int year, mouth;
printf("请输入年份:");
scanf("%d", &year);
printf("请输入月份:");
scanf("%d",&mouth);
yearmouth(year,mouth);
number(year, mouth);
return 0;
}
//1
//打印相应年份和月份的日历
void yearmouth(int year, int mouth)
{
year1(year, mouth);
underline();
week();
}
//1.1
//打印年份月份
void year1(int year, int mouth)
{
printf("\t%d 年 %d 月\n", year, mouth);
}
//1.2
//打印下划线
void underline()
{
int i;
for (i = 0; i < 16; i++)
{
printf("- ");
}
printf("\n");
}
//1.3
//打印中文星期
void week()
{
printf(" 日");
printf(" 一");
printf(" 二");
printf(" 三");
printf(" 四");
printf(" 五");
printf(" 六\n");
}
//2
//打印日历内容
void number(int year, int mouth)
{
//1970年1月1日是星期四
//num1为接收每个闰年多出来的一天,num2为接收输入的当前月份1号之前的所有天数
//num为当前月份天数
int n = 1970, num1 = 0, num2 = 0, num = 0;
int sum1 = 0, sum2 = 0;
int i=0, j=0;
//run函数 是否是闰年,是的话返回非0值
for (n; n < year; n++)
{
if (run(n))
{
num1++;
}
}
//用来计算输入的当年月份1号之前的所有天数
for (i = 1; i < mouth; i++)
{
num2 += day(year, i);
}
//上面run函数用过了n现在得,归为原值
n = N;
//得到当月1号星期数
sum1 = ( (year -n) * 365 + num1 + num2 + D) % 7;
//输出每个日期空格
for (i = 0; i < sum1 && sum1 != 7; i++)
{
space();
}
//当前月份天数
num = day(year, mouth);
j += sum1;
//j为统计7的倍数换行
//最后循环输出
for (i = 1; i <= num; i++)
{
printf("%4d", i);
j++;
if (j% 7 == 0)
{
printf("\n");
}
}
printf("\n");
}
//2.1
//判断是否为闰年
bool run(int year)
{
return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}
//2.2
//当前月份1号之前的所有天数
int day(int year ,int mouth)
{
int d;
//如果输入年份中月份大于2月需要查询输入年份是否为闰年
if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10)
return 31;
else if (mouth == 4 || mouth == 6 || mouth == 11 || mouth == 9)
return 30;
else if (mouth==2)
{
d = 28;
if (run(year))
{
return ++d;
}
else
return d;
}
}
//2.3
//空格
void space()
{
printf(" ");
}