C语言题判断输入的年月日是一年中的第几天

版权声明:请尊重每一个人的劳动成果 https://blog.csdn.net/jamenu/article/details/84110392

这道题有几种方法,可以直接用数组做,也可以调用函数来解决。
这道题有考到数组,循环,逻辑表达式,等基础知识。
并不是很难,只要厘清思路。

唯一值得注意的地方是对闰年的判断,解决闰年,这个问题就会简单很多。

方法1:数组累加法求天数

思路:1st:定义一个长度为12的整型数组,将每个月的天数放入这12个数组元素中去。
2ed:定义整型变量分别代表 年,月, 日,还有有用与循环的变量,和累加的容器(一个用于存储的变量)
3rd:从键盘输入年月日的数据,赋给年月日变量。
4th:用逻辑表达式分出闰年的情况,并将闰年的A【1】改为29;
最后我们进行累加,然后输出累加值要加上输入的天数。

下面贴出我的操作代码

include <stdio.h>
int main()
{
	int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	
	int years,months,days,i,j=0,flag = 1;
	
	printf("请输入年月日来判断\n");
	
	scanf("%d%d%d",&years,&months,&days);
	
	if(years%4==0&&years%100!=0||years%400==0)
	{
		a[1] = 29;
	}

	for(i=0;i<months-1;i++)
	{
		j+=a[i];
	}
	printf("这是第%d天",j+days);

但是,我们并不能避免人们输入错误的月份的日子。或是提示错误后依旧给出诸如第378天的数子。

我们应该怎么办呢?

方法是我们设一个整形作为标记,将标记的初始为1,若是月份数超过12,日子超过31,便把标记赋为0;
最后我们把输出日数放到一个IF语句中,就可以屏蔽在错误的月份和日数中输出天数。
下面给出我的操作代码

#include <stdio.h>
int main()
{
	int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	
	int years,months,days,i,j=0,flag = 1;//j为累加容器,flag为标记//
	
	printf("请输入年月日来判断\n");
	
	scanf("%d%d%d",&years,&months,&days);
	
	if(years%4==0&&years%100!=0||years%400==0)//判断是否为闰年//
	{
		a[1] = 29;
	}
	if(months>12||days>31)//如遇到输入错误,则把标记便为假,就屏蔽了天数的输出//
	{
		flag = 0;
	}
	for(i=0;i<months-1;i++)
	{
		j+=a[i];
	}
	if(flag)
	{
		printf("这是第%d天",j+days);
	}
	else
	{
		printf("FUCK YOU");
	}
	
		
}

现在,我们来看利用调用函数的方法来解决这个问题。

月份仍然是关键,我们定义一个子函数,以它来实现月份的累加,
我们在子函数内定义一个数组,仍然把月份的天数放在内,
这里只需要一个简单的循环,将里面的元素累加,

结束后再把累加的天数作为返回值带回主函数
这样我们在主函数内调用这个月份累加函数就可以完成,
如果是闰年,则将日加以即可.

下面给出我的操作代码

#include <stdio.h>
int main()
{
 int years,months,days,i,j,k;
 
 printf("请输入年月日\n");
 
 scanf("%d%d%d",&years,&months,&days);
 
 if(years%4==0&&years%100!=0||years%400==0)
 {
  days+=1;
 }
 printf("这是第%d天",leijia(months)+days); 
}
int leijia(int a)
{
 int i,j = 0;
 
 int b[12]={31,28,31,30,31,30,31,31,30,31,30,31};


 for(i=0;i<a-1;i++)
 {
  j+=b[i];  
 }
 return j;
}

这个代码并不能阻止对月份的月份与日子的错误输入,大家可以自己想想如何阻止错误的输入,比如用上面的标记法。

猜你喜欢

转载自blog.csdn.net/jamenu/article/details/84110392