打印效果
#打印整年日历
wxd@DESKTOP-SD6D2NM:/code$ ./a.out
*********************Please chose*************************
*************1.Print a year's calendar *******************
*************2.Print a month's calendar*******************
**********************************************************
your chose:(1 or 2) -> 1
input Year(2100>Year>0) -> 2020
2020-01
Mon Tue Wed Thu Fri Sat Sun
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
2020-02
Mon Tue Wed Thu Fri Sat Sun
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29
2020-03
Mon Tue Wed Thu Fri Sat Sun
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
2020-04
Mon Tue Wed Thu Fri Sat Sun
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
2020-05
Mon Tue Wed Thu Fri Sat Sun
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
2020-06
Mon Tue Wed Thu Fri Sat Sun
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
2020-07
Mon Tue Wed Thu Fri Sat Sun
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
2020-08
Mon Tue Wed Thu Fri Sat Sun
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
2020-09
Mon Tue Wed Thu Fri Sat Sun
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
2020-10
Mon Tue Wed Thu Fri Sat Sun
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
2020-11
Mon Tue Wed Thu Fri Sat Sun
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
2020-12
Mon Tue Wed Thu Fri Sat Sun
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
#打印整月的日历
wxd@DESKTOP-SD6D2NM:/code$ ./a.out
*********************Please chose*************************
*************1.Print a year's calendar *******************
*************2.Print a month's calendar*******************
**********************************************************
your chose:(1 or 2) -> 2
input Year and Month (eg:2020,2) -> 2020,3
2020-03
Mon Tue Wed Thu Fri Sat Sun
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
源代码(测试通过)
/********************************Copyright (c)**********************************
**
** (c) Copyright 2020, Main, China, QD.
** All Rights Reserved
**
** TurboTab
** https://blog.youkuaiyun.com/turbotab
**
**----------------------------------文件信息------------------------------------
** 文件名称: main.c
** 创建人员: MrWang
** 创建日期: 2020/03/02 10:07:40
** 文档描述: brief
**
**----------------------------------版本信息------------------------------------
** 版本代号: V0.0.0.1
** 版本说明: 初始版本
**
**------------------------------------------------------------------------------
*/
#include <stdio.h>
/*******************************************************************************
** 函数名称: IsLeapYear
** 功能描述: 检测当前年分是闰年还是平年
** 参数说明: int year: 判断年份,范围1-2100
** 返回说明: int ret :0-平年 1-闰年 其他-输入参数不在判断范围内
** 创建人员: MrWang
** 创建日期: 2020/03/02 10:08:20
** 函数备注:普通闰年:能被4整除但不能被100整除的年份为普通闰年
** 世纪闰年:能被400整除的为世纪闰。
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
int IsLeapYear(int year)
{
int ret = 0;
if(year <= 0 || year > 2100){
ret = -1;
goto err;
}
if(((year%4 == 0)&&(year%100 != 0))||(year%400 == 0)){
ret = 1;
}
err:
return ret;
}
/*******************************************************************************
** 函数名称: GetDateDays
** 功能描述: 检测当前年月的天数
** 参数说明: int year : 判断年份,范围1-2100
** 参数说明: int month: 判断月份,范围1-12
** 返回说明: int ret :-1-YearError -2-MonthError 其他-success
** 创建人员: MrWang
** 创建日期: 2020/03/02 10:12:20
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
int GetDateDays(int year, int month)
{
int ret;
char days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if(month <= 0 || month >12){
ret = -2;
goto err;
}
ret = IsLeapYear(year);
if(ret < 0){
ret = -1;
goto err;
}else if(ret == 1){
days[1] = 29;
}
return days[month-1];
err:
return ret;
}
/*******************************************************************************
** 函数名称: CalendarConvertWeek
** 功能描述: 输入日期计算星期
** 参数说明: int year : 判断年份,范围1-2100
** 参数说明: int month: 判断月份,范围1-12
** 参数说明: int day : 判断日期
** 返回说明: int ret :0-周一 1-周二 ... 6-周日
** 创建人员: MrWang
** 创建日期: 2020/03/02 10:12:20
** 函数备注:基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7
** 基本思想:把1月和2月看成是上一年的13月和14月
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
int CalendarConvertWeek(int year, int month, int day)
{
int week;
if((month == 1) || (month == 2)){
year--;
month += 12;
}
week = (day + 2*month + 3*(month+1)/5 + \
year + year/4 - year/100 + year/400)%7;
return week;
}
/*******************************************************************************
** 函数名称: PrintfCalendarAMonth
** 功能描述: 打印输入日期这一个月的日历
** 参数说明: int year : 判断年份,范围1-2100
** 参数说明: int month : 判断月份,范围1-12
** 参数说明: int maxday : 当前月份多少天
** 返回说明: None
** 创建人员: MrWang
** 创建日期: 2020/03/02 10:12:20
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void PrintfCalendarAMonth(int year, int month, int maxday)
{
int i, j;
printf("\n%04d-%02d\n", year, month);
/* 计算当前起始位置:礼拜一是第一列 */
j = CalendarConvertWeek(year, month, 1)%7;
printf("\tMon\tTue\tWed\tThu\tFri\tSat\tSun\n");
/* 起始第一行的偏移量 */
for(i=0; i<j; i++){
printf("\t");
}
/* 打印剩余的day */
for(i=1; i<=maxday; i++,j++){
if((j%7) == 0){
printf("\n");
}
printf("\t%d", i);
}
printf("\n");
}
/*******************************************************************************
** 函数名称: PrintfCalendarYear
** 功能描述: 打印整年的日历
** 参数说明: int year : 判断年份,范围1-2100
** 返回说明: None
** 创建人员: MrWang
** 创建日期: 2020/03/02 10:12:20
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
int PrintfCalendarYear(int year)
{
int i, ret = 0;
char sday[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
ret = IsLeapYear(year);
if(ret < 0){
goto err;
}
if(ret == 1){
sday[1] = 29;
}
for(i=1; i<=12; i++){
PrintfCalendarAMonth(year, i, sday[i-1]);
printf("\n");
}
err:
return ret;
}
/*******************************************************************************
** 函数名称: main
** 功能描述: 主函数
** 参数说明:
** 返回说明:
** 创建人员: MrWang
** 创建日期: 2020/03/02 10:14:20
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
int main(int argc, const char *argv[])
{
int rec;
int year, month;
printf("*********************Please chose*************************\n");
printf("*************1.Print a year's calendar *******************\n");
printf("*************2.Print a month's calendar*******************\n");
printf("**********************************************************\n");
printf("your chose:(1 or 2) -> ");
setbuf(stdin,NULL);
scanf("%d", &rec);
if(rec == 1){
printf("input Year(2100>Year>0) -> ");
scanf("%d", &year);
rec = PrintfCalendarYear(year);
if(rec < 0){
printf("\nInput err, please try again.\n\n");
}
}else if(rec == 2){
printf("input Year and Month (eg:2020,2) -> ");
scanf("%d,%d", &year, &month);
rec = GetDateDays(year, month);
if(rec > 0){
PrintfCalendarAMonth(year, month, rec);
}else {
printf("\nInput err, please try again.\n\n");
}
}else {
printf("\nInput err, please try again.\n");
}
}