




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 函数5.1 知识要点回顾C语言提供了丰富的库函数,如数学处理函数,字符处理函数,输入输出函数等,我们应学会调用这些函,可以提高编程效率。本章要掌握的知知要点主要有:库函数的正确调用、自定义函数的定义方法、函数的类型和返回值、形式参数与实际参数、参数值的传递、自定义函数的正确调用、嵌套调用、递归调用、局部变量与全局变量、变量的存储类别和外部函数与内部函数。5.1.1 函数的分类函数实质是事先编好的程序,从用户的角度看,函数可分两类,一类是库函数也叫标准函数(见主教材的附录D),另一类是用户自定义函数。5.1.2 库函数的调用 对每一类库函数,主教材附录D中都列出了在调用该库函数时,用户在源程序include命令中应该包含的头文件名,如调用数学库函数sin(x),sqrt(x)时,应用头文件#include或#include ”math.h”;但要注意include命令不是C语句,因此不能在最后加分号。调用库函数可以出现在表达式中,也可以出现在独立语句中。对库函数调用的一般形式为:函数名(参数表)。5.1.3自定义函数定义和调用1. 有参函数的定义的一形式存储类型 返回类型 函数名(参数表) 函数体语句 . return (表达式) 例1:下面是一个求n!的自定义函数:函数名返回类型参数表extern int fact (int n )存储类型 int s=1,k; for(k=1;k=n;k+) s=s*k;return s; 说明:(1)存储类型有extern(外部)和static(内部)两种,省略为extern。(2)返回类型是函数值的类型,如整数、实数等, 省略为int型。(3)参数说明表里的参数叫形式参数。(4)return的值为返回值,它的类型与函数的返回类型要一致。若不一致,函数值的类型为准。(5)函数可以没有return语句,程序执行到末尾,返回调用函数,带回不确定值。(6)为使被调用函数不带回值,须用void定义称”空类型“,不带回值。2. 无参函数的定义的一形式存储类型 返回类型函数名 函数体语句 说明:(1)存储类型是,有extern和static两种,省略为extern。(2)函数的返回类型省略为int型。(3)无参函数一般不要返回值,可用void定义,使函数没有返回值,如void putstar(),void hello()。(4)sum() 为空函数,表示什么也不做。3.自定义函数的调用(1)自定义函数放在main( )函数前面的调用方式例2 float sum( int n) int k; float s=0; for(k=1;k=n;k+) 自定义函数放在main( )函数前面s=s+n; return s ;main() int x; float s;scanf(“%d”,&x);s=sum(x); printf(“s的值为%d”,s);(2)自定义函数放在main( )函数后面的调用方式:例3 #include int max(int x, int y, int z); int main() int i, j, k; scanf(%d,%d,%d, &i, &j, &k); max(i, j, k); getch(); max(int x, int y, int z) int max; max=xy?x:y; max=maxz?max:z; 自定义函数放在main( )函数后面z=1000;printf(The max data is %dn, max); 说明:(1)调用函数时,函数名必须与所调用的函数名字完全一致。(2)函数调用时由实参传递给形参,即“值传递”,对数组传递的是首地址值。(3)形参和实参必须个数相等次序相同,类型一致,但名称不必相同,调用时,相应位(4)置上的变量传给对应的参数。(5)一个程序必须有一个主函数,用户定义的函数可以是任意多个,位置可在main()函数前,也可在其后。所有函数都是平行的,函数可以递归调用,也可以调用本身,但不能在函数内部再定义函数,即嵌套定义。(5)函数调用可以出现在独立执行语句、表达式、函数的实参中等,但不能出现在形参中。(6)函数的参数可以是逗号表达式,如fun(e1,e2),(e3,e4,e5)。(7)自定义函数放在程序后面, 则函数需声明,函数声明后面的分号不能省。若自定义函数类型为int与char型时,可省略声明。5.1.4 函数的递归调用所谓递归调用,就是指定义的函数自己直接或间接调用自己。满足函数递归调用有两个条件:一是总有一个结束条件,这个结束条件称为”边界条件”,二是有一个递归调用公式。f(a,b,c) . . .f(x,y,z); 直接调用 间接调用 间接调用g(t,b) . . .f(x,y,z); f(a,b,c) . . .g(x,y); 5.1.5 函数中变量的分类1局部变量与全局变量在c语言中,把在函数内部或复合语句内部定义的变量,称为局部变量,也称内部变量,局部变量的作用范围只适用于所在函数或复合语句内部。注意,函数的形参属于局部变量,在函数外部定义的变量,称为全局变量,也称外部变量,全局变量一般在整个程序中起作用。例:#includeint fun(int x);main()x,k为局部变量,在主函数main()中有效 int x=5,k=2; x=fun(x); printf(“%d,%dn”,x,k);int fun(int m)int x,k;x1,y,z在复合语句中有效 float x1,y,z;x,k为局部变量,在自定义函数fun中有效 z=x1+y;z=x*k; x=m;if(x0)k=2*x; printf(“%d,%dn”,x,k);return k;elsereturn x;把这种定义函数内部的或复合语句内部的变量叫叫局部变量。注意:形参是局部变量,其有效范围只能在自定义函数中有效。float add(float x,float y);float z;main()z为全局变量,在整个程序中起作用z=3;printf(“调用函数结果=n”,add(1,3);float add(float x,float y); float h;h=x+y+z;return h; 把这种把定义在函数外部的变量叫全局变量。如把int z 放存程序文件末尾 则用 extern声明全局变量。当全局变量与局部变同名时,执行到局变量时,局部变量起作用。2. 动态变量与静态变量在c语言中,变量有两种存储类别:一种是自动类,也称动态类,加一种是静态类。(1) 在函数内部或复合语句中定义的局部变量或者用auto说明符说明的变是都为动态类变量,动态变量的特点是:用时分配空间,用完后立即释放,即变量所赋值没有了。(2) 在函数内部或复合语句中用static来说明的一个变量或程序中定义的全局变量都为静态类变量,静态类变量的特点是:在函数运行时不会被释放,函数执行完后,值还会保留,一直保留到程运行结束。(3) 函数中变量的隐含存储类型为动态类auto。(4)静态变量变量的初值是编译时赋的,程序执行期间不再赋予初值,对未赋初值的静态变量自动赋0。注:还有一种特殊的自动类变量register叫寄存器变量,它的作用将变量的值保留在CPU的寄存器中,来提高程序的执行速度。如定义两个寄存器变量a和b,其定义形式为:register int a,b;5.2 实训内容实验一 验证性实验一、实验目的1、验证主教材中典型例题。2、掌握自定义函数的定义和调用方法。3、理解和掌握多模块的程序设计与调试的方法。4、函数的递归调用方法。5、全局变量与局部变量的作用范围。6、动态变量与静态变量的使用方法。二、实验设备和仪器1、IBM PC或兼容计算机2、Windows 9x/2000/XP操作系统3、Visual C+6.0三、实验内容(一)调试程序1:1、实验要求:函数编程:利用函数调用的方式编程求表达式的 (1+2+3.M)+(1+2+3.N)/(1+2+3P)的值,M、N、P通过键盘输入。例如输入 3 5 6则输出结果为:1 ;输入5 6 7则输入结果为:1.2875。2、程序代码proc1.c:#include float add(int m) int n; float s=0; for(n=1;nk, 则组合数 c为c=(j!-k!)/k!。!为阶乘的符号。若输入6,2则输出结果为359。若输入7,5则输出结果为41。2、程序代码proc1.c如下:#includefloat jc(int);main() int j,k; float rt; scanf(%d,%d,&j,&k); rt=( jc(j)- jc(k) )/ jc( k ); printf(rt=%fn, rt);float jc(int n) int i;float j=1.0; for(i=1;i=n;i+) j=j*i; return j; 3、实验步骤步骤一:打开“Visual C+”软件,在图5.4的编辑状态输入如下程序代码:图5-4 编辑程序图5-5 执行结果步骤二:选择“编译”项进行编译,然后“执行”程序,如图5-5输入6,2输出结果为rt=359.000000。图5-6 执行结果步骤 三:重复执行程序,如图5-6所示,输入7,5输出结果rt=41.000000(三)调试程序3:1、实验要求:函数编程:程序功能是从12个球中,其中三个红球、三个白球、六个黑球,每次取出八个球,问有多少种取法,并将各种可能的取法打印出来。2、程序prog3.c源代码:#includevoid pri(int r, int w);main() int r,w,sum=0,i=1;for(r=0;r=3;r+) for(w=0;w=2)sum=sum+1;printf(第%2d种取法:,i);pri(r,w);i+; printf(n共有 %d 种取法n,sum); void pri(int r, int w) int b,i;b=8-r-w;for(i=1;i=r;i+)printf(红);for(i=1;i=w;i+)printf(白);for(i=1;in,且n0)。若输入112,77则输出最大公约数为7;若输入48,24则输出最大公约数24。2、程序prog4.c源代码:#includeint fgcd(int m,int n);main()int m,n,r;printf(请输入m和n的值n);scanf(%d,%d,&m,&n);if(nm)printf(input error!);elser=fgcd(m,n);printf(最大公约数是:%dn,r);int fgcd(int m,int n) if(n=0) return m; else fgcd(n,m%n); 3、实验步骤:图5-9 编辑程序步骤一:打开“Visual C+”,在图5-9的编辑状态输入如下程序代码:图5-10 执行结果步骤二:选择“编译”项进行编译,然后“执行”程序,如图5-10所示,输入112,77输出结果为7。图5-11 执行结果步骤三:重复执行程序,如图5-11所示,输入48,24输出结果为24。(五)调试程序5:1、实验要求:函数编程:程序功能是通过函数调用来输出动态变量与静态变量的值,从而理解它们之间区别。动态变量用时分配空间,用完后立即释放。静态变量,在程序运行时不会被释放,值还会保留,一直到程序结束。下面程序的输入结果是i=1,j=1i=1,j=2, i=1,j=3,i=1,j=4。2、程序prog5.c源代码:#includeint f();main() int k; for(k=0;k4;k +) f(); int f() int i=0; static int j=0;i=i+1;j=j+1; printf(i=%dn,i);printf(j=%dn,j);return; 3、实验步骤:图5-12 编辑程序步骤一:打开“Visual C+”,在图5-12的编辑状态输入如下程序代码:图5-13 执行结果步骤二:选择“编译”项进行编译,然后“执行”程序,如图5-13所示的输出结果。四、实验报告要求1、写出程序一的实验原理与考查知识点。2、写出程序二的实验原理与考查知识点。3、写出程序三的实验原理与考查知识点。4、写出程序四的实验原理与考查知识点。5、写出程序五的实验原理与考查知识点。6、写出在程序调试过程中遇到的问题和解决方法。实验二 启发性实验一、实验目的1、掌握多模块的程序设计与调试的方法。2、掌握函数程序填空的方法。3、掌握函数程序改错技巧。4、掌握函数程序编程能力二、实验设备和仪器1、IBM PC或兼容计算机2、Windows 9x/2000/XP操作系统3、Visual C+6.0三、实验内容1、填空题:请补充fun函数,fun函数的功能是:计算并输出n(包括n)以内能被3或7整除的所有自然数的倒数之和。例如,在主函数中输入50,输出为:s=1.425889。注意:部分源程序已给出。输入并调试程序,使程序得出正确结果不得增行或删行,也不得更改程序的结构!仅在fun函数的横线上填入。#include double fun(int n)int i;double sum = 0.0;for (i=1; i=n; i+)if (i%3=0 | i%7=0)sum += 1.0/i;return sum; main()int n;double s;printf(nInput n: );scanf(%d, &n);s = fun(n);printf(nns=%fn, s); 2、改错题:给定程序的功能是:读入一个整数k(2k1000),打印它的所有质因子。例如,若输入整数2310,则应输出:2、3、5、7、11。请改正程序中的错误,使程序能输出正确的结果。注意:不要改动main函数, 不得删行或减行。#include #include /*found*/IsPrime(int n)int i, m;m = 1;/*found*/for (i=2; in; i+)if (!(n%i)m = 0;break;return(m); main()int j, k;printf(nplease enter an integer number between 2 and 10000:);scanf(%d, &k);printf(nnThe prime factor(s) of %d is(are):, k);for (j=2; jk; j+)if (!(k%j) & (IsPrime(j)printf( %4d, j);printf(n);3、编程题:编写函数fun,函数的功能是根据以下公式计算s,计算结果作为函数值返回;n通过形参传入。s=1+1/(1+2)+1/(1+2+3)+.1/(1+2+3+4n)例如:若n的值为11时,函数的值为1.833333。#includefloat fun(int n) float s,m,i,t;s=0;m=0;for(i=1;i=n;i+)m=m+i; t=1.0/m; s=s+t;return(s); main()int n; float s; scanf(“%d”,&n); s=fun(n);printf(“The result is %fn”,s);实验三 启发性实验一、实验目的1、掌握多模块的程序设计与调试的方法。2、掌握函数程序填空的方法。3、掌握函数程序改错技巧。4、掌握函数程序编程能力二、实验设备和仪器1、IBM PC或兼容计算机2、Windows 9x/2000/XP操作系统3、Visual C+6.0三、实验内容1、填空题:给定程序中,函数fun的功能是:将形参n中各位上为偶数的数取出,按原来从高位到低位的顺序组成一个新的数,并作为函数值返回。例如,从主函数输入一个整数27638496,函数返回值为26846。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:不得增行或删行,也不得更改程序的结构!#include unsigned long fun(unsigned long n) unsigned long x=0,s,i; int t; s=n;/*found*/ i= 1 ;/*found*/ while(s!=0) t=s%10; if(t%2=0) /*found*/ x=x+t*i; i= i*10; s=s/10; return (x); main() unsigned long n=-1; while(n99999999|n0) printf(input(0n100000000): ); scanf(%ld,&n); printf(nThe result is: %ldn,fun(n);2改错题:以下程序中,函数fun的功能是:求s的值。设s=22/(1*3)x42/(3*5)x62/(5*7)x.x((20*k)+2)/(2k*(2k+1)例如当k为10时,函数值应为1.533852,请改正程序中的错误,使程序能输出正确的结果。注意:不要改动主函数。#include#include#include/*/Float fun(int k) int n; float s,w,p,q;n=1; s=1.0;while(n=k) w=2.0*n;p=w-1.0;q=w+1.0;s=s*(w*10+2)/p/q; n+;/*/return s ;main() printf(“%fn”,fun(10);3编程题:请编写一个函数float fun(float h),函数的功能是对变量h中的值保留2位小数,并对第三位进行四舍五入(规定h的值为正数)。例如h的值为:8.32433,则函数返回8.32。h的值为:8.32533,则函数返回8.33。#include #include float fun(float h) main() float a; printf(Enter a: );scanf(%f,&a); printf(Th
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 发外喷涂合同(标准版)
- 浆膜腔积液图谱课件
- 活性炭企业安全培训内容课件
- 活字印刷幽默课件
- 活塞连杆组的拆装课件
- 活塞压缩机基础培训课件
- 2025年红木帆船项目提案报告模板
- 洪泽消防安全培训课件
- 2025年原木加工项目提案报告
- 安全用具培训的意义
- 山体滑坡事故应急处理模版课件
- 体检中心投诉处理流程
- 银行解冻申请书
- 基于学科核心素养下的教学设计
- 人教版英语七年级(全册)单词表
- 全心衰竭的治疗与护理
- 扩张型心肌病治疗及护理
- 2002版干部履历表(贵州省)
- DL∕T 1396-2014 水电建设项目文件收集与档案整 理规范
- 行路难课件8省公开课一等奖新名师比赛一等奖课件
- 防欺凌隐患排查和矛盾化解记录表
评论
0/150
提交评论