printf打印日历

本文介绍了一个使用C语言编写的日历打印程序,能够准确地打印出指定年份的全年日历或指定年月的单月日历。程序包含了闰年判断、月份天数获取、日期到星期转换等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打印效果

#打印整年日历
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");
		}				
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盗骊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值