文档详情

计算机等级考试二级C语言配套课件第07章-函数

沈***
实名认证
店铺
2024-10-30
PPT
146.54KB
约38页
计算机等级考试二级C语言配套课件第07章-函数_第1页
1/38
计算机等级考试二级C语言配套课件第07章-函数_第2页
2/38
计算机等级考试二级C语言配套课件第07章-函数_第3页
3/38

单击此处编辑母版标题样式,,2021/7/23,*,*,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,第7章 函数与模块化程序设计基础,7.1 概述,7.2 函数的定义,7.3 函数的调用,7.4 函数说明,7.5 函数与被调函数之间的数据传递,2021/7/23,1,,6.1 概述,7.1,概述,C语言是 结构化程序设计语言,,通常采用自顶向下逐步求精的模块化程序设计方法和单入口单出口控制结构2021/7/23,2,,复杂问题(复杂任务),子任务1,子任务2,子任务3,子任务,N,,子任务1,子任务2,子任务1,子任务2,子任务1,子任务1,C语言是通过函数来实现模块化程序设计的所以较大的C语言应用程序,往往是由多个函数组成的,每个函数分别对应各自的功能模块,在C语言中,函数就是完成相对独立功能的一段程序,,2021/7/23,3,,6.1 概述,7.1,概述,C语言是 结构化程序设计语言,,通常采用自顶向下逐步求精的模块化程序设计方法和单入口单出口控制结构在第一章中已经介绍),,C语言是通过函数来实现模块化程序设计的所以较大的C语言应用程序,往往是由多个函数组成的,每个函数分别对应各自的功能模块,在C语言中,函数就是完成相对独立功能的一段程序,2021/7/23,4,,从函数使用的角度来看,C语言的函数可以分为两类:标准库函数和用户自定义函数。

1. Turbo C系统提供了400多个标准库函数(参见附录8)按功能可以分为:,,(1)类型转换函数,(2)字符判别与转换函数,(3)字符串处理函数,(4)标准I/O函数,(5)文件管理函数,(6)数学运算函数等它们的执行效率高,用户需要时,可在程序中直接进行调用6.2 函数的定义,7.2,库函数,2021/7/23,5,,(1)c语言程序设计中,使用的之前要求在程序开头出包含以下命令行,:,#include “文件名h”或#include ,,注意:以上声明实际上告诉计算机所使用函数的出处,这是一条命令,在13章将详细介绍它不是一条语句,所以不能在其后加“;”,(2)标准库函数的调用,:,,,a、作为语句的一部分,即出现在表达式中,此时该函数在调用后会返回一个值y=pow(x,2.5)+1.3,,b、作为单独语句完成某种操作,此时该函数是不需要返回值的printf(”Hello world!”);,2021/7/23,6,,函数值类型名 函数名(形式参数类型及参数说明),,{数据说明部分,,语句部分,,},1 、函数定义形式,如: int max(int a,int b),,{,,return a+b,,},6.2 函数的定义,7.3,函数定义和返回值,2021/7/23,7,,注意:,,1、函数名和形式参数都是合法的标识,用用户指定。

在同一个程序中,函数名应该唯一;,,2、C语言规定,函数不可嵌套定义;,,3、如果省略了“函数值类型名”,则默认情况下,返回int型数据;,,4、除了返回值类型为int类型的函数外,函数必须先定义,后使用;,,5、若函数功能只是完成某种操作,不需要返回值时,应将其返回类型定义为void,double add( double a double b),,{double s;,,s=a+b;,,return s,,},函数首部,函数体,2021/7/23,8,,return语句的表示形式如下:,,return 表达式; 或 return(表达式);,2、函数返回值,在函数调用过程中,有时被调函数要向调用函数带回一个值,,,这个被带回主函数的值称为函数的返回值在c语言中,要实,,现这样的操作,要用到retuen语句,6.2 函数的定义,注意:1、函数返回值的类型要与函数首部说明类型保持一致,如,,果不一致,则以函数首部说明为准,系统进行类型的自动转化2、一个函数中可以有多个return,但当执行到第一个遇到的,,Return,函数则返回主调函数3、return后的表达式可省,但此时函数声明应为void,它的,,作用是使流程返回到主调用函数并没有确定的返回值。

如果函数中,,没有return,则函数将执行到函数的末尾“}”处,在返回到调用函数2021/7/23,9,,例6-3:写出以下程序的运行结果max( ),/*函数类型缺省,为int型,return语句缺省*/,,{ },,min( ),/*函数类型缺省,return语句缺省表达式*/,,{return ;},,main( ),,{printf("%d,%d\n",max(),min());},,程序运行结果为:,,-256,-256,/*返回值不确定,TC2开发环境中返回值为0*/,若函数max与函数min的类型为float,则返回值为:,Floating point error: Domain.,Abnormal program termination,6.2 函数的定义,2021/7/23,10,,◆,在具有多个函数的C程序中,主函数出现的位置并不重要为阅读方便,可将主函数main放在最前面为了避免过多的函数声明语句,习惯上将主函数放在所有函数之后不论主函数放在什么位置,一旦启动该程序,总是从主函数开始执行,并且最终在主函数结束整个程序的执行3. 函数main,■,一个C语言程序至少包含一个函数,并且必须有且只能有一个名为main的函数,称之为主函数。

◆,在包含多个函数的程序中,不仅可以由主函数调用其它函数,还可以由被调函数调用其它函数,但任何函数都不能调用主函数■,通常主函数的类型定义为void(在TC2中可省略函数main的类型说明)6.2 函数的定义,2021/7/23,11,,,7.4 函数的调用,★,在C语言的一般函数体中,可以包含对其它函数的调用,称为函数的嵌套调用,甚至包含对自身的调用,称为函数的递归调用☆,一个函数一旦被定义,就可在程序的其它函数中使用它,这个过程称为函数调用一. 函数的调用的两种形式,函数名(实际参数列表),函数调用的一般形式:,6.3 函数的调用,A、作为表达式的一部分 y=add(3.0,4.0)+2;,,B、做为对立的一条语句 函数名(实参列表),;,2021/7/23,12,,,◆,实际参数也称为实在参数,简称为实参,实际参数之间以“,”分隔■,函数调用时,实参与形参应保持个数、次序及类型的一致性,以确保实参与形参之间数据的正确传递◆,实际参数一般为表达式,可以是常量、变量(调用时必须有确定的值或确定的地址)■,函数调用时,函数名必须与所调用的函数名完全一样,函数在调用之前需先定义,后调用。

当实际参数的个数、次序、类型与对应形式参数的个数、次序、类型不一致时,系统并不提示错误,后果却难以预测注意,6.3 函数的调用,2021/7/23,13,,例6-4, 函数语句调用与函数表达式调用include ,,void main(),,{printf("\nk1=%d",printf("\n%k2"));},,程序运行结果为:,,k2,,k1=3,6.3 函数的调用,2021/7/23,14,,void main( ),/*主函数中采用函数参数调用形式调用函数max2*/,,{ int x,y,z,m;,,scanf("%d,%d,%d",&x,&y,&z);,,printf("max=%d\n",max2(max2(x,y),z));,,/ *内层函数max2的值作为外层函数max2的实参,整个函数max2的值又作函数printf的的实参*/,,},例6-5:函数参数调用形式调用函数max2:,int max2(int a,int b),/*求两个数中较大者*/,,{ int y;,,y=(a>b)?a:b;,,return y;},6.3 函数的调用,2021/7/23,15,,二. 函数声明,◆,调用用户自定义函数时,一般调用函数和被调用函数应在同一个文件中,在调用函数中对被调用函数返回值的类型、函数名称、函数形式参数的类型进行说明,这种说明称为函数声明。

■,函数声明的一般形式如下:,类型名 函数名(类型1 形参1,类型2 形参2,…,类型n 形参n);,或,类型名 函数名(类型1,类型2,…,类型n);,或,类型名 函数名();,◆,函数声明是以语句形式出现的,因此其后有语句结束标记“;”■,若函数定义放在主调函数之前,遵循先定义后调用原则,函数声明可以省略6.3 函数的调用,double add(double a,double b);,double add(double ,double );,add();,2021/7/23,16,,例6-6: 编程求两个整数的阶乘之和long fac(n),,/*定义函数fac,其功能是求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!=%ld\n",,,m1,m2,result);,,},6.3 函数的调用,函数说明位置:,,1、在所有函数外部、被调用之前说明函数时,在函数说明的语句,,后面所有位置都可以对这个函数进行调用;,,2、在调用它的函数内说明时,仅在这个函数内部可以识别它(即,,调用它),,2021/7/23,17,,二. 形参与实参,形式参数,,(简称形参),定义函数使用的参数,实际参数,,(简称实参),调用函数使用的参数,◆,C语言中,采用函数之间的参数传递方式或用全局变量共享数据方式,使一个函数能对不同的数据进行相同功能的处理。

■,C语言函数的参数传递均采用单向值传递方式(或称复制方式)◆,单向值传递方式是指在函数调用时,将实参之值传递给对应的形式参数,使形参具有与实参相同的值■,当实际参数是变量的地址值、指针常量或指针变量时,实际参数传递给形式参数的是地址值,也同样是单向值传递方式6.3 函数的调用,7.6 调用函数与被调用函数之间的数据传递,,C语言中,调用函数与被调用函数之间数据可以通过三种方式传递,,1、实参与形参之间的数据传递,,2、通过retrun语句把函数值返回调用函数,,3、通过全局变量,但这不是一种好的方式,通常不提倡使用2021/7/23,18,,请看以下程序,,#include ,,Void try(int,int,int),/*声明函数try及形式参数类型*/,,void main(),,{ int x=2,y=3,z=0;,,printf(,“(1)x=%d y=%d z=%d\n “,x,y,z,),;,,try(x,y,z);,/*调用函数try,传递实参x,y,z*/,,,printf(“(4)x=%d y=%d z=%d\n “,x,y,z);,,},,Void try(int x,int y,int z),,{,printf(“(2)x=%d y=%d z=%d\n “,x,y,z);,,z=x+y;x=x*x;y=y*y;,,printf(“(3)x=%d y=%d z=%d\n “,x,y,z);,,},6.3 函数的调用,2021/7/23,19,,函数main,函数try,x,y,z,x,y,z,实参与形参数据传递,通过函数调用,将实参的值传递给形参.,函数调用时,系统对参数的处理步骤为:,(1)计算各实参的值,将实参的一个副本给形参,然后执行函数体。

2)当函数执行完返回时,形参将自动销毁6.3 函数的调用,2021/7/23,20,,有关实参与形参的几点说明:,(1)在函数定义中指定的形参,未调用时,它们不占用存储单元只有调用该函数时,形参才被分配空间,函数调用结束后,形参所占的存储单元被释放2)实参为表达式函数调用时,先计算表达式的值,然后将值传递给形参常量、变量、函数值都可看成是表达式的特殊形式3)定义函数时,形参的排列没有次序要求,但对形参列表中每个参数要进行说明调用函数时,实参类型、个数及排列次序应与形参一一对应若类型不一致,必须在参数前加上强制转换符,否则会发生“类型不匹配”的错误4)实参与形参的数据传递为单向传递,只可由实参向形参传递,不能由形参传回实参实参与形参处在不同的函数中,作用的区域不同,即使实参与形参同名,也是不同的变量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,,2021/7/23,21,,历年国家计算机等级考试题目,,1、若有代数式 (其中e仅代表自然对数的底数,不是变量),则以下正确的表示该代数式的C语言程序表达式是( )《2007.04》,,A、sqrt(abs(n^x+e^x)),,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))),,答案:C,2021/7/23,22,,2、以下不能正确计算代数式 值的C语言表达式时()《2005.09》,,1/2*,sin(1/2)*sin(1/2),,Sin(0.5)*sin(0.5)/3,,Pow(sin(0.5),2)/3,,1/3*pow(sin(1.0),2),答案:A,3、在C语言中,函数返回值的类型最终取决于()《2005.09》,,函数定义时函数首部所说明的类型,,Return,语句中表达式的类型,,调用函数时主函数传递的实参类型,,函数定义时形参类型,答案:A,2021/7/23,23,,4、若个选项中变量均以正确定义,函数fun通过return语句返回一个函数值,以下选项错误的时()《2006.04》,,A) main(),,{….x=fun(2.10);….},,float fun(int a,int 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){…..},,答案:A,2021/7/23,24,,5、以下isprime函数的功能时判断形参a是不是素数,是素数则函数返回1,否则返回0,请填空。

《2006.04》,,int isprime(int a),,{int i;,,for(i=2;i<=a/2;i++),,if(a%i==0) ________;,,__________________;,,,,},return 0,return 1,2021/7/23,25,,6、有以下程序:,,fun(int x),,{int p;,,if(x==0 || x==1) return (3);,,p=x-fun(x-2);,,return p;,,},,Main(),,{ printf(“%d\n”,fun(7));}执行后输出结果是()《2006.9》,,A)7 B)3 C)2 D)0,答案:C,2021/7/23,26,,7、有以下程序:,,int fun1(double a) {return a*=a;},,int fun2(double x,double y),,{double a=0,b=0;,,a=fun1(x);b=fun1(y);return(int)(a+b);,,},,main (),,{double w; w=fun2(1.1,2.0);…..},,程序执行后变量w的值是()《2006.04》,,A)5.21 B)5 C)5.0 D)0.0,答案:B,2021/7/23,27,,8、设函数fun的定义形式为:,,Viod fun(char ch,float x){},,则以下函数fun()的调用语句中,正确的是()《2006.04》,,A)fun(”abc“,3.0) B)t=fun(‘D’,16.5),,C fun(‘65’,2.8) D)fun(32,32),答案:D,2021/7/23,28,,9、有以下程序:,,int f1(int x,int y){return x>y?x:y;},,int f2(int x,int y){return x>y?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.04》,,A)4,3,7 B)3,4,7 C) 5,2,7 D 2,5,7,答案:A,2021/7/23,29,,10、有以下函数定义:,,Void fun(inst n,double x) {……},,若以下选项中变量都已正确定义并赋值,则对函数fun()的正确调用是()《2003.04》,,A)fun(int y,double m);B)k=fun(10,12.5);,,C)fun(x,n); D)void fun(n,x);,答案:C,2021/7/23,30,,11、有以下程序:,,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(“%d\n”,sum);,,}执行程序输出结果是()《2006.09》,,A)6 B)7 C)8 D)9,答案:C,2021/7/23,31,,12、以下叙述错误的是()《2006.4》,,A)C程序必须有一个或一个以上的函数组成,,B)函数调用可以作为一个独立语句存在,,C)若函数有返回值,必须通过return语句返回,,D)函数形参的值也可以传回对应的实参,答案:D,2021/7/23,32,,13、有以下程序:,,Int fun(int n),,{if (n==1),,return 1;,,else,,return (n+fun(n-1));,,},,main(),,{int x;,,scanf(“%d”,,,printf(“%d\n”,x);,,}程序执行时,变量x输入10,程序的输出结果是(),,A)55 B)54 C)65 D)45,答案:A,2021/7/23,33,,14、以下程序运行结果是____________。

Int k=0,,Void fun(int m),,{m+=k;k+=m;printf(“m=%dk=%d”,m,k++);},,Main(),,{int i=4;,,Fun(i++);,,Printf(“i=%dk=%d\n”,i,k);,,},m=4k=4i=5k=5,2021/7/23,34,,15、以下程序中函数fun()的功能时计算x,2,-2x+6,主函数中将调用fun函数计算:《2006.9》,,Y1=(x+8),2,-2(x+8)+6,,Y2=sin,2,(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”,,,y1=fun(_______),,Y2=fun(________),,Printf(“y1=%lf,y2=%lf\n”,y1,y2);,,},x+8,Sin(x),2021/7/23,35,,16、有以下程序:,,Int sub(int n){return (n/10+n%10);},,Main(),,{int x,y;,,scanf(“%d”,,,Y=sub(sub(sub(x)));,,Printf(“%d\n”,y);,,}若运行时输入1234,程序输出结果是( ______________),10,2021/7/23,36,,16、以下程序运行后输出结果是_______,,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 %d\n”,a,b);,,},4334,2021/7/23,37,,注:,文档资料素材和资料部分来自网络,如不慎侵犯了您的权益,请联系文库客服,我们将做删除处理,感谢您的理解。

下载提示
相关文档
正为您匹配相似的精品文档