PPT05_1第五章--函数_第1页
PPT05_1第五章--函数_第2页
PPT05_1第五章--函数_第3页
PPT05_1第五章--函数_第4页
PPT05_1第五章--函数_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

1、vC C程序的结构:若干个程序的结构:若干个函数函数组成。组成。v函数:函数: vC C函数的功能相当于其它程序设计语言中的函数的功能相当于其它程序设计语言中的一个程序模块,或一个子程序。一个程序模块,或一个子程序。 5.1.2 引进子程序概念引进子程序概念 模块化、分块编译、逐步求精模块化、分块编译、逐步求精 简化代码、缩小长度及引进简化代码、缩小长度及引进数学中的函数数学中的函数概念概念。 引进函数后,使得程序与问题本身具有极强的可引进函数后,使得程序与问题本身具有极强的可对照性,十分清晰,增加对照性,十分清晰,增加(1)增加可读性)增加可读性(2)增加清晰性)增加清晰性(3)增强正确性)

2、增强正确性子程序技术将子程序技术将“做什么做什么”与与“怎么做怎么做”分分离开离开1.减轻程序员负担,关心减轻程序员负担,关心“做什么做什么”。2. 设计子程序本身时,再具体关心设计子程序本身时,再具体关心“怎么做怎么做”。子程序技术优点子程序技术优点l 程序逻辑结构清晰,易写、易读、易懂。程序逻辑结构清晰,易写、易读、易懂。l 设计、调试、维护容易。设计、调试、维护容易。在数学中可定义函数,例在数学中可定义函数,例的次方的次方 f(2,4) 。函数概念来源于数学。函数概念来源于数学。 函数组成:函数函数组成:函数定义定义、函数、函数调用调用。 使用规则使用规则:l先定义(标准库函数除外)先定

3、义(标准库函数除外)类似于数学中的函数定义。类似于数学中的函数定义。l后使用后使用类似于数学中计算某函数的一个特定值。类似于数学中计算某函数的一个特定值。yxyxf),( 从从使用使用角度角度分:分: 标准库标准库函数函数: :编译器已定义好的函数,编译器已定义好的函数, 可直接调用可直接调用stdio.hgets()stdio.hgets()、printf()printf()math.h sin()math.h sin()、sqrt()sqrt()用户自定义用户自定义函数函数:由用户建立定义:由用户建立定义 从函数形式分:从函数形式分:v 无参函数无参函数:c=getchar( )c=get

4、char( )u有参函数有参函数:有参数传递。:有参数传递。如:如:putchar(ch); puts(str); pow(10,x); sqrt(m); printf(“%d”,t); scanf(“%s”,s1); strcat(s1,s2); strlen(s1); strcpy(s1,s2); 从有无返回值分:有返回值 即 int max(int); int min(int); float f(float);无返回值如void printstr();5.2 5.2 函数的定义和调用函数的定义和调用 一个函数定义的形式是一个函数定义的形式是: : 类型类型 函数名函数名( ( 形式形式参

5、数列表参数列表 ) ) 语句语句1;1; 语句语句2 2; 例:例: int fun(int n,float x,float y)int fun(int n,float x,float y) 函数类型函数类型不不可以可以定义类型:定义类型: 数组类型数组类型 函数类型函数类型 由一个个参数声明组成,以逗号由一个个参数声明组成,以逗号“,”分隔。分隔。 每个参数声明具体说明一个形式参数的特性,每个参数声明具体说明一个形式参数的特性,形式如下:形式如下: 类型类型 形参名字形参名字列表如下:列表如下: T id ,T id ,. ,T id 。格式:函数名(实在参数列表);格式:函数名(实在参数列

6、表);例:函数定义例:函数定义int funint fun(int n,float x,float y);int n,float x,float y); 调用时:调用时: fun(3,a,4.5);l首先把首先把实参表实参表中各信息中各信息传入形参传入形参中;中;l然后然后进入进入函数函数执行执行复合语句复合语句 。 目的目的计算一个函数值,用于表达式中,参与进计算一个函数值,用于表达式中,参与进一步的操作。一步的操作。 C C 规定:规定:1. 实参与形参一一对应。实参与形参一一对应。2. 实参与形参要实参与形参要赋值兼容赋值兼容。当程序运行时,调用函数,进行参数结合的动作是当程序运行时,调

7、用函数,进行参数结合的动作是:1. 计算实在参数计算实在参数表达式;表达式;2. 把实参值把实参值按赋值转换规则,转换成形参类型按赋值转换规则,转换成形参类型。;。; 3. 把转换后的实参值把转换后的实参值形参。形参。主程序调用函数返回结束函数 函数函数 调用函数,称为激活一个函数调用函数,称为激活一个函数实质:实质:形式参数形式参数用用实在参数实在参数带进来的信息参与进带进来的信息参与进一步的运算。一步的运算。定义定义调用调用 C函数返回有两种方式:函数返回有两种方式:l执行返回语句,返回语句的形式是执行返回语句,返回语句的形式是 return ; 或或 return 表达式表达式 ;l若函

8、数体中无若函数体中无返回语句返回语句;l或虽有返回语句,但在函数执行期间或虽有返回语句,但在函数执行期间没有执没有执行到任何一个返回语句,行到任何一个返回语句,则自动返回到函数调用处。则自动返回到函数调用处。 题目:定义一个函数,求两个数中的最大数。题目:定义一个函数,求两个数中的最大数。功能:定义一个求较大数的函数并在主函数中调用功能:定义一个求较大数的函数并在主函数中调用int max(int n1, int n2)/定义一个函数定义一个函数max() return ( n1n2? n1: n2 );/if 语句简写方式语句简写方式 main() int num1,num2,maxx; p

9、rintf(“请输入两个整数:请输入两个整数:n); scanf(“%d%d”, &num1, &num2); maxx= max(num1,num2); printf(“max=%dn”, maxx);/函数调用函数调用 5.2.5 函数原型函数原型 任何函数的函数任何函数的函数调用调用都在相应函数都在相应函数定义定义之后之后C规定规定: 任何标识符都必须声明,而且必须先声明后使用任何标识符都必须声明,而且必须先声明后使用 但不是所有程序都能做到这点但不是所有程序都能做到这点C引进概念引进概念 函数原型函数原型 建议建议:把所有函数原型集中一起,放在主函数把所有函数原型集中一

10、起,放在主函数main之前。之前。函数原型一般具有形式:函数原型一般具有形式: TT F TT F ( T T ,T T ,. . ,T T ) ; 或或TT F TT F ( T id T id ,T id T id ,. . ,T id T id ) ;只需要说明参数个数和每个参数的特性只需要说明参数个数和每个参数的特性float f ( int , float ,int , char ) ;float f ( int z , float u ,int v , char w ) ;v#include vvoid printstar( )/第一个函数第一个函数 v printf(*n);v

11、void print_message()/第二个函数第二个函数 v printf(how do you do!n);vmain()v printstar();/调用第一个函数调用第一个函数v print_message( );/调用第二个函数调用第二个函数v printstar( ); /再次调用第一个函数再次调用第一个函数v 开始调用函数开始调用函数 用户自定义函数用户自定义函数求两数的最大值。注意函数的定义形式。求两数的最大值。注意函数的定义形式。#include int max(int ,int);main( ) int a,b,c; scanf(%d%d,&a,&b);

12、 c=max(a,b); printf(max=%dn,c);int max(int x,int y) int z; z=(xy)?x:y; return(z);【5.2】函数举例函数举例(输入十个数输入十个数,找出其中素数找出其中素数,并求平均数并求平均数)int isprime(int););void main( ) int i,a10,sum=0,n=0; float aver; printf(Enter 10 numbers:n); for(i=0;i10;i+) scanf(%d,&ai); scanf(%d,&ai); printf(n); printf(n); f

13、or(i=0;i10;i+) for(i=0;i10;i+) if(isprime(ai)=1) if(isprime(ai)=1) / /* *若若aiai素数素数* */ / printf(%d ,ai); printf(%d ,ai); sum+=ai; sum+=ai;/ /* *求素数和求素数和* */ / n+; n+; / /* *统计素数个数统计素数个数* */ / aver=sum/n; aver=sum/n; / /* *求素数平均值求素数平均值* */ /printf(nsum=%d,aver=%fn,sum,aver);printf(nsum=%d,aver=%fn,s

14、um,aver); int prime(int x) /*该函数判断是否素该函数判断是否素数数*/ int i; for (i=2;i=x/2;i+) if (x%i=0) return (0); return 1; 5.4 参数参数5.4.1 C参数传递规则参数传递规则 C只有只有值参数值参数一种参数类别。函数调用时一种参数类别。函数调用时实在参数的值传送到形式实在参数的值传送到形式参数中。参数中。 值参数意味着值参数意味着: 1. 赋值兼容赋值兼容 2. “虚实结合虚实结合” 3. 在函数在函数活化活化期间,形参期间,形参与实参无关与实参无关 4. 当函数执行结束返回后,当函数执行结束返回

15、后,实参数无任何变化。实参数无任何变化。 eg.void funcA(int,int);void main()int a=6,b=12;funcA(a,b);void funcA(int aa,int bb)int n=5;:返回地址 调用函数运行状态返回地址main()funcA()操作系统运行状态main函数参数612ab6125bbaan栈区.5.5 数组作参数数组作参数 数组名数组名即即指针指针。 传递传递的信息实质上是一个的信息实质上是一个地址地址。 使用数组作函数参数形式使用数组作函数参数形式1. 形式参数用数组声明符说明:形式参数用数组声明符说明: int f ( float x

16、 10 )2. 实在参数用数组名对应形式参数数组:实在参数用数组名对应形式参数数组: float a10 ; 则用如下形式调用函数则用如下形式调用函数 f(a) 函数调用函数调用f(a) 在函数执行期间,在函数执行期间,形式参数和实在参数使用一个数组。形式参数和实在参数使用一个数组。 数组参数可以有各种变形数组参数可以有各种变形: 省略最外层尺寸省略最外层尺寸 如如f的函数定义说明符可以使用的函数定义说明符可以使用 int f ( float x ); 多维相同多维相同 int q ( float y 20 ); 声明两维数组参数声明两维数组参数y ,y每行每行20个元素,具体多少行由实在参数

17、数组决个元素,具体多少行由实在参数数组决定。设有声明定。设有声明float u1020 , v1520 ; 则函数调用则函数调用 q(u); q(v); 分别分别执行时,执行时, 数组大小不同。数组大小不同。 与数组初值一样,省略尺寸的与数组初值一样,省略尺寸的只能是最外层只能是最外层,下述函数定义说明符下述函数定义说明符错误错误: int r ( float z ) int s ( float z10 ) int t ( float z10 20 ) 【例例5.3】利用数组参数重写第六章例利用数组参数重写第六章例6.4 ,用,用“主元排序主元排序”法对整法对整数组进行排序,使之能对任意整数数

18、组排序。数组进行排序,使之能对任意整数数组排序。把被排序数组和数组长度都作为函数的参数。把被排序数组和数组长度都作为函数的参数。void sort ( int a , int n ) int i,j,k,r ; for ( i=0 ; in-1 ; i+ ) j=i ; for ( k=i+1 ; kn ; k+ ) if ( ak aj ) j=k ; r = ai ; ai = aj ; aj = r ;设用定义设用定义int b10;则调用函数则调用函数 sort(b,10);【例例5.4】编函数,把给定数组中的编函数,把给定数组中的n个整数反序存放。个整数反序存放。 void inv(

19、int x ,int n)int temp,i,j;for(i=0;i=(n-1)/2;i+)j=n-1-i;temp=xi;xi=xj;xj=temp; 设有声明设有声明int a10;则可以调用该函数则可以调用该函数inv(a,10)5.6 作用域(作用域(空间概念空间概念)5.6.1 作用域作用域使程序中声明的标识符有定义的区域。使程序中声明的标识符有定义的区域。在作用域内,使用合法;超出,非法。在作用域内,使用合法;超出,非法。 声明点声明点包含相应标识符词法记号的声明符的结尾处。例包含相应标识符词法记号的声明符的结尾处。例int x /* 此处为此处为x的声明点的声明点 */ ,u1

20、020 /* 此处为此处为u的声明点的声明点 */ ; C C 标识符作用域规则标识符作用域规则类别类别 声明的作用域声明的作用域顶层标识符顶层标识符从声明点到本源程序编译单位文本结束从声明点到本源程序编译单位文本结束函数定义中的形式参数函数定义中的形式参数从声明点到从声明点到函数体函数体结束结束函数原型中的形式参数函数原型中的形式参数从声明点到函数原型结束从声明点到函数原型结束复合语句中声明的标识符复合语句中声明的标识符从复合语句中声明点到复合语句结束从复合语句中声明点到复合语句结束语句标号语句标号相应标号声明所在的整个函数体相应标号声明所在的整个函数体预处理器的预处理器的宏宏 从相应宏定义

21、的从相应宏定义的#define命令到本源程命令到本源程序编译单位文本结束,或第一个序编译单位文本结束,或第一个#undef命命令令 C规定:规定:l 在嵌套结构中,若里层标识符与外层某标识符同名在嵌套结构中,若里层标识符与外层某标识符同名,“屏蔽屏蔽”l必须先声明后使用必须先声明后使用;在同一区域;在同一区域不得重复不得重复。 【例【例5.5】下述应用都是错误的:】下述应用都是错误的:1) int i,j; int f() . . k=i+j; 2) float f( int x ) int x ;. . 3) #define c 2.0 int c,d,e; 4) #define c 2.0

22、 float y index ; #define index 10全局量全局量函数外部定义函数外部定义的变量,不属于任何一个的变量,不属于任何一个函数。函数。 5.6.2 局部量和全局量局部量和全局量 一个函数或复合语句引入的标识符只在本函数或复合语句内有效。称一个函数或复合语句引入的标识符只在本函数或复合语句内有效。称它们它们局部于局部于声明它们的那个函数或复合语句(或局部量)。声明它们的那个函数或复合语句(或局部量)。eg1.float f1(int a)int b,c;:char f2(int x,int y)int i,j;:void main()int m,n;: a,b,c 有效有

23、效m,n 有效有效x,y,i,j 有效有效vmain()vint a,b;v:vvint c;vc=a+b;v:v:va,b在此范围内有效在此范围内有效以下程序片段是否正确?若有错,错在哪里?vvoid main()vv int a=2,b=4;v v int k,b;v k=a+5;v b=a*5;v v a=k+2;vvint p=1,q=5;/全局变量vfloat f(int a)vint b,c;v:vvchar c1,c2; /全局变量vchar f2(int x,int y)vint i,j;v:vvmain()vint m,n;v:v全局变量全局变量c1,c2的的作用范围作用范围

24、全局变量全局变量p,q的的作用范围作用范围v#include vint a=3,b=5;/全局变量vint max(int a,int b);vvoid main() int a=8;vprintf(“%dn”,max(a,b);/调用函数maxvint max(int a,int b)/函数maxvint c;vc=ab?a:b;vreturn c;!结果:85.6.3 生存期(生存期(时间概念时间概念) 描述当程序运行起来后,一个对象(标识符)是否有效存在。所谓对象描述当程序运行起来后,一个对象(标识符)是否有效存在。所谓对象主要是指主要是指变量和函数变量和函数。 数据区 堆区heap(动

25、态存贮区)用户区用户区代码区code 栈区stack常量区const全局/静态变量动态生存期动态生存期 C中的数据对象还可以具有动态生存期,可以随意显式地创中的数据对象还可以具有动态生存期,可以随意显式地创建和删除。动态对象的创建和释放,通过动态存储分配函数如:建和删除。动态对象的创建和释放,通过动态存储分配函数如:malloc、freenew、delete等等显式实现。显式实现。区别:不是自动释放空间,而是通过函数实现!区别:不是自动释放空间,而是通过函数实现! 静态生存期静态生存期 所分配的存储空间在程序执行前开始,并保持到程序执行终止所分配的存储空间在程序执行前开始,并保持到程序执行终止

26、全局变量全局变量具有静态生存期(具有静态生存期(系统默认系统默认实现方式)实现方式)l 一些变量可以明显地说明是静态存储变量,使用保留字一些变量可以明显地说明是静态存储变量,使用保留字static 具有静态生存期的对象(变量、函数)在程序整个运行期间都存在!具有静态生存期的对象(变量、函数)在程序整个运行期间都存在!auto自动变量 static静态变量、函数register寄存器变量 extern外部变量、函数 存储类别存储类别四种四种关键字关键字v一、v按作用域分局部变量全局变量自动变量(动态局部变量,离开函 数,值就消失)静态局部变量(离开函数,值仍保留)寄存器变量(离开函数,值就消失)静态外部变量(只能本文件引用)外部变量(其他文件可以引用)v二、v按生存期分动态存储静态存储自动变量(本函数有效)寄存器

温馨提示

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

评论

0/150

提交评论