求高手简化代码

scofield6666 2017-12-08 05:26:59
最近看c语言时,有个题目:编写函数,求出并设置y年m月d日的前一天或后一天的日期(能正确判断闰年)
想的脑子疼终于解出来了,代码如下:
#include <stdio.h>
int irn;
//判断是闰年还是平年,闰年返回1,平年返回0
int isRunNian(int *y)
{
//判断是否为闰年
if((*y%4==0 && *y%100!=0) || *y%400==0) //如果是闰年
{
return (1);
}else //如果是平年
{
return (0);
}
}
void yesterday(int *y, int *m, int *d)
{
int day=*d-1;
int month=*m;
int newYear=*y;
if(day==0){
month=*m-1;
if(month==0){
newYear=*y-1; month=12;day=31;
}else{
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10){
day=31;
}else if(month==4 || month==6 || month==9 || month==11){
day=30;
}else if(month==2){
irn=isRunNian(y);
if(irn==1){
day=29;
}else{
day=28;
}
}
}
}
printf("昨天是%d年%d月%d日。\n", newYear,month,day);
}
void tomorrow(int *y, int *m, int *d)
{
int newDay=*d+1;
int newMonth=*m;
int newYear=*y;

if(*m==1 || *m==3 || *m==5 || *m==7 || *m==8 || *m==10 || *m==12)
{
if(*d==31)
{
if(*m==12)
{
newYear=*y+1;
newMonth=1;
newDay=1;
}
}
}else if(*m==4 || *m==6 || *m==9 || *m==11)
{
if(*d==30)
{
newDay=1;
newMonth=*m+1;
}
}else if(*m==2)
{
irn=isRunNian(y);
if(irn)
{
if(*d==29)
{
newDay=1; newMonth=*m+1;
}
}else{
if(*d==28)
{
newDay=1; newMonth=*m+1;
}
}
}
printf("明天是%d年%d月%d日。", newYear,newMonth,newDay);
}


void main()
{
int y=0,m=0,d=0;
int irn;
printf("请输入年份");scanf("%d",&y);
while(y<1)
{
printf("请重新输入年份");scanf("%d",&y);
}
irn=isRunNian(&y);
printf("请输入月份"); scanf("%d",&m);
while(m<1 || m>12)
{
printf("请重新输入月份"); scanf("%d",&m);
}
printf("请输入日期"); scanf("%d",&d);
do{
if(d<1 || d>31)
{
printf("请重新输入日期"); scanf("%d",&d);
}else
{
if((m==4 || m==6 || m==9 || m==11) && d==31)
{
printf("输入错误,%d月没有%d天,请重新输入日期",m,d); scanf("%d",&d);
}else if(m==2)
{

if(irn==0 && d>28)
{
printf("输入错误,%d是平年,%d月没有%d天,请重新输入日期",y,m,d); scanf("%d",&d);
}else if(irn==1 && d>29)
{
printf("输入错误,%d是闰年,%d月没有%d天,请重新输入日期",y,m,d); scanf("%d",&d);
}else
{
break;
}
}else
{
break;
}
}
}while(1);

printf("您输入的是%d年%d月%d日\n", y,m,d);

yesterday(&y,&m,&d);

tomorrow(&y,&m,&d);

putchar('\n');
}


解是解出来了,但是我总感觉这种处理方法太麻烦了,我想优化一下代码,请教一下各位老师有没有更简洁的处理方案,谢谢。

...全文
178 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
scofield6666 2017-12-13
  • 打赏
  • 举报
回复
谢谢 cfjtaishan自信男孩 谢谢 wodexiaojidan 学习了
wodexiaojidan 2017-12-08
  • 打赏
  • 举报
回复
#include <stdio.h>

static const int passdays[][12] = {
	0, 31, 59, 90, 120,
	151, 181, 212, 243, 
	273, 304, 334,
	0, 31, 60, 91, 121,
	152, 182, 213, 244,
	274, 305, 335
};

static const char *weekday[] = {
	"MON", "TUE", "WEN", "THU", 
	"FRI", "SAT", "SUN"
};

static const int dayofmon[][12] = {
	31, 28, 31, 30,
	31, 30, 31, 31,
	30, 31, 30, 31,
	31, 29, 31, 30,
	31, 30, 31, 31,
	30, 31, 30, 31,
};

static int FirstDayofYear(int year)
{
	return (((year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7 + 1);
}

static int FirstDayofMonth(int year, int month, int isleap)
{
	int wday, mday;

	wday = FirstDayofYear(year);
	mday = (wday + passdays[isleap][month - 1]) % 7;

	return mday;
}

static int WdayofToday(int year, int month, int day, int isleap)
{
	int mday, tday;

	mday = FirstDayofMonth(year, month, isleap);
	tday = (mday + day - 1) % 7;

	return tday;
}

static void Show(const char *s, const char *f, int day)
{
	printf("%s%s%s\n", s, weekday[(day - 1 + 7) % 7], f);
}

static char *NextDate(char *date, int year, int month, int day, int isleap)
{
	int nyear, nmonth, nday;

	if(day == dayofmon[isleap][month - 1]){
		nmonth = (month + 1) % 12;
		if(nmonth == 0){
			nmonth = 12;
		}

		nday = 1;
	}else if(day >= 1 && day < dayofmon[isleap][month - 1]){
		nmonth = month;
		nday = day + 1;
	}
	
	nyear = year + (nmonth < month);

	sprintf(date, ", %4d/%02d/%02d", nyear, nmonth, nday);

	return date;
}

static char *FrontDate(char *date, int year, int month, int day, int isleap)
{
	int fyear, fmonth, fday;

	if(day == 1){
		fmonth = (month - 1 + 12) % 12;
		if(fmonth == 0){
			fmonth = 12;
		}

		fday = dayofmon[isleap][fmonth - 1];
	}else if(day > 1 && day <= dayofmon[isleap][month - 1]){
		fmonth = month;
		fday = day - 1;
	}

	fyear = year - (fmonth > month);

	sprintf(date, ", %4d/%02d/%02d", fyear, fmonth, fday);

	return date;
}

int main(void)
{
	int year, month, day, tday, isleap, bcontinue;
	char date[16] = "";

	do{
		scanf("%d%d%d", &year, &month, &day);

		if(year >= 1900 && year < 2100){
			isleap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);

			if(month >= 1 && month < 13){
				bcontinue = (day >= 1 && day <= dayofmon[isleap][month - 1]);
			}else{
				bcontinue = 0;
			}
		}else{
			bcontinue = 0;
		}
	}while(!bcontinue);

	tday = WdayofToday(year, month, day, isleap);

	FrontDate(date, year, month, day, isleap);
	Show("Yesterday is ", date, tday - 1);

	NextDate(date, year, month, day, isleap);
	Show("Tomorrow is ", date, tday + 1);

	return 0;
}
wodexiaojidan 2017-12-08
  • 打赏
  • 举报
回复
#include <stdio.h>

static const int passdays[][12] = {
	0, 31, 59, 90, 120,
	151, 181, 212, 243, 
	273, 304, 334,
	0, 31, 60, 91, 121,
	152, 182, 213, 244,
	274, 305, 335
};

static const char *weekday[] = {
	"MON", "TUE", "WEN", "THU", 
	"FRI", "SAT", "SUN"
};

static const int dayofmon[][12] = {
	31, 28, 31, 30,
	31, 30, 31, 31,
	30, 31, 30, 31,
	31, 29, 31, 30,
	31, 30, 31, 31,
	30, 31, 30, 31,
};

static int FirstDayofYear(int year)
{
	return (((year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7 + 1);
}

static int FirstDayofMonth(int year, int month, int isleap)
{
	int wday, mday;

	wday = FirstDayofYear(year);
	mday = (wday + passdays[isleap][month - 1]) % 7;

	return mday;
}

static int WdayofToday(int year, int month, int day, int isleap)
{
	int mday, tday;

	mday = FirstDayofMonth(year, month, isleap);
	tday = (mday + day - 1) % 7;

	return tday;
}

static void Show(const char *s, const char *f, int day)
{
	printf("%s%s%s\n", s, weekday[(day - 1 + 7) % 7], f);
}

static char *NextDate(char *date, int year, int month, int day, int isleap)
{
	int nyear, nmonth, nday;

	if(day == dayofmon[isleap][month - 1]){
		nmonth = (month + 1) % 13;
		if(nmonth == 0){
			nmonth = 1;
		}

		nday = 1;
	}else if(day >= 1 && day < dayofmon[isleap][month - 1]){
		nmonth = month;
		nday = day + 1;
	}
	
	nyear = year + (nmonth < month);

	sprintf(date, ", %4d/%02d/%02d", nyear, nmonth, nday);

	return date;
}

static char *FrontDate(char *date, int year, int month, int day, int isleap)
{
	int fyear, fmonth, fday;

	if(day == 1){
		fmonth = (month - 1 + 12) % 13;
		if(fmonth == 0){
			fmonth = 1;
		}

		fday = dayofmon[isleap][fmonth - 1];
	}else if(day > 1 && day <= dayofmon[isleap][month - 1]){
		fmonth = month;
		fday = day - 1;
	}

	fyear = year - (fmonth > month);

	sprintf(date, ", %4d/%02d/%02d", fyear, fmonth, fday);

	return date;
}

int main(void)
{
	int year, month, day, tday, isleap, bcontinue;
	char date[16] = "";

	do{
		scanf("%d%d%d", &year, &month, &day);

		if(year >= 1900 && year < 2100){
			isleap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);

			if(month >= 1 && month < 13){
				bcontinue = (day >= 1 && day <= dayofmon[isleap][month - 1]);
			}else{
				bcontinue = 0;
			}
		}else{
			bcontinue = 0;
		}
	}while(!bcontinue);

	tday = WdayofToday(year, month, day, isleap);

	FrontDate(date, year, month, day, isleap);
	Show("Yesterday is ", date, tday - 1);

	NextDate(date, year, month, day, isleap);
	Show("Tomorrow is ", date, tday + 1);

	return 0;
}
2017 1 1 Yesterday is SAT, 2016/12/31 Tomorrow is MON, 2017/01/02 2017 2 1 Yesterday is TUE, 2017/01/31 Tomorrow is THU, 2017/02/02 2016 12 25 Yesterday is SAT, 2016/12/24 Tomorrow is MON, 2016/12/26 2016 2 28 Yesterday is SAT, 2016/02/27 Tomorrow is MON, 2016/02/29 2016 2 29 Yesterday is SUN, 2016/02/28 Tomorrow is TUE, 2016/03/01 2017 2 28 Yesterday is MON, 2017/02/27 Tomorrow is WEN, 2017/03/01
自信男孩 2017-12-08
  • 打赏
  • 举报
回复
#include <stdio.h>

struct date_t {
    int year;
    int month;
    int day;
};
int gmonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int is_leap(int year);
void tomorrow(struct date_t *ptm);
void yesterday(struct date_t *ptm);

int main(void)
{
    struct date_t tm;
    int y, m, d;

    do {
        scanf("%d%d%d", &y, &m, &d);
        if (is_leap(y) && m == 2 && d == 29)
            break;
    } while (m > 12 || m <= 0 || d > gmonth[m-1] || d <= 0);

    tm.year = y;
    tm.month = m;
    tm.day = d - 1;
    yesterday(&tm);
    printf("%4d-%02d-%02d's yesterday is %4d-%02d-%02d\n", y, m, d, tm.year, tm.month, tm.day);

    tm.year = y;
    tm.month = m;
    tm.day = d + 1;
    tomorrow(&tm);
    printf("%4d-%02d-%02d's tomorrow  is %4d-%02d-%02d\n", y, m, d, tm.year, tm.month, tm.day);

    return 0;
}


int is_leap(int year)
{
    if ((year % 4 == 0 && year % 100 != 0)
        || year % 400 == 0)
        return 1;

    return 0;
}

void yesterday(struct date_t *ptm)
{
    if (ptm->day <= 0) {
        ptm->month -= 1;
        if (ptm->month <= 0) {
            ptm->year -= 1;
            if (ptm->year <= 0) {
                ptm->year = 0;
                ptm->month = 0;
                ptm->day = 0;
                return;
            }
            ptm->month = 12;
            ptm->day = gmonth[ptm->month-1] + ptm->day;
            return;
        }
        ptm->day = gmonth[ptm->month-1] + ptm->day;
        if (ptm->month == 2 && is_leap(ptm->year))
            ptm->day += 1;
        return;
    }
}

void tomorrow(struct date_t *ptm)
{
    if (ptm->month == 2 && is_leap(ptm->year)
        && ptm->day == gmonth[ptm->month - 1] + 1)
        return;
    if (ptm->day > gmonth[ptm->month - 1]) {
        ptm->month += 1;
        if (ptm->month > 12) {
            ptm->year += 1;
            ptm->month = 1;
            ptm->day = 1;
            return;
        }
        ptm->day = 1;
        return;
    }
}
参考一下吧 就是比较比较多。
wodexiaojidan 2017-12-08
  • 打赏
  • 举报
回复
static int passdays[] = {
	0, 31, 59, 90, 120,
	151, 181, 212, 243, 
	273, 304, 334
};

static char *weekday[] = {
	"MON", "TUE", "WEN", "THU", 
	"FRI", "SAT", "SUN"
};

static int FirstDayofYear(int year)
{
	int i;
	if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
		for(i = 2; i < 12; ++i){
			passdays[i] += 1;
		}
	}

	return (((year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7 + 1);
}

static int FirstDayofMonth(int year, int month)
{
	int wday, mday;

	wday = FirstDayofYear(year);
	mday = (wday + passdays[month - 1]) % 7;

	return mday;
}

static WdayofToday(int year, int month, int day)
{
	int mday, tday;
	
	mday = FirstDayofMonth(year, month);
	tday = (mday + day - 1) % 7;

	return tday;
}

static void Show(const char *s, int day)
{
	printf("%s%s\n", s, weekday[(day - 1 + 7) % 7]);
}

int main(void)
{
	int year, month, day, tday, isleap, bcontinue;

	do{
		scanf("%d%d%d", &year, &month, &day);

		if(year >= 1900 && year < 2100){
			isleap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
		
			if(month >= 1 && month < 13){
				switch(month){
					case 1:
					case 3:
					case 5:
					case 7:
					case 8:
					case 10:
					case 12:
						bcontinue = (day >= 1 && day < 32);
						break;

					case 4:
					case 6:
					case 9:
					case 11:
						bcontinue = (day >= 1 && day < 31);

					case 2:
						bcontinue = (isleap ? (day >= 1 && day < 30) : (day >= 1 && day < 29));
						break;
					default:
						break;
				}
			}else{
				bcontinue = 0;
			}
		}else{
			bcontinue = 0;
		}
	}while(!bcontinue);

	tday = WdayofToday(year, month, day);

	Show("Yesterday is ", tday - 1);
	Show("Tomorrow is ", tday + 1);

	return 0;
}

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧