我必须编写一个程序,询问用户日期和月份。接下来,它应该打印给定日期和月份的年的日期。假设这一年是闰年。
我设计了一个公式来避免使用过多的条件。
#include <stdio.h>
int main()
{
int day, month, dayOfYear;
puts("Give me a day and a month and i'll give you the number of year day!");
scanf("%d %d", &day, &month);
/* (month / 2) is used for add the extra day of the months with 31 days. */
dayOfYear = (month - 1) * 30 + day + (month / 2);
/*All the months are calculated of 30 days, so, after of February 29 it's
*substrated one day to compensate the remaining day. For non-leap years, substract
*two.
*/
if(month > 2)
{
dayOfYear -= 1;
}
printf("The day of the year: %dn", dayOfYear);
return 0;
}
我花了很多时间想办法做简短易懂的事。我写这篇文章是因为我希望这篇文章对某些人有用。
可以回答您自己的问题;我能回答我自己的问题吗?,但重要的是要把它做好。
OP的方法在第9个月和第11个月都失败了。
#include "stdio.h"
#include "time.h"
int doy2021(int month, int day) {
int dayOfYear = (month - 1) * 30 + day + (month / 2);
if (month > 2) {
dayOfYear -= 2; // 2021
}
return dayOfYear;
}
int main() {
for (int m = 1; m <= 12; m++) {
struct tm first_of_the_month = {.tm_year = 2021 - 1900, .tm_mon = m - 1,
.tm_mday = 1, .tm_hour = 12};
mktime(&first_of_the_month);
// int tm_yday; // days since January 1 -- [0, 365]
printf("Month:%2d doy(mktime):%3d doy(Juan):%3dn", m,
first_of_the_month.tm_yday + 1, doy2021(m, 1));
}
return 0;
}
Ouput
Month: 1 doy(mktime): 1 doy(Juan): 1
Month: 2 doy(mktime): 32 doy(Juan): 32
Month: 3 doy(mktime): 60 doy(Juan): 60
Month: 4 doy(mktime): 91 doy(Juan): 91
Month: 5 doy(mktime):121 doy(Juan):121
Month: 6 doy(mktime):152 doy(Juan):152
Month: 7 doy(mktime):182 doy(Juan):182
Month: 8 doy(mktime):213 doy(Juan):213
Month: 9 doy(mktime):244 doy(Juan):243 Differ
Month:10 doy(mktime):274 doy(Juan):274
Month:11 doy(mktime):305 doy(Juan):304 Differ
Month:12 doy(mktime):335 doy(Juan):335
关注闰年。来自维基百科的公历闰年:
如果(年不能被4整除(,那么(这是一个普通年份(否则如果(年不能被100整除(那么(它是闰年(否则如果(年份不能被400整除(那么(这是一个普通年份(否则(这是闰年(
你跳得太快了。