1、1计算机程序设计计算机程序设计C语言程序设计语言程序设计2中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China第八章函数第八章第八章函函 数数3中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China8 函数函数本章主要介绍了模块化程序设计的思想,讲解函数定义的方式、函数的参数的传递方式、函数的返回值。同时重点讲解了局部变量和全局变量的区别和注意事项。重点:模块化程序设计的思想,和局部变量和全局变量的区别。4中北大学计算机系基础教研
2、室中北大学计算机系基础教研室2023-8-17 2006-7 North University of ChinaC语言的函数语言的函数C语言的特点n结构化程序设计n模块化程序设计C语言中的函数是支持程序设计实现模块化和层次结构的基础,C语言函数是由完成某一特定任务的说明语句和执行语句组成的基本功能单元5中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China8-1 概述概述问题的提出问题的提出:n设计一程序,实现学生成绩的处理:求平均值、方差、分段统计等。n解决方法:解决方法:可以顺序地在程序中,实现这些算法。但可
3、能出现的问题是程序重复、不容维护n好的解决方法好的解决方法:采用结构化程序设计的思路,分模块设计 函数例:通过调用求最大值函数,实现求a,b 的最大值6中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China示例示例 main()int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(max=%dn,c);int max(int x,int y)int z;if(xy)z=x;else z=y;return z;7中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8
4、-17 2006-7 North University of China函数的一般形式函数的一般形式函数的一般形式:类型说明符 函数名(形参表列)形参说明;数据描述;算法实现;例如:例如:y=x2-1float y(x)float x;return(x*x-1);8中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China说明说明函数名n程序自定义的标示符,用以标识该函数类型说明符n定义函数返回的数值类型n可以为C语言中的任意类型、整型时可以省略,无数值返回时,可以用void表示返回值nReturn中的表达式的值,返
5、回给函数名(函数调用)形参表列n以逗号分隔的变量名表,值由主调函数初始化9中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China函数的特点函数的特点C 语言中关于函数的约定:语言中关于函数的约定:n一个源程序文件由一个或多个函数组成,但有且仅有一个main()函数n一个程序可以由多个文件组成;n程序从main()开始执行,由主函数结束n函数之间的关系相互独立,不存在从属关系n主函数和其它函数发生关系是靠函数调用实现的10中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 Nort
6、h University of China函数调用函数调用:实参实参=形参形参调用函数应注意n任何函数均可相互调用(main除外)n主调函数、被调函数main()float a;float y(float);a=3;printf(%.2fn,y(a);float y(x)float x;return(x*x-1);11中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China对被调函数的说明对被调函数的说明被调函数在整个程序之前或者函数类型是基本整型声明部分可以省略。12中北大学计算机系基础教研室中北大学计算机系基础
7、教研室2023-8-17 2006-7 North University of China函数的分类函数的分类用户角度n标准库函数(系统函数)n用户自定义函数形参(函数形式)n无参函数n有参函数13中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China8-2 函数的定义、返回值函数的定义、返回值无参函数的定义#includestdio.hmain()void beep();beep();void beep()int i;for(i=0;i形参(数据的抽象表示,定义的时候不占内存空间)15中北大学计算机系基础教研室
8、中北大学计算机系基础教研室2023-8-17 2006-7 North University of China返回值返回值格式功能n返回该函数一个值n结束该函数n数据类型不一致时,自动转换为函数的定义类型16中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China程序举例程序举例例编写函数将某一字母变成大写字母算法分析:n小写字母=大写字母 C-32n返回值:returnn类型:字符型17中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of C
9、hina参考程序参考程序char pro(c)char c;if(c=a&c=a&ctype w1.cmain()int a=1;printf(%d,%dn,a,a+);D:TCw1.exe2,122中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China示例示例int max(int x,int y)int z;if(xy)z=x;else z=y;return z;main()int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(max=%dn,c);#include i
10、nt max(int x,int y);main()int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(max=%dn,c);int max(int x,int y)int z;if(xy)z=x;else z=y;return z;被调函数放在主调函数之前主调函数之前(内)加函数声明23中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China函数期间函数期间执行过程执行过程 main函数 c=max(a,b);函数调用 执行max函数 return返回 调用结果int m
11、ax(int x,int y)int z;z=xy?x:y;return z;main()int a=3,b=5,c;c=max(a,b);printf(max=%dn,c);abcxyz24中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China注意事项注意事项一个函数只能有一个返回值函数调用不能改变实参的值主调函数不能使用被调函数中的变量主调函数中的变量也不能用于被调函数中变量起作用的范围只限本函数(局部变量)25中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North
12、University of China程序举例程序举例例输入两数,逆序输出判断结果:判断结果:3,55,33,526中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China8-4 函数的参数函数的参数 函数调用的执行过程n实际参数被传递给被调函数的形式参数,实参和形参的数据类型以及传递顺序必须一一对应(赋值兼容)n把控制传递给函数的第一条语句,执行函数体n在函数体中,执行返回语句return,把控制和返回值返回主调函数。如无返回语句时,则执行完最后一条语句时,把控制返回主调函数n除void类型外,所有函数都返回一个
13、值,值由return语句表达式返回n只要是非void型,函数返回值(函数调用)均可作为操作数出现在表达式中27中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China参数的传递参数的传递如果函数需要参数,它就必须定义用来接受实参数据的形参,形参和实参不仅具备同样的数据类型,而且必须选择正确的传递方法通常有两种方法实现参数的传递:28中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China传值调用传值调用这种方法采用复制的形式把实参的值传
14、递给形参,被调函数中形参的改变对于主调函数中的形参而言没有影响数据数据数据数据29中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China传址调用传址调用(数组作函数参数数组作函数参数)传址调用是被调函数的形参和主调函数中的实参在内存中占据相同的位置,可以实现函数中对主调函数的数据进行操作数组名作函数的形参和实参时传递的是数组的首地址,形参和实参共享存储单元,形参的改变影响实参的改变。数组元素只能做函数的实参。30中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North Un
15、iversity of China程序举例程序举例例编两个函数,分别实现对数组的输入和输出31中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China注意事项注意事项在主调函数和被调函数中,作为实参和形参出现的数组要分别定义,类型应一致,数组名可以相同函数调用时,传递数组名(地址),对形参的数组个数不作检查,因此,可以不必声明长度习惯上实参数组名,长度a,N形参数组名,变量a,n32中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of Chin
16、a参考参考33中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China例:编写函数用例:编写函数用“冒泡法冒泡法”排排序序void sort(array,n)int array,n;int i,j,t;for(i=1;in;i+)for(j=1;jaj)t=arrayj-1;arrayj-1=arrarj;arrayj=t;#define N 10main()int aN,I;for(i=0;iN;i+)scanf(“%d”,&ai);sort(a,N);for(i=0;iN;i+)printf(“%8d”,ai)
17、;printf(“n”);34中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China函数的嵌套调用函数的嵌套调用函数之间没有从属关系即在一个函数的定义内不能再包含有另一个函数的定义,也就是说函数的定义不能嵌套,但是允许函数嵌套调用。所谓嵌套调用指的是在函数的调用过程中又出现了另外一种函数调用成为函数的嵌套调用。35中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China例:计算例:计算n!float fac(int n)float f
18、;if(n=0|n=1)f=1;else f=fac(n-1)*n;return(f);main()int n;float y;printf(“input n:”);scanf(“%d”,&n);y=fac(n);printf(“%d!=%.0fn”,n,y);36中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China局部变量和全局变量局部变量和全局变量局部变量指在一个函数内定义的变量,只在定义它的函数内起作用。允许在不同的函数中使用相同的变量名,它们代表不同的对象分配不同的内存互不干扰。全局变量:函数外定义的变
19、量称作全局变量。允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用。37中北大学计算机系基础教研室中北大学计算机系基础教研室2023-8-17 2006-7 North University of China变量的存储类型变量的存储类型变量定义的完整形式:存储类型 类型说明符 变量名表列;存储类型关键字主要有:auto、register、extern、static.变量在内存的存储分为静态存储和动态存储。静态存储的变量从程序开始到程序结束对应的存储单元都存在。动态存储的变量在使用时才分配存储单元,一旦使用结束变量的存储单元就结束。讲解P1418.6.4例子38 结束语当你尽了自己的最大努力时,失败也是伟大的,所以不要放弃,坚持就是正确的。When You Do Your Best,Failure Is Great,So DonT Give Up,Stick To The End39谢谢大家荣幸这一路,与你同行ItS An Honor To Walk With You All The Way演讲人:XXXXXX 时 间:XX年XX月XX日