数组进阶

来源:互联网 发布:mac系统偏好设置卡死 编辑:程序博客网 时间:2024/06/15 05:08
听同学说今天你们学了数组,但是从今晚的上机课问题来看,很多同学还不会用。我就以第一次作业的第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,也很容易找到出问题的代码段。


只是给同学们提供一个思路,期待你们今后写出更优雅的代码。

1 0
原创粉丝点击