听同学说今天你们学了数组,但是从今晚的上机课问题来看,很多同学还不会用。我就以第一次作业的第6题为例,为大家展示数组的使用方法。
问题重述:
【问题描述】编写一个程序,用户输入日期,计算该日期是这一年的第几天。
【输入形式】用户在第一行输入一个日期(年 月 日,中间以空格分割)
【输出形式】程序在下一行输出一个整数
【样例输入】2006 2 21
【样例输出】52
【样例说明】用户以年月日的格式输入,中间以空格分割,程序计算出该天是输入年份的第几天并输出该天数。另外还需要判断这一年是否为闰年。
【评分标准】结果完全正确得20分,每个测试点4分。提交程序名为:datetoday.c
某位同学的代码(根据我的回忆重写的,不能保证完全一样):
#include <stdio.h>
int main()
{
int y,m,d,n; //y:年 m:月 d:日 n:总天数
//step one:读入数据
scanf("%d%d%d",&y,&m,&d);
//step two:根据平年、闰年,分别处理
n = 0;
if(y%4==0 && y%100!=0 || y%400==0) //判断y是否是闰年,一些同学对闰年的概念不清楚
{
if(m==1)
n = d;
else if(m==2)
n = 31 + d;
else if(m==3)
n = 31 + 29 + d;
else if(m==4)
n = 31 + 29 + 31 + d;
else if(m==5)
n = 31 + 29 + 31 + 30 + d;
else if(m==6)
n = 31 + 29 + 31 + 30 + 31 + d;
else if(m==7)
n = 31 + 29 + 31 + 30 + 31 + 30 + d;
else if(m==8)
n = 31 + 29 + 31 + 30 + 31 + 30 + 31 + d;
else if(m==9)
n = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + d;
else if(m==10)
n = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + d;
else if(m==11)
n = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + d;
else
n = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + d;
}
else //如果不是闰年,即平年
{
if(m==1)
n = d;
else if(m==2)
n = 31 + d;
else if(m==3)
n = 31 + 28 + d;
else if(m==4)
n = 31 + 28 + 31 + d;
else if(m==5)
n = 31 + 28 + 31 + 30 + d;
else if(m==6)
n = 31 + 28 + 31 + 30 + 31 + d;
else if(m==7)
n = 31 + 28 + 31 + 30 + 31 + 30 + d;
else if(m==8)
n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + d;
else if(m==9)
n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + d;
else if(m==10)
n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + d;
else if(m==11)
n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + d;
else
n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + d;
}
//step three:输出结果
printf("%d\n",n);
return 0;
}
思路很简单,就是把情况分成了24类,对每类分别计算。 ps:她的代码没有任何注释,这几句注释是我自己加的
可以看出,代码中有很多从重复性的操作,这样不仅写起来麻烦,一旦需要修改,代码的变动也很多。比如,如果6月变成了31天,那么你要改12条语句才能适应新情况。
我们使用数组和循环来重写代码,看看会不会改善这一情况。
关于数组如何使用,可以参考教材第六章。
新的代码:
#include <stdio.h>
int main()
{
int y,m,d,n; //y:年 m:月 d:日 n:总天数
int a[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //存储平年里1月到12月的天数
int i; //循环变量
//step one:读入数据
scanf("%d%d%d",&y,&m,&d);
//step two:假设是平年,计算总天数
n = d; //先把零头赋给n,作为初始值
for(i=0;i<m-1;i++) //每次循环,把第i+1月的天数加到n,从1月一直加到第m-1月
n += a[i];
//step three:把闰年的影响考虑进去
if((y%4==0 && y%100!=0 || y%400==0) && m>2) //如果是闰年且月份大于2,在之前计算的基础上加上2月多出的一天
n += 1;
//step four:输出结果
printf("%d\n",n);
return 0;
}
新的代码用数组存储每个月的天数,这样做不仅方便用循环读取数据,而且如果天数写错了,修改起来也方便。代码的每一块功能分的很清楚,如果出现bug,也很容易找到出问题的代码段。
只是给同学们提供一个思路,期待你们今后写出更优雅的代码。