数组进阶

听同学说今天你们学了数组,但是从今晚的上机课问题来看,很多同学还不会用。我就以第一次作业的第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,也很容易找到出问题的代码段。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值