函数和模块设计.ppt
《函数和模块设计.ppt》由会员分享,可在线阅读,更多相关《函数和模块设计.ppt(98页珍藏版)》请在三一办公上搜索。
1、第 6 章 函 数 和 模 块 设 计,第 6 章 函数和模块设计,对大千世界的许多描述大都可以在计算机中运用程序设计中的函数问题来解决,C语言程序设计也不例外。一个功能较大的系统,它一定包含有若干个相对独立的子功能,通过子程序模块来描述这些子功能,再通过对这些子程序的组织和调用,来实现整个程序的功能要求。而这些功能比较独立的子程序模块则称之为函数。本章用于揭开函数的真面目!,2023/10/6,程序设计基础(C语言)wh,4,6.1 结构化程序设计,6.1.1 结构化程序设计的基本概念结构化程序设计基本思想:将一个大的程序按功能分割成一些子模块,再通过对这些子模块的组织和调用,来实现整个程序
2、的功能要求。,2023/10/6,程序设计基础(C语言)wh,5,#include stdio.h void main()float a,b,c,v;scanf(”%f,%f,%f”,输出体积,组织和调用,计算立方体,示例:编程序计算一立方体的体积,并在屏幕上输出。,2023/10/6,程序设计基础(C语言)wh,6,6.1 结构化程序设计,6.1.1 结构化程序设计的基本概念,结构化程序设计特点:各模块相对独立、功能单一、结构清晰;控制了程序设计的复杂性;提高元件的可靠性缩短开发周期;避免程序开发的重复劳动;易于维护和功能扩充;开发方法:自上向下,逐步求精,模块化,限制使用goto语句。,2
3、023/10/6,程序设计基础(C语言)wh,7,6.1 结构化程序设计,6.1.2 结构化程序设计的基本特征,1.程序的三种基本结构,2023/10/6,程序设计基础(C语言)wh,8,2.C语言是模块化程序设计语言,2023/10/6,程序设计基础(C语言)wh,9,3.程序设计采用自顶向下逐步细化过程,2023/10/6,程序设计基础(C语言)wh,10,6.2 函数的定义和调用,函数是C语言程序的一种基本组成部分,C语言程序的功能是通过函数之间的调用来实 现,一个完整的C语言程序可由一个或多个函 数组成。,2023/10/6,程序设计基础(C语言)wh,11,示例:编一个程序,计算一立
4、方体的体积,并在屏幕上输出立方体的体积。,#include stdio.h void main()float a,b,c,v;scanf(”%f,%f,%f”,说明:,C是函数式语言,必须有且只 能有一个名为main的主函数,执行总是从main函数开始,在main中结束。,一个C语言程序可由一个或 多个函数组成。,C语言中函数与函数之间都是 互相独立的,不能嵌套定义。,除main函数之外,其他函数 是通过调用来执行的。,自定义函数必须先定义后使用,volume函数中的return(v)语句是返回语句,2023/10/6,程序设计基础(C语言)wh,12,6.2 函数的定义和调用,6.2.1 函
5、 数 的 定 义,一 般 格 式,函数类型 函数名(形参类型说明表)说明部分语句部分,传统格式,函数类型 函数名(形参表)形参类型说明说明部分语句部分,现代格式,2023/10/6,程序设计基础(C语言)wh,13,函数类型 函数名(形参类型说明表)说明部分语句部分,现代格式,函数返回值类型缺省 int 型无返回值 void,合法标识符,可以为空也可以有多个参数,例 无参函数 void print_message()printf(”v=%f”,v);,2023/10/6,程序设计基础(C语言)wh,14,6.2 函数的定义和调用,6.2.2 函 数 的 调 用,一.函数调用格式及执行过程,调用
6、形式,函数名(实参列表);,说明:实参与形参个数相等,类型一致,按顺序一一对应;实参列表求值顺序,因系统而定(Turbo C 自右向左);实参的量可以是常量、有值的变量或运算表达式.,2023/10/6,程序设计基础(C语言)wh,15,【例6_3】实参求值顺序举例。,运行结果:n=0,运行结果:n=1,i(1),+i(2),a(1),b(2),c=0;,i(2),+i(2),a(2),b(2),c=1;,2023/10/6,程序设计基础(C语言)wh,16,函数调用语句的执行过程:首先计算每个实参表达式的值,并把此值存入所对应 的形参单元中,执行流程转入函数体,执行函数体中的各语句。函数体执
7、行完之后,return(c)返回到调用该函数的 函数中的调用处的下一条语,/*计算面积*/#include stdio.h void main()int x=5,y=4,s=0;s=f(x,y);printf(”ns=%dn”,s);f(int a,int b)c=a*b;return(c);,x=5y=4,a=5b=4,c=5*4=20,s=20,运行结果:s=20,2023/10/6,程序设计基础(C语言)wh,17,二.函 数 的 调 用 方 式,3.以函数调用中的一个实际参数形式调用 例如 k=hust(hust(m,n),j);printf(”%d”,power(a,b);,2.以函
8、数表达式的一个运算对象形式调用 例如 k=hust(m,n)*hust(i,j);,1.以函数调用语句形式调用例如 hust();,2023/10/6,程序设计基础(C语言)wh,18,三.对被调用函数的使用说明,在程序中调用另一个函数时,要满足以下三个条件:被调用函数可以是已存在的用户自定义函数或库函数。,若是库函数,应用#include命令将有关库函数所需的信息包含到本文件中,#include stdio.h void main()printf(“*”);,若是用户自定义的函数,且该函数与调用它的函数(即调用函数)在同一个源文件中,则在调用函数中应对被调用函数返回值的类型加以说明。,202
9、3/10/6,程序设计基础(C语言)wh,19,#include stdio.h void main()float volume(float a,float b,float c)float x,y,z,v;scanf(”%f%f%f”,【例6_4】求长方形体积的程序。,对自定义函数volume说明,调用自定义函数volume,2023/10/6,程序设计基础(C语言)wh,20,6.2 函数的定义和调用,6.2.3 函数的返回值,返回语句形式,return(表达式);,说明:系统默认的返回值类型为int型 当函数有返回值时,凡是允许表达式出现的地方,都可以调用该函数 当函数没有返回值时,函数的
10、返回值类型可以说明为void型(空类型)若无return语句,遇 时,自动返回调用函数函数中可有多个return语句,或,return 表达式;,或,return;,功能:利用return语句,将计算结果(或不带结果)返回给调用程序,同时,也使程序的执行流程转到调用语句的下一语句去执行。,2023/10/6,程序设计基础(C语言)wh,21,float count(int n)int i;float s;if(n=0);printf(”The%d is invalid”,n);return(0);else s=0;for(i=1;i=n;i+)s+=1/(float)i;return(s);,
11、【例6_5】编一函数,求112131n的值。,强制转换成实型,2023/10/6,程序设计基础(C语言)wh,22,void spc(int n)int i;for(i=0;in;i+)printf(”%c”,);return(0);,【例6_6】打印n个空格的函数。,void spc(int n)int i;for(i=0;in;i+)printf(”%c”,);,返回调用函数,或,2023/10/6,程序设计基础(C语言)wh,23,void line(int n),line(int n)int i;for(i=1;i=n;i+)printf(”%c”,-);return;调用该函数:pr
12、intf(”%d”,line(30);,当无返回值的函数将void省掉时,函数将返回一个不确定的值。例如:,输出一段虚线的同时,还输出line函数的返回值,它是一个不确定的值。,引起编译错误,2023/10/6,程序设计基础(C语言)wh,24,double power(float x,int n)int i;double pw;pw=l;for(i=1;i=n;i+)pw*=x;return pw;,【例6_7】编一函数,求x的n次方的值,其中n是整数。,将 x、n 做为函数参数,结果通过return语句返回调用程序,2023/10/6,程序设计基础(C语言)wh,25,to_str(int
13、 n)char str10;int i;if(n0);while(-i=0)putchar(stri);,【例6_8】将一个给定的整数转换成相应的字符串后显示出来。,将数值型的数据转换成数值字符的内码,2023/10/6,程序设计基础(C语言)wh,26,6.2 函数的定义和调用,6.2.4 函数参数及函数间的数据传递,形式参数:定义函数时函数名后面括号中的变量名。实际参数:调用函数时函数名后面括号中的表达式。,例如,形参与实参,2023/10/6,程序设计基础(C语言)wh,27,/*计算面积*/#include stdio.h void main()int x=5,y=4,s=0;s=f(
14、x,y);printf(”ns=%dn”,s);f(int a,int b)c=a*b;return(c);,实参,形参,2023/10/6,程序设计基础(C语言)wh,28,6.2 函数的定义和调用,6.2.4 函数参数及函数间的数据传递,形式参数:定义函数时函数名后面括号中的变量名。实际参数:调用函数时函数名后面括号中的表达式。,形参与实参,说明:实参可以是常量、已赋值的变量或表达式。实参在次序、类型和个数上应与相应形参表中的形参保持一致。通常,当需要从调用函数中传值(或传地址)到被调用函数中的形参时应设置实参。,2023/10/6,程序设计基础(C语言)wh,29,6.2 函数的定义和调
15、用,6.2.4 函数参数及函数间的数据传递,值的传递:调用函数将实参(常数、变量、数组元素或可计算的表达式)的值传递到被调用函数形参设置的临时变量存储单元中,被调用函数形参值的改变对调用函数的实参没有影响。调用结束后,形参存储单元被释放,实参仍保持原值不变。,传递形参值的两种方法,特点:形参与实参占用不同的内存单元.单向传递,2023/10/6,程序设计基础(C语言)wh,30,#include stdio.h void main()int i=25;printf(”The value of i in main()before calling sqr(x)is%dn”,i);printf(”C
16、alling sqr(x):sqr(%d)=%dn”,i,sqr(i);printf(”The value of i in main()after calling sqr(x)is%dn”,i);sqr(int x)x=x*x;return(x);,【例6_9】值的传递程序举例,运行结果:The value of i in main()before calling sqr(x)is 25 Calling sqr(x):sqr(25)=625 The value of i in main()after calling sqr(x)is 25,结论:在值的传递调用中,只是实参的复制值被传递,被调用
17、函数中的操作不会影响实参的值。,2023/10/6,程序设计基础(C语言)wh,31,6.2 函数的定义和调用,6.2.4 函数参数及函数间的数据传递,地址的传递:调用函数将实参(数组名或指针型变量)的地址作为参数传递给形参。若实参是数组名,则调用函数将实参数组的起始地址传递给形参的临时变量单元;若实参是指针变量或地址表达式,则调用函数将实参指针变量所指向单元的地址或实参的地址传递给形参的临时变量存储单元。,传递形参值的两种方法,特点:形参与实参占用相同的内存单元.双向传递实参和形参必须是地址常量或变量,2023/10/6,程序设计基础(C语言)wh,32,void f(int b)int m
18、ax,max_i,i;max=b0,max_i=0;for(i=0;i10;i+)if(maxbi)max=bi;max_i=i;max=b0;b0=bmax_i;bmax_i=max;return;,#include stdio.h void main()void f(int b);int a10,i;for(i=0;i10;i+)scanf(”%d”,【例6_11】将数组中的最大元素值与第一个元素值交换,运行结果:0 1 2 3 4 5 6 7 8 9 9 1 2 3 4 5 6 7 8 0,结论:在地址的传递调用中,数组b与数组a共用同一存储空间。所以被传递的数据在被调用函数中对存储空间
19、的值做出某种 变动后,必然会影响到使用该空间的调用函数中变量的值。,2023/10/6,程序设计基础(C语言)wh,33,6.2 函数的定义和调用,6.2.4 函数参数及函数间的数据传递,一、非数组名作为函数参数,参数传递的两种形式,当非数组名作为函数参数,在函数调用时,C语言编译系统根据形参的类型为每个形参分配存储单元,并将实参的值复制到对应的形参单元之中,形参和实参分别占用不同的存储单元,且形参值的改变不影响与其对应的实参,即按“值的传递”方法操作。,2023/10/6,程序设计基础(C语言)wh,34,f(int a,int b)a=a+2;b=b+4;printf(”a=%d,b=%d
20、n”,a,b);return(a);,#include stdio.h void main()int f(int a,int b);int x=1,y=2,z;static int a=0,1,2,3,4;z=f(x,y);printf(”z=%d,x=%d,y=%dn”,z,x,y);z=f(a3,a4);printf(”z=%d,a3=%d,a4=%dn”,z,a3,a4);z=f(x,y+1);printf(”z=%d,x=%d,y=%dn”,z,x,y);,【例6_12】非数组名作为参数的值的传递程序举例,运行结果:,a=3,b=6,z=3,x=1,y=2,a=5,b=8,z=5,a3
21、=3,a4=4,a=3,b=7,z=3,x=1,y=2,2023/10/6,程序设计基础(C语言)wh,35,6.2 函数的定义和调用,6.2.4 函数参数及函数间的数据传递,二、数组名作为函数参数,参数传递的两种形式,单个数组元素可以作为函数参数,这同非数组名作为函数参数的情形完全一样,即遵守”值传递”方式。,2023/10/6,程序设计基础(C语言)wh,36,1、数组名作为函数参数的表示方法,当数组名作为函数参数时,需要对其类型进行相应的说明 例如 int test(int array10).,若数组说明时不指定数组的长度,可用另一个参数来表示数组的长度 例如 int test(int
22、array,int n).,用形参n来表示array数组的实际长度,更灵活,2023/10/6,程序设计基础(C语言)wh,37,int solve(int a,int n)int sum,i;sum=0;for(i=0;in;i+)if(ai!=0)sum+;return(sum);,【例6_13】编一函数,用来统计一个一维数组中非0元素的个数,用形参n来表示a数组的实际长度。,2023/10/6,程序设计基础(C语言)wh,38,1、数组名作为函数参数的表示方法,当多维数组名作为函数参数时,除第一维可以不指定长度外,其余各维都必须指定长度。例如 check(float a 10,float
23、 n).,下面的参数说明都是不正确的:例如 float a;或 float a10;.,2023/10/6,程序设计基础(C语言)wh,39,说明:,用数组名作为函数参数时,应该在调用函数和被调用函数 中分别定义数组。,实参数组和形参数组类型应一致,否则出错。,形参数组的大小应大于等于实参数组的大小,否则得不到 实参数组的全部值。,特别注意的是,数组名作为函数参数时,是将实参数组 的首地址传给形参数组,两数组的对应元素占用同一内 存单元。传递时按数组在内存中排列的顺序进行。,2023/10/6,程序设计基础(C语言)wh,40,2、数组名作为函数参数的传递方式,数组名作为函数参数时,不是采用“
24、值传递”方式,而是采用“地址传递”方式。这意味着形参数组中某一元素的改变,将直接影响到 与其对应的实参数组中的元素。,2023/10/6,程序设计基础(C语言)wh,41,void sort(int array10)int i,j,k,t;for(i=0;i9;i+)k=i;for(j=i+1;j10;j+)if(arrayjarrayk)k=j;t=arrayk;arrayk=arrayi;arrayi=t;,#include stdio.h void main()int x10,i;void sort(int array10);for(i=0;i10;i+)scanf(”%d,”,【例6_
25、14】将一个10个元素的一维数组用函数调用实现选择排序。,9,8,7,6,5,4,3,2,1,0,The sorted array:,0,1,2,3,4,5,6,7,8,9,scanf(”%d,”,2023/10/6,程序设计基础(C语言)wh,42,6.3 嵌套调用和递归调用,C语言中的函数定义是互相独立的,函数和函数之间没有从属关系,即一个函数内不允许包含另一个函数的定义。一个函数既可以被其他函数调用,同时,它也可以调用别的函数,这就是函数的嵌套调用。函数的嵌套调用为自顶向下、逐步求精及模块化的结构化程序设计技术提供了最基本的支持。,2023/10/6,程序设计基础(C语言)wh,43,6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 模块 设计
链接地址:https://www.31ppt.com/p-6221441.html