回 帖 发 新 帖 刷新版面

主题:[讨论]可以更加简单吗、要用函数啊???

楼主
输入年日算出是该年的几月几日





#include <stdio.h>
#include <stdlib.h>

 int m,d1;
 void f(int y,int d)
 {


       if(y%4==0&&y%100!=0||y%400==0)
     {
             if(d>0&&d<=31)
     {
         m=1;
         d1=d;
     }
     else
         if(d>31&&d<=60)
        {
           m=2;
         d1=d-31;
        }
        else if(d>60&&d<=91)
        {
           m=3;
         d1=d-60;
        }
       else  if(d>91&&d<=121)
        {
           m=4;
         d1=d-91;
        }
         else if(d>121&&d<=152)
        {
           m=5;
         d1=d-121;
        }
         else if(d>152&&d<=182)
        {
           m=6;
         d1=d-152;
        }
         else if(d>182&&d<=213)
        {
           m=7;
         d1=d-182;
        }
         else if(d>213&&d<=244)
        {
           m=8;
         d1=d-213;
        }
         else if(d>244&&d<=274)
        {
           m=9;
         d1=d-244;
        }
          else if(d>274&&d<=305)
        {
           m=10;
         d1=d-274;
        }
         else if(d>305&&d<=335)
        {
           m=11;
         d1=d-305;
        }
         else if(d>335&&d<=366)
        {
           m=12;
         d1=d-335;
        }
     }
     else
     {
      if(d>0&&d<=31)
     {
         m=1;
         d1=d;
     }

           else   if(d>31&&d<=59)
        {
           m=2;
         d1=d-31;
        }
        else if(d>59&&d<=90)
        {
           m=3;
         d1=d-59;
        }
        else if(d>90&&d<=120)
        {
           m=4;
         d1=d-90;
        }
        else if(d>120&&d<=151)
        {
           m=5;
         d1=d-120;
        }
        else if(d>151&&d<=181)
        {
           m=6;
         d1=d-151;
        }
        else if(d>181&&d<=212)
        {
           m=7;
         d1=d-181;
        }
        else if(d>212&&d<=243)
        {
           m=8;
         d1=d-212;
        }
        else if(d>243&&d<=273)
        {
           m=9;
         d1=d-243;
        }
          else if(d>273&&d<=304)
        {
           m=10;
         d1=d-273;
        }
        else if(d>304&&d<=334)
        {
           m=11;
         d1=d-304;
        }
        else if(d>334&&d<=365)
        {
           m=12;
         d1=d-334;
        }
     }


 }

int main()
{
    int y,d;
   while(scanf("%d%d",&y,&d)!=EOF)
    {
        f(y,d);
        printf("年:%d  日:%d\n",m,d1);
    }
    return 0;
}

回复列表 (共2个回复)

沙发

简单方法,肯定是有的。并且方法也不少。
其实一年就365天,数据并不多,完全用查表法莱做。

下面我给出一种 查表法(不是完全查表)的实现:
[code=c]
#include <stdio.h>
#include <assert.h>
#include <conio.h>

/*
判断year是不是闰年 
*/
#define is_leap_year(year) (!(year&3) && ((year%100) || !(year%400)))


/*************************************************
 *   将 第year年的第days天 转换成 日期          * 
**************************************************

/*
据说在无返回值(返回值是void)的函数定义时加上volatile
可以让gcc生成更好的代码,不过我并不知道是不是真的。 
*/
void volatile 
fun (int *month, int *date, int year, int days)
{
  /*
  下面是2个表都是表示 天数和月份的关系 的表,并且月份是从1月开始,因此下标为0的
  值都是0(其实并没有0月份):
  days_each_month  [ m ]: 表示的是 第m月 里面最多有多少天
  days_remain_month[ m ]: 表示一年的开头 到 第m月第一天 一共有的天数 
  两个表都没有考虑闰年,并且完全没必要在这两个表中考虑闰年   
  */
  const static int days_each_month[] = 
    { 0, 31, 28, 31, 30,  31,  30,  31,  31,  30,  31,  30,  31 };
  const static int days_remain_month[] =
    { 0,  0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
   
  /*
  在这里,我们一定要确保输入的参数是合理的,
  输入的 year 必须大于0 并且小于9999
  输入的 days 必须大于0 并且小于367(闰年有366天) 
  */  
  assert(year>0 && year<9999);
  assert(days>0 && days< 367);
  
  /*
  对于闰年的2月有点特殊,所以我在这里单独考虑了2月的29日这一天。
  如果 year 是闰年,并且 days 刚好是 60, 那么这一天就是2月29日。
  如果 year 是闰年,并且 days 又大于 60, 那么这之前一定要经过
          2月29日这一天,鼓我们要在原来的天数中减去一天。 
  */
  if (!is_leap_year(year)){ } 
  else if (days >  60) --days;
  else if (days == 60)
    {
    *month = 2,   *date = 29;
    return;
    }
  
  /*
  首先估算出这一天 大概是第几月。
  *month = (days + 31) >> 5;完全等价于*month = (days + 31) / 32;
  不过移位运算可能要比除法的效率好点,上面的32也就考虑在此基础上的。 
  
  然后在估算这一天是 这个月中的第几天。
  如 2009年的第93天,
  估算的月份是   (93+31)/32 =  3月 
  估算这一天是4月的第几天  93 - 59 = 34天 
  也就是说 这是 3月分的第34天 
  */
  *month = (days + 31) >> 5;
  *date  = days - days_remain_month[ *month ];
  
  
  /*
  然后在通过查表知道3月份最多只有31天 ,因此这一天不可能是3月份。
  然后我们就要在原来估算的月份中加1月,现在月份变成了4月。
  34 - 31 = 3 得到的是真正的日期。
  因此2009年的第93天是 4月3号 
  */
  if (*date > days_each_month[ *month ])
    {
    *date -= days_each_month[ *month ];
    ++ *month;
    }  

  /*
  这里,断言失败的唯一原因是 输入的year是平年,但是输入的days却有366。
  如果断言失败, 那么一定有 *month == 13, 并且 *date == 1 
  */
  assert(*month < 13);
  return;

}



int main (void)
{
  int year = 2008,   days;
  int month,date;
  
  days = 0;
  while(++days < 400)
    {
    fun (&month, &date, year, days);
    printf("\n< %02d >月< %02d >日在< %04d >年中时第< %03d >天。",
           month,date,year,days); 
    //getch();
    }
  

  //puts("\nexit");
  //getch();
  return 0;
}

[/code]

板凳


有点看不懂,不过还是谢啦!

我来回复

您尚未登录,请登录后再回复。点此登录或注册