《计算机等级考试二级C语言配套课件第07章函数.ppt》由会员分享,可在线阅读,更多相关《计算机等级考试二级C语言配套课件第07章函数.ppt(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第第第7 7 7 7章章章章 函数与模块化程函数与模块化程函数与模块化程函数与模块化程序设计基础序设计基础序设计基础序设计基础7.1 7.1 概述概述7.2 7.2 函数的定义函数的定义7.3 7.3 函数的调用函数的调用7.4 7.4 函数说明函数说明7.5 7.5 函数与被调函数之间的数据传递函数与被调函数之间的数据传递 6.1 6.1 概述概述7.17.1概述概述 C语言是 结构化程序设计语言,通常采用自顶向下逐步求精的模块化程序设计方法和单入口单出口控制结构。复杂问题(复杂任务)复杂问题(复杂任务)子子任任务务1子子任任务务2子子任任务务3子子任任务务N N。子子任任务务1子子任任务
2、务2子子任任务务1子子任任务务2子子任任务务1子子任任务务1 C语言是通过函数来实现模块化程序设计的。所以较大的C语言应用程序,往往是由多个函数组成的,每个函数分别对应各自的功能模块在C语言中,函数就是完成相对独立功能的一段程序 6.1 6.1 概述概述7.17.1概述概述 C语言是 结构化程序设计语言,通常采用自顶向下逐步求精的模块化程序设计方法和单入口单出口控制结构。(在第一章中已经介绍)。C语言是通过函数来实现模块化程序设计的。所以较大的C语言应用程序,往往是由多个函数组成的,每个函数分别对应各自的功能模块在C语言中,函数就是完成相对独立功能的一段程序从函数使用的角度来看,从函数使用的角
3、度来看,C C语言的函数可以分为两类:语言的函数可以分为两类:标准库函数和用户自定义函数。标准库函数和用户自定义函数。1.Turbo C系统提供了400多个标准库函数(参见附录8)按功能可以分为:(1)类型转换函数,(2)字符判别与转换函数,(3)字符串处理函数,(4)标准I/O函数,(5)文件管理函数,(6)数学运算函数等。它们的执行效率高,用户需要时,可在程序中直接进行调用。6.2 6.2 函数的定义函数的定义7.2 7.2 库函数库函数(1 1)c c语言程序设计中,使用的之前要求在程序开头出语言程序设计中,使用的之前要求在程序开头出包含以下命令行包含以下命令行:#include “文件
4、名。h”或#include 注意:以上声明实际上告诉计算机所使用函数的出处,注意:以上声明实际上告诉计算机所使用函数的出处,这是一条命令,在这是一条命令,在13章将详细介绍。它不是一条语句,章将详细介绍。它不是一条语句,所以不能在其后加所以不能在其后加“;”(2 2)标准库函数的调用)标准库函数的调用:a a、作为语句的一部分,即出现在表达式中,此、作为语句的一部分,即出现在表达式中,此时该函数在调用后会返回一个值。时该函数在调用后会返回一个值。y=pow y=pow(x x,2.52.5)+1.3+1.3 b b、作为单独语句完成某种操作,此时该函数是不、作为单独语句完成某种操作,此时该函数
5、是不需要返回值的。需要返回值的。printf printf(”Hello world”Hello world!”););函数值类型名 函数名(形式参数类型及参数说明)数据说明部分 语句部分 1、函数定义形式如如:int max(int a,int b)return a+b 6.2 6.2 函数的定义函数的定义7.3 7.3 函数定义和返回值函数定义和返回值注意:1、函数名和形式参数都是合法的标识,用用户指定。在同一个程序中,函数名应该唯一;2、C语言规定,函数不可嵌套定义;3、如果省略了“函数值类型名”,则默认情况下,返回int型数据;4、除了返回值类型为int类型的函数外,函数必须先定义,后
6、使用;5、若函数功能只是完成某种操作,不需要返回值时,应将其返回类型定义为void函数首部函数首部函数体函数体return语句的表示形式如下:语句的表示形式如下:return 表达式;表达式;或或 return(表达式);(表达式);2、函数返回值、函数返回值在函数调用过程中,有时被调函数要向调用函数带回一个值,在函数调用过程中,有时被调函数要向调用函数带回一个值,这个被带回主函数的值称为函数的返回值。在这个被带回主函数的值称为函数的返回值。在c语言中,要实语言中,要实现这样的操作,要用到现这样的操作,要用到retuen语句语句 6.2 6.2 函数的定义函数的定义例例6-3:写出以下程序的运
7、行结果。:写出以下程序的运行结果。max()/*函数类型缺省,为函数类型缺省,为int型,型,return语句缺省语句缺省*/min()/*函数类型缺省,函数类型缺省,return语句缺省表达式语句缺省表达式*/return;main()printf(%d,%dn,max(),min()););程序运行结果为:程序运行结果为:-256,-256 /*返回值不确定,返回值不确定,TC2开发环境中返回值为开发环境中返回值为0*/若函数若函数max与函数与函数min的类型为的类型为float,则返回值为:,则返回值为:Floating point error:Domain.Abnormal prog
8、ram termination 6.2 6.2 函数的定义函数的定义在具有多个函数的在具有多个函数的C程序中,主函数出现的位置并不重程序中,主函数出现的位置并不重要。为阅读方便,可将主函数要。为阅读方便,可将主函数main放在最前面。为了避免放在最前面。为了避免过多的函数声明语句,习惯上将主函数放在所有函数之后。过多的函数声明语句,习惯上将主函数放在所有函数之后。不论主函数放在什么位置,一旦启动该程序,总是从主函不论主函数放在什么位置,一旦启动该程序,总是从主函数开始执行,并且最终在主函数结束整个程序的执行。数开始执行,并且最终在主函数结束整个程序的执行。3.函数函数main一个一个C语言程序
9、至少包含一个函数,并且必须有且只能有一语言程序至少包含一个函数,并且必须有且只能有一个名为个名为main的函数,称之为主函数。的函数,称之为主函数。在包含多个函数的程序中,不仅可以由主函数调用其它函在包含多个函数的程序中,不仅可以由主函数调用其它函数,还可以由被调函数调用其它函数,但任何函数都不能调数,还可以由被调函数调用其它函数,但任何函数都不能调用主函数。用主函数。通常主函数的类型定义为通常主函数的类型定义为void(在(在TC2中可省略函数中可省略函数main的的类型说明)。类型说明)。6.2 6.2 函数的定义函数的定义7.4 函数的调用函数的调用在在C语言的一般函数体中,可以包含对其
10、它函数的调用,语言的一般函数体中,可以包含对其它函数的调用,称为函数的嵌套调用,甚至包含对自身的调用,称为函数的称为函数的嵌套调用,甚至包含对自身的调用,称为函数的递归调用。递归调用。一个函数一旦被定义,就可在程序的其它函数中使用它,这一个函数一旦被定义,就可在程序的其它函数中使用它,这个过程称为函数调用。个过程称为函数调用。一一.函数的调用的两种形式函数的调用的两种形式函数名函数名(实际参数列表)实际参数列表)函数调用的一般形式:函数调用的一般形式:6.3 6.3 函数的调用函数的调用A、作为表达式的一部分、作为表达式的一部分 y=add(3.0,4.0)+2;B、做为对立的一条语句、做为对
11、立的一条语句 函数名(实参列表)函数名(实参列表);实际参数也称为实在参数,简称为实参,实际参数之间以实际参数也称为实在参数,简称为实参,实际参数之间以“,”分隔。分隔。函数调用时,实参与形参应保持个数、次序及类型的一致性,函数调用时,实参与形参应保持个数、次序及类型的一致性,以确保实参与形参之间数据的正确传递。以确保实参与形参之间数据的正确传递。实际参数一般为表达式,可以是常量、变量(调用时必须有实际参数一般为表达式,可以是常量、变量(调用时必须有确定的值或确定的地址)。确定的值或确定的地址)。函数调用时,函数名必须与所调用的函数名完全一样,函数函数调用时,函数名必须与所调用的函数名完全一样
12、,函数在调用之前需先定义,后调用。在调用之前需先定义,后调用。当实际参数的个数、次序、类型与对应形式参数的个数、次当实际参数的个数、次序、类型与对应形式参数的个数、次序、类型不一致时,系统并不提示错误,后果却难以预测。序、类型不一致时,系统并不提示错误,后果却难以预测。注意注意 6.3 6.3 函数的调用函数的调用例例6-4,函数语句调用与函数表达式调用。函数语句调用与函数表达式调用。#include void main()()printf(nk1=%d,printf(n%k2););程序运行结果为:程序运行结果为:k2k1=3 6.3 6.3 函数的调用函数的调用void main()/*主
13、函数中采用函数参数调用形式调用函数主函数中采用函数参数调用形式调用函数max2*/int x,y,z,m;scanf(%d,%d,%d,&x,&y,&z);printf(max=%dn,max2(max2(x,y),z);/*内层函数内层函数max2的值作为外层函数的值作为外层函数max2的实参,整个函数的实参,整个函数max2的值的值又作函数又作函数printf的的实参的的实参*/例例6-5:函数参数调用形式调用函数:函数参数调用形式调用函数max2:int max2(int a,int b)/*求两个数中较大者求两个数中较大者*/int y;y=(ab)?a:b;return y;6.3
14、6.3 函数的调用函数的调用二二.函数声明函数声明调用用户自定义函数时,一般调用函数和被调用函数应在同调用用户自定义函数时,一般调用函数和被调用函数应在同一个文件中,在调用函数中对被调用函数返回值的类型、函数一个文件中,在调用函数中对被调用函数返回值的类型、函数名称、函数形式参数的类型进行说明,这种说明称为函数声明。名称、函数形式参数的类型进行说明,这种说明称为函数声明。函数声明的一般形式如下:函数声明的一般形式如下:类型名类型名 函数名(类型函数名(类型1 形参形参1,类型,类型2 形参形参2,类型,类型n 形参形参n););或或类型名类型名 函数名(类型函数名(类型1,类型,类型2,类型,
15、类型n););或或类型名类型名 函数名();函数名();函数声明是以语句形式出现的,因此其后有语句结束标记函数声明是以语句形式出现的,因此其后有语句结束标记“;”。若函数定义放在主调函数之前,遵循先定义后调用原则若函数定义放在主调函数之前,遵循先定义后调用原则,函数函数声明可以省略。声明可以省略。6.3 6.3 函数的调用函数的调用double add(double a,double b););double add(double,double););add();();例例6-6:编程求两个整数的阶乘之和。编程求两个整数的阶乘之和。long fac(n)/*定义函数定义函数fac,其功能是求,其
16、功能是求n!*/int n;int i;long r=1;/*注意注意r的初始化值为的初始化值为1*/for(i=1;i=n;i+)r=r*i;return r;#include void main()int m1,m2;long result;long fac(int);/*在主函数中声明后面定义的函数在主函数中声明后面定义的函数fac*/scanf(%d,%d,&m1,&m2);result=fac(m1)+fac(m2);printf(%d!+%d!=%ldn,m1,m2,result);6.3 6.3 函数的调用函数的调用二二.形参与实参形参与实参形式参数形式参数(简称形参简称形参)定
17、义函数使用的参数定义函数使用的参数实际参数实际参数(简称实参简称实参)调用函数使用的参数调用函数使用的参数C语言中,采用函数之间的参数传递方式或用全局变量共享数语言中,采用函数之间的参数传递方式或用全局变量共享数据方式,使一个函数能对不同的数据进行相同功能的处理。据方式,使一个函数能对不同的数据进行相同功能的处理。C语言函数的参数传递均采用单向值传递方式(或称复制方式)。语言函数的参数传递均采用单向值传递方式(或称复制方式)。单向值传递方式是指在函数调用时,将实参之值传递给对应单向值传递方式是指在函数调用时,将实参之值传递给对应的形式参数,使形参具有与实参相同的值。的形式参数,使形参具有与实参
18、相同的值。当实际参数是变量的地址值、指针常量或指针变量时,实际参当实际参数是变量的地址值、指针常量或指针变量时,实际参数传递给形式参数的是地址值,也同样是单向值传递方式。数传递给形式参数的是地址值,也同样是单向值传递方式。6.3 6.3 函数的调用函数的调用7.6 调用函数与被调用函数之间的数据传递调用函数与被调用函数之间的数据传递C语言中,调用函数与被调用函数之间数据可以通过三种方式传递语言中,调用函数与被调用函数之间数据可以通过三种方式传递1、实参与形参之间的数据传递、实参与形参之间的数据传递2、通过、通过retrun语句把函数值返回调用函数语句把函数值返回调用函数3、通过全局变量,但这不
19、是一种好的方式,通常不提倡使用。、通过全局变量,但这不是一种好的方式,通常不提倡使用。请看以下程序请看以下程序#include Void try(int,int,int)/*声明函数声明函数try及形式参数类型及形式参数类型*/void main()int x=2,y=3,z=0;printf(“(1)x=%d y=%d z=%dn“,x,y,z);try(x,y,z);/*调用函数调用函数try,传递实参,传递实参x,y,z*/printf(“(4)x=%d y=%d z=%dn“,x,y,z);Void try(int x,int y,int z)printf(“(2)x=%d y=%d
20、z=%dn“,x,y,z);z=x+y;x=x*x;y=y*y;printf(“(3)x=%d y=%d z=%dn“,x,y,z);6.3 6.3 函数的调用函数的调用函数main函数tryxyzxyz实参与形参数据传递通过函数调用,将实参的值传递给形参通过函数调用,将实参的值传递给形参.函数调用时,系统对参数的处理步骤为:函数调用时,系统对参数的处理步骤为:(1)计算各实参的值,将实参的一个副本给形参,然后执行函数体。)计算各实参的值,将实参的一个副本给形参,然后执行函数体。(2)当函数执行完返回时,形参将自动销毁。)当函数执行完返回时,形参将自动销毁。6.3 6.3 函数的调用函数的调用
21、有关实参与形参的几点说明:有关实参与形参的几点说明:(1)在函数定义中指定的形参,未调用时,它们不占用存储单元。)在函数定义中指定的形参,未调用时,它们不占用存储单元。只有调用该函数时,形参才被分配空间,函数调用结束后,形参只有调用该函数时,形参才被分配空间,函数调用结束后,形参所占的存储单元被释放。所占的存储单元被释放。(2)实参为表达式。函数调用时,先计算表达式的值,然后将值)实参为表达式。函数调用时,先计算表达式的值,然后将值传递给形参。常量、变量、函数值都可看成是表达式的特殊形式。传递给形参。常量、变量、函数值都可看成是表达式的特殊形式。(3)定义函数时,形参的排列没有次序要求,但对形
22、参列表中每)定义函数时,形参的排列没有次序要求,但对形参列表中每个参数要进行说明。调用函数时,实参类型、个数及排列次序应个参数要进行说明。调用函数时,实参类型、个数及排列次序应与形参一一对应。若类型不一致,必须在参数前加上强制转换符,与形参一一对应。若类型不一致,必须在参数前加上强制转换符,否则会发生否则会发生“类型不匹配类型不匹配”的错误。的错误。(4)实参与形参的数据传递为单向传递,只可由实参向形参传)实参与形参的数据传递为单向传递,只可由实参向形参传递,不能由形参传回实参。实参与形参处在不同的函数中,作用递,不能由形参传回实参。实参与形参处在不同的函数中,作用的区域不同,即使实参与形参同
23、名,也是不同的变量。的区域不同,即使实参与形参同名,也是不同的变量。6.3 6.3 函数的调用函数的调用程序执行结果:程序执行结果:(1)x=2 y=3 z=0(2)x=2 y=3 z=0(3)x=4 y=9 z=5(4)x=2 y=3 z=0历年国家计算机等级考试题目1、若有代数式 (其中e仅代表自然对数的底数,不是变量),则以下正确的表示该代数式的C语言程序表达式是()2007.04A、sqrt(abs(nx+ex)B、sqrt(fabs(pow(n,x)+pow(x,e)C、sqrt(fabs(pow(n,x)+exp(x,e)D、sqrt(fabs(pow(x,n)+exp(x)答案:
24、答案:C2、以下不能正确计算代数式 值的C语言表达式时()2005.09A)1/2*sin(1/2)*sin(1/2)B)Sin(0.5)*sin(0.5)/3C)Pow(sin(0.5),2)/3D)1/3*pow(sin(1.0),2)答案:答案:A3、在C语言中,函数返回值的类型最终取决于()2005.09A)函数定义时函数首部所说明的类型B)Return语句中表达式的类型C)调用函数时主函数传递的实参类型D)函数定义时形参类型答案:答案:A4、若个选项中变量均以正确定义,函数fun通过return语句返回一个函数值,以下选项错误的时()2006.04A)main().x=fun(2.1
25、0);.float fun(int a,int b).B)float fun(int a,int b).main().x=fun(2.10);.C)float fun(int,int)main().x=fun(2.10);.float fun(int a,int b).D)main()float fun(int,int);x=fun(2.10);.float fun(int a,int b).答案:答案:A5、以下isprime函数的功能时判断形参a是不是素数,是素数则函数返回1,否则返回0,请填空。2006.04int isprime(int a)int i;for(i=2;iy?x:y;i
26、nt f2(int x,int y)return xy?y:x;Main()int a=4,b=3,c=5d=2,e,f,g;E=f2(f1(a,b),f(c,d);f=f1(f2(a,b),f2(c,d);g=a+b+c+d+e-f;printf(“%d,%d,%d”,e,f,g);程序运行后输出结果()2005.04A)4,3,7 B)3,4,7 C)5,2,7 D 2,5,7答案:答案:A10、有以下函数定义:Void fun(inst n,double x)若以下选项中变量都已正确定义并赋值,则对函数fun()的正确调用是()2003.04A)fun(int y,double m);B
27、)k=fun(10,12.5);C)fun(x,n);D)void fun(n,x);答案:答案:C11、有以下程序:Fun(int x,int y)return(x+y);Main()int a=1,b=2,c=3,sum;sum=fun(a+,b+,a+b),c+);printf(“%dn”,sum);执行程序输出结果是()2006.09A)6 B)7 C)8 D)9答案:答案:C12、以下叙述错误的是()2006.4A)C程序必须有一个或一个以上的函数组成B)函数调用可以作为一个独立语句存在C)若函数有返回值,必须通过return语句返回D)函数形参的值也可以传回对应的实参答案:答案:D
28、13、有以下程序:Int fun(int n)if(n=1)return 1;else return(n+fun(n-1);main()int x;scanf(“%d”,&x);x=fun(x);printf(“%dn”,x);程序执行时,变量x输入10,程序的输出结果是()A)55 B)54 C)65 D)45答案:答案:A14、以下程序运行结果是_。Int k=0Void fun(int m)m+=k;k+=m;printf(“m=%dk=%d”,m,k+);Main()int i=4;Fun(i+);Printf(“i=%dk=%dn”,i,k);m=4k=4i=5k=515、以下程序中
29、函数fun()的功能时计算x2-2x+6,主函数中将调用fun函数计算:2006.9Y1=(x+8)2-2(x+8)+6Y2=sin2(x)-2sin(x)+6请填空:#include“math.h”Double fun(double x)return(x*x-2*x+6);Main()double x,y1,y2;printf(“Enter x:”);Scanf(“%lf”,&x);y1=fun(_)Y2=fun(_)Printf(“y1=%lf,y2=%lfn”,y1,y2);x+8Sin(x)16、有以下程序:Int sub(int n)return(n/10+n%10);Main()int x,y;scanf(“%d”,&x);Y=sub(sub(sub(x);Printf(“%dn”,y);若运行时输入1234,程序输出结果是(_)1016、以下程序运行后输出结果是_Void swap(int x,int y)int t;t=x;x=y;y=t;Printf(“%d%d”,x,y);Main()int a=3,b=4;swap(a,b);printf(“%d%dn”,a,b);4334
限制150内