青海大学程序设计基础(第六章)_第1页
青海大学程序设计基础(第六章)_第2页
青海大学程序设计基础(第六章)_第3页
青海大学程序设计基础(第六章)_第4页
青海大学程序设计基础(第六章)_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、LOGO程序设计基础程序设计基础LOGO第六章第六章 函数与模块化程序设计函数与模块化程序设计 函数的定义和调用函数的定义和调用6.1 变量的作用域与存储类型变量的作用域与存储类型6.2 利用函数进行模块化程序设计利用函数进行模块化程序设计6.3LOGO6.1 函数的定义和调用函数的定义和调用v函数是构成函数是构成C程序的基本构件。程序的基本构件。C程序是程序是一系列函数的集合,每个函数都具有相对一系列函数的集合,每个函数都具有相对独立的单一功能。独立的单一功能。v一个完整的一个完整的C程序由程序由主函数主函数被调函数被调函数来来构成构成。LOGO6.1 函数的定义和调用函数的定义和调用 一个

2、一个C C程序可以分为若干个函数。程序可以分为若干个函数。 每个程序有且只能有一个主函数(每个程序有且只能有一个主函数(mainmain),其他),其他函数都是函数都是“字函数字函数”。 子函数可以互相调用,但主函数不能被调用。子函数可以互相调用,但主函数不能被调用。 一个一个C C源程序由一个或多个文件构成,一个源程源程序由一个或多个文件构成,一个源程序是一个编译单位。序是一个编译单位。 C C语言中允许一个函数被多次调用,也允许函数语言中允许一个函数被多次调用,也允许函数调用自己本身调用自己本身( (递归调用递归调用) )LOGO6.1 函数的定义和调用函数的定义和调用6.1.1 函数分类

3、函数分类 从用户角度 标准函数(库函数):由系统提供 用户自定义函数 从函数形式 无参函数 有参函数使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件LOGO6.1 函数的定义和调用函数的定义和调用 6.1.2 函数的定义函数的定义 一般格式一般格式合法标识符合法标识符函数返回值类型函数返回值类型缺省缺省int型型无返回值无返回值void函数体函数体函数类型函数类型 函数名函数名(形参类型说明表形参类型说明表)说明部分说明部分语句部分语句部分现代风格现代风格: :例例 有参函数(现代风格)有参函数(现代风格) int max

4、(int x,int y) int z; z=xy?x:y; return(z); 例例 有参函数(现代风格)有参函数(现代风格) int max(int x, y) int z; z=xy?x:y; return(z); 例例 空函数空函数 dummy( ) 函数体为空函数体为空例例 无参函数无参函数 printstar( ) printf(“*n”); 或或 printstar(void ) printf(“*n”); LOGO6.1 函数的定义和调用函数的定义和调用6.1.3 函数传统风格和例子函数传统风格和例子函数类型函数类型 函数名(形参表)函数名(形参表)形参类型说明形参类型说明说

5、明部分说明部分语句部分语句部分传统风格传统风格: :例例 有参函数(传统风格)有参函数(传统风格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); LOGO6.1 函数的定义和调用函数的定义和调用 6.1.4 函数的返回值函数的返回值 返回语句返回语句 形式:形式: return(表达式表达式); 或或 return 表达式表达式; 或或 return; 功能:使程序控制从被调用函数返回到调用函数中,功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数同时把返值带给调用函数 说明:说明: 函数中可有多个函数中可有多个retur

6、n语句语句 若无若无return语句,遇语句,遇时,自动返回调用函数时,自动返回调用函数 若函数类型与若函数类型与return语句中表达式值的类型不一致,按语句中表达式值的类型不一致,按前者为准,自动转换前者为准,自动转换-函数调用转换函数调用转换 void型函数型函数例例 无返回值函数无返回值函数 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; LOGO6.1 函数的定义和调用函数的定义和调用 6.1.5 函数的调用函数的调用 调用形式调用形式 函数名函数名(实参表实参表); 说明:说明: 实参与形参个数相等,类型一致,按顺序一一

7、对应实参与形参个数相等,类型一致,按顺序一一对应 实参表求值顺序,因系统而定(实参表求值顺序,因系统而定(Turbo C 自右向左)自右向左) 调用方式调用方式(1)直接以函数引用语句的形式出现直接以函数引用语句的形式出现例如:例如: call_function(x,y, z); scanf(%d%d%d“,&i,&j,&k)LOGO6.1 函数的定义和调用函数的定义和调用 (2) 函数在表达式中出现函数在表达式中出现例如:例如: y = 8.25*min(x,y)*function(n); (3) 在函数引用中以实参的形式出现在函数引用中以实参的形式出现例如:例如:y

8、=cos(tg(x);/也称嵌套调用也称嵌套调用 main( ) a( ) b( )调用调用a( ) 调用调用b( ) ENDLOGO6.1 函数的定义和调用函数的定义和调用 在一个函数中调用另一函数(即被在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢?调用函数)需要具备哪些条件呢?被调用的函数必须是已经存在的被调用的函数必须是已经存在的函数函数(是库函数或用户自己定义函是库函数或用户自己定义函数数).(2) 如果使用库函数,一般应在本文件如果使用库函数,一般应在本文件开头用开头用include 预包含。预包含。(3) 如果使用用户自己定义的函数,而如果使用用户自己定义的函数,而且

9、该函数与调用它的函数(即主调函且该函数与调用它的函数(即主调函数)在同一个文件中,一般还应该在数)在同一个文件中,一般还应该在主调函数中对被调用的函数作声明。主调函数中对被调用的函数作声明。例例 对被调用的函数作声明对被调用的函数作声明main( ) float add (float x, float y); float a,b,c; scanf(f,f,a,b);); cadd(a,b);); printf (“sum isf”, c);float add(float x,float y) float ; xy; return();();LOGO6.1 函数的定义和调用函数的定义和调用LOG

10、O6.1 函数的定义和调用函数的定义和调用(1)(1)转展相除法求最大公约数的函数转展相除法求最大公约数的函数#include stdio.hgcd(int m, int n) int temp,k; while(n!=0) temp=m%n; m=n; n=temp; k=m; return(k); (2) (2) 调用调用gcdgcd函数的主函数函数的主函数main() int m,n,j,temp; scanf(%d%d,&m,&n); if(mn) temp=m; m=n; n=temp; j=gcd(m,n); printf(gcd is: %dn,j); LOGO6

11、.1 函数的定义和调用函数的定义和调用v C程序的执行从main函数开始,调用其他函数后仍回到main函数,程序在main函数结束时结束。v 所有的子函数都是平行的,任何子函数都不属于其他函数.v 从用户的角度看,函数可以分为: 标准函数即库函数 自定义函数v 从函数的形式看,可分为: 无参数函数: 有参数函数LOGO6.1 函数的定义和调用函数的定义和调用函数说明函数说明 对被调用函数要求:对被调用函数要求: 必须是已存在的函数必须是已存在的函数 库函数库函数: #include 用户自定义函数用户自定义函数: 函数类型说明函数类型说明 函数说明函数说明 一般形式:一般形式: 函数类型函数类

12、型 函数名函数名(形参类型形参类型 形参名形参名,. ); 或或 函数类型函数类型 函数名函数名(); 作用:告诉编译系统函数类型、参数个数及类型,以便检验作用:告诉编译系统函数类型、参数个数及类型,以便检验 函数定义与函数说明不同函数定义与函数说明不同 函数说明位置:程序的数据说明部分(函数内或外)函数说明位置:程序的数据说明部分(函数内或外) 下列情况下,可不作函数说明下列情况下,可不作函数说明 若函数返值是若函数返值是char或或int型,系统自动按型,系统自动按int型处理型处理 被调用函数定义出现在主调函数之前被调用函数定义出现在主调函数之前 有些系统有些系统(如如Borland C

13、+)要求函数说明指出函数返值类型和要求函数说明指出函数返值类型和形参类型,并且对形参类型,并且对void 和和 int 型函数也要进行函数说明型函数也要进行函数说明LOGO6.1 函数的定义和调用函数的定义和调用6.1.6 函数参数及其传递方式函数参数及其传递方式 形参与实参 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式c=max(a,b);(main 函数)(max 函数)max(int x, int y) int z; z=xy?x:y; return(z); 例 比较两个数并输出大者main() int a,b,c; scanf(%d,%d,

14、&a,&b); c=max(a,b); printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z);形参实参LOGO6.1 函数的定义和调用函数的定义和调用 函数参数及其传递方式函数参数及其传递方式形参与实参形参与实参形式参数:定义函数时函数名后面括号中的变量名形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式实际参数:调用函数时函数名后面括号中的表达式说明:说明:实参必须有确定的值实参必须有确定的值形参必须指定类型形参必须指定类型形参与实参形参与实参类型一致,个数相同类

15、型一致,个数相同若形参与实参类型不一致,自动按形参类型转换若形参与实参类型不一致,自动按形参类型转换函数调用转换函数调用转换形参在函数被调用前不占内存形参在函数被调用前不占内存;函数调用时为形参分函数调用时为形参分配内存;调用结束,内存释放配内存;调用结束,内存释放LOGO6.1 函数的定义和调用函数的定义和调用参数传递方式参数传递方式 值传递方式值传递方式 方式:函数调用时方式:函数调用时,为形参分配单元为形参分配单元,并将实参的值复制到形参并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原中;调用结束,形参单元被释放,实参单元仍保留并维持原值值 特点:特点: 形参与

16、实参占用不同的内存单元形参与实参占用不同的内存单元 单向传递单向传递LOGO6.1 函数的定义和调用函数的定义和调用例例 交换两个数交换两个数711x:y:调用前:调用结束:711x:y:/*ch7_2.c*/#include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;调用:711a:b:711x:y:swap:711x:y:117a:b:te

17、mpLOGO6.1 函数的定义和调用函数的定义和调用函数的地址传递函数的地址传递 方式:函数调用时,将数据的存储地址作为参数传递给形参方式:函数调用时,将数据的存储地址作为参数传递给形参 特点:特点: 形参与实参占用同样的存储单元形参与实参占用同样的存储单元 “双向双向”传递传递 实参和形参必须是地址常量或变量实参和形参必须是地址常量或变量LOGO6.1 函数的定义和调用函数的定义和调用/*ch9_3.c*/swap(p1,p2)int *p1,*p2; int p; p=*p1; *p1=*p2; *p2=p;main()int a,b; scanf(%d,%d,&a,&b)

18、; printf(“a=%d,b=%dn”,a,b); printf(“swapped:n”); swap(&a,&b); printf(”a=%d,b=%dn,a,b);例 交换两个数a59b调前:a59b调swap:p1&a&bp2a95b交换:p1&a&bp2a95b返回:例子图解例子图解LOGO6.2 变量的作用域与存储类型变量的作用域与存储类型运行栈运行栈C程序程序运行时运行时所用存所用存储空间储空间程序区程序区静态存储区静态存储区存放执行程序存放执行程序的代码和静态的代码和静态变量变量存放外存放外部变量部变量系统为运行程系统为运行程序

19、分配的存储序分配的存储空间空间LOGO6.2 变量的作用域与存储类型变量的作用域与存储类型变量的存储属性变量的存储属性 概述 变量是对程序中数据的存储空间的抽象内存.main() int a; a=10; printf(“%d”,a);编译或函数调用时为其分配内存单元1020002001程序中使用变量名对内存操作LOGO6.2 变量的作用域与存储类型变量的作用域与存储类型变量的存储属性变量的存储属性概述变量是对程序中数据的存储空间的抽象变量的属性数据类型:变量所持有的数据的性质(数据类型:变量所持有的数据的性质(操作属性操作属性)存储属性存储属性存储器类型:寄存器、静态存储区、动态存储区存储器

20、类型:寄存器、静态存储区、动态存储区生存期生存期:变量在某一时刻存在:变量在某一时刻存在-静态变量与动态变量静态变量与动态变量作用域作用域:变量在某区域内有效:变量在某区域内有效-局部变量与全局变量局部变量与全局变量变量的存储类型auto -自动型自动型register-寄存器型寄存器型static -静态型静态型extern -外部型外部型变量定义格式: 存储类型 数据类型 变量表;如如: int sum; auto int a,b,c; register int i; static float x,y;LOGO6.2 变量的作用域与存储类型变量的作用域与存储类型auto型变量型变量v au

21、to型变量在函数内部定义,它局限于所在的函数。也型变量在函数内部定义,它局限于所在的函数。也称为局部变量。称为局部变量。v auto型变量定义的形式:型变量定义的形式:v auto 数据类型标识符数据类型标识符 变量名表;变量名表; func (int a,int b) int i1,i2; char c1,c2; float a1,a2; int p1,p2; double d1,d2; auto int k; autoauto型变量的作用范围局型变量的作用范围局限于所在的花括号。函数的限于所在的花括号。函数的形参属于形参属于autoauto型变量其生命型变量其生命期在执行所属的函数这段时期

22、在执行所属的函数这段时间区间。同名变量在不同函间区间。同名变量在不同函数中代表不同的含义。数中代表不同的含义。LOGO6.2 变量的作用域与存储类型变量的作用域与存储类型extern型变量型变量v extern型变量也称为外部变量,它是一种全局变量,在型变量也称为外部变量,它是一种全局变量,在函数之外定义,其定义格式如下:函数之外定义,其定义格式如下:v extern 数据类型标识符数据类型标识符 变量名表变量名表;int f2(int a) a=a+b+c; return (a); #include stdio.hint b=1,c=2;int f1(int a,int c) int b=8

23、; scanf(%d,&a); a=a+b+c; return (a);LOGO6.2 变量的作用域与存储类型变量的作用域与存储类型register型变量型变量v由于CPU对寄存器的操作速度要远远快于对内存的操作,为了加快操作速度,可以使用寄存器型变量。 寄存器变量定义的一般形式为:寄存器变量定义的一般形式为: register 数据类型标识符数据类型标识符 变量名表变量名表;LOGO6.2 变量的作用域与存储类型变量的作用域与存储类型局部变量与全局变量局部变量与全局变量 局部变量-内部变量 定义:在函数内定义,只在本函数内有效 说明: main中定义的变量只在main中有效 不同函数

24、中同名变量,占不同内存单元 形参属于局部变量 可定义在复合语句中有效的变量 局部变量可用存储类型:auto register static (默认为auto)float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效有效x,y,i,j有效有效m,n有效有效例例 不同函数中同名变量不同函数中同名变量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int

25、a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);例例 不同函数中同名变量不同函数中同名变量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4例例 复合语句中变量复合语句中变量#define N 5main() int i; int aN=1,2,3,

26、4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);运行结果:5 4 3 2 1例例 复合语句中变量复合语句中变量#define N 5main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);LOGO6.2 变量的作用域与存储类型变量的作用域与存储类型 全局变量全局变量 -外部变量外部

27、变量 定义:在函数外定义,可为本文件所有函数共用定义:在函数外定义,可为本文件所有函数共用 有效范围:从定义变量的位置开始到本源文件结束,及有有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件说明的其它源文件外部变量说明: extern 数据类型 变量表;外部变量定义与外部变量说明不同 定义定义 说明u次数: 只能1次 可说明多次u位置: 所有函数之外 函数内或函数外u分配内存: 分配内存,可初始化 不分配内存,不可初始化若外部变量与局部变量同名,则外部变量被屏蔽 应尽量少使用全局变量,因为:Y全局变量在程序全部执行过程中占用存储单元Y降低了函数的通用性、可靠性,可

28、移植性Y降低程序清晰性,容易出错外部变量可用存储类型:缺省:缺省 或 staticLOGO6.2 变量的作用域与存储类型变量的作用域与存储类型全局变量在程序的整个执行过程都占用内存注注意意考虑程序的模块性、通用性、可读性,应少用全局变量全局变量太多,当程序长且大时往往难以清楚的判断出各个瞬时各个全局变量的值。若函数中用到以前未定义过的参数,要用 extern 作外部变量说明LOGO6.2 变量的作用域与存储类型变量的作用域与存储类型float max,min;float average(float array, int n) int i; float sum=array0; max=min=a

29、rray0; for(i=1;imax) max=arrayi; else if(arrayiy?x:y; return(z);main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;运行结果:max=13extern int a,b;int max() int z; z=ab?a:b; return(z);main() printf(max=%d,max();int a=13,b=-8;例例 外部变量定义与说明外部变量定义与说明LOGO6.2 变量的作用域与存储类型变量的作用域与存储类型动态变量与静态变量动态变量与静态变量 存储

30、方式 静态存储:程序运行期间分配固定存储空间 动态存储:程序运行期间根据需要动态分配存储空间 内存用户区程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(auto register)函数调用现场保护和返回地址等生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束LOGO静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件u局部变量默认为auto型uregister型

31、变量个数受限,且不能为long, double, float型u局部static变量具有全局寿命和局部可见性u局部static变量具有可继承性uextern不是变量定义,可扩展外部变量作用域register局部staticauto外部static外部存储类别变变量量存存储储类类型型6.2 变量的作用域与存储类型变量的作用域与存储类型LOGO6.2 变量的作用域与存储类型变量的作用域与存储类型静态静态变量变量内部静态变量内部静态变量外部静态变量外部静态变量 静态变量定义的一般形式为:静态变量定义的一般形式为: static 数据类型标识符数据类型标识符 变量名表;变量名表;函数内定义函数内定义在

32、源文件的开始和所在源文件的开始和所有函数之外定义有函数之外定义 static和全局变量若不初始化和全局变量若不初始化,自动赋自动赋0 static和全局变量初始化时必须用常量为其赋初值和全局变量初始化时必须用常量为其赋初值 static型局部变量的初始化仅执行一次型局部变量的初始化仅执行一次 若进入某程序块后若进入某程序块后auto和和register型变量要被初始化,型变量要被初始化,则每次执行该程序块都要进行初始化则每次执行该程序块都要进行初始化 未初始化的未初始化的auto和和register变量,其初值不定,不能直变量,其初值不定,不能直接在程序中使用接在程序中使用extern型的变量

33、不能进行初始化。型的变量不能进行初始化。LOGO6.3 利用函数进行模块化程序设计利用函数进行模块化程序设计 模块化程序设计模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块基本思想:将一个大的程序按功能分割成一些小模块, 特点:特点: 各模块相对独立、功能单一、结构清晰、接口简单各模块相对独立、功能单一、结构清晰、接口简单 控制了程序设计的复杂性控制了程序设计的复杂性 提高元件的可靠性提高元件的可靠性 缩短开发周期缩短开发周期 避免程序开发的重复劳动避免程序开发的重复劳动 易于维护和功能扩充易于维护和功能扩充 开发方法开发方法: 自上向下自上向下,逐步分解,分而治之逐步分解,分而

34、治之LOGO6.3 利用函数进行模块化程序设计利用函数进行模块化程序设计C是模块化程序设计语言是模块化程序设计语言源程序文件1预编译命令说明部分执行部分函数1函数n源程序文件i源程序文件nC程序C程序结构&C是函数式函数式语言&必须有且只能有一个名为mainmain的主函数&C程序的执行总是从从mainmain函数开始,在函数开始,在mainmain中结束中结束&函数不能嵌套定义不能嵌套定义, ,可以嵌套调用可以嵌套调用LOGO6.3 利用函数进行模块化程序设计利用函数进行模块化程序设计例例 求三个数中最大数和最小数的差值求三个数中最大数和最小数的差值#incl

35、ude int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?

温馨提示

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

最新文档

评论

0/150

提交评论