C语言函数打印日历

运行结果如下:

思路:

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");
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值