注册 登录
编程论坛 C语言论坛

被这个题搞自闭了

a1602388940 发布于 2020-04-13 21:58, 3467 次点击
编写函数,输入年、月、日,输出当年剩余天数。在main中输入今天的日期,调用函数并输出今年已过的天数和剩余天数。
12 回复
#2
lin51616782020-04-13 22:20
前面每个月的天数加起来 加 这个月的日期
已过天数和剩余天数
就拿年总天数去减就完事了
都是写简单的加加减减而已
#3
fulltimelink2020-04-14 08:17
可以转换为时间戳, 年始,当前,年终    /(24*3600) 转换为天
#4
rjsp2020-04-14 09:11
程序代码:
void foo( unsigned y, unsigned m, unsigned d )
{
    static const unsigned s[2][12] = { {0,31,59,90,120,151,181,212,243,273,304,334}
                                     , {0,31,60,91,121,152,182,213,244,274,305,335} };
    _Bool isleap = (y%400==0 || (y%4==0 && y%100!=0));
    unsigned a = s[isleap][m-1] + d;
    unsigned b = (isleap?366:365) - a;
    printf( "%u, %u\n", a, b );
}
#5
return_02020-04-14 10:00
回复 楼主 a1602388940
可以用数组储存每月天数
#6
a16023889402020-04-14 10:12
回复 4楼 rjsp
我还是学的太少了
大佬牛批
#7
邹峰研2020-04-14 15:04
用二维数组,闰年平年分情况讨论,可以先算出已过天数,剩余天数减一下就ok。
#8
hbccc2020-04-14 20:17
这题烦就烦在有四种天数,31,30,28,29
#9
wmf20142020-04-14 21:41
我记得这个问题当初我用一句代码实现了的:首先是m-1,接着加天数d,接着假设每个月是30天,所以加上m*30,接着处理大月,由于7月和8月都是大月,所以用一个三目运算m > 7 ? m/2+1 : (m+1)/2,最后处理2月并处理闰年,就是大于2月份的天数减2还是减1.根据这个思想写出的代码如下(未处理闰年):
程序代码:
int sumday(int y, int m, int d)
{
    m--;
    return m * 30 + d + (m > 1 ? -2 : 0) + (m > 7 ? m / 2 + 1 : (m + 1) / 2);
}


对比rjsp版主统计每个月1号的天数,可见结果一样,各位可自行做闰年运算:
1-1:  1,  1
 2-1: 32, 32
 3-1: 60, 60
 4-1: 91, 91
 5-1:121,121
 6-1:152,152
 7-1:182,182
 8-1:213,213
 9-1:244,244
10-1:274,274
11-1:305,305
12-1:335,335
#10
fulltimelink2020-04-15 08:55
windows 没有strptime 函数...
程序代码:

void theDiff(unsigned year, unsigned month, unsigned day) {
   
    year -= 1900;
   
    struct tm start = { 0 };
    struct tm end = { 0 };

    start.tm_year = year;
    start.tm_mon = 1;
    start.tm_mday = 1;


    end.tm_year = year;
    end.tm_mon = 12;
    end.tm_mday = 31;
    end.tm_hour = 23;
    end.tm_min = 59;
    end.tm_sec = 59;

    time_t startT, currentT, endT;
    startT = mktime(&start);
    currentT = time(NULL);
    endT = mktime(&end);

    double diffPast = difftime(currentT ,startT);
    double diffHas = difftime(endT , currentT);
    printf("%f \t %f\n", diffPast / (24 * 3600), diffHas / (24 * 3600));

}


[此贴子已经被作者于2020-4-15 09:01编辑过]

#11
程序小新2020-04-16 16:49
我也做过一个这样类似的题,不过我自己写的太啰嗦,贴给你看一下,希望可以帮到你,剩余天数减一下就好了。
/*
题目:输入某年某月某日,判断这一天是这一年的第几天?
*/
#include<stdio.h>
void main()
{
    int year,month,day;
    int i = 0;
    int sum_1,sum_2,sum_3,sum_4,sum_5,sum_6,sum_7,sum_8,sum_9,sum_10,sum_11;
    sum_1 = 31;sum_2=sum_1+28;sum_3=sum_2+31;sum_4=sum_3+30;sum_5=sum_4+31;
    sum_6=sum_5+30;sum_7=sum_6+31;sum_8=sum_7+31;sum_9=sum_8+30;
    sum_10=sum_9+31;sum_11=sum_10+30;
    printf("年:");
    scanf("%d",&year);
    printf("月:");
    scanf("%d",&month);
    printf("日:");
    scanf("%d",&day);
    if(year%4 == 0)
    {
        switch(month)
        {
            case 1:
                 i=day;
                 break;
            case 2:
                 i=sum_1 + day;
                 break;
            case 3:
                 i=sum_2 + day + 1;
                 break;
            case 4:
                 i=sum_3 + day + 1;
                 break;
            case 5:
                 i=sum_4 + day + 1;
                 break;
            case 6:
                 i=sum_5 + day + 1;
                 break;
            case 7:
                 i=sum_6 + day + 1;
                 break;
            case 8:
                 i=sum_7 + day + 1;
                 break;
            case 9:
                 i=sum_8 + day + 1;
            case 10:
                 i=sum_9 + day + 1;
                 break;
            case 11:
                 i=sum_10 + day + 1;
                 break;
            case 12:
                 i=sum_11 + day + 1;
                 break;
        }
    }
    else
    {
        switch(month)
        {
            case 1:
                 i=day;
                 break;
            case 2:
                 i=sum_1 + day;
                 break;
            case 3:
                 i=sum_2 + day;
                 break;
            case 4:
                 i=sum_3 + day;
                 break;
            case 5:
                 i=sum_4 + day;
                 break;
            case 6:
                 i=sum_5 + day;
                 break;
            case 7:
                 i=sum_6 + day;
                 break;
            case 8:
                 i=sum_7 + day;
            case 9:
                 i=sum_8 + day;
                 break;
            case 10:
                 i=sum_9 + day;
                 break;
            case 11:
                 i=sum_10 + day;
                 break;
            case 12:
                 i=sum_11 + day;
                 break;
        }
    }
    printf("这一天是这一年的第%d天\n",i);
}
#12
程序小新2020-04-16 16:50
这个是引自脚本之家的答案:
1、程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,
特殊情况,闰年且输入月份大于3时需考虑多加一天。
2、程序源代码:
#include<stdio.h>
void main()
{
    int day,month,year,sum,leap;
    printf("\nplease input year,month,day\n");
    scanf("%d,%d,%d",&year,&month,&day);
    switch(month)//先计算某月以前月份的总天数
    {
         case 1:sum=0;break;
         case 2:sum=31;break;
         case 3:sum=59;break;
         case 4:sum=90;break;
         case 5:sum=120;break;
         case 6:sum=151;break;
         case 7:sum=181;break;
         case 8:sum=212;break;
         case 9:sum=243;break;
         case 10:sum=273;break;
         case 11:sum=304;break;
         case 12:sum=334;break;
         default:printf("data error");break;
}
    sum=sum+day;  //再加上某天的天数
     if(year%400==0||(year%4==0&&year%100!=0))//判断是不是闰年
      leap=1;
     else
      leap=0;
    if(leap==1&&month>2)//如果是闰年且月份大于2,总天数应该加一天
        sum++;
    printf("It is the %dth day.",sum);}
#13
wfzz0012020-04-23 14:47
我也是菜鸟。我刚刚试着编了一下,试运行好像没有问题。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
#include<iostream>

int main()
{
int m[13],moon,year,day,i,mi;
  m[1]=31;
  m[2]=28;
  m[3]=31;
  m[4]=30;
  m[5]=31;
  m[6]=30;
  m[7]=31;
  m[8]=31;
  m[9]=30;
  m[10]=31;
  m[11]=30;
  m[12]=31;
  mi=0;
  printf("请输入四位数年份:");
  scanf("%d",&year);
   printf("请输入月份:");
  scanf("%d",&moon);
    printf("请输入日期:");
  scanf("%d",&day);
  if(year%4==0)
  {
      m[2]=29;
      if(moon==1)
      {
          printf("今年已经过去%d天",day);
          mi=366-day;
          printf(",还剩下%d天。\n",mi);
    }
    else
      {
      for(i=1;i<moon;i++)
      {
          mi=mi+m[i];
      }
      mi=mi+day;
    printf("今年已经过去%d天",mi);
          mi=366-mi;
          printf(",还剩下%d天。\n",mi);
      
    }
  }
  else
  {
      if(moon==1)
      {
          printf("今年已经过去%d天",day);
          mi=365-day;
          printf(",还剩下%d天。\n",mi);
    }
    else
      {
      for(i=1;i<moon;i++)
        {
          mi=mi+m[i];
        }
      mi=mi+day;
    printf("今年已经过去%d天",mi);
          mi=365-mi;
          printf(",还剩下%d天。\n",mi);
      
    }
  }
system("pause");
    return 0;
}

[此贴子已经被作者于2020-4-23 14:50编辑过]

1