算法--计算当天在该年是第几天

来源:互联网 发布:提高淘宝店铺流量 编辑:程序博客网 时间:2024/06/08 09:45

问题:输入一个年份,检测其是否为正确的年份,检测是否为闰年,输入当天为该年的第几天

问题解析:判断日期的正确性最关键的就是每个月有多少天。其中最特殊的就是每年的二月(分平年和闰年)

所以在考虑日期是否准确的时候 二月要特别“关照一下”

1.先检测该日期是否为闰年(闰年的标准是4的倍数,不能是100的倍数,但可以是400的倍数)

2.检测完是否为闰年之后,我们可以根据普通的月份和闰年和二月份的特殊性一起判断该日期是否准确。

3.最后根据每个月的天数输出该年是第几天(闰年的话如果月份大于二,天数要加一)


代码如下:

#include <stdio.h>


int leap(int y) //检查是否为闰年
{
    if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
        return 1;
    else
        return 0;
}
int valid(int y, int m, int d) //判断日期是否正确
{
    return (((leap(y)&&d<30)||(leap(y)==0&&d<29))&&m==2/*判断闰年二月份是否填写正确*/||(y>=0&&m>0&&d>0&&m<13&&m!=2/*限制二月份的情况以免发生约束冲突*/&&d<32));//判断普通年份是否正确
}
int calc(int y, int m, int d) //判断当天是在该年的第几天
{
    int sum;
    switch (m) {
    case 1:
        break;
    case 2:
        sum = 31;
        break;
    case 3:
        sum = 31 + 28;
        break;
    case 4:
        sum = 31 + 28 + 31;
        break;
    case 5:
        sum = 31 + 28 + 31 + 30;
        break;
    case 6:
        sum = 31 + 28 + 31 + 30 + 31;
        break;
    case 7:
        sum = 31 + 28 + 31 + 30 + 31 + 30;
        break;
    case 8:
        sum = 31 + 28 + 31 + 30 + 31 + 30 + 31;
        break;
    case 9:
        sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
        break;
    case 10:
        sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
        break;
    case 11:
        sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
        break;
    case 12:
        sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
    break;
  }
  sum += d;
  if (leap(y) && m > 2)
    sum++;
  return sum;
}
int main()
{
    int year,month,day;
    printf("请输入年份月份以及天数=");
    scanf("%d%d%d", &year, &month, &day);
    while (valid(year,month,day)-1)
    {
      printf("您输入的日期有误,请再次输入\n请输入年份月份以及天数=");
      scanf("%d%d%d", &year, &month, &day);
    }
    printf("您输入的天数为该年的第%d天", calc(year, month, day));
    return 0;
}
0 0