版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、利用函数实现指定功能利用函数实现指定功能为了便于规划、组织、编程和调试,一般是把一个大的程序划分为若干个程序模块(即程序文件),每一个模块实现一部分功能。在程序进行编译时,以程序模块为编译单位,即分别对每一个编译单位进行编译。在分别通过编译后,才进行连接,把各模块的目标文件以及系统文件连接在一起形成可执行文件。利用函数实现指定功能利用函数实现指定功能在C+面向对象的程序设计中,主函数以外的函数大多是被封装在类中的。主函数或其他函数可以通过类对象调用类中的函数。无论是C还是 C+,程序中的各项操作基本上都是由函数来实现 的,程序编写者要根据需要编写一个个函数,每个函数用来实现某一功能。主函数写得
2、很简单,它的作用就是调用各个函数,程序部分的功能全部都是由各函数实现的。主函数相当于总调度,调动各函 数依次实现各项功能。 在主函数中调用其他函数在主函数中调用其他函数Main ( )Func1 ( )Func2 ( )Func3 ( )Func4 ( )Func5 ( )举例举例#include using namespace std;void printstar(void)cout*endlendl;void print_message(void)cout welcome to 武软!endlendl;int main()printstar();print_message();prints
3、tar();return 0;调用过程调用过程定义定义在前在后区别(是否要声明)在前在后区别(是否要声明)不可不可以嵌套定义;以嵌套定义;举例举例#include using namespace std;void printstar(void)cout*endlendl;void print_message(void)cout welcome to 武软!endly?x:y;z=xy?x:y;return(z)return(z) 注注意在意在C+C+中函数前面的类型名是不可以省略的,这相对于中函数前面的类型名是不可以省略的,这相对于C C语言更加语言更加安全和严格;安全和严格;函数参数函数参数
4、形式参数和实际参数形式参数和实际参数int max(int x,int y) int max(int x,int y) 这里的这里的x x,y y是形参是形参 int z;int z;z=xy?x:y;z=xy?x:y;return(z)return(z) main()main() int x;int x;x=maxx=max(a,ba,b) 这里的这里的a a,b b是实际参数是实际参数 举例举例#include using namespace std;int max(int x,int y)int z;z=xy?x:y;return(z);int main()int a,b,c;couta
5、b;c=max(a,b);coutmax=cendl;return 0;举例举例#include using namespace std;int max(int x,int y)int z;z=xy?x:y;return(z);int main()int a,b,c;coutab;c=max(a,b);coutmax=cendl;return 0;形式参数,在函数还没有调用的时,形式参数,在函数还没有调用的时,没有占用内存,只有在被调用的时没有占用内存,只有在被调用的时候才临时分配了存储空间,这个存候才临时分配了存储空间,这个存储空间和实参的存储不是一个地址,储空间和实参的存储不是一个地址,在
6、被调函数改变的变量不会返回到在被调函数改变的变量不会返回到调用函数,这就是值传递,也就是调用函数,这就是值传递,也就是单向传递。单向传递。实实参可以是常量、变量、表达式。参可以是常量、变量、表达式。但是要求变量或者表达式的值在传但是要求变量或者表达式的值在传递的时候有个确定的值递的时候有个确定的值。形参和实。形参和实参之间的值是可以相同或者赋值兼参之间的值是可以相同或者赋值兼容的。容的。举例举例#include using namespace std;int max(int x,int y)int z;z=xy?x:y;return(z);int main()int a,b,c;coutab;
7、c=max(a,b);coutmax=cendl;return 0;定义函数的时候函数首部指定,函定义函数的时候函数首部指定,函数形参的类型,函数类型都是不可数形参的类型,函数类型都是不可以省略。以省略。函数的返回值函数的返回值#include using namespace std;int max(int x,int y)int z;z=xy?x:y;return(z);int main()int a,b,c;coutab;c=max(a,b);coutmax=cendl;return 0;通过函数调用可以使得主调函数得通过函数调用可以使得主调函数得到一个确定的函数值,这个值就是到一个确定的
8、函数值,这个值就是函数值。函数值。关于关于return:函数的返回值是通过:函数的返回值是通过return语句获得的,语句获得的,return将被调用将被调用函数中的一个确定值带到主调函数函数中的一个确定值带到主调函数中去。一个函数中可以有很多个中去。一个函数中可以有很多个return语句,执行到哪一个语句,执行到哪一个return语语句,那个语句起作用。执行到句,那个语句起作用。执行到return就会返回到主调函数。这样后面即就会返回到主调函数。这样后面即使有很多个使有很多个return也不会起作用。也不会起作用。函数的返回值函数的返回值#include using namespace st
9、d;int max(int x,int y)int z;z=xy?x:y;return(z);int main()int a,b,c;coutab;c=max(a,b);coutmax=cy?x:y)函数的返回值函数的返回值#include using namespace std;int max(int x,int y)int z;z=xy?x:y;return(z);int main()int a,b,c;coutab;c=max(a,b);coutmax=cendl;return 0;函数值类型:函数返回值属于某个函数值类型:函数返回值属于某个确定的数据类型。如果函数值的类确定的数据类型。
10、如果函数值的类型和型和return返回值的类型不一样的时返回值的类型不一样的时候,是以函数值类型决定返回值的候,是以函数值类型决定返回值的类型。类型。函数的调用函数的调用函数调用方式:函数调用方式:. .函函数语句数语句 把把函数调用单独作为一个语句,并不要求函数带函数调用单独作为一个语句,并不要求函数带回一回一个值,只是个值,只是要函要函数完成一定的操作数完成一定的操作。printstarprintstar( ( ) ); 2.2.函函数表达式数表达式 函函数出现在一个表达式中,这时要求函数带回一数出现在一个表达式中,这时要求函数带回一个确个确定的值以参加表定的值以参加表达式的运算达式的运算
11、。如如c=2c=2* *max(a,bmax(a,b); ); 3.3.函函数参数参数数函函数调用作为一个函数的实参数调用作为一个函数的实参。如如 m=max(a,max(b,c); /max(b,c) m=max(a,max(b,c); /max(b,c) 是是函数调用,其值作为外层函数调用,其值作为外层 maxmax函函数调用的一个实参数调用的一个实参对被调用函数的声明对被调用函数的声明一个函数调用另一个函数的条件:一个函数调用另一个函数的条件:1.1.该函数必须是已经存在该函数必须是已经存在( (库函库函数或者用户自定义函数数或者用户自定义函数) )2.2.库函数要使用库函数要使用#in
12、clude#include指定将其包含过来。(指定将其包含过来。(#include#include)3.3.用户自定义,如果被调用函数定义在调用函数之后,要提前进行声用户自定义,如果被调用函数定义在调用函数之后,要提前进行声明。明。函数声函数声明:就明:就是在函数尚在未定义是在函数尚在未定义的情的情况下,事先将该函数的有关信况下,事先将该函数的有关信息通知编译系息通知编译系统,以统,以便使编译能正常进行。便使编译能正常进行。函数声明例题函数声明例题#include using namespace std;int main()int max(int x,int y);int a,b,c;cout
13、ab;c=max(a,b);coutmax=cy?x:y;return(z);声明和定义的区别:对声明和定义的区别:对函数的定义和声明不是同函数的定义和声明不是同一件事情。定义一件事情。定义 是指对函数功能的确立,包括是指对函数功能的确立,包括指定函数名、函数类指定函数名、函数类 型、形参及其类型、函数型、形参及其类型、函数体等,它是一个完整的、体等,它是一个完整的、 独立的函数单位。而独立的函数单位。而声明的作用则是把函数的名字、声明的作用则是把函数的名字、 函数类型以及函数类型以及形参的个数、类型和顺序形参的个数、类型和顺序( 注注意,不意,不 包括函数体包括函数体) 通通知编译系统,以便
14、在对包含函数知编译系统,以便在对包含函数调用调用的语句进的语句进行编译时,据此对其进行对照检查(例行编译时,据此对其进行对照检查(例 如函数如函数名是否正确,实参与形参的类型和个数是否名是否正确,实参与形参的类型和个数是否 一一致)。致)。 函数声明例题函数声明例题#include using namespace std;int main()int max(int x,int y);int a,b,c;coutab;c=max(a,b);coutmax=cy?x:y;return(z);函数原型:函数原型:int max(int x,int y);int max(int ,int );根据函数
15、原型在程序编译阶段对调根据函数原型在程序编译阶段对调用函用函数的合法数的合法性进行全面检查性进行全面检查函数声明例题函数声明例题#include using namespace std;int main()int max(int x,int y);int a,b,c;coutab;c=max(a,b);coutmax=cy?x:y;return(z);一般定义的方式:一般定义的方式:函数类型函数类型 函数名函数名(参数类型参数类型1 ,参数类型,参数类型2 ); 函数类型函数类型 函数名函数名(参数类型参数类型1 参数名参数名1,参数类,参数类型型 2 参数名参数名2);系统不检查参数名,所以
16、可以不写上,但是写上系统不检查参数名,所以可以不写上,但是写上可以让程序看起来更加清晰。可以让程序看起来更加清晰。函数声明位置函数声明位置一般都把main函数写在最前面,这样对整个程序的结构和作用一目了然,统览全局,然后再具体了解各函数的细节。此外,用函数原型来声明函数,还能减少编写程序时可能出现的错误。由于函数声明的位置与函数调用语句的位置比较近,因此在写程序时便于就近参照函数原型来书写函数调用,不易出错。函数的嵌套调用函数的嵌套调用函函数可以嵌套调用不可以嵌套定义。数可以嵌套调用不可以嵌套定义。Void f1()Void f1() Int f2()Int f2() Void f1()Voi
17、d f2()函数的嵌套调用函数的嵌套调用main( )调fun1( )结束fun1( )调fun2( )返回fun2( )返回过程:p98嵌嵌套调用套调用#include using namespace std;int main()int max_4(int a, int b,int c,int d);int max_4(int a, int b,int c,int d);int a,b,c,d,max;coutabcc;max=max_4(a,b,c,d);coutmax=maxy)return x;else return y;递递归调用归调用在调用一个函数的过程中又出现直接或间接地调用该函
18、数本身,称为函数的递归调用。直接调用自己,间接调用自己。 顺顺序结构序结构递递归调用归调用有5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁。问第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个人大两岁。问第2个人,说比第1个人大两岁。最后问第1个人, 他说是10岁。请问第5个人多大? 每一个人的年龄都比其前1个人的年龄大两岁。 递递归调用归调用#include using namespace std;int age(int);int main()coutage(5)endl;return 0;int age(int n)int c;if(n=1) c=10;else c=ag
19、e(n-1)+2;return c;(过程详述)递递归调用归调用用递归方法求n!特殊情况:n=1或者n=0的处理方法;阶乘要一层层的求出结果递递归调用归调用#include using namespace std;long fac(int);int main()int n;long y;coutn;y=fac(n);coutn!=yendl;return 0;long fac(int n)long f;if(n0)coutn的值小于0,不符合要求endl;f=-1;else if(n=0|n=1)f=1;else f=fac(n-1)*n;return f;变量属性变量属性空间角度:全局变量,
20、局部变量时间角度:(存储期)动态存储期,静态存储期。局部变量局部变量在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。同样,在复合语句中定义的变量只在本复合语句范围内有效。这称为局部变量。局部变量局部变量全局变量全局变量而在函数之外定义的变量是外部变量,称为全局变量。全局变量的有效范围为从定义变量的位置开始到本源文件结束。全局变量全局变量作用域作用域变量的有效范围称为变量的作用域,变量有4种不同的作用域,文件作用域、函数作用域、块作用和函数原型作用域。文件作用域是全局的,其他三者是局部的。 变量的存储类别变量的存储
21、类别静态存储方式和动态存储方式;所谓静态存储方式是指在程序运行期间,系统对变量分配固定固定的存储空间。而动态存储方式则是在程序运行期间,系统对变量动态动态地分配存储空间。 全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储单元,程序执行完毕就释放这些空间。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。 变量的存储类别变量的存储类别静态存储方式和动态存储方式;在动态存储区中存放以下数据:函数形式参数函数形式参数。 函数中的自动自动变量变量(未加static声明的局部变量,详见后面的介绍)。函数调用时的现场保护和返回地址现场保护和返回地址等。对以上这些数据,在
22、函数调用开始时分配动态存储空间,函数结束时释放这些空间。在程序执行过程中,这种分配和释放是动态的如果在一个程序中两次调用同一函数,则要进行两次分配和释放,而两次分配给此函数中局部变量的存储空间地址可能是不相同的。存储类别存储类别C+中描述一个变量有数据类型和存储类别。存储类别指的是数据在内存中存储的方法。存储4种:自动的(auto)、静态的(static)、寄存器(register)的和外部的(extern)。根据变量的存储类别,可以知道变量的作用域和存储期。自动变量函数中的局部变量,如果不用关键字static加以声明,编译系统对它们是动态地分配存储空间。函数形参和函数中定义的变量,在调用函数
23、的时候,系统给它们动态的分配存储空间,函数调用结束时自动释放这些空间。复合语句中也是如此。int max(int a)auto int b=3;auto可以省略,如果不写,默认为自动存储类别,属于动态存储方式。程序中大多数变量就是属于自动变量。静态局部变量静态局部变量用static声明静态局部变量:有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量保留上一次函数调用结束时的值。静态局部变量静态局部变量举例举例#include using namespace std;int f(int a)auto int b=0;static
24、int c=3;b=b+1;c=c+1;return a+b+c;int main()int a=2,i;for(i=0;i3;i+)coutf(a) ;coutendl;return 0;静态局部变量静态局部变量(1)静态局部变量在静态存储区内分配存储单元。 在程序整个运行期间都不释放。(2)静态局部变量赋初值是在编译时进行的,即只赋初值一次,在程序运行时它已有初值。(3)如果在定义局部变量时不赋初值的话,对静态 局部变量来说,编译时自动赋初值0。而对自动变量来说,如 果不赋初值,则它的值是一个不确定的值。(4)虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。静态局部变量
25、静态局部变量举例举例输出1到5的阶乘值。思路:先求出:1!再求2!然后分别3!、4!、5!这样可以通过记住上面一个值,然后继续执行。在上一次执行的基础上继续执行。静态局部变量静态局部变量举例举例输出1到5的阶乘值。#include using namespace std;int fac(int n)static int f=1;f=f*n;return f;int main()int i;for(i=1;i=5;i+)couti!=fac(i)endl;return 0;静态局部变量静态局部变量应该看到,用静态存储要多占内存,而且降低了程序的读性,当调用次数多时往往弄不清静态局部变量的当前值是
26、什么。RegisterRegister声明寄存器变量声明寄存器变量为提高执行效率,C+允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。在程序中定义寄存器变量对编译系统只是建议性(而不是强制性) ) )的。当今的优化编译系统能够识别使用频繁的变量,自动地将这些变量放在寄存器中。externextern声明外部变量声明外部变量全局变量(外部变量)是在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为本文件中各个函数所引用。编译时将全局变量分配在静态存储区。 有时需要用extern来声明全局变量,以扩展
27、全局变量的作用域。 1.在一个文件内声明全局变量2.在多文件的程序中声明外部变量在一个文件内声明全局变量如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了定义处到文件终了。如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字extern对该变量作外部变量声明,表示该变量是一个将在下面定义的全局变量。在一个文件内声明全局变量#include using namespace std;int max(int,int);int main()extern extern int a,b;int a,b;coutmax(a,b)y?x:y;return z;在多个文件内声明全
28、局变量如果一个程序包含两个文件,在两个文件中都要用 到同一个外部变量num,不能分别在两个文件中各 自定义一个外部变量num正确的做法是:在任一个文件中定义外部变量num,而在另一文件中用extern对num作外部变量声明注意:extern 是用作变量的声明,而不是变量的定义。它只是对一个已经定义的外部变量作声明,以扩展其作用域。用用staticstatic声明静态外部变量声明静态外部变量有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时可以在定义 外部变量时加一个static声明。这种加上static声明、只能用于本文件的外部变量(全局变量)称为静态外部变量。注意
29、:无论加上static还是不加上static的外部变量都是静态存储方式,只是作用范围不同而已,都是在编译时分配内存的。总结总结一个变量除了数据类型以外,还有3种属性: (1)存储类别 ,C+允许使用auto,static,register和 extern 4种存储类别。 (2)作用域,指程序中可以引用该变量的区域。 (3)存储期,指变量在内存的存储期限。 以上3种属性是有联系的,程序设计者只能声明变量的存储类别,通过存储类别可以确定变量的作用域和存储期。总结总结一个变量除了数据类型以外,还有3种属性: (1)存储类别 ,C+允许使用auto,static,register和 extern 4种
30、存储类别。 (2)作用域,指程序中可以引用该变量的区域。 (3)存储期,指变量在内存的存储期限。 以上3种属性是有联系的,程序设计者只能声明变量的存储类别,通过存储类别可以确定变量的作用域和存储期。说明:extern 只能用来声明已定义的外部变量,而不能用于变量的定义。只要看到extern,就可以判定这是变量声明,而不是定义变量的语句。总结总结从作用域角度分,有局部变量和全局变量。它们采用的存储类别如下: 局部变量 自动变量, 即动态局部变量( 离开函数,值就消失) 静态局部变量(离开函数,值仍保留) 寄存器变量(离开函数, 值就消失 ) 形式参数(可以定义为自动变量或寄存器变量) 全局变量静态外部变量(只限本文件引用)外部变量(即非静态的外部变量,允许其他文件引用) 总结总结从变量存储期(存在的时间)来区分,有有动态存动态存储和储和静态存储两种类静态存储两种类型,型,静态存储是程序整个运行时间都存在,而动态存储则是在调用函数时临时分配单元。 动态存储 自动变量( 本函数内有效 ) 寄存器变量(本函数内有效) 形式参数 静态存储 静态局部变量(函数内有效 ) 静态外部变量( 本文件内有效 ) 外部变量(其他文件可引用)总结总结从变量值存放的位置来区分,可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年度执法资格测试卷附答案详解(轻巧夺冠)
- 2026年党校入党积极分子培训结业考试全真模拟试卷及答案(三)
- 2024-2025学年中级软考考试历年机考真题集含完整答案详解【夺冠】
- 2024-2025学年度化验员试题预测试卷及参考答案详解【新】
- 2024-2025学年全国统考教师资格考试《教育教学知识与能力(小学)》过关检测试卷含完整答案详解【全优】
- 2024-2025学年天津公安警官职业学院单招《数学》测试卷附参考答案详解(达标题)
- 2024-2025学年度计算机四级高频难、易错点题附答案详解(综合卷)
- 2024-2025学年度粮油食品检验人员能力提升B卷题库带答案详解(考试直接用)
- 2025年事业单位考试时事政治知识真题(附答案)
- 2025年吉林省四平市政府采购评审专家考试真题(附含答案)
- 广西南宁市第四十七中学2026届中考模拟金典卷数学试题(七)试题含解析
- 中医护理四诊法应用
- 2025年云南省英语专升本真题及答案
- 【2026年中考复习】全国中考物理真卷综合能力题100道(下)
- 2026年安徽城市管理职业学院单招职业适应性测试题库带答案详解(黄金题型)
- 《地理信息数据分类分级工作指南(试行)》
- 2026年及未来5年市场数据中国污水处理行业市场前景预测及投资战略数据分析研究报告
- 证券市场交易规则与操作指南
- 2026湖南张家界市桑植县招聘城市社区专职工作者20人笔试备考题库及答案解析
- 2026年公立医院信息科工作人员招聘考试笔试试题(含答案)
- 第一单元《写作:考虑目的和对象》八年级语文下册同步课件(统编版新教材)
评论
0/150
提交评论