C语言教程:函数进阶与日期运算解析

版权申诉
0 下载量 64 浏览量 更新于2024-07-03 1 收藏 602KB PPT 举报
"C程序设计快速进阶大学教程——第14章 函数进阶,主要探讨了函数的分解与抽象以及递归的概念,并通过日期运算的实例详细讲解了这两个主题。" 在C程序设计中,函数是组织代码的重要方式,它们能够帮助我们将复杂的问题分解成更小、更易于管理的部分。第14章的主题"分解与抽象"是编程中的核心概念,它强调将大问题拆解为一系列可复用的小功能单元,以提高代码的可读性和维护性。通过抽象,我们可以隐藏实现细节,只对外暴露必要的接口,使得程序结构更加清晰。 首先,分解是指将一个大的任务或算法分解成若干个相互独立或有依赖关系的小任务,每个小任务由一个函数来实现。在日期运算的例子中,如判断日期合法性、计算两个日期的差值、加减整数天数以及确定日期是星期几等,都是独立的功能,可以分别用函数来处理。例如,日期合法性判断涉及到年、月、日的检查,可以独立设计一个函数来专门处理闰年的判断,这样既提高了代码的复用性,又降低了复杂度。 抽象则是从具体实现中提取出共性特征,形成一种高层次的描述。在日期运算的示例中,抽象可能体现在将日期表示为年、月、日的组合,并提供通用的接口用于执行不同的日期操作,如`AddDays()`、`SubtractDays()`、`IsDateValid()`等。这些函数对外只暴露功能,不涉及具体的实现细节,使得调用者无需关心内部如何进行闰年判断或天数转换。 接下来,我们来看递归。递归是一种函数在其定义中调用自身的技术,常用于解决具有自相似性质的问题。虽然在本章描述中没有详细展开递归,但在C语言中,递归通常用于处理树形结构、回溯算法以及某些数学问题,如阶乘计算。例如,计算一个数的阶乘可以通过递归定义:`n! = n * (n-1)!`,当n等于1时,基础情况`1! = 1`,结束递归。 在日期运算中,尽管没有直接使用递归的例子,但我们可以想象,如果我们要计算两个日期之间的差距,并且其中涉及到复杂的日期计算(如跨越多个闰年),递归可能会是解决问题的一个有效工具,尤其是在处理嵌套循环和复杂逻辑时。 总结,本章"函数进阶"深入讲解了如何利用函数进行分解和抽象,以优化代码结构,同时暗示了递归作为解决问题的一种方法。通过日期运算的实例,学习者可以更好地理解和掌握这些编程技巧,并将它们应用到实际的C程序设计中。
2019-11-08 上传
第十四章 函数进阶 14.1 分解与抽象 案例 日期运算 给定日期由年月日(3个整数,年的取值在1970~2050间)组成,完成以下功能: (1)判定给定日期的合法性。 (2)计算两个日期相差的天数。 (3)计算一个日期加上一个整数后对应的日期。 (4)计算一个日期减去一个整数后对应的日期。 (5)计算一个日期是星期几。 分析: 1.判断给定日期的合法性 首先判断年份是否在1970~2050之间,然后判断月份是否在1~12之间,最后判断日的合法性。当月份为1、3、5、7、8、10、12时,日在1~31之间;月份为4、6、9、11时,日在1~30之间;月份为2时,若年为闰年,日在1~29之间,不为闰年在1~28之间。 闰年:year%4==0&&year0;!=0||year@0==0 2.计算两个日期相差的天数 计算日期A和日期B相差天数,A小于B且A与B不在同一年时,把天数分为三段: (1)A到A所在年份12月31日的天数; (2)A所在年份后整年部分(A、B在相邻年份时无整年部分); (3)B所在年份1月1日到B的天数。 若A小于B且A、B在同一年,直接在年内计算。 3.计算一个日期加上一个整数后对应的日期。 4.计算一个日期减去一个整数后对应的日期。 5.计算一个日期是星期几。 计算日期A为星期几,先找一个知道为星期几的参照日期B,通过计算A和B的相差天数,就可计算出日期A星期几。 例:日期综合运算。 #include #include /*日期结构体*/ struct date { int year; int month; int day; }; /*二维数组,第0行是闰年每月天数,第1行是非闰年每月天数 */ int m[2][12]= {{31,29,31,30,31,30,31,31,30,31,30,31}, {31,28,31,30,31,30,31,31,30,31,30,31}}; /*判断闰年,是返回1,不是返回0*/ int leap(int y) { if(y%4==0&&y0;!=0||y@0==0) return 1; else return 0; } /*将给定日期转换成从1970年1月1日到该日期经过的天数*/ int dateToDays(struct date d) { int sum=0,i; /*把整年的天数累加到sum中*/ for(i=1970; i<d.year; i++) sum+=leap(i)+365; /*闰年时返回1,多加一天*/ /*不够整年的month之前的整月天数累加到sum中*/ if(leap(d.year)) for(i=0; i<d.month-1; i++) sum+=m[0][i]; else for(i=0; i<d.month-1; i++) sum+=m[1][i]; sum+=d.day; return sum; } /*将给定天数转换成从1970年1月1日经过该天数的日期*/ struct date daysToDate(int days) {