C语言程序设计CPD09更多课件请进我文库

上传人:无*** 文档编号:232476678 上传时间:2023-09-20 格式:PPT 页数:64 大小:783.50KB
收藏 版权申诉 举报 下载
C语言程序设计CPD09更多课件请进我文库_第1页
第1页 / 共64页
C语言程序设计CPD09更多课件请进我文库_第2页
第2页 / 共64页
C语言程序设计CPD09更多课件请进我文库_第3页
第3页 / 共64页
资源描述:

《C语言程序设计CPD09更多课件请进我文库》由会员分享,可在线阅读,更多相关《C语言程序设计CPD09更多课件请进我文库(64页珍藏版)》请在装配图网上搜索。

1、第第9 9章章 模块化编程与函数模块化编程与函数何 渝北京工商大学计算机与信息工程学院计算机程序设计基础计算机程序设计基础北京工商大学 何渝本章主要内容模块化编程模块化编程C/C+C/C+函数函数函数的参数函数的参数递归方法递归方法程序结构和结构图程序结构和结构图带返回值的带返回值的C/C+C/C+函数函数指针与函数指针与函数2计算机程序设计基础北京工商大学 何渝9.1 引言引言 现在的软件越来越庞大,越来越复杂,带来现在的软件越来越庞大,越来越复杂,带来软件的开发、调试和维护也越来越困难,由此出软件的开发、调试和维护也越来越困难,由此出现了上个世纪的软件危机!为解决这一问题,产现了上个世纪的

2、软件危机!为解决这一问题,产生了生了“软件工程软件工程”这一学科。解决的方法之一就这一学科。解决的方法之一就是模块化编程,它将软件分解成若干单元,每一是模块化编程,它将软件分解成若干单元,每一单元称为一个模块,完成软件的一个功能或一个单元称为一个模块,完成软件的一个功能或一个任务,每一模块可以单独开发、调试和测试,最任务,每一模块可以单独开发、调试和测试,最后再集成一个整体。这样可减少软件的复杂性,后再集成一个整体。这样可减少软件的复杂性,提高效率,减少错误,便于维护。提高效率,减少错误,便于维护。3计算机程序设计基础北京工商大学 何渝9.1 引言引言(续续)在在C/C+中,模块由函数来实现。

3、函中,模块由函数来实现。函数间可通过数间可通过3种方式来进行信息与数据的传种方式来进行信息与数据的传送:全局变量、函数的参数和函数的返回送:全局变量、函数的参数和函数的返回值,后两种方法最值得提倡。其中通过函值,后两种方法最值得提倡。其中通过函数参数的类型有数参数的类型有3种:值参数、指针参数和种:值参数、指针参数和引用参数,引用参数,C支持前两种,支持前两种,C+三种都三种都支持支持。本章重点介绍前两种。本章重点介绍前两种。4计算机程序设计基础北京工商大学 何渝5 C/C+程序可由若干逻辑模块组成,模块程序可由若干逻辑模块组成,模块功能又由函数实现。一个模块中可有一个或多个功能又由函数实现。

4、一个模块中可有一个或多个函数,但至少有一个且只能有一个名为函数,但至少有一个且只能有一个名为main()的函数。的函数。C/C+程序可由一个或多个源程序文件构成,程序可由一个或多个源程序文件构成,每个文件可包含一个或多个函数。每个文件可包含一个或多个函数。C/C+编译器编译器和连接器把构成一个程序的若干源程序文件有机和连接器把构成一个程序的若干源程序文件有机地联系在一起,最终产生可执行程序。地联系在一起,最终产生可执行程序。9.2 9.2 程序结构程序结构计算机程序设计基础北京工商大学 何渝9.3 模块化程序三要素模块化程序三要素 逻辑上说,程序是由若干模块构成。C/C+中,模块都是由一个个函

5、数实现的,故在模块化程序中的编程中主要是设计和编写一个个函数。函数有三个重要要素:函数定义函数(原型)说明函数调用 6计算机程序设计基础北京工商大学 何渝 函数函数函数函数(Function)(Function)是按给定的任务,把相关语句组织在一是按给定的任务,把相关语句组织在一是按给定的任务,把相关语句组织在一是按给定的任务,把相关语句组织在一起的程序块,也称为例程或过程。起的程序块,也称为例程或过程。起的程序块,也称为例程或过程。起的程序块,也称为例程或过程。函数分为标准库函数和用户自定义函数。函数分为标准库函数和用户自定义函数。函数分为标准库函数和用户自定义函数。函数分为标准库函数和用户

6、自定义函数。标准库函数标准库函数标准库函数标准库函数 :可以在任何程序中使用的公共函数,由:可以在任何程序中使用的公共函数,由:可以在任何程序中使用的公共函数,由:可以在任何程序中使用的公共函数,由C/C+C/C+编译器提供。编译器提供。编译器提供。编译器提供。用户自定义函数:必须按用户自定义函数:必须按用户自定义函数:必须按用户自定义函数:必须按C/C+C/C+要求通过函数定义、要求通过函数定义、要求通过函数定义、要求通过函数定义、函数说明、才能被调用,由用户自定义。函数说明、才能被调用,由用户自定义。函数说明、才能被调用,由用户自定义。函数说明、才能被调用,由用户自定义。程序从程序从程序从

7、程序从main()main()函数开始执行。任一函数可以调用其他函数开始执行。任一函数可以调用其他函数开始执行。任一函数可以调用其他函数开始执行。任一函数可以调用其他函数,也可以被其他函数调用。函数与函数之间通过传递函数,也可以被其他函数调用。函数与函数之间通过传递函数,也可以被其他函数调用。函数与函数之间通过传递函数,也可以被其他函数调用。函数与函数之间通过传递参数和返回值相联系参数和返回值相联系参数和返回值相联系参数和返回值相联系。C/C+不允许函数嵌套定义。在一不允许函数嵌套定义。在一个函数中再定义一个函数是非法的。个函数中再定义一个函数是非法的。9.3.1 9.3.1 函数概述函数概述

8、7计算机程序设计基础北京工商大学 何渝 函数由函数由“函数头函数头函数头函数头”加加“函数体函数体函数体函数体”组成。函数头又由组成。函数头又由函数名、形式参数函数名、形式参数(可无可无)、函数类型、函数类型(可缺省,又称为返可缺省,又称为返回类型回类型)和函数存储属性和函数存储属性(可缺省可缺省)构成;函数体由声明部构成;函数体由声明部分和执行部分组成分和执行部分组成(这两部分都可有可无这两部分都可有可无)。一般形式如下:一般形式如下:存储属性存储属性 函数类型函数类型 函数名函数名(形式参数表形式参数表)函数头函数头 形式参数说明形式参数说明 变量声明变量声明 (被调被调)函数声明函数声明

9、 执行语句执行语句 函数体函数体 返回语句返回语句 9.3.2 函数定义函数定义8计算机程序设计基础北京工商大学 何渝 函数定义形式函数定义形式函数定义形式函数定义形式 定义的一般形式:定义的一般形式:类型标识符类型标识符 函数名函数名(形式参数表形式参数表)函数体函数体 类型标识符:函数返回值的数据类型,若无返回值则用类型标识符:函数返回值的数据类型,若无返回值则用void函函 数数 名:给自定义的函数取的名字名:给自定义的函数取的名字形式参数表:可为空;若不空,则在函数被调用时,接收调用形式参数表:可为空;若不空,则在函数被调用时,接收调用函数传递的实在参数。函数传递的实在参数。函函 数数

10、 体:执行功能的语句块。体:执行功能的语句块。函数返回值:可有可无;若有,则返回调用函数一函数值,由函数返回值:可有可无;若有,则返回调用函数一函数值,由返回语句返回语句return完成。完成。例:例:int area(int a,int b)int c;c=a*b;return(a*b);9计算机程序设计基础北京工商大学 何渝 定义函数时,若带有参数,可用传统方式定义,定义函数时,若带有参数,可用传统方式定义,也可用现代方式定义,提倡使用后者也可用现代方式定义,提倡使用后者。例:。例:int swap(x,y)int swap(x,y)/*/*传统方式传统方式*/*/int x,y;int

11、x,y;.int swap(int x,int y)int swap(int x,int y)/*/*现代方式现代方式*/.9.3.3 函数定义时参数的传统定义和现代定义函数定义时参数的传统定义和现代定义10计算机程序设计基础北京工商大学 何渝1.函数调用的形式函数调用的形式 函数名函数名(实参数表实参数表);2.调用实质调用实质 程序执行流程转向由函数名指定的被调用函数。程序执行流程转向由函数名指定的被调用函数。实参数一一对应地传递给函数定义中的形参数。实参数一一对应地传递给函数定义中的形参数。执行函数定义中的函数体。执行函数定义中的函数体。执行结束,通过执行结束,通过return语句将值返

12、回到调用处。语句将值返回到调用处。程序执行流程返回调用处。执行后面的语句。程序执行流程返回调用处。执行后面的语句。119.3.4 函数调用函数调用计算机程序设计基础北京工商大学 何渝12图图 9.1 函数之间的调用关系函数之间的调用关系main()main().f1();f1();.f2();f2();.f1()f11();f2().f21();.f22();.f11()f21()f22()计算机程序设计基础北京工商大学 何渝13图图 9.2 主函数与子函数的关系主函数与子函数的关系main()f1()f2()f11()f21()f22()计算机程序设计基础北京工商大学 何渝 函数语句函数语句

13、 printstar();函数表达式函数表达式 C=2*area_s(l,w)函数带参数函数带参数 m=max(a,max(b,c)注意:函数若有参数,在函数定义时的参数称为注意:函数若有参数,在函数定义时的参数称为“形形(式式)参数参数”,在函数调用时的参数称为,在函数调用时的参数称为“实实(在在)参数参数”。123.函数调用的几种情况函数调用的几种情况计算机程序设计基础北京工商大学 何渝15如:如:int area_s(int,int);也可包含形参数变量名:也可包含形参数变量名:int area_s(int a,int b);注注 意意 函数原型和函数定义中函数原型和函数定义中 的的函数

14、返回类型、函数名和形参函数返回类型、函数名和形参数表必须完全数表必须完全 一致,否则,编一致,否则,编译器会报告有编译错误。译器会报告有编译错误。9.3.5 9.3.5 函数原型函数原型 函数原型函数原型(Function Prototyping)是一条程序语句,必是一条程序语句,必须以分号结束。它由函数返回类型、函数名和参数表构成,须以分号结束。它由函数返回类型、函数名和参数表构成,其形式与函数定义的头部相似。其形式与函数定义的头部相似。格式:格式:返回类型返回类型 函数名函数名(参数表参数表);对于用户自己定义的函数,只要函数调用点在自定义函对于用户自己定义的函数,只要函数调用点在自定义函

15、数之前,程序员必须在源代码中说明函数原型。函数原型可数之前,程序员必须在源代码中说明函数原型。函数原型可不包含形参数变量名,只包含形参数类型名。不包含形参数变量名,只包含形参数类型名。计算机程序设计基础北京工商大学 何渝16#include /头文件头文件void main()/通知通知C+编译器,程序由此开始执行编译器,程序由此开始执行void hello();/函数原型说明,无参函数函数原型说明,无参函数hello();/函数第函数第1次调用次调用hello();/函数第函数第2次调用次调用void hello()/函数定义函数定义cout n Hello,girls and boys!n

16、;cout 姑娘们,小伙子们,大家好!姑娘们,小伙子们,大家好!nn;例例9.1 9.1 函数调用函数调用计算机程序设计基础北京工商大学 何渝17 函数调用采用栈结构实现。栈是一种后进函数调用采用栈结构实现。栈是一种后进先出的数据结构。先出的数据结构。函数调用的整个过程就是栈空间操作过程函数调用的整个过程就是栈空间操作过程1.调用过程:调用过程:建立被调用函数的栈空间建立被调用函数的栈空间 保留调用函数的运行状态和返回地址保留调用函数的运行状态和返回地址 传递参数传递参数 将控制权转交给被调用的函数将控制权转交给被调用的函数*9.4*9.4 函数调用机制函数调用机制计算机程序设计基础北京工商大

17、学 何渝182.返回过程:返回过程:函数返回时,如果有返回值保留在临函数返回时,如果有返回值保留在临时变量空间中时变量空间中 恢复调用函数的运行状态恢复调用函数的运行状态 释放栈空间释放栈空间 按保存的返回地址,返回到调用函数按保存的返回地址,返回到调用函数计算机程序设计基础北京工商大学 何渝19 void funca(int,int);void funcb(float);void main()int a=6,b=12;float c=10;funca(a,b);funcb(c);void funca(int aa,int bb)int n=5;/void funcb(float cc)flo

18、at f=2.12;/栈区栈区 n bb funca(c)aa5126返回地址返回地址调用函数运行状态调用函数运行状态 b a main()126参数参数返回地址返回地址操作系统运行状态操作系统运行状态例中函数调用机制中的栈结构计算机程序设计基础北京工商大学 何渝20 C/C+程序中函数间数据传送方法之程序中函数间数据传送方法之一是通过函数的返回值,这种带有返回值一是通过函数的返回值,这种带有返回值的函数就称为的函数就称为“带有返回值的函数带有返回值的函数”,它的,它的函数体内部一定至少有一个返回语句:函数体内部一定至少有一个返回语句:return(return_value);其中其中retu

19、rn为关键字,为关键字,参数参数return_value可可是常数,变量,表达式或有返回值的函数是常数,变量,表达式或有返回值的函数调用,它的数据类型应与函数定义的类型调用,它的数据类型应与函数定义的类型一致!特殊时,也可不用该参数。建议用!一致!特殊时,也可不用该参数。建议用!9.5 带返回值的带返回值的函数函数计算机程序设计基础北京工商大学 何渝21#include /头文件头文件void main()/通知通知C+编译器,程序由此开始执行编译器,程序由此开始执行void hello();/函数原型说明函数原型说明int r;r=hello();/用变量用变量r接收返回值接收返回值hell

20、o();/没有接收返回值没有接收返回值int hello()/函数定义函数定义cout n Hello,girls and boys!n;cout 姑娘们,小伙子们,大家好!姑娘们,小伙子们,大家好!nn;return(0);例例9.2 9.2 带返回值的函数调用带返回值的函数调用计算机程序设计基础北京工商大学 何渝9.5.1 返回指针值的函数返回指针值的函数 一个函数在被调用之后可以带回一个值返回到一个函数在被调用之后可以带回一个值返回到主调函数,这值可以是整型、实型、字符型等类型,主调函数,这值可以是整型、实型、字符型等类型,也可以带回一个指针类型的数据也可以带回一个指针类型的数据。前面介

21、绍过的申。前面介绍过的申请动态内存空间的函数实际上就这样一类函数,如请动态内存空间的函数实际上就这样一类函数,如在上章例在上章例8.88.8和例和例8.98.9中使用的中使用的malloc()malloc()函数函数int int*iM=(int*)malloc(sizeof(int*iM=(int*)malloc(sizeof(int););iMiM=(int*)malloc(sizeof(int)*iC=(int*)malloc(sizeof(int)*iC););这样的函数在这样的函数在C/C+C/C+编译系统中提供的系统函数库编译系统中提供的系统函数库中有很多,熟练掌握有很大益处!中有

22、很多,熟练掌握有很大益处!计算机程序设计基础北京工商大学 何渝例例9.3 自编自编strchr函数,在一字符串中找函数,在一字符串中找 一指定的字符一指定的字符(C/C+库函数中有此函数库函数中有此函数)void main()void main()char*strch(char*str,char ch);char*strch(char*str,char ch);char*pt,ch,line=I love China;char*pt,ch,line=I love China;ch=ch=C;long cl;C;long cl;pt=strchr(line,ch);/pt=strchr(line

23、,ch);/查找字符查找字符C C cl=pt-line;cl=pt-line;/计算字符计算字符C C在第几位置在第几位置 coutThe position coutThe position isis cl cl (starting from 0)starting from 0)n n;/输出位置数输出位置数 char*strch(char*str,char ch)while(*str!=ch)str+;return(str);计算机程序设计基础北京工商大学 何渝249.5.1 程序的内存区域程序的内存区域 程序在系统中运行时,操作系统为其分配的程序在系统中运行时,操作系统为其分配的存储空间

24、可划分为如下的四个区域,每个区域存存储空间可划分为如下的四个区域,每个区域存放不同的数据。变量除有数据类型外,还有存储放不同的数据。变量除有数据类型外,还有存储特性。特性。程序代码程序代码全局数据,静态数据全局数据,静态数据动态数据动态数据局部数据局部数据Code areaData area Heap areaStack area9.5 9.5 变量的存储特性变量的存储特性计算机程序设计基础北京工商大学 何渝25数据区数据区数据区数据区全局生命期及作用域全局生命期及作用域全局生命期及作用域全局生命期及作用域 静态生命期及作用域静态生命期及作用域静态生命期及作用域静态生命期及作用域栈栈栈栈 区区

25、区区 局部生命期及作用域局部生命期及作用域局部生命期及作用域局部生命期及作用域堆堆堆堆 区区区区 动态生命期动态生命期动态生命期动态生命期 当数据存放在不同区域时,具有不同的生命期和作用域。当数据存放在不同区域时,具有不同的生命期和作用域。生命期也称为生存期,即标识符在程序运行中的时限。生命期也称为生存期,即标识符在程序运行中的时限。全局生命期指标识符在程序运行的全过程中存在。全局生命期指标识符在程序运行的全过程中存在。局部生命期指标识符在程序运行的局部阶段存在。局部生命期指标识符在程序运行的局部阶段存在。作用域是指标识符在程序中的有效范围。作用域开始于作用域是指标识符在程序中的有效范围。作用

26、域开始于标识符的说明处。标识符的说明处。可见性是分析在某一位置标识符的有效性,即表示该标识可见性是分析在某一位置标识符的有效性,即表示该标识符在该位置是否可以被调用。它是从另一角度表现标识符符在该位置是否可以被调用。它是从另一角度表现标识符的有效性。的有效性。标识符的生命期和作用域与标识符在内存中的存储方式密标识符的生命期和作用域与标识符在内存中的存储方式密切相关。切相关。计算机程序设计基础北京工商大学 何渝269.5.2 全局变量全局变量(Global Variable)全局变量是在函数之外定义的变量,具有全全局变量是在函数之外定义的变量,具有全局生命期和作用域,程序中的每个函数都可见。局生

27、命期和作用域,程序中的每个函数都可见。全局变量存放在内存的全局数据区。全局变量存放在内存的全局数据区。定义全局变量时,若无显示初始化,编译器定义全局变量时,若无显示初始化,编译器将全局变量初始化为将全局变量初始化为0。全局变量通常在全局变量通常在main()函数之前定义,一旦函数之前定义,一旦被定义可被后面函数访问。被定义可被后面函数访问。尽管全局变量是可以在程序任何函数之外定尽管全局变量是可以在程序任何函数之外定义,但定义点之前的函数是不可知的。义,但定义点之前的函数是不可知的。计算机程序设计基础北京工商大学 何渝27例例9.4 全局变量例子全局变量例子 int func();int n=5

28、;void main()int m=n;coutm=mendl;coutn=nendl;coutn=func();int func()int s=10;n=s;return(n);结果结果:m=5 n=5 n=10则则main()函数中语句函数中语句m=n;无意义,编译错。无意义,编译错。若将全局变量若将全局变量n 定义在定义在两函数之间:两函数之间:int n=5;int n=5;计算机程序设计基础北京工商大学 何渝28例例9.5 全局变量的又一个例子全局变量的又一个例子:#include int id=3;/全局变量全局变量void main()id=5;/局部变量局部变量 int id=

29、7;/更深层的局部变量更深层的局部变量 coutid=idendl;/输出输出7 coutid=idendl;/输出输出5 运算结果:运算结果:id=7 id=5计算机程序设计基础北京工商大学 何渝299.5.3 局部变量局部变量(Local Variable)在函数在函数(模块模块)内部定义的变量称为局部变量,内部定义的变量称为局部变量,其生命期和作用域均为局部的。即在函数其生命期和作用域均为局部的。即在函数(模块模块)内内可见,作用域为函数内部。可见,作用域为函数内部。局部变量存放在栈区中,函数被调用时,局部局部变量存放在栈区中,函数被调用时,局部变量在栈区被分配存储空间,函数调用结束时,

30、变量在栈区被分配存储空间,函数调用结束时,局部变量随之消失,其值不能保存。生命期是在局部变量随之消失,其值不能保存。生命期是在函数调用期间。函数调用期间。局部变量在局部变量在C/C+中没有缺省初值,未被显式中没有缺省初值,未被显式初始化,其值不确定。初始化,其值不确定。计算机程序设计基础北京工商大学 何渝30 不同函数可以使用同名的局部变量,便不同函数可以使用同名的局部变量,便于大型软件开发中的分任务分模块的编程。于大型软件开发中的分任务分模块的编程。类型修饰符类型修饰符auto习惯上被省略。例如:习惯上被省略。例如:void main()int n;/等价于等价于auto int n;/vo

31、id func()int n;/等价于等价于auto int n;/计算机程序设计基础北京工商大学 何渝319.5.4 静态变量静态变量(Static Variable)包括:静态局部变量及静态全局变量。包括:静态局部变量及静态全局变量。1.静态局部变量静态局部变量(Static Local Variable)静态局部变量静态局部变量(关键字为关键字为static)也是在函数(模块)内部定也是在函数(模块)内部定义的变量,其作用域与局部变量类似,仅在函数内部可见,但义的变量,其作用域与局部变量类似,仅在函数内部可见,但由于存放在由于存放在data area有固定的存储单元,函数调用结束后,其有

32、固定的存储单元,函数调用结束后,其值得以保存。值得以保存。静态局部变量与全局变量一样,若未初始化,其值为静态局部变量与全局变量一样,若未初始化,其值为0。编译器对静态局部变量仅初始化一次,重复调用保留原值,编译器对静态局部变量仅初始化一次,重复调用保留原值,不再进行初始化。不再进行初始化。计算机程序设计基础北京工商大学 何渝32程序一程序一程序一程序一main()main()void increment(void);void increment(void);increment();increment();increment();increment();increment();increment

33、();void increment(void)void increment(void)int x=0;int x=0;/自动自动自动自动 x+;printf(%d ,x);x+;printf(%d ,x);运行结果运行结果运行结果运行结果:程序二程序二main()void increment(void);increment();increment();increment();void increment(void)static int x=0;/静态静态 x+;coutx;运行结果:运行结果:计算机程序设计基础北京工商大学 何渝33 在函数之外定义的静态变量称为静态全局在函数之外定义的静态变量

34、称为静态全局变量。静态全局变量与全局变量的作用域和生变量。静态全局变量与全局变量的作用域和生命期都是全局的。命期都是全局的。区别:前者作用域为定义该静态全局变量区别:前者作用域为定义该静态全局变量的源程序文件,后者作用域为组成程序的所有的源程序文件,后者作用域为组成程序的所有源程序文件,即可以用在不至一个源程序文件源程序文件,即可以用在不至一个源程序文件中。见后面章节的介绍。中。见后面章节的介绍。2.静态全局变量静态全局变量(Static Global Variable)计算机程序设计基础北京工商大学 何渝34 函数与函数之间可能需要数据的交换,函数与函数之间可能需要数据的交换,有三种方式:有

35、三种方式:1.全局变量全局变量2.函数名带回返回值函数名带回返回值3.函数的参数函数的参数注:第注:第1种因副作用,尽量少用;第种因副作用,尽量少用;第2种方式只种方式只能带回一个值;第能带回一个值;第3种方式最好,可将数据带种方式最好,可将数据带 进函数进函数,也可带出函数,但较复杂。也可带出函数,但较复杂。9.6 9.6 带参数的函数带参数的函数计算机程序设计基础北京工商大学 何渝35例例9.9.6 带参数及返回值函数示例带参数及返回值函数示例 int sum_ab(int a,int b);/函数说明函数说明 void main()int a=6,b=12,sum;/变量定义变量定义 s

36、um=sum_ab(a,b);/函数调用并带回返回值函数调用并带回返回值 cout a+b=sum endl;int sum_ab(int aa,int bb)/函数定义函数定义 int isum;isum=aa+bb;return(isum);/返回值类型是整型返回值类型是整型 计算机程序设计基础北京工商大学 何渝36例例9.7 求三整数平均值求三整数平均值#include void main(void)/计算平均值 float fun(int x,int y,int z);/函数(原型)声明 int a=87,b=90,c=93;float ave;/定义数组和变量 ave=fun(a,b

37、,c);/调用fun函数,计算三数平均值 printf(“三整数平均值为:%f”,ave);/输出平均值float fun(int x,int y,int x)/定义函数fun float aver;aver=(float)(x+y+z)/3.0;/求三数的算术平均值 return(aver);/返回计算结果给的调用函数计算机程序设计基础北京工商大学 何渝37 函数间进行信息与数据的传送方法之一就是通过函数的参数来完成的,它可以将信息与数据传进函数,也可以传出函数。下面通过两变量相互交换其值的例子来进一步了解函数参数的作用,若有:int a=3,b=5;a=b;b=a;试问:是否试问:是否a与

38、与b相互交换其值?相互交换其值?9.6.1 9.6.1 函数的参数实例函数的参数实例计算机程序设计基础北京工商大学 何渝38void main()void swap(int,int);/函数声明 int a=2,b=9;/定义两整数,并初始化 swap(a,b);/调用函数 cout “a=“a “b=“b endl;void swap(int x,int y)/*函数定义*/int t;cout “x=“x “y=“y endl;t=x;x=y;y=t;cout “x=“x “y=“y endl;结果:x=2 y=9x=9 y=2a=2 b=9例例9.8 9.8 交换两整数的值交换两整数的值

39、计算机程序设计基础北京工商大学 何渝39void main()void swap(int&,int&);/函数声明 int a=2,b=9;/定义两整数,并初始化 swap(a,b);/调用函数 cout “a=“a “b=“b endl;void swap(int&x,int&y)/*函数定义*/int t;cout “x=“x “y=“y endl;t=x;x=y;y=t;cout “x=“x “y=“y endl;结果:x=2 y=9x=9 y=2a=9 b=2*例例9.9 9.9 修改例修改例9.89.8计算机程序设计基础北京工商大学 何渝40void main()void swap(

40、int*,int*);/函数声明 int a=2,b=9;/定义两变量,并初始化 swap(&a,&b);/函数调用 cout “a=“a “b=“b endl;void swap(int*x,int*y)/函数定义 int t;cout “x=“*x “y=“*y endl;t=*x;*x=*y;*y=t;cout “x=“*x “y=“*y endl;结果:?例例9.10 9.10 修改例修改例9.89.8计算机程序设计基础北京工商大学 何渝41void main()void swap(int*,int*);/函数声明 int a=2,b=9;/定义两整数,并初始化 swap(&a,&b)

41、;/调用函数 cout “a=“a “b=“b endl;void swap(int*x,int*y)/*函数定义*/int*t;cout “x=“*x “y=“*y endl;*t=*x;*x=*y;*y=*t;cout “x=“*x “y=“*y endl;结果:?例例9.11 9.11 修改例修改例9.109.10计算机程序设计基础北京工商大学 何渝42void main()void swap(int*,int*);/函数声明 int a=2,b=9;/定义两整数,并初始化 swap(&a,&b);/调用函数 cout “a=“a “b=“b endl;void swap(int*x,i

42、nt*y)/*函数定义*/int*t;cout “x=“*x “y=“*y endl;t=x;x=y;y=t;cout “x=“*x “y=“*y endl;结果:?例例9.12 9.12 修改例修改例9.109.10计算机程序设计基础北京工商大学 何渝43 前面例子中只有例9.8的函数参数是值传送,只能进行数据的“单向单向”传送,将数据送进函数,而发生变化了的结果没法传回来!其余的例9.9-例9.12的函数参数都是地址传送,因此才能实现数据的“双向双向”传递!多多体会!说明说明:计算机程序设计基础北京工商大学 何渝449.6.2 数组指针作为函数的参数数组指针作为函数的参数 通过前面的学习,

43、我们了解了用数组名作函数参数的情况。进一步的学习知道,数组名可以代表数组的起始地址,用数组名可作参数传递的是地址,这样可将数组起始地址传递给被调用函数的形参,同样指向数组的指针变量也就可以作为函数参数,这样做常常可以给我们带很多方便之处。计算机程序设计基础北京工商大学 何渝45将数组中数据传送到另一个 函数,有两种方法:一、将数组元素数组元素作为参数 用法与用简单变量作为参数相同。ave=fun(a0,a1,a2);/主函数中调用函数 .int fun(int a,int b,int c)/定义一个 fun 函数 int aver;aver=(a+b+c)/3;return(aver);它是值

44、传送值传送方式,只能从实参传给形参,反之不行!9.6.39.6.3 数组作为函数参数的各种用法数组作为函数参数的各种用法计算机程序设计基础北京工商大学 何渝46main()int fun2(int x3);/函数说明 int av3=87,90,93,ave;/定义数组和变量 ave=fun2(av);int fun2(int a3);/定义函数fun2,参数为数组 int sum,aver;sum=a0+a1+a2;aver=sum/3;return(aver);二、将数组名数组名作为函数参数计算机程序设计基础北京工商大学 何渝47void main()void swap(int x,int

45、 y);/函数说明 static int a2=2,9;/定义数组并赋初值 swap(a0,a1);/调用函数 cout a0=a0 a1=a1 endl;void swap(int x,int y)/函数定义 int t;cout x=x y=y endl;t=x;x=y;y=t;cout x=x y=y endl;例9.13 程序运行的结果是什么?计算机程序设计基础北京工商大学 何渝48void main()void swap(int b);/函数说明 static int a2=2,9;/定义数组并赋初值 swap(a);/调用函数 cout a0=a0 “a1=a1 endl;void

46、 swap(int b)/函数定义 int t;cout b0=b0 “b1=b1 endl;t=b0;b0=b1;b1=t;cout b0=b0 “b1=b1 endl;例9.14 修改例9.13,程序的结果是什么?计算机程序设计基础北京工商大学 何渝49void main()void swap(int b);/函数说明 static int a2=2,9,*ip;/定义数组和指针变量 ip=a;swap(ip);/用指针变量作函数实参 cout a0=a0 a1=a1 endl;void swap(int b)/函数定义 int t;cout b0=b0 b1=b1 endl;t=b0;b

47、0=b1;b1=t;cout b0=b0 b1=b1 endl;例9.15 修改例9.14计算机程序设计基础北京工商大学 何渝50void main()void swap(int*ip);/函数说明 static int a2=2,9;/定义数组和指针变量 swap(a);/用数组名当指针使用 cout a0=a0 a1=a1 endl;void swap(int*ip)/函数定义 int t;cout a0=*ip a1=*(ip+1)endl;t=*ip;*ip=*(ip+1);*(ip+1)=t;cout a0=*ip a1=*(ip+1)endl;例9.16 修改例9.14计算机程序设

48、计基础北京工商大学 何渝51注释:在上面的例子中知:可以用数组名作形参,而在上面的例子中知:可以用数组名作形参,而用指针变量为实参;同样也可以反过来,如此等等。用指针变量为实参;同样也可以反过来,如此等等。归纳一下,函数的实参与形参的对应关系可以归纳一下,函数的实参与形参的对应关系可以有以下几种:有以下几种:实实 参参 形形 参参数数 组组 名名数数 组组 名名数数 组组 名名指针变量指针变量指针变量指针变量数数 组组 名名指针变量指针变量指针变量指针变量计算机程序设计基础北京工商大学 何渝52 C+可给函数参数定义缺省值(Default Arguments),例如:void delay(in

49、t loops=100);/函数说明中指定缺省值 /void delay(int loops)/函数定义中不允许再指定缺省值 if(loops=0)return;for(int i=0;i loops;i+);调用时:delay();/loops采用缺省值100 delay(150);/loops设置为150*9.6.4 带缺省参数的函数带缺省参数的函数(一一)计算机程序设计基础北京工商大学 何渝53也可在定义函数时给函数的参数定义缺省值,如下也可在定义函数时给函数的参数定义缺省值,如下例,但被调函数的定义需放在调用函数之前。例,但被调函数的定义需放在调用函数之前。void delay(int

50、 loops=190)/函数定义时指定缺省值函数定义时指定缺省值 if(loops=0)return;for(int i=0;i copy d:123e.c f:123e.cc:copy d:123e.c f:123e.c它带了两个参数,若编写这样的程序,它带了两个参数,若编写这样的程序,mainmain函数必函数必须带参数,通过须带参数,通过mainmain参数处理命令行中的参数。参数处理命令行中的参数。mainmain函数中一般使用两个参数,其形式如下:函数中一般使用两个参数,其形式如下:main(argc,argv)main(argc,argv)/传统风格传统风格int argc;int

51、 argc;char*argv;/char*argv;/也写成也写成*argvargv或或main(int argc,char*argv)/main(int argc,char*argv)/现代风格现代风格 其中的其中的argcargc和和argvargv的参数名不能改变。的参数名不能改变。计算机程序设计基础北京工商大学 何渝56例9.17 设命令行命令:f1 Hello C+,输出其参数void main(int argc,char*argv)while(argc1)+argv;cout *argv;-argc;运行结果:Hello C+argvargc=3计算机程序设计基础北京工商大学 何

52、渝579.7 指针与函数指针与函数 一个函数包括一系列指令,在内存中占据一片存储单元,它也有一个起始地址,即入口地址。通过该地址可找到该函数,这个地址就称为函数的指针。这样可以定义一个指针变量,让它的值等于函数的入口地址,那么通过它也就能调用此函数,这个指针变量称为指向函数的指针变量称为指向函数的指针变量。定义一个指向函数的指针变量的一般形式如下:类型标识符 (*指针变量名)();ip函数fun1如:int(*ip)();若ip指向一函数fun1,即ip=fun1;则如右上图所示:计算机程序设计基础北京工商大学 何渝58例例9.18 9.18 用指针调用函数用指针调用函数 void main(

53、)int add2(int x,int y);int a=2,b=3,sum,sumpt;int(*pt)(int,int);pt=add2;sum=add2(a,b);sumpt=(*pt)(a,b);coutsum=sumendl;coutsumpt=simptendl;int add2(int x,int y)int iSum;iSum=x+y;return(iSum);运行结果:运行结果:total1=144total2=144计算机程序设计基础北京工商大学 何渝59 递归递归就是某一事物直接或间接地由自己组成。递归算法在计算机中被广泛使用。若一个函数直接或间接地调用自身,便构成了函数

54、的递归调用,前者称直接递归调直接递归调用用,后者称间接递归调用间接递归调用。C/+支持递归调用。使用递归可使程序简洁明了,但运算中要耗用大量内存。9.8 9.8 递归递归计算机程序设计基础北京工商大学 何渝例例9.18 递归计算递归计算 n!的函数的函数 rfact()n!n!的定义:的定义:long rfact(int n)long rfact(int n)if(n0)if(n0)/*/*输入值必须为非负整数输入值必须为非负整数*/printf(Negative argument to fact!n);/*printf(Negative argument to fact!n);/*报错报错*

55、/exit(-1);exit(-1);/*/*不正常退出不正常退出*/else if(n=1)return(1);else if(n=1)return(1);else return(n*rfact(n-1);/*else return(n*rfact(n-1);/*自己调用自己自己调用自己*/20计算机程序设计基础北京工商大学 何渝 返回值 2递归调用实例:计算!main()main()调用rfact(3)输 出 rfact(3)=6调用rfact(2)调用rfact(1).返回值 1 返回 值 6rfact(3)rfact(2)rfact(1)rfact(3)=-=6调 回 用 3*rfac

56、t(2)=-=3*2 代 过 过 程 2*rfact(1)=-=2*1 程 1=-=1 21计算机程序设计基础北京工商大学 何渝如:如:n 等于等于3,则递归调用过程如下;,则递归调用过程如下;fact(3)=3*fact(2)1 2*1 2*fact(1)1*fact(0)1 1*123*26大多数递归函数都能用非递归函数代替。大多数递归函数都能用非递归函数代替。由于自调用过程在函数内必须设置某些条件,当条由于自调用过程在函数内必须设置某些条件,当条件成立时终止自调用过程,并使程序控制逐步从函数中件成立时终止自调用过程,并使程序控制逐步从函数中返回。返回。函数之间由参数传递和返回值联系。函数

57、之间由参数传递和返回值联系。22计算机程序设计基础北京工商大学 何渝63例例例例9.19 9.19 求两个整数求两个整数求两个整数求两个整数a,b a,b 的最大公约数的最大公约数的最大公约数的最大公约数递归:递归:long gcd1(int a,int b)if(a%b=0)return(b);return gcd1(b,a%b);非递归:非递归:long gcd2(int a,int b)int temp;while(b!=0)temp=a%b;a=b;b=temp;return (a);使用递归函数的目的是简化程序设计,提高程使用递归函数的目的是简化程序设计,提高程 序的可读性,但增加系统开销。序的可读性,但增加系统开销。计算机程序设计基础北京工商大学 何渝64第第9章章 家庭作业家庭作业1.复习教材第复习教材第7章及新增内容章及新增内容2.做教材第做教材第7章及相关习题章及相关习题3.上机:依照讲义例题及教材上机:依照讲义例题及教材第第7章相关习题章相关习题4.预习下一章相关内容预习下一章相关内容

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!