这道题有几种方法,可以直接用数组做,也可以调用函数来解决。
这道题有考到数组,循环,逻辑表达式,等基础知识。
并不是很难,只要厘清思路。
唯一值得注意的地方是对闰年的判断,解决闰年,这个问题就会简单很多。
方法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;
}
这个代码并不能阻止对月份的月份与日子的错误输入,大家可以自己想想如何阻止错误的输入,比如用上面的标记法。