c语言输入一个日期,计算这个日期前一天和后一天的日期。怎么解答?

输入
​ 输入三个整数 y,m,dy,m,d 分别表示年月日 (1000≤y≤3000,1≤m≤12,(1000≤y≤3000,1≤m≤12, 日期必合法))。

输出
​ 第一行输出三个用空格分隔的整数,表示前一天的年月日。

​ 第二行输出三个用空格分隔的整数,表示后一天的年月日。

#include <stdio.h>
#include <conio.h>

/* 日期存储结构 */
typedef struct date {
int year; /* 年 */
int month; /* 月 */
int day; /* 日 */
} date;

int dpm[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; /* 平年每月天数 */

/* 判断闰年 1:是; 0:否 */
/* 闰年特点:年份是4的倍数但不是100的倍数、年份是400的倍数 */
int isLeap (int year) {
    return (year%4==0 && year%100!=0) || (year%400==0);
}

/* 日期校验 */
/* 日期错误返回1,正确返回0 */
int dateIsErr (date d) {
if (d.year<1582 && d.month<10 && d.day<15) /* 仅支持1582年10月15日之后的日期计算 */
return 1;
if (d.month <1 || d.month >12) /* 月校验 */
return 1;
if (d.day<1 || d.day>31) /* 日初步校验 */ 
return 1;
if (d.month!=2 && d.day>dpm[d.month]) /* 非2月日校验 */ 
return 1;
if (d.month==2 && isLeap (d.year) && d.day>29) /* 2月闰年日校验 */
return 1;
if (d.month==2 && isLeap (d.year)==0 && d.day>28) /* 2月平年日校验 */
return 1;
return 0;
}

/* 计算与日期start相差delta天的日期 */
date dateDelta (date start, int delta) {
date end = start;

if (delta>=0) { /* 日期start向后计算 */
end.day = start.day + delta; /* start日加intervalDays天 */
while (end.day > dpm[end.month]) { /* 不断减去整月天数,向月、年进位,直至其不超过当前月份天数 */
end.day -= dpm[end.month];
if (isLeap (end.year) && end.month==2) /* 闰年2月天数-1 */
end.day--;
end.month++; /* 月进位+1 */
if (end.month == 13) { /* 满1年 */
end.year++; /* 年进位+1 */
end.month = 1; /* 月归位至1月 */
}
}
}
else { /* 日期start向前计算 */
end.day = start.day + delta; /* start日加intervalDays天 */
while (end.day < 1) { /* 不断加整月天数,向月、年借位,直至其不小于1 */
end.month--; /* 月借位-1 */
if (end.month == 0) { /* 向年借位 */
end.year--; /* 年借位-1 */
end.month = 12; /* 月归位至12月 */
}
end.day += dpm[end.month];
if (isLeap (end.year) && end.month==2) /* 闰年2月天数+1 */
end.day++;
}
}

return end;
}

int main (void) {
date start = {2008,5,6}, end;
int delta;

if (dateIsErr (start)) {
printf ("日期错误!\n");
}
else {
printf ("\t%4d年%2d月%2d日\n", start.year, start.month, start.day);
delta = 1;
end = dateDelta (start, delta);
printf ("向后\t1天\n");
printf ("是\t%4d年%2d月%2d日\n", end.year, end.month, end.day);
delta = -1;
end = dateDelta (start, delta);
printf ("向前\t1天\n");
printf ("是\t%4d年%2d月%2d日\n", end.year, end.month, end.day);
}

getch (); /*屏幕暂留*/
    return 0;
}

输入日期部分,题主自己写吧。以上是核心代码。

追问

追答#include <conio.h> //这个头文件去掉
getch (); /*屏幕暂留*/ //main函数里这句去掉

getch () 函数是为了让屏幕停住,所以需要conio.h头文件,你的环境不支持,所以去掉就好。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-06-05
#include <stdio.h>
int main(){ 
int y,m,d,y1,m1,d1,y2,m2,d2,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
scanf("%d%d%d",&y,&m,&d);
if(y%4==0&&y%100||y%400==0) a[2]=29;
y1=y2=y;m1=m2=m;d1=d-1;d2=d+1;
if(d==1){
if(m==1) {y1-=1;m1=12;d1=31;}
else {m1-=1;d1=a[m1];}
}
if(d==a[m]){
if(m==12) {y2+=1;m2=d2=1;}
else {m2+=1;d2=1;}
}
printf("%d %d %d\n%d %d %d",y1,m1,d1,y2,m2,d2);
return 0;
}

//运行示例:

本回答被提问者采纳
相似回答