100 Days of Code-day26(年月日转换的奥秘)

本文针对程序中day_of_year和month_day函数进行错误检查和改进,采用指针代替索引来提高效率。重点在于闰年的判断、边界条件处理和日期计算逻辑。通过实例展示了如何使用指针操作一维数组daytab.
摘要由CSDN通过智能技术生成

day_of_year:set day of year from month and day
month_day:set month,day from day of year

1.error checking in day_of_year or month_day. Remedy this defect.

int day_of_year(int year, int month, int day)
{
	int leap ,i;

	leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;//若该年为闰年,则逻辑表达式的值为1
	if (month < 1 || month > 12)
		return -1;
	if (day < 0 || day > daytab[leap][month])
		return -1;
	for (i = 1; i < month; i++)
		day += daytab[leap][i];//将天数不断累加起来
	return day;
}

void month_day(int year, int yearday, char *pmonth, char *pday)
{
	int i, leap;

	if (year < 1)
	{
		*pmonth = -1;
		*pday = -1;
		return;
	}
	leap = year % 4 == 0 && year % 100 != 0 || year % 4 == 0;
	for (i = 1;i <= 12 && yearday > daytab[leap][i];i++)
		yearday -= daytab[leap][i];//与day_of_year函数的计算恰好相反,不断做减法,最终得到相应日期
	if (i = 13 && yearday > daytab[leap][i])
	{
		*pmonth = -1;
		*pday = -1;
	}
	else
	{
		*pmonth = i;
		*pday = yearday;
	}
}

改写该程序:

int day_of_year(int year, int month, int day)
{
	int leap ,i;

	leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;//若该年为闰年,则逻辑表达式的值为1
	if (month < 1 || month > 12 || day < 0 || day > daytab[leap][month])
		return -1;
	for (i = 1; i < month; i++)
		day += daytab[leap][i];//将天数不断累加起来
	return day;
}

void month_day(int year, int yearday, int *pmonth, int *pday)
{
	int i, leap;

	leap = year % 4 == 0 && year % 100 != 0 || year % 4 == 0;
	if (year < 1 || yearday < 1 || yearday > (leap ? 366 : 365))
	{
		*pmonth = -1;
		*pday = -1;
		return;
	}
	for (i = 1;yearday > daytab[leap][i];i++)
		yearday -= daytab[leap][i];//与day_of_year函数的计算恰好相反,不断做减法,最终得到相应日期
	*pmonth = i;
	*pday = yearday;
}

2. Rewrite the routines day_of_year and month_day with pointers instead of indexing.

int day_of_year(int year, int month, int day)
{
	int leap;
	char *p;

	leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;//若该年为闰年,则逻辑表达式的值为1
	p = daytab[leap];//daytab[leap]可以看做是一维数组名,是二维数组daytab所包含的一维数组首元素的地址
	//等价于p = *(daytab + leap); daytab是二维数组首元素的地址,现在的“首元素”指的是由13个整型元素组成的一维数组
	if (month < 1 || month > 12 || day < 0 || day > *(p + month))//day > *(p+month)等同于day > p[month]
		return -1;//p所指的对象是一维数组的元素
	while (--month)
		day += *++p;	//将天数不断累加起来,首元素不用加,
	return day;
}

void month_day(int year, int yearday, int *pmonth, int *pday)
{
	int leap;
	char *p;

	leap = year % 4 == 0 && year % 100 != 0 || year % 4 == 0;
	p = *(daytab + leap);
	if (year < 1 || yearday < 1 || yearday > (leap ? 366 : 365))
	{
		*pmonth = -1;
		*pday = -1;
		return;
	}
	while (yearday > *++p)
		yearday -= *p;//与day_of_year函数的计算恰好相反,不断做减法,最终得到相应日期
	*pmonth = p - *(daytab + leap);
	*pday = yearday;
}

test:

#include<stdio.h>

int day_of_year(int year, int month, int day);
void month_day(int year, int yearday, int *pmonth, int *pday);

int main()
{
	int month, day;

	printf("yearday=%d\n", day_of_year(2008, 1, 29));
	printf("yearday=%d\n", day_of_year(2008, 3, 29));

	month_day(2008, 34, &month, &day);
	printf("%d month %d day\n", month, day);
	return 0;
}

static char daytab[][13] = {
	{0,31,28,31,30,31,30,31,31,30,31,30,31},
	{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值