首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算一年中的某一天

计算一年中的某一天
EN

Stack Overflow用户
提问于 2013-09-28 11:38:08
回答 4查看 2.1K关注 0票数 1

我正在尝试用C语言编写一个程序,给定来自用户的这两个数据集。年份:范围1901-2099和年中的日期:范围1-366我需要一个公式来计算MM/DD/YYYY格式的日期。还有一件事。没有IF/ELSE语句。不允许AND/OR或大于或小于。

EN

回答 4

Stack Overflow用户

发布于 2013-09-28 12:02:05

您可以使用嵌套的switch case来避免使用if-else。

  1. 找出今年是否是闰年。
  2. 创建四个月桶(1-99)、(100-199)..存储桶编号将用作箱号。
  3. 现在检查一天中最左边的位,并写入一个开关箱体,将其分配到右侧存储桶中。
  4. 每个存储桶也可以被分成4个以上的存储桶(将使用闰年信息)。
  5. 对中间位重复步骤3,并根据结果(情况)切换到适当的存储桶。

简而言之,逻辑可能如下:

代码语言:javascript
运行
复制
isLeapYear = year % 4

Switch(isLeapYear)
Case 0: {
  first_bucket = days/4
  Switch(first_bucket)
  {
   Case 0: {
            days_left = days % 100
            second_bucket = days / 50;
// ...
// ...
}
Case 1, 2, 3: {
// Similar logic for non-leap year
// ...
}
票数 2
EN

Stack Overflow用户

发布于 2013-09-28 12:52:08

您可以在不使用任何类型的流控制语句(if、switch),也不需要自己计算闰年的情况下完成此操作。获取与所需年份的1月1日对应的时间戳。然后,您可以在时间戳上添加一次,以获得正确的日期,并将时间戳转换为您想要的任何格式。

我会提供代码,具体的函数名,并解释你需要在时间戳中添加什么,但因为这显然是一个家庭作业问题,所以我不会提供。如果有人在两周后提醒我(即作业的最后期限最有可能过了),我会很高兴地发布示例代码。

票数 2
EN

Stack Overflow用户

发布于 2013-09-28 15:20:50

如果允许使用库函数(我对此表示怀疑),我会这样做(懒惰的乐高积木):

代码语言:javascript
运行
复制
#define _XOPEN_SOURCE /* glibc2 needs this for strptime */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>    
#include <errno.h>

int to_date(
  char * date, 
  const size_t size, 
  const char * fmt, 
  const short unsigned int day_of_year, 
  const short unsigned int year)
{
  char buffer[16] = "";

  sprintf(buffer, "%hu %hu", day_of_year, year);

  {
    struct tm t = {0};
    char * presult = strptime(buffer, "%j %Y", &t);

    if ((NULL == presult) || ('\0' != *presult))
    {
      errno = EINVAL;
      return -1;
    }

    strftime(date, size, fmt, &t);
  }

  return 0;
}

int main(int argc, char ** argv)
{
  if (2 > argc)
  {
    fprintf(stderr, "Missing arguments. Usage: %s day-of-year year\n", argv[0]);
    return EXIT_FAILURE;
  }

  short unsigned int day_of_year = atoi(argv[1]);
  short unsigned int year = atoi(argv[2]);
  char date[16] = "";

  if (-1 == to_date(date, sizeof(date), "%m/%d/%Y", day_of_year, year))
  {
    perror("to_date() failed");
    return EXIT_FAILURE;
  }

  printf("Result: day %d of year %d is '%s'.\n", day_of_year, year, date);

  return EXIT_SUCCESS;
}

这样叫它

代码语言:javascript
运行
复制
$ ./main 2 2000

要获得

代码语言:javascript
运行
复制
Result: day 2 of year 2000 is '01/02/2000'.    
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19062961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档