【问题标题】:C beginner help : day of week for any given dateC初学者帮助:任何给定日期的星期几
【发布时间】:2014-03-21 03:30:14
【问题描述】:

提示是: 实现一个函数,该函数读取一个包含日历日期文本描述的字符串,并打印出对应的星期几(周一至周日)。此函数的两种有效输入格式是:

mm/dd/yyyy

示例:2014 年 3 月 4 日
输出:周二

月 dd, yyyy

示例:2014 年 3 月 4 日
输出:周二

其中 dd 是数字日期,mm 是数字月份,yyyy 是年份,Month 是月份名称。所有日期和月份均使用两位数指定(例如,对于 3 月,使用 03 而不是 3)。在第二种有效格式中,Month 和 dd 之间以及 dd 和 yyyy 之间有一个空格。 为了在此任务中获得全部功劳,您的程序应打印出正确的星期几,以便以正确的格式输入任何内容。

所以到目前为止,我能够得到每一天的正确日期,除了 2005 年 2009 年 2013 年 2017 年等......他们总是落后一天,我注意到它过去了每 4 年的趋势天数最终落后 1 天。我不确定出了什么问题。是不是因为我每年使用 365.25 的方法不对?

我的代码:

#include<stdio.h>

int main()
{
int month,day1,day2,totdays,year,dm,dn,leap,rmd;


    printf(" ");
    scanf("%d/%d/%d",&month,&day1,&year);


    if(((year%4==0) && (year%100!=0)) || (year%400==0))
      {
         if(month==1)
            dm=0;

         if(month==2)
            dm=31;

         if(month==3)
            dm=60;

         if(month==4)
            dm=91;

         if(month==5)
            dm=121;

         if(month==6)
            dm=152;

         if(month==7)
            dm=182;

         if(month==8)
            dm=213;

         if(month==9)
            dm=244;

         if(month==10)
            dm=274;

         if(month==11)
            dm=305;

         if(month==12)
            dm=335;
       }
    else
       {
         if(month==1)
            dm=0;

         if(month==2)
            dm=31;

         if(month==3)
            dm=59;

         if(month==4)
            dm=90;

         if(month==5)
            dm=120;

         if(month==6)
            dm=151;

         if(month==7)
            dm=181;

         if(month==8)
            dm=212;

         if(month==9)
            dm=243;

         if(month==10)
            dm=273;

         if(month==11)
            dm=304;

         if(month==12)
            dm=334;
       }


      day2=(year-1970)*(365.25);
      dn=dm+day1;
      totdays=day2+dn;

      rmd=totdays%7;

      if(rmd==5)
        {
           printf("Monday \n");
        }

      if(rmd==6)
        {
           printf("Tuesday \n");
        }

      if(rmd==0)
        {
            printf("Wednesday \n");
        }

      if(rmd==1)
        {
            printf("Thursday \n");
        }

      if(rmd==2)
        {
            printf("Friday \n");
        }

      if(rmd==3)
        {
            printf("Saturday \n");
        }

      if(rmd==4)
        {
            printf("Sunday \n");
        }

      return 0;

}

【问题讨论】:

  • 在闰年之后的那些年给你带来麻烦是多么奇怪。再看看你的闰年处理。
  • 我仔细检查了我的闰年情况,是不是错了?
  • 这更像是一道数学题。如果你能破解其中的数学,那么你就得到了答案。

标签: c date datetime


【解决方案1】:

1969 年不是闰年,1972 年是。当你这样做时

day2=(year-1970)*(365.25);

要了解一年中的 1 月 1 日有多少天,您将数数

  • 70 天为 0 天
  • 71 年为 365.25 天
  • 72 年为 730.5 天
  • 73 年为 1095.75 天
  • 74 年为 1461 天

浮点计算的小数部分被截断,因此第 2 天不会计算从 1972 年 2 月 29 日到 1974 年 1 月 1 日之间的额外天数,而不是 1973 年 1 月 1 日。

换句话说,您假设 1970 年是闰年之后的第一年,因此闰日要到四年后才会计算在内。

【讨论】:

  • 我意识到 1970 年不是闰年,所以应该是 day2=(year-1973)*(365.25)
  • 是的,但是你必须修复下面的 if/else if 链来处理 1973 年 1 月 1 日是星期一的事实。我意识到您还有另一个问题:在 1970 年之前的几年(或 1973 年,如果您进行了您建议的更改)结果将是否定的,并且 rmd=totdays%7;不会像你预期的那样表现。
  • 泰!它现在可以工作了。我意识到,如果我在减去任何年份之前选择任何年份,那将是负面的。我不能只做绝对值吗?
  • 问题是 C 中的 % 运算符并没有真正执行您想要的模运算。 (-1) % 7 是 -1 而不是 (-1) MOD 7 是 6;如果您将 -1 视为“0 之前的数字”,这更有意义,在 MOD 7 算术中,从 0 倒数到 6。好消息是,如果您得到否定结果,您可以很容易地解决这个问题今天 % 7,只需添加 7。
【解决方案2】:

day2 计算不起作用。每四年有1461天。首先,您需要计算已经过去了多少个 4 年。然后算出到指定年份的开始还有多少天,类似于您对月份所做的事情。

year%100 和 year%400 例外增加了一点复杂性,但幸运的是 2000 年是闰年,所以你第一次必须处理这个小皱纹是 2100 年。

【讨论】:

  • 为什么不计算 day2 工作?你能举个例子说明我如何进行正确的计算吗?
  • 它不起作用,因为没有一年有 365.25 天。一年有 365 天或 366 天。一种稍微不同的方法是假设所有年份都是 365 天,然后计算闰年的数量,并将其添加到总数中。
  • 如何在我的代码中做到这一点?你能给我举个例子吗,例如,如果我输入的是 2017 年,那么它将是 2017-1970=47 我不知道如何计算我们的 47 个闰年。
  • 嗯,从 1972 年开始每 4 年一次(除了 2100 年这样的小例外)。
  • 是的,我意识到 1970 年是闰年,但 1972 年是闰年,但我仍然不确定如何解决我的问题。 :(
猜你喜欢
  • 2017-03-23
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 2010-11-06
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多