零基础计算机二级一级讲解课件_第1页
零基础计算机二级一级讲解课件_第2页
零基础计算机二级一级讲解课件_第3页
零基础计算机二级一级讲解课件_第4页
零基础计算机二级一级讲解课件_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 八 章 函 数 第8章 函 数 田 屏 第 八 章 函 数 模块化程序设计是面向过程程序设计的很重要的方法, C语言中的函数体现了这种思想。 本章主要介绍: 1、函数的定义 2、函数的调用 3、函数的声明 4、递归函数 5、变量的分类 6、函数与数组 第 八 章 函 数 8.1 函数的分类 1. 从函数的参数形式看,函数可分为两类: 无参函数; 有参函数 有参函数例:(输出两数中大者) #include int max( int x, int y ); main( ) int num1,num2,a; scnaf(“%d,%d“, a = max(num1,num2); printf(“max=%d“,a); int max( int x, int y ) int z; if(xy) z=x; else z=y; 第 八 章 函 数 2. 从用户使用的角度看,函数有两种 : 标准函数(库函数); 用户自己定义的函数 库函数:是由编译系统提 供的已设计好的函数。用 户只需调用而无需要去实 现它。前几章用过的scanf ,printf,getchar, putchar等都是库函数。 用户自定义函数:由程序员自己 定义和设计的 函数。需要程序员自 己来编写函数 功能实现代码。 3、 从作用的范围分为外部函数和内部函数 4 、从返回值的角度分成有返回值函数和无返回值 函数 第 八 章 函 数 函数名含义用法 abs求整数的绝对值int abs(int i); cos求余弦函数double cos(double x); exp求指数函数double exp(double x); labs取长整型绝对值long lasb(long n); log求对数函数long double(x) pow指数函数(x的y次方)double pow(double x,double y); sin求正弦值double sin(double x); sqr计算平方根double sqrt(double x); tan求正切值double tan(double x); itoa把整型转换为 字符型char *itoa(int value,char *string,int radix); tolower把字符转换为 小写字母int tolower(int c); toupper把字符转换为 大写字母int toupper(int c); rand随机发生器void rand(void); gettime取得当前系统时间void gettime(struct time timep); 表8.1常用标准库函数 第 八 章 函 数 8.2 函数的定义 1. 无参函数的定义形式 类型标识符 函数名() 声明部分 执行部分 例如: void print_message() printf(“n Hello!”); 无参数传递 2. 有参函数的定义形式 类型标识符 函数名(形式参数表列) 声明部分 执行部分 有参数传递 一、 函数的定义形式 第 八 章 函 数 例如: int max (int x, int y) /*求x和y二者中大者,x,y为形参*/ int z; /*函数体中变量的说明*/ z=xy?x:y; return (z); /*将z的值作为函数返回值*/ 3. 空函数的定义形式 类型标识符 函数名( ) 例如:dummy() 功能:调用后什么也不做。 用处:建立程序结构,在需要时补充功能。 第 八 章 函 数 (4) 函数体 由 括起来的部分称为函数体。由说明部分和 语句部分组成 (5) 函数的返回值 返回值可以是常数、变量或表达式,也可以是指 针,但不能是数组名或函数名。 return 表达式; return (表达式); 第 八 章 函 数 函数具有以下特征 (1)数据类型 定义函数时数据类型是用来说明该函数返回值的类 型,可以是整型、字符型、实型、指针型和其它构造类 型。如果省略,则系统默认为int型。 (2) 函数名 函数名是一个标识符,它的命名规则同变量相同。 (3) 形式参数表 形式参数(简称形参 )的说明形式如下: 数据类型 形式参数1,数据类型 形式参数2, 第 八 章 函 数 关于return语句说明如下: 1. 如果不需要从被调函数带回返回值可以不要 return语句。一种情况是将函数类型定义为void 型,也叫空类型. 例如:void printstar( ) 2、 还可以用不带表达式的return作为函数的逻辑结 尾,这时,return的作用是将控制权交给调用函 数,而不是返回一个值。也可以不用return。 return; 第 八 章 函 数 return语句是函数的逻辑结尾,不一定是函数 的最后一条语句,一个函数中允许出现多个 return语句,但每次只能有一个return语句被执 行。 int jitie(int x) if(x0 Y= 第 八 章 函 数 8.3 函数的调用 使函数得以运行称为函数的调用 函数调用格式: 函数名(实参表); 函数的调用过程是: 一、 如果是有参函数,则C系统首先为函数的形式参数 分配存储单元,将实参的值计算出后依次赋予对应的形参 ,称为值传递(传值),在C语言中这种数据传递是单向的 。 二、 执行函数体,根据函数中的数据类型定义,系统为 其中的变量分配存储单元并执行函数体中的可执行语句。 当执行到“返回语句”时,计算返回值返回主调函数继续运 行程序,如果是无返回值函数,则省略此操作。系统将释 放本函数体中定义的变量(静态型变量不释放),同时收 回分配给形参的存储单元。如果是“无参函数”,则无需进 行参数传递。 第 八 章 函 数 8.3.1 函数间的参数传递 1. 形式参数和实际参数的概念 形式参数:在定义函数时函数名后面括弧中的变量名, 简称形参。 实际参数:在调用函数时函数名后面括弧中的表达式, 简称实参。 main( ) int a,b,c,m; scanf (“%d,%d”, m=max(a,b,c); printf(“Max is %d”,m); int max( int x, int y,int z) int m; m=xy?x:y; m=mz?m:z; return(m); 形参表 实参表 形式参数和实际参数 第 八 章 函 数 上例中形参与实参、函数名与返回值之间的关系: c=max(a, b); - 实参:在运行时 把函数的 max(int x,int y) 把值传给函数。 结果赋给 函数名 returu (z); 形参:通知系统 要预留内存位置。 第 八 章 函 数 实参可以是常量、变量或表达式,并且必须 有确定的值; 对每个形参必须指明其名字和数据类型; 实参个数、类型必须与对应的形参一致; 形参是函数的内部变量,只在函数内部才有意义; 实参对形参的数据传递是值传递,即单向传递, 只由实参传递给形参,反之不可。调用结束后, 只有形参单元被释放,实参单元中的值不变。 形参调用前不占内存单元,调用时占用, 调用后释 放; 关于参数的几点说明: 第 八 章 函 数 input three integers:10 20 30 sum=60 int sum(int x,int y,int z) int m; m=x+y+z; return m; #include int sum(int x,int y,int z); main() int i,j,k,s; printf(“input three integers:“); scanf(“%d %d %d“, while(!(i=0 printf(“sum=%dn“,s); break; 例、编写程序,计算3个不为0的整数之和 第 八 章 函 数 三、函数调用时要注意以下问题: (1) 如果实参表中包含多个实参,则各实参用逗号 隔开,实参与形参的个数应相等,且类型应一致。 (2) 函数的调用也可以出现在表达式中。这时要求 函数带回一个确定的值以参加表达式的运算。 s=5*sum(i,j,k); 第 八 章 函 数 例、写出程序运行结果。 #include int f(int a,int b) if(ab) return 1; else if(a=b) return 0; else return -1; main( ) int i=2,p; p=f(i,+i); printf(“%d”,p); 结果为 : 0 (3) 对实参表求值的顺序 C语言是按从右到左的顺序求值。 /*传递的都是3*/ 第 八 章 函 数 (4) 函数定义 的类型就是返回值的类型; 函数调用时,如果return中的表达式类型与函数类型不 一致,则编译系统自动将表达式的类型转换成函数的类 型后返回。 int max(float x, float y) float z; z=(xy)?x:y; return z; /*返回整型值*/ 形参x,y获得的值为3.5, 4.8时 返回值为4 第 八 章 函 数 一个程序文件中可能包含若干个函数,函数在其中所处 的位置代表函数定义的顺序,同时也决定了它的作用域。 若: 调用点位于被调用函数后则不需说明,而调用点位于 被调用函数前,则必须进行函数声明后才能调用。 声明时要说明被调用函数的返回值的类型、函数名、函数 的形式参数表,其中形参都要在形参表中一一列举。函数声 明的 格式为: 类型名 被调用函数的函数名( 形参表) 四、函数的声明 第 八 章 函 数 例、编写函数,求一个整数的阶乘。 #include main( ) int n; long fac(int); printf(“input an integer: “); scanf(“%d“, printf(“%d!=%ldn“,n,fac(n); input an integer:5 5!=120 long fac(int x) int i; long y; if(x main( ) int m,n; long fac(int); long cmn(int,int); printf(“input two integers: ”); scanf(“%d,%d”, if(m float fac ( int n ) float f ; if ( n 1 ) f = fac ( n - 1) * n ; else if (n = 1 ) f = 1; else f = -1; return f ; void main ( ) int n ;float y ; printf (“Input a integer number :“); scanf ( “%d“, y = fac ( n ); if ( y 1) #include int p(int n,int x) if(n=0) return (1); else if(n=1) return (x); else return(2*n-1)*x*p(n-1),x)-(n-1)*p(n-2),x)/n; main() int n,x; printf(“Input n scanf(“%d,%d“, printf(“p(%d,%d)=%dn“,n,x,p(n,x); Input n else hanoi(n-1,a,c,b); printf(“%c%cn“,a,b); hanoi(n-1,c,b,a); main() int n; printf(“请输入金盘数:“); scanf(“%d“, hanoi(n,A,B,C); 程序运行结果: 下面给出将A针上的n个金盘借助C针移到 B针上的程序 第 八 章 函 数 8.5 变量的存储属性 c语言中每一个变量和函数都有两个属性:数据类型和数据的 存储类别 根据变量的作用域不同可以将变量分为全局变量和局部变量 局部变量:在函数内部定义的变量,它只在本函数范围内有效 ,也就是说只有在函数内才能使用它们,在此函数以外是不能 使用这些变量的 全局变量:程序的编译单位是源程序文件,一个源文件可以包 含一个或若干个函数在函数内定义的变量是局部变量,而在 函数之外定义的变量称为外部变量也就是全局变量全局变量 (又称外部变量)是在程序执行的全程有效的变量。 第 八 章 函 数 作用域:是从定义处开始到整个程序结束。 同时,还可以被任何一个函数使用 内存的使用:在整个程序的运行中一直占用着存储 单元。 作用:可以利用全局变量在函数间传递数据,使得 通过函数调用得到多个返回值。 第 八 章 函 数 它的有效范围为从定义变量的位置开始到本源文件 结束 intp=1,q=5; /*外部变量*/ float f1(int a) int b,c; . char c1,c2; /*外部变量*/ char f2(int x,int y) int i,j; main() int m,n; p,q,c1,c2 都是全局变 量,但是它们的作用 范围不一样在main 函数和f2函数中可以使 用全局变量p,q,c1,c2, 但在函数f1中只能使用 全局变量p,q,而不 能使用c1和c2 全局变量 第 八 章 函 数 全局变量的作用是增加函数之间数据联系的 渠道由于同一个文件中的所有函数都能引用全 局变量的值,因此如果在一个函数中改变了全局 变量的值,就能影响到其他函数,相当于各个函 数间有直接的传递通道由于函数的调用只能带 回一个返回值,因此有时可以利用全局变量增加 与函数联系的渠道 第 八 章 函 数 #include int s1,s2,s3; int vs( int a,int b,int c) int v; v=a*b*c; s1=a*b; s2=b*c; s3=a*c; return v; main() int v,l,w,h; printf(“input length,width and height:n“); scanf(“%d%d%d“, v=vs(l,w,h); printf(“v=%d s1=%d s2=%d s3=%dn“,v,s1,s2,s3); input length,width and height: 2 3 4 v=24 s1=6 s2=12 s3=8 第 八 章 函 数 建议不在必要时不要使用全局变量,理由: 1).全局变量在程序的全部执行过程中都占用存储单元,而不 是仅在需要时才开辟单元 2).它使函数的通用性降低了,因为函数在执行时要依赖于其 所在的外部变量如果将一个函数移到另一个文件中,还要 将有关的外部变量及其值一起移过去但若该外部变量与其 它文件的变量同名时,就会出现问题,降低了程序的可靠性 和通用性 3).如果在同一个源文件中,外部变量与局部变量同名,则在 局部变量的作用范围内,外部变量被屏蔽,即他不起作 用 第 八 章 函 数 例、外部变量与内部变量同名 int a=3,b=5; max(int a,int b) int c; c=ab?a:b; return c; main() int a=8; printf(“%d“ ,max(a,b); 运行结果为 : 8 形参a、b的作用范围 局部变量a的作用范围 全局变量a,b的作用范围 第 八 章 函 数 根据变量值存在的时间(生存期)可以分为静态存储方式和动态存储方式 静态存储方式是指在程序运行期间分配固定的存储空间的方式; 动态存储方式是指在程序运行期间根据需要动态的分配存储空间的方式 内存中供用户使用的存储空间分为部分:程序区、静态存储区和动态存 储区 静态存储区主要存放的是全局变量,在程序开始执行的时候给全局变量 分配存储区,程序执行完后就释放在程序执行过程中它们占据固定的存 储单元,而不是动态的进行分配和释放 在动态存储区中存放的主要是:函数形式参数在调用函数的时候给 行参分配存储空间自动变量函数调用时的现场保护和返回地址等 这些数据,在函数调用开始时分配动态存储空间,函数结束时释放这些 空间 据数据在内存中的存储方式,可分为静态存储方式和动态存储方式,具体 包含四种:自动的(auto),静态的(static),寄存器的(register),外部的 (extern). 第 八 章 函 数 auto变量 函数中的局部变量,如果不做专门声明为static存储类别,都是动态的分配 存储空间的数据存储在动态存储区中 static声明的变量 用static声明局部变量 有时候希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即 其占用的存储单元不释放,在下次该函数调用时,改变量已有值,就是上一 次函数调用结束时的值这时就应该指定该局部变量为“静态局部变量”,用 关键字static进行声明 语法是:static 数据类型 变量名; 说明: 静态局部变量属于静态存储类别,在静态存储区内分配存储单元在 程序整个运行期间不释放而自动变量属于动态存储类别,占动态区空间而 不占静态存储区空间,函数调用结束后即释放空间 第 八 章 函 数 对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运 行时它已有初值以后每次调用函数是不再重新赋初值而只是保留上一 次函数调用结束时的值;对自动变量赋初值,不是在编译时进行的,而 是在函数调用时进行的,每调用一次就重新给一次初值,相当于执行一 次赋值语句 如在定义局部变量是不赋初值的话,则对静态局部变量来说,编 译时自动赋初值(对数值型变量)或空字符(对字符型变量)而对 自动变量来说,如果不赋初值则它的值是一个不确定的值 虽然静态局部变量在函数调用结束后仍然存在,但是其他函数不能 调用它 例如: int fac(in n) static int f=1; f=f*n; return (f); main() int i; for(i=1;1 max(int x,int y) int z; z=xy?x:y; return z; main() extern int a,b; printf(“max=%dn“,max(a,b); int a=3,b=5; 程序运行结果: max=5 第 八 章 函 数 8.6 内部函数和外部函数 语言程序中函数分为两类: 即内部函数和外部函数。 它们以是否可以允许其它程序文件调用来区分的 。允许其它程序文件调用的函数称为外部函数; 不允许其它程序文件调用的函数称为内部函数; 第 八 章 函 数 8.6.1 内部函 数 一个源文件中定义的函数只能被本文件中的函数调 用,而不能被其它文件中的函数调用,这种函数称为 内部函数(静态函数)。使用关键字static定义内部函 数,其格式为: static 数据类型 函数名(形参表); 例如:static int f(int a,int b); 内部函数的作用域:只局限于本文件 第 八 章 函 数 8.6.2 外部函数 外部函数是指允许其他文件调用的函数,使用关键 字extern定义外部函数,其格式为: extern 数据类型 函数名(形参表); 例如:extern int f(int a,int b); 系统默认: 如在函数定义中没有说明extern或static则 默认为外部函数; 在一个源文件的函数中调用其它源文件中定义的外 部函数时,应用extern说明被调函数为外部函数。 第 八 章 函 数 8.7 数组与函数 l数组元素做函数的实参 l数组名做函数的参数 l二维数组可以做函数参数 1. 数组元素可以做函数的实参 由于表达式可以做实参,数组元素可以 作为表达式的组成部分,因此,数组元素可 以做函数的实参,并且可以单向传递给形参 。 第 八 章 函 数 例:有两个数组A,B。各有10个元素,将它们逐个对应相比 ,如果A数组中的元素大于B数组中相应的元素数目多于B数组 中的元素大于A数组中相应的元素数目,则认为A数组大于B数 组,并分别统计出两个数组相应元素大于,小于和等于的个数 。 程序设计: 函数large(x, y) :比较两个数组元素的 大小。 返回值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论