krx50800.c

来自「answer of the c programming language sec」· C语言 代码 · 共 84 行

C
84
字号
/* * A solution to exercise 5-8 in K&R2, page 112: * *	There is no error checking in day_of_year or month_day. Remedy *	this defect. * * The error to check for is invalid argument values. That is simple, what's * hard is deciding what to do in case of error. In the real world, I would * use the assert macro from assert.h, but in this solution I take the * approach of returning -1 instead. This is more work for the caller, of * course. * * I have selected the year 1752 as the lowest allowed year, because that * is when Great Britain switched to the Gregorian calendar, and the leap * year validation is valid only for the Gregorian calendar. * * Lars Wirzenius <liw@iki.fi> */#include <stdio.h>static char daytab[2][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},};/* day_of_year: set day of year from month & day */int day_of_year(int year, int month, int day){	int i, leap;		if (year < 1752 || month < 1 || month > 12 || day < 1)		return -1;	leap = (year%4 == 0 && year%100 != 0) || year%400 == 0;	if (day > daytab[leap][month])		return -1;	for (i = 1; i < month; i++)		day += daytab[leap][i];	return day;}/* month_day: set month, day from day of year */int month_day(int year, int yearday, int *pmonth, int *pday){	int i, leap;		if (year < 1752 || yearday < 1)		return -1;	leap = (year%4 == 0 && year%100 != 0) || year%400 == 0;	if ((leap && yearday > 366) || (!leap && yearday > 365))		return -1;	for (i = 1; yearday > daytab[leap][i]; i++)		yearday -= daytab[leap][i];	*pmonth = i;	*pday = yearday;		return 0;}/* main: test day_of_year and month_day */int main(void){	int year, month, day, yearday;		for (year = 1970; year <= 2000; ++year) {		for (yearday = 1; yearday < 366; ++yearday) {			if (month_day(year, yearday, &month, &day) == -1) {				printf("month_day failed: %d %d\n",					year, yearday);			} else if (day_of_year(year, month, day) != yearday) {				printf("bad result: %d %d\n", year, yearday);				printf("month = %d, day = %d\n", month, day);			}		}	}		return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?