c语言题目要求:日期转换(日期转天数,天数转日期)(考虑闰年:平年2月有28天,闰年2月有29)(能被4整除不能被100整除,能被400整除)(4.6.9.11有30天))
首先需要知道的是平年闰年的定义,已经列出在标题上了。
第一步是日期转天数,我个人认为这个大家应该都是轻车熟路了,至少知道思路在哪。没错,就是先判断平年闰年,然后利用输入月份的天数加上余下的“日”。
这里我直接把函数拿上来解释一下
int dayofyear(int year, int month, int day)
{
int t = 0; //存放第几天
int k = 0; //标记是否是闰年,是则为非0;
int i;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
printf("%d年是闰年\n", year);
k += 1;
}
else
{
printf("%d年不是闰年", year);
k = 0;
}
printf("\n");
for (i = 1; i < month; i++)
{
if (i != 4 || i != 6 || i != 9 || i != 11)
{
if (i == 2)
{
if (k != 0)
{
t += 29;
}
else
{
t += 28;
}
}
else
{
t += 31;
}
}
else
{
t += 30;
}
}
if (i == month)
{
t += day;
}
return t;
}
当然...不要那么死板的一堆if了哈,只需要判断31天外的月份即可,4.6.9.11都是30天,那好办,将变量i与输入月份对应起来,不满足则+=,然后在i与月份相同时,将天数也一并加上去,最后返回天数t即可。
第二个比较绕的就是天数转日期,思路当然不难,就是一直减嘛。
不过我在代码实现的时候还是花了点心思,首先找出功能部分,利用一堆if将问题简单化,然后找出共同点去优化代码
先直接上代码
void monthday(int year, int yearday, int *pmonth, int *pday)
{
int k = 0; //标记是否为闰年
int day = yearday; //存放“日”
int days = 0; //存放yearday减前一个月份的天数
int month = 0; //存放“月”
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
if (yearday <= 366)
{
printf("%d年是闰年\n", year);
k += 1;
}
else
{
printf("输入天数有误!");
}
}
else
{
if (yearday <= 365)
{
printf("%d年不是闰年", year);
k = 0;
}
else
{
printf("输入天数有误!");
}
}
printf("\n");
for (month = 1; days >= 0;)
{
if (month == 1)
{
day = yearday;
days = day - 31; //表示退出条件,如果输入天数减1月的31天<0,则退出
if (days >= 0)
{
if (days == 0)
{
days += 1;
}
month++;
}
}
else if (month == 2)
{
day = days;
if (k != 0)
{
days = day - 29; //表示闰年
}
else
{
days = day - 28; //表示平年
}
if (days >= 0)
{
if (days == 0)
{
days += 1;
}
month++;
}
}
else if (month > 2 && month != 4 && month != 6 && month != 9 && month != 11)
{
day = days;
days = day - 31;
if (days >= 0)
{
if (days == 0)
{
days += 1;
}
month++;
if (month == 13)
{
month--;
goto a;
}
}
}
else
{
day = days;
days = day - 30;
if (days >= 0)
{
if (days == 0)
{
days += 1;
}
month++;
if (month == 13)
{
month--;
goto a;
}
}
}
}
a: *pday = day;
*pmonth = month;
}
这里我将所求天数小于31放为一个部分,在1-2月之间的放一个部分,剩下的一个部分,前两个月的比较好实现,这里我用的是day来存放输入的yearday,避免直接修改。
后续先将day=yearday保存一下,再用days来存放减去的日期,只需要注意对应日期的即可,两者顺序别颠倒,重要的点是指针是出口,最后将day与月赋给两指针即可
需要注意的点:
- 使用额外的变量来存放输入的天数
- 区分闰年
- Day=yearday与days=day-天数顺序先后(这个是不断减的代码的前提)
- 在12月后月份再自增会出问题,因为已经跑到13月去了,需要自减
- 天数是否超出对应年份的输入情况需要考虑
调试台结果如下:
最后是完整代码:
int dayofyear(int year, int month, int day)
{
int t = 0; //存放第几天
int k = 0; //标记是否是闰年,是则为非0;
int i;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
printf("%d年是闰年\n", year);
k += 1;
}
else
{
printf("%d年不是闰年", year);
k = 0;
}
printf("\n");
for (i = 1; i < month; i++)
{
if (i != 4 || i != 6 || i != 9 || i != 11)
{
if (i == 2)
{
if (k != 0)
{
t += 29;
}
else
{
t += 28;
}
}
else
{
t += 31;
}
}
else
{
t += 30;
}
}
if (i == month)
{
t += day;
}
return t;
}
void monthday(int year, int yearday, int *pmonth, int *pday)
{
int k = 0; //标记是否为闰年
int day = yearday; //存放“日”
int days = 0; //存放yearday减前一个月份的天数
int month = 0; //存放“月”
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
if (yearday <= 366)
{
printf("%d年是闰年\n", year);
k += 1;
}
else
{
printf("输入天数有误!");
}
}
else
{
if (yearday <= 365)
{
printf("%d年不是闰年", year);
k = 0;
}
else
{
printf("输入天数有误!");
}
}
printf("\n");
for (month = 1; days >= 0;)
{
if (month == 1)
{
day = yearday;
days = day - 31; //表示退出条件,如果输入天数减1月的31天<0,则退出
if (days >= 0)
{
if (days == 0)
{
days += 1;
}
month++;
}
}
else if (month == 2)
{
day = days;
if (k != 0)
{
days = day - 29; //表示闰年
}
else
{
days = day - 28; //表示平年
}
if (days >= 0)
{
if (days == 0)
{
days += 1;
}
month++;
}
}
else if (month > 2 && month != 4 && month != 6 && month != 9 && month != 11)
{
day = days;
days = day - 31;
if (days >= 0)
{
if (days == 0)
{
days += 1;
}
month++;
if (month == 13)
{
month--;
goto a;
}
}
}
else
{
day = days;
days = day - 30;
if (days >= 0)
{
if (days == 0)
{
days += 1;
}
month++;
if (month == 13)
{
month--;
goto a;
}
}
}
}
a: *pday = day;
*pmonth = month;
}
int main()
{
int year, month, day; //年月日
int yearday; //任务2的输入天计算日期
int nian;
printf("输入你的年,月,日(以空格隔开即可):");
scanf("%d %d %d", &year, &month, &day);
printf("%d年的%d月%d日是%d年的第%d天\n", year, month, day, year,dayofyear(year, month, day));
printf("\n");
month = 0;
day = 0;
int *Month = &month; //存储这一年第几月的整型变量
int *Day = &day; //存储第几日的整型变量
printf("请输入你想要转换成日期的年份以及对应的天数:");
scanf("%d %d", &nian,&yearday);
monthday(nian, yearday, Month, Day);
printf("%d年的第%d天是%d年的%d月%d日\n", nian, yearday, nian, *Month, *Day);
return 0;
}
如果有更好的代码实现,欢迎一起沟通交流!