数组进阶
来源:互联网 发布: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
- 数组进阶
- 数组进阶-数组倒置
- 数组进阶对象数组
- js数组进阶
- 数组操作(进阶)
- JavaScript进阶之数组
- 关于数组(ASP高手进阶)
- php进阶笔记之数组
- JavaScript数组进阶全掌握
- JavaScript 进阶学习 2 数组
- scala基础7-数组进阶
- JS进阶笔记-02(数组)
- PHP进阶篇 第一章 数组
- JavaScript进阶:数组常用方法
- Scala数组的基本操作,数组进阶操作,多维数组
- Java进阶---数组与内存控制
- 【C++进阶】C++中的数组退化
- Scala教程(四)数组进阶实战
- java7新特性之Simplified varargs method invocation
- Android自定义View之六位密码框
- Android基础-Intent用法
- Oracle sql, 外键,级联
- JPA hibernate spring repository pgsql java 工程(二):sql文件导入数据,测试数据
- 数组进阶
- 【问题集】Provided dependencies can only be jars
- 林大OJ 60
- JFinal在网络服务端开发中的位置
- 计算完全最短路径的Floyd算法
- 有重复元素的排列问题
- PagerAdapter学习
- python笔记1
- codeforces-148B-Escape