读入一个年份和月份,打印出该月有多少天(考虑闰年,写出源码)。用c语言编写程序

读入一个年份和月份,打印出该月有多少天(考虑闰年,写出源码)。用c语言编写程序,第1张

#include <stdio.h>

#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

}

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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11829342.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存