#include <conio.h>
int main (void) {
int dpm[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31} /* 平年每月天数 */
int year, month
int isLeap
int days
printf ("输入年份:")
scanf ("%d", &year)
printf ("输入月份:")
scanf ("%d", &month)
isLeap = (year%4==0 && year%100!=0) || (year%400==0) /* 判断闰年 */
if (isLeap && month==2)
days = 29
else
days = dpm[month]
printf ("%d年%d月有%d天!\n", year, month, days)
getch () /* 屏幕暂留 */
return 0
}
#include <stdio.h>#include <conio.h>
int dpm[13] = {0,31,28,31,30,31,30,31,31,30,31,30} /* 平年每月天数 */
/* 判断闰年 1:是 0:否 */
/* 闰年特点:年份是4的倍数但不是100的倍数、年份是400的倍数 */
int isLeap (int year) {
return (year%4==0 && year%100!=0) || (year%400==0)
}
/* 求日期为当年的第几天 */
int days (int year, int month, int day) {
int i
int x
/* 年初至上月天数累加 */
if (month>1)
for (i=1 i<month i++)
x += dpm[i]
if (month>2 && isLeap(year)) /* 闰年加1天 */
x++
x += day /* 月初至当前天数累加 */
}
int main (void) {
int year, month, day
int x = 0
int i
printf ("输入年月日:")
scanf ("%d%d%d", &year, &month, &day)
x = days (year, month, day)
printf ("%d年%d月%d日是%d年的第%d天!\n", year, month, day, year, x)
getch () /*屏幕暂留*/
return 0
}
#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
}
输入日期部分,题主自己写吧。以上是核心代码。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)