我正在尝试用C语言编写一个程序,给定来自用户的这两个数据集。年份:范围1901-2099和年中的日期:范围1-366我需要一个公式来计算MM/DD/YYYY格式的日期。还有一件事。没有IF/ELSE语句。不允许AND/OR或大于或小于。
发布于 2013-09-28 12:02:05
您可以使用嵌套的switch case来避免使用if-else。
简而言之,逻辑可能如下:
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
// ...
}
发布于 2013-09-28 12:52:08
您可以在不使用任何类型的流控制语句(if、switch),也不需要自己计算闰年的情况下完成此操作。获取与所需年份的1月1日对应的时间戳。然后,您可以在时间戳上添加一次,以获得正确的日期,并将时间戳转换为您想要的任何格式。
我会提供代码,具体的函数名,并解释你需要在时间戳中添加什么,但因为这显然是一个家庭作业问题,所以我不会提供。如果有人在两周后提醒我(即作业的最后期限最有可能过了),我会很高兴地发布示例代码。
发布于 2013-09-28 15:20:50
如果允许使用库函数(我对此表示怀疑),我会这样做(懒惰的乐高积木):
#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;
}
这样叫它
$ ./main 2 2000
要获得
Result: day 2 of year 2000 is '01/02/2000'.
https://stackoverflow.com/questions/19062961
复制相似问题