第四章模块化函数编程(1)2本章内容4.1模块化程序设计(ModelDesigning)4.2函数定义和声明4.3函数调用过程4.4函数的嵌套调用和递归函数4.7变量的作用域(Scope)与生存期(Lifetime)4.8编译预处理(Pre-process)34.1模块化程序设计(modularprogramming)4主控模块二级模块三级模块【学生项目案例4-1】高等院校信息管理系统中“学生信息管理系统”的模块化设计与划分。5主控模块模块1_1模块1_n模块2_1模块2_n模块n_1模块n_n模块1模块2模块n“分而治之”--自顶向下(Top-downdesign)、逐步细化的模块化程序设计方法1.模块化程序设计思想6把一个较大的软件工程项目分解成若干个简单、易于实现的子系统(也称模块),每个子系统(模块)实现单一完整的功能。优点:每个模块单独编写和测试,项目开发工作同时展开,节省时间。1.模块化程序设计思想72.模块设计原则(PrincipleofModuleDesigning)(1)模块独立性(ModuleIndependency)模块实现相对独立的特定子功能。模块之间关系简单。模块内数据的局部化。(2)模块大小适中(3)模块分解层次清楚8【学生项目案例4-1】“学生信息管理系统”项目模块化设计与划分。3.项目案例9学生信息管理系统待开发课程信息输出课程信息录入学生成绩录入学生成绩修改学生成绩输出学生成绩查询学生成绩插入学生成绩删除学生成绩统计待开发用户信息录入用户信息输出用户信息添加用户信息删除用户信息查询用户信息修正系统管理报表管理班级管理学生成绩管理课程设置学籍管理用户信息表成绩信息统计表课程信息表二级模块主模块三级模块10文本编辑器文件编辑插入格式工具复制查找粘贴删除替换排序新建保存打开关闭打印退出小写变大写大写变小写段落字符分类统计字数统计文件加密文件解密【文本项目案例4-1】“文本编辑器”项目模块划分。114.2函数定义与声明(FunctionDefinition&Declaration)12将程序中反复使用、完成特定任务的程序段定义为函数;优点:实现代码复用,提高编程效率。1.函数的概念13【例4-1】编程实现求最大值。#includestdio.hvoidmain(void){intx,y,z;printf(Pleaseinputxandy:);scanf(%d%d,&x,&y);if(xy)z=x;elsez=y;printf(最大值是%d\n,z);}标准库函数14VC++6.0中标准c常用的几个头文件。stdio.hmath.hString.h使用某库函数时,要在程序中嵌入该函数对应的头文件。用#include命令包含头文件,头文件的扩展名是“.h”。15【例4-1】设计自定义函数实现求最大值。#includestdio.hvoidmain(void){intx,y,z;printf(Pleaseinputxandy:);scanf(%d%d,&x,&y);if(xy)z=x;elsez=y;printf(最大值是%d\n,z);}z=max(x,y);函数必须先定义才能使用。intmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}从定义的角度,函数分为:标准库函数和自定义函数16现代格式的函数定义形式:函数值类型名函数名(形式参数类型及参数说明){数据说明部分语句}2.函数定义形式intmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}函数说明或函数首部函数体17函数类型说明函数名(形式参数列表)形式参数说明{数据说明部分语句}传统格式的函数定义形式:2.函数定义形式intmax(a,b)inta,b;{intc;if(ab)c=a;elsec=b;returnc;}intmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}18intmax(inta,intb){intc;if(ab)c=a;elsec=b;intmin(ints,intt){……}}intmax(x,y){intx,y;……}intmax(a,b)inta,b,c;{if(ab)c=a;elsec=b;}2.函数定义形式intmax(intx,y){……}19无参函数函数定义时无参数有参函数函数定义时定义了一个或一个以上的参数fabs(doublex)pow(doublex,doubley)getchar()x=getchar();从函数的形式来看,C语言的函数可以分为两类:有参函数和无参函数3.函数的结构20从函数调用的角度,函数分为:有返回值函数和无返回值函数。有返回值函数:函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。特点:(1)函数体中至少包含一个带表达式的return语句。(2)一个函数最多只能有一个返回值。(3)函数定义中应明确返回值的类型,默认为int类型。3.函数的结构intmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}21return语句的一般格式为:return表达式;或return(表达式);或return;/*函数无返回值,return语句可省*/return语句功能:立即结束当前函数的执行;计算表达式的值,并把该值传回到调用函数;返回值被转换为函数定义中的返回值类型。程序控制流程返回到调用环境(CallingEnvironment)。3.函数的结构intmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}floatc;voidmain(void){intx,y,z;printf(Pleaseinputxandy:);scanf(%d%d,&x,&y);z=max(x,y);printf(最大值是%d\n,z);}22无返回值函数:函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。例如:voidf()注意:(1)一般无返回值函数定义中没有return语句,而是直接运行到了终点。(2)无返回值函数也可以用return语句强制从函数中某处立即返回。3.函数的结构23#includestdio.hvoidmain(void){intx,y,z;printf(inputxandy:);scanf(%d%d,&x,&y);z=max(x,y);printf(最大值是%d\n,z);}【例4-1】设计自定义函数实现求最大值。intmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}#includestdio.hvoidmain(void){intx,y,z;printf(inputxandy:);scanf(%d%d,&x,&y);max(x,y);}voidmax(inta,intb){intc;if(ab)c=a;elsec=b;printf(%d,c);}24函数定义后,才可以被调用执行,这个过程称为函数调用。自定义函数不会自动执行,只有正在执行中的其它的函数调用它,才能执行。4.3.函数调用过程25#includestdio.hintmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}voidmain(void){intx,y,z;printf(Pleaseinputxandy:);scanf(%d%d,&x,&y);z=max(x,y);printf(最大值是%d\n,z);}【例4-1】设计自定义函数实现求最大值。主调函数被调函数函数定义函数调用26函数名(实际参数列表)1.函数的调用形式可以是常量、变量或表达式27C语言中函数调用的三种形式:语句调用表达式调用参数调用大多数函数的调用形式。例:ch=getchar();n=sqrt(x);在函数调用后加“;”,构成一个语句。例:printf(x=%d,x);被调用函数作为某个函数的一个参数。printf(\nk1=%d,sqrt(k1));28#includestdio.hintmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}voidmain(void){intx,y,z;printf(Pleaseinputxandy:);scanf(%d%d,&x,&y);z=max(x,y);printf(最大值是%d\n,z);}【例4-1】设计自定义函数实现求最大值。主调函数被调函数函数定义函数调用主调函数在前可以吗?29#includestdio.hintmax(inta,intb);voidmain(void){intx,y,z;printf(Pleaseinputxandy:);scanf(%d%d,&x,&y);z=max(x,y);printf(最大值是%d\n,z);}【例4-1】设计自定义函数实现求最大值。函数定义函数调用函数声明intmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}30函数的声明函数必须先定义后使用,如果定义在使用之后,要先声明,后使用。函数声明的一般形式如下:类型名函数名(类型1形参1,类型2形参2,…,类型n形参n);或类型名函数名(类型1,类型2,…,类型n);或类型名函数名();31#includestdio.hintmax(inta,intb);或intmax(int,int);voidmain(void){intx,y,z;printf(Pleaseinputxandy:);scanf(%d%d,&x,&y);z=max(x,y);printf(最大值是%d\n,z);}【例4-1】设计自定义函数实现求最大值。函数声明intmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}具体的调用过程?32【例4-1】设计自定义函数实现求最大值。形式参数(简称形参)实际参数(简称实参)#includestdio.hintmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}voidmain(void){intx,y,z;printf(Pleaseinputxandy:);scanf(%d%d,&x,&y);z=max(x,y);printf(最大值是%d\n,z);}33……变量名=主调函数名(实际参数);……主调函数被调函数名(形式参数){……return返回值;……}被调函数2.函数调用过程34函数通过参数实现数据传递的方式:值传递地址传递值传递方式是指在函数调用时,将实参的值传递给对应的形参,使形参具有与实参相同的值。3.函数间数据的传递35………………10201020abc20xyz20#includestdio.hvoidmain(void){intx,y,z;printf(Pleaseinputxandy:);scanf(%d%d,&x,&y);z=max(x,y);printf(最大值是%d\n,z);}intmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}【例4-1】设计自定义函数实现求最大值。36说明:在函数定义中指定的形参,未调用时,它们不占用存储单元。只有调用该函数时,形参才被分配空间,函数调用结束后,形参所占的存储单元被释放。3.函数间数据的传递37#includestdio.hintf(intn){inti,r=1;for(i=1;i=n;i++)r=r*i;returnr;}main(){intm1,m2,result;scanf(%d%d,&m1,&m2);result=f(m1)+f(m2);printf(%d,result);}