假期回顾c语言学习之“指针”课后习题(选)(初学友好式)

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与月赋给两指针即可

需要注意的点:

  1. 使用额外的变量来存放输入的天数
  2. 区分闰年
  3. Day=yearday与days=day-天数顺序先后(这个是不断减的代码的前提)
  4. 在12月后月份再自增会出问题,因为已经跑到13月去了,需要自减
  5. 天数是否超出对应年份的输入情况需要考虑 

 

  调试台结果如下:

 最后是完整代码:

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;
}

如果有更好的代码实现,欢迎一起沟通交流!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值