以下是问题:编写如下函数,将*y年*m月*d日的日期,修改为前一天或者后一天的日期。
viod decrement_date(int y,int *m,int *d){/….*/}
viod increment_date(int y,int *m,int *d){/….*/}
#include <stdio.h>
int days(int y,int m)
{
if(m==2){
if((y%4==0&&y%100!=0)||y%400==0) return 29;
else return 28;
}
else if(m==1||m==3||m==5||m==7||m==8||m==10) return 31;
else return 30;
}
int validate(int y,int m,int d)
{
int c;
c=days(y,m);
if(y<0||y>3000) return 1;
if(m<0||m>12) return 1;
if(d>c||d<1) return 1;
}
void decrement_date(int *y,int *m,int *d)
{
if(*m==3&&*d==1){
if((*y%4==0&&*y%100!=0)||*y%400==0){
(*m)=2; *d=29;
}
else {
(*m)=2; *d=28;
}
}
else if((*m==2||*m==4||*m==6||*m==8||*m==9||*m==11)&&(*d==1)){
(*m)--;*d=31;
}
else if(*m==1&&*d==1){
(*m)=12;(*y)--;*d=31;
}
else if((*m==5||*m==7||*m==10||*m==12)&&(*d==1)){
(*m)--;*d=30;
}
else (*d)--;
}
void increment_date(int *y,int *m,int *d)
{
if(*m==2&&(*d>=28)){
if((*y%4==0&&*y%100!=0)||*y%400==0||*d==29){
(*m)=3;*d=1;
}
else if(*d==28){
(*m)=3; *d=1;
}
}
else if((*m==1||*m==3||*m==5||*m==7||*m==8||*m==10)&&(*d==31)){
(*m)++;*d=1;
}
else if(*m==12&&*d==31){
(*m)=1;(*y)++;*d=1;
}
else if((*m==4|*m==6||*m==9||*m==11)&&(*d==31))
{
(*m)++; *d=1;
}
else (*d)++;
}
int main(int argc, char *argv[])
{
int y,m,d;
int i;
printf("please enter number\n");
do{
scanf("%d%d%d",&y,&m,&d);
}while(validate(y,m,d));
printf("%d-%d-%d\n",y,m,d);
printf("which one you want to choose:before--0 or later--1\n");
do{
scanf("%d",&i);
if(i==0) decrement_date(&y,&m,&d);
else increment_date(&y,&m,&d);
}while(i<0||i>1);
printf("\n");
printf("%d-%d-%d",y,m,d);
return 0;
}
注意闰年的特殊情况,如果再用户输入y,m,d三个数的时候可以通过月份控制,在后面的判断就可以事半功倍。