C语言看不懂形参实参以及调用方法必看课件

上传人:文**** 文档编号:240608821 上传时间:2024-04-24 格式:PPT 页数:61 大小:190.51KB
收藏 版权申诉 举报 下载
C语言看不懂形参实参以及调用方法必看课件_第1页
第1页 / 共61页
C语言看不懂形参实参以及调用方法必看课件_第2页
第2页 / 共61页
C语言看不懂形参实参以及调用方法必看课件_第3页
第3页 / 共61页
资源描述:

《C语言看不懂形参实参以及调用方法必看课件》由会员分享,可在线阅读,更多相关《C语言看不懂形参实参以及调用方法必看课件(61页珍藏版)》请在装配图网上搜索。

1、第8章 函数主要内容:主要内容:主要内容:主要内容:1 1、函数的定义、函数的定义2 2、函数的调用(包括嵌套调用和递归调用)、函数的调用(包括嵌套调用和递归调用)4 4、局部变量和全局变量、局部变量和全局变量5 5、变量的存储类别、变量的存储类别 重点重点重点重点:1)1)如何定义函数(即如何编写函数)如何定义函数(即如何编写函数)2)2)如何调用函数(包括库函数和自定义函如何调用函数(包括库函数和自定义函数)数)函数的引入n n函数:函数是完成某些特定功能的代码块。函数:函数是完成某些特定功能的代码块。n n使用函数的优点:使用函数的优点:1 1)实现模块化设计:将一个大任务分解成一个个的

2、)实现模块化设计:将一个大任务分解成一个个的小任务,然后每个任务分别用函数实现。小任务,然后每个任务分别用函数实现。2 2)实现)实现“编写一次,多次调用编写一次,多次调用”,避免在不同的程,避免在不同的程序中重复编写相同的函数。序中重复编写相同的函数。3 3)便于程序调试和维护,因为每个函数之间是相互)便于程序调试和维护,因为每个函数之间是相互独立的。独立的。函数的分类:库函数和用户自定义函数函数的分类:库函数和用户自定义函数8.1 函数的定义函数的定义例例例例8.18.1编写函数编写函数编写函数编写函数maxmax:求两个整数求两个整数求两个整数求两个整数x x和和和和y y中的较大数。中

3、的较大数。中的较大数。中的较大数。int int max(max(int int x,x,int int y)y)/*/*函数头函数头函数头函数头*/*/int int z=x;z=x;/*/*函数体函数体函数体函数体*/*/if(xy)z=y;if(xb?a:b);return(ab?a:b);或或 intint max(a,b)max(a,b)intint a,b;a,b;/*/*形参的类型在函数体前、函数名后说明形参的类型在函数体前、函数名后说明*/*/return(ab?a:b);return(ab?a:b);前者为标准格式,后者为传统格式,通常用前者。前者为标准格式,后者为传统格式,

4、通常用前者。4.4.函数体函数体函数体函数体:即即函数功能的具体实现。函数功能的具体实现。函数功能的具体实现。函数功能的具体实现。它包括两部分:它包括两部分:说明部分和执行部分说明部分和执行部分说明部分和执行部分说明部分和执行部分,其中说明部分,其中说明部分包括函数中所用的局部变量等的说明、函数中要调用包括函数中所用的局部变量等的说明、函数中要调用的函数的说明。的函数的说明。注意:注意:函数不能嵌套定义,即函数内不能再定义函数,这样可函数不能嵌套定义,即函数内不能再定义函数,这样可以保证函数间是相互独立的,以实现模块化程序设计。以保证函数间是相互独立的,以实现模块化程序设计。5.5.空函数:空

5、函数:空函数:空函数:函数类型函数类型函数类型函数类型 函数名函数名函数名函数名()()调用此函数时,什么也不做。只是表明这里要调用此函数时,什么也不做。只是表明这里要 调用一调用一个函数,而现在这个函数的功能还没实现。个函数,而现在这个函数的功能还没实现。空函数在程空函数在程空函数在程空函数在程 序设计中常常用到的:序设计中常常用到的:序设计中常常用到的:序设计中常常用到的:1 1)预留函数,便于以后扩充程序功能。)预留函数,便于以后扩充程序功能。)预留函数,便于以后扩充程序功能。)预留函数,便于以后扩充程序功能。2 2)便于程序的模块化设计和调试:程序设计中往往)便于程序的模块化设计和调试

6、:程序设计中往往)便于程序的模块化设计和调试:程序设计中往往)便于程序的模块化设计和调试:程序设计中往往根据需要确定若干模块,分别由一些函数来实现。根据需要确定若干模块,分别由一些函数来实现。根据需要确定若干模块,分别由一些函数来实现。根据需要确定若干模块,分别由一些函数来实现。一个大系统,需要编写很多用户函数,而这些函一个大系统,需要编写很多用户函数,而这些函一个大系统,需要编写很多用户函数,而这些函一个大系统,需要编写很多用户函数,而这些函数不可能数不可能数不可能数不可能 也没有必要同步完成,通常足从一些基也没有必要同步完成,通常足从一些基也没有必要同步完成,通常足从一些基也没有必要同步完

7、成,通常足从一些基本模块开始,编写一个调试一个,对于没有编写本模块开始,编写一个调试一个,对于没有编写本模块开始,编写一个调试一个,对于没有编写本模块开始,编写一个调试一个,对于没有编写 的函数就需要用空函数代替。从而也有利于集体的函数就需要用空函数代替。从而也有利于集体的函数就需要用空函数代替。从而也有利于集体的函数就需要用空函数代替。从而也有利于集体创作。创作。创作。创作。空函数举例空函数举例n n例例8.3 8.3 编写小学生算术练习系统的主程序:编写小学生算术练习系统的主程序:显显示主菜单,用户选择,根据选择执行加、减、示主菜单,用户选择,根据选择执行加、减、乘、除、退出乘、除、退出5

8、 5项功能之一。项功能之一。重复上述步骤,直至选择退出。重复上述步骤,直至选择退出。其中主程序调用的函数有:显示主菜单函数其中主程序调用的函数有:显示主菜单函数list_menu(),list_menu(),加、减、乘、除、退出函数分别是加、减、乘、除、退出函数分别是add(),sub(),add(),sub(),mulmul(),divide(),end().(),divide(),end().以上函数除以上函数除list_menulist_menu()()外此时均为空函数。外此时均为空函数。程序:程序:l8_1_4.cl8_1_4.c#include include stdiostdio.

9、h /*l8_1_4.c*/.h /*l8_1_4.c*/main()main()void add(),sub(),void add(),sub(),mulmul(),divide(),end(),list_menu()(),divide(),end(),list_menu();int int n;n;do do list_menu()list_menu();scanf scanf(%d,&n);(%d,&n);getchar getchar();();switch(n)switch(n)case 1:case 1:add();add();break;break;case 2:case 2:s

10、ub()sub();break;break;case 3:case 3:mulmul();();break;break;case 4:case 4:divide()divide();break;break;case 5:case 5:end()end();break;break;default:default:printfprintf(n enter error,please again.);(n enter error,please again.);while(n!=5);while(n!=5);void list_menu()void list_menu()printfprintf(n*t

11、he exercise system for primitive(n*the exercise system for primitive students*);students*);printf printf(n*1.add *);(n*1.add *);printf printf(n*2.sub *);(n*2.sub *);printf printf(n*3.(n*3.mul mul *);*);printf printf(n*4.divide*);(n*4.divide*);printf printf(n*5.end *n);(n*5.end *n);void add()void add

12、()void sub()void sub()voidvoid mul mul()()void divide()void divide()void end()void end()问题:如何定义一个函数如何定义一个函数n n第一步:第一步:分析函数需要的参数,包括参数的的个数分析函数需要的参数,包括参数的的个数分析函数需要的参数,包括参数的的个数分析函数需要的参数,包括参数的的个数以及每个参数的类型以及每个参数的类型以及每个参数的类型以及每个参数的类型,n n第二步:第二步:分析函数返回值的类型,若无返回值,分析函数返回值的类型,若无返回值,分析函数返回值的类型,若无返回值,分析函数返回值的类型,

13、若无返回值,则为则为则为则为 voidvoid。函数的返回值可看作是函数执行完后需输出的函数的返回值可看作是函数执行完后需输出的函数的返回值可看作是函数执行完后需输出的函数的返回值可看作是函数执行完后需输出的一个一个一个一个数据。数据。数据。数据。n n第三步:第三步:编写函数体编写函数体编写函数体编写函数体说明:说明:参数和返回值是函数之间的接口,即函数之间通过参参数和返回值是函数之间的接口,即函数之间通过参参数和返回值是函数之间的接口,即函数之间通过参参数和返回值是函数之间的接口,即函数之间通过参数和返回值进行通信。参数包括执行该函数时需要数和返回值进行通信。参数包括执行该函数时需要数和返

14、回值进行通信。参数包括执行该函数时需要数和返回值进行通信。参数包括执行该函数时需要的数据信息,以及返回数据的有关信息。的数据信息,以及返回数据的有关信息。的数据信息,以及返回数据的有关信息。的数据信息,以及返回数据的有关信息。例如:例如:1 1)求求求求n!:n!:要处理的数据是要处理的数据是要处理的数据是要处理的数据是n n,因此必须有一个参数因此必须有一个参数因此必须有一个参数因此必须有一个参数n n,类型为类型为类型为类型为 intint。返回值为返回值为返回值为返回值为long long 型。即型。即型。即型。即 long fact(long fact(int int n)n)2 2)

15、打印表头打印表头打印表头打印表头:不需输入任何数据即可执行该函数,因此无参不需输入任何数据即可执行该函数,因此无参不需输入任何数据即可执行该函数,因此无参不需输入任何数据即可执行该函数,因此无参数。执行该函数无返回值,因此函数类型为数。执行该函数无返回值,因此函数类型为数。执行该函数无返回值,因此函数类型为数。执行该函数无返回值,因此函数类型为 voidvoid。即即即即 void linevoid line()()3 3)求两个整数求两个整数求两个整数求两个整数mm和和和和n n的最小公倍数,执行该功能时必须有两个的最小公倍数,执行该功能时必须有两个的最小公倍数,执行该功能时必须有两个的最小

16、公倍数,执行该功能时必须有两个整型参数,返回值为整型。程序:整型参数,返回值为整型。程序:整型参数,返回值为整型。程序:整型参数,返回值为整型。程序:l8_1_5.cl8_1_5.c int int min_multiple(min_multiple(intint m,m,int int n)n)(见下页)见下页)见下页)见下页)4 4)求一批整型数据()求一批整型数据()求一批整型数据()求一批整型数据(n n个)中的最大值。实现该功能的函数个)中的最大值。实现该功能的函数个)中的最大值。实现该功能的函数个)中的最大值。实现该功能的函数的参数有两个:该批数据的首地址及数据的个数。返回值的参数

17、有两个:该批数据的首地址及数据的个数。返回值的参数有两个:该批数据的首地址及数据的个数。返回值的参数有两个:该批数据的首地址及数据的个数。返回值为一个整型数。为一个整型数。为一个整型数。为一个整型数。int int max(max(int int data,data,int int n)n)/*/*例例例例3:3:计算两个整数的最小公倍数计算两个整数的最小公倍数计算两个整数的最小公倍数计算两个整数的最小公倍数 l8_1_5.c*/l8_1_5.c*/main()main()intint m,n,min;m,n,min;intint min_multiple(min_multiple(int i

18、nt,int int);/*);/*函数声明函数声明函数声明函数声明*/*/printfprintf(n input m,n:);(n input m,n:);scanf scanf(%d%d,&m,&n);(%d%d,&m,&n);min=min=min_multiple(m,n);/*min_multiple(m,n);/*函数调用函数调用函数调用函数调用*/*/printfprintf(n(n bei shu bei shu:%d,min);:%d,min);intint min_multiple(min_multiple(intint x,x,intint y)/*y)/*函数定义函数

19、定义函数定义函数定义*/*/intint i;i;i=1;i=1;while(x*i%y!=0)i+;while(x*i%y!=0)i+;return(x*i);return(x*i);8.2 函数的调用函数的调用n n重点重点重点重点:1 1、对被调函数的声明、对被调函数的声明、对被调函数的声明、对被调函数的声明2 2、如何调用一个函数、如何调用一个函数、如何调用一个函数、如何调用一个函数3 3、主调函数和被调函数之间如何进行数据传递、主调函数和被调函数之间如何进行数据传递、主调函数和被调函数之间如何进行数据传递、主调函数和被调函数之间如何进行数据传递 例例例例8.5 8.5 调用函数调用函

20、数调用函数调用函数fact()fact()求求求求n!(nn!(n由用户输入)。由用户输入)。由用户输入)。由用户输入)。分三种情况:分三种情况:(1)(1)函数函数函数函数fact()fact()与主函数在同一文件中,且与主函数在同一文件中,且与主函数在同一文件中,且与主函数在同一文件中,且main()main()在在在在fact()fact()前面。前面。前面。前面。(2)(2)函数函数函数函数fact()fact()与主函数在同一文件中,且与主函数在同一文件中,且与主函数在同一文件中,且与主函数在同一文件中,且mainmain在在在在factfact之后。之后。之后。之后。(3)(3)函

21、数函数函数函数factfact与与与与mainmain不再同一程序文件中不再同一程序文件中不再同一程序文件中不再同一程序文件中。main()/*(1)main()/*(1)main()main()在在fact()fact()前面前面*/*/intint n;long p;n;long p;long fact(long fact(intint););/*/*函数声明函数声明函数声明函数声明*/*/scanfscanf(%d,&n);(%d,&n);p=p=fact(n);fact(n);/*/*函数调用函数调用函数调用函数调用*/*/printfprintf(n%ld,p);(n%ld,p);l

22、ong fact(long fact(int int m)m)/*/*函数定义函数定义函数定义函数定义*/*/intint i;long s=1;i;long s=1;for(i=1;i=m;i+)for(i=1;i=m;i+)s*=i;s*=i;return(s);return(s);/*/*函数返回函数返回函数返回函数返回*/*/结论结论:被调函数在后,需在主调函数中先声明后调用。被调函数在后,需在主调函数中先声明后调用。被调函数在后,需在主调函数中先声明后调用。被调函数在后,需在主调函数中先声明后调用。/*(2)/*(2)主调函数在被调函数之后主调函数在被调函数之后主调函数在被调函数之后

23、主调函数在被调函数之后*/*/long fact(long fact(int int m)m)/*/*函数定义函数定义函数定义函数定义*/*/intint i;long s=1;i;long s=1;for(i=1;i=m;i+)for(i=1;i=m;i+)s*=i;s*=i;return(s);return(s);main()main()intint n;long p;/*n;long p;/*不需函数声明不需函数声明不需函数声明不需函数声明*/*/scanfscanf(%d,&n);(%d,&n);p=p=fact(n);fact(n);/*/*函数调用函数调用函数调用函数调用*/*/p

24、rintfprintf(n%ld,p);(n%ld,p);结论结论:被调函数先于主调函数被编译,因此在编译主调函数:被调函数先于主调函数被编译,因此在编译主调函数:被调函数先于主调函数被编译,因此在编译主调函数:被调函数先于主调函数被编译,因此在编译主调函数时已知被调函数的类型等信息。故不需函数声明时已知被调函数的类型等信息。故不需函数声明时已知被调函数的类型等信息。故不需函数声明时已知被调函数的类型等信息。故不需函数声明。/*(3)/*(3)设设设设fact()fact()函数存放在文件函数存放在文件函数存放在文件函数存放在文件f1.cf1.c中,则编写主调函数时需中,则编写主调函数时需中,

25、则编写主调函数时需中,则编写主调函数时需用用用用include include 命令对被调函数声明命令对被调函数声明命令对被调函数声明命令对被调函数声明*/*/#include include main()main()intint n;long p;n;long p;scanf scanf(%d,&n);(%d,&n);p=fact(n);p=fact(n);printf printf(n%ld,p);(n%ld,p);结论:该程序的效果与(结论:该程序的效果与(2 2)相同,由此可)相同,由此可实现将多个文件实现将多个文件实现将多个文件实现将多个文件连接成一个程序。连接成一个程序。连接成一个

26、程序。连接成一个程序。同理,同理,对库函数的调用都要在对库函数的调用都要在mainmain函数前用函数前用includeinclude命令将函命令将函数所在的头文件包含进来。数所在的头文件包含进来。函数声明小结:函数声明小结:n n被调函数必须是已存在的函数,通过被调函数必须是已存在的函数,通过被调函数必须是已存在的函数,通过被调函数必须是已存在的函数,通过“函数声明函数声明函数声明函数声明”告知编告知编告知编告知编译系统关于被调函数的有关信息。译系统关于被调函数的有关信息。译系统关于被调函数的有关信息。译系统关于被调函数的有关信息。n n函数声明的形式:函数声明的形式:函数声明的形式:函数声

27、明的形式:函数类型函数类型函数类型函数类型 函数名(参数表);函数名(参数表);函数名(参数表);函数名(参数表);(注意与函数定义的区别)(注意与函数定义的区别)(注意与函数定义的区别)(注意与函数定义的区别)1 1、若被调函数是库函数或用户已编写的函数(与主调函数不、若被调函数是库函数或用户已编写的函数(与主调函数不、若被调函数是库函数或用户已编写的函数(与主调函数不、若被调函数是库函数或用户已编写的函数(与主调函数不在同一文件中),则使用前需在程序的开头用在同一文件中),则使用前需在程序的开头用在同一文件中),则使用前需在程序的开头用在同一文件中),则使用前需在程序的开头用include

28、include命令命令命令命令将被调函数的信息包含进来。将被调函数的信息包含进来。将被调函数的信息包含进来。将被调函数的信息包含进来。2 2、若主调函数与被调函数在同一文件内,且主调函数在前,若主调函数与被调函数在同一文件内,且主调函数在前,若主调函数与被调函数在同一文件内,且主调函数在前,若主调函数与被调函数在同一文件内,且主调函数在前,则必须在主调函数的说明部分或主调函数的前面对被调函则必须在主调函数的说明部分或主调函数的前面对被调函则必须在主调函数的说明部分或主调函数的前面对被调函则必须在主调函数的说明部分或主调函数的前面对被调函数进行说明。数进行说明。数进行说明。数进行说明。3 3、以

29、下情况下可以省略对被调函数的说明。、以下情况下可以省略对被调函数的说明。、以下情况下可以省略对被调函数的说明。、以下情况下可以省略对被调函数的说明。a)a)函数类型为整型函数类型为整型函数类型为整型函数类型为整型 b)b)被调函数在主调函数之前定义被调函数在主调函数之前定义被调函数在主调函数之前定义被调函数在主调函数之前定义通常,将所有函数的说明集中在程序开头;或将所有函数的通常,将所有函数的说明集中在程序开头;或将所有函数的通常,将所有函数的说明集中在程序开头;或将所有函数的通常,将所有函数的说明集中在程序开头;或将所有函数的信息写入一个文件,编程时用信息写入一个文件,编程时用信息写入一个文

30、件,编程时用信息写入一个文件,编程时用include include 命令将其包含进来即命令将其包含进来即命令将其包含进来即命令将其包含进来即可。可。可。可。函数的调用与返回过程小结函数的调用与返回过程小结n n1 1、函数调用的一般形式:、函数调用的一般形式:函数名函数名函数名函数名(实参表实参表实参表实参表)如如 p=p=fact(n)fact(n);printf printf(“%d”,(“%d”,power(2,n)power(2,n););等等注意注意注意注意:实参与形参的类型、个数、顺序必须一致实参与形参的类型、个数、顺序必须一致实参与形参的类型、个数、顺序必须一致实参与形参的类型

31、、个数、顺序必须一致。n n2 2、调用过程:调用过程:调用过程:调用过程:n n1 1)在调用函数时,首先将实参的值赋给形参;再将控制流在调用函数时,首先将实参的值赋给形参;再将控制流在调用函数时,首先将实参的值赋给形参;再将控制流在调用函数时,首先将实参的值赋给形参;再将控制流程转到被调函数;程转到被调函数;程转到被调函数;程转到被调函数;n n2 2)然后执行被调函数。)然后执行被调函数。)然后执行被调函数。)然后执行被调函数。n n3 3)当被调函数执)当被调函数执)当被调函数执)当被调函数执 行行行行到到到到returnreturn语句,或执行到被调函数函数语句,或执行到被调函数函数

32、语句,或执行到被调函数函数语句,或执行到被调函数函数体最后的一个大花括号时,控制流程返回到体最后的一个大花括号时,控制流程返回到体最后的一个大花括号时,控制流程返回到体最后的一个大花括号时,控制流程返回到 主调函数的断点主调函数的断点主调函数的断点主调函数的断点处继续执行主调函数。如果被调函数有返回值,则控制流程处继续执行主调函数。如果被调函数有返回值,则控制流程处继续执行主调函数。如果被调函数有返回值,则控制流程处继续执行主调函数。如果被调函数有返回值,则控制流程返回的同时将该返回值带回主调函数。返回的同时将该返回值带回主调函数。返回的同时将该返回值带回主调函数。返回的同时将该返回值带回主调

33、函数。3、函数的返回、函数的返回n n函数返回的实现函数返回的实现函数返回的实现函数返回的实现:n n1 1)函数体中通过执行)函数体中通过执行returnreturn语句返回,其格式有语句返回,其格式有3 3种:种:returnreturn(expression(expression);或或或或 return expression;return expression;或或或或return;return;n n2)2)若函数体中无若函数体中无returnreturn语句,当执行到函数末尾时自语句,当执行到函数末尾时自动返回到调用函数。动返回到调用函数。n n注意:注意:注意:注意:1)1)函数

34、的返回值最多只有一个函数的返回值最多只有一个函数的返回值最多只有一个函数的返回值最多只有一个,可通过,可通过return return 语句返回语句返回主调函数。主调函数。2)2)当有当有多个值多个值多个值多个值需要返回主调函数时,用需要返回主调函数时,用returnreturn语句无法语句无法实现,只能通过实现,只能通过传地址传地址传地址传地址调用实现。如对数组元素排调用实现。如对数组元素排序等。序等。4.参数传递:实参与形参的结合参数传递:实参与形参的结合n n形参形参:定义函数时的参数为形参,此时的参数无具定义函数时的参数为形参,此时的参数无具体的值,仅仅表示参数的类型、个数、以及在函数

35、体的值,仅仅表示参数的类型、个数、以及在函数体内对其如何处理体内对其如何处理。其作用是:该函数被调用时用来接收实参的值其作用是:该函数被调用时用来接收实参的值.n n实参实参;调用函数时的参数为实参,它表示该函数要调用函数时的参数为实参,它表示该函数要处理的数据的信息,因此实参必须有确定的值。调处理的数据的信息,因此实参必须有确定的值。调用时,将实参的值传给形参用时,将实参的值传给形参。n n要求要求:调用函数时,实参与形参的类型、个数必须完调用函数时,实参与形参的类型、个数必须完全一致。全一致。n n分析例分析例8.48.4程序的调用过程:明确实参与形参的作用。程序的调用过程:明确实参与形参

36、的作用。(传值调用:单向传递(传值调用:单向传递)例例例例8.48.4以下程序企图通过调用以下程序企图通过调用swapswap函数,交换主函数中变量函数,交换主函数中变量x x和和y y中的数据。请观察程序的输出结果。中的数据。请观察程序的输出结果。void swap(void swap(intint a,a,int int b)b)int int t;t;printf printf(2)a=%d b=%dn,a,b);(2)a=%d b=%dn,a,b);t=a;a=b;b=t;t=a;a=b;b=t;printf printf(3)a=%d b=%dn,a,b);(3)a=%d b=%dn

37、,a,b);main()main()int int x=10,y=20;x=10,y=20;printf printf(1)x=%d y=%dn,x,y);(1)x=%d y=%dn,x,y);swap(x,y);swap(x,y);printf printf(4)x=%d y=%dn,x,y);(4)x=%d y=%dn,x,y);程序运行结果如下:程序运行结果如下:(1)(1)x=10 y=20 x=10 y=20(2)a=10 b=20(2)a=10 b=20(3)a=20 b=10(3)a=20 b=10(4)x=10 y=20(4)x=10 y=20 结论:结论:参数的传递是单参数的

38、传递是单向的,即只能由实参传向的,即只能由实参传给形参,在被调函数中给形参,在被调函数中对形参的改变的不影响对形参的改变的不影响实参的值。实参的值。例例例例8.12 8.12 编写函数实现:用选择法对编写函数实现:用选择法对编写函数实现:用选择法对编写函数实现:用选择法对n n个整数排序。编写主函数实个整数排序。编写主函数实个整数排序。编写主函数实个整数排序。编写主函数实现数据的输入输出现数据的输入输出现数据的输入输出现数据的输入输出。分析:分析:主程序的算法主程序的算法主程序的算法主程序的算法:S1S1:输入一批数据输入一批数据(个数为个数为N)N),存入一维数组存入一维数组aaaa。S2S

39、2:调用函数调用函数sort()sort(),对一维数组中的数据按从小到大的顺序排对一维数组中的数据按从小到大的顺序排序。序。S3S3:输出数组输出数组aaaa中的各元素。中的各元素。函数函数函数函数sort()sort()的编写的编写的编写的编写:首先,确定函数的类型:首先,确定函数的类型:voidvoid;参数:一维数组的首地址,数据的个数,共参数:一维数组的首地址,数据的个数,共2 2个;个;然后编写函数体,实现排序。然后编写函数体,实现排序。重点:分析参数的传递,比较传值与传地址的区别,各有何用重点:分析参数的传递,比较传值与传地址的区别,各有何用处?处?(图示图示:形参数组与实参数组

40、的结合方式)形参数组与实参数组的结合方式)/*/*主函数主函数主函数主函数*/*/#define N 10define N 10main()main()int aa int aaN,i;N,i;void sort(void sort(intint b,b,intint n n););printf printf(n enter integers(n enter integers for sort;);for sort;);for(i=0;iN;i+)for(i=0;iN;i+)scanf scanf(%d,&(%d,&aaaai);i);sort(sort(aaaa,N);,N);/*/*函数调

41、用函数调用函数调用函数调用*/*/printfprintf(n after sort:n);(n after sort:n);for(i=0;iN;i+)for(i=0;iN;i+)printf printf(%6d,(%6d,aaaai);i);/*/*函数函数sort()*/sort()*/void sort(void sort(intint b,b,intint n)n)int int i,j,t,k;i,j,t,k;for(i=1;i=n-1;i+)for(i=1;i=n-1;i+)k=0;k=0;for(j=1;j=n-i;j+)for(j=1;j=n-i;j+)if(bkbj)k=

42、j;if(bk=6)if(a%2=0&a=6)even(a);even(a);/*/*函数调用语句函数调用语句函数调用语句函数调用语句*/*/elseelse printf printf(The%d(The%d isn isnt even numbern,a);t even numbern,a);void even(void even(intint x)/*x)/*函数定义函数定义函数定义函数定义*/*/intint i;i;for(i=2;i=x/2;i+)for(i=2;i=x/2;i+)if(if(isprimeisprime(i)(i)if(if(isprimeisprime(x-i)

43、(x-i)printfprintf(%d=%d+%dn,x,i,x-i);return;(%d=%d+%dn,x,i,x-i);return;int isprimeint isprime(intint a)/*a)/*函数定义函数定义函数定义函数定义*/*/intint i,k=i,k=sqrt sqrt(a);(a);for(i=2;i=k;i+)for(i=2;i1)-f(n)=f(n-1)*n (n1)-规律规律 f(1)=1 (n=1)-f(1)=1 (n=1)-递归结束条件递归结束条件程序:程序:l8_4_1.cl8_4_1.c分析程序的执行过程,理解递归中的分析程序的执行过程,理解

44、递归中的“递进递进”与与“回回推推”。main()/*main()/*程序:程序:程序:程序:L8_4_1.c*/L8_4_1.c*/int int n;long p;n;long p;long long f(f(intint););/*/*对被调函数的声明对被调函数的声明对被调函数的声明对被调函数的声明*/*/printfprintf(n input n:);(n input n:);scanf scanf(%d,&n);(%d,&n);p=p=f(n)f(n);/*/*函数调用函数调用函数调用函数调用*/*/printfprintf(n n!=%ld,p);(n n!=%ld,p);lon

45、g f(long f(intint m)m)/*/*函数定义函数定义函数定义函数定义*/*/long t;long t;if(m=1)t=1;if(m=1)t=1;else t=m*else t=m*f(m-1)f(m-1);/*;/*函数递归调用函数递归调用函数递归调用函数递归调用*/*/return(t);/*return(t);/*函数的返回函数的返回函数的返回函数的返回*/*/n n类似的递归问题:类似的递归问题:n n1 1。猴子吃桃:。猴子吃桃:int int peach(peach(int int day)day)int int n;n;if(d=10)n=1;if(d=10)n

46、=1;else n=2*(peach(day+1)+1);else n=2*(peach(day+1)+1);return n;return n;n n2 2。猜年龄:第一个人说它比第二个人大猜年龄:第一个人说它比第二个人大4 4岁,第二岁,第二个人说它比第三个人大个人说它比第三个人大4 4岁,第三个人说它比第四岁,第三个人说它比第四个人大四岁,第四个人个人大四岁,第四个人1010岁,问:第一个人多大?岁,问:第一个人多大?8.5 局部变量和全局变量局部变量和全局变量n n指变量的作用范围不同。指变量的作用范围不同。n n局部变量局部变量 :在函数体内定义的变量。:在函数体内定义的变量。作用范

47、围:只在本函数内有效作用范围:只在本函数内有效 如前面例题中的变量、数组等。如前面例题中的变量、数组等。n n全局变量全局变量 :在函数体外定义的变量:在函数体外定义的变量 作用范围:从定义该变量的位置开始,到本作用范围:从定义该变量的位置开始,到本源程序文件结束。源程序文件结束。n n程序:程序:/*/*全局变量全局变量x,y*/x,y*/intint x=100;float y=66.6;x=100;float y=66.6;f1()f1()float y=0float y=0;/*;/*局部变量局部变量局部变量局部变量 y*/y*/printfprintf(“x=%dt”,x);(“x=

48、%dt”,x);printf printf(“y=%ft”,y);(“y=%ft”,y);intint z=1;z=1;f2()f2()intint i;i;/*/*局部变量局部变量局部变量局部变量 i*/i*/for(i=1;i5;i+)for(i=1;i5;i+)putchar putchar(*);(*);printf printf(n z=%dt,z);(n z=%dt,z);/*/*全局变量全局变量全局变量全局变量 z z 从从从从 定义起至程定义起至程定义起至程定义起至程序末起作用序末起作用序末起作用序末起作用*/*/main()main()f1();f2();f1();f2();

49、printf printf(“y=%fn”,y);(“y=%fn”,y);/*/*输出全局变量输出全局变量输出全局变量输出全局变量y*/y*/运行结果:运行结果:x=100 y=0.000000 x=100 y=0.000000 *z=1 y=66.600000z=1 y=66.600000/*/*全局变量全局变量x,yx,y在本程序内在本程序内起作用起作用*/*/*/*局部变量局部变量y y的作用范围的作用范围内,全局变量内,全局变量y y不作用不作用*/*/intint d=1;d=1;/*/*全局变量全局变量全局变量全局变量d*/d*/fun(fun(intint p)p)intint

50、d=5;d=5;/*/*局部变量局部变量局部变量局部变量d*/d*/d+=p+;/*d+=p+;/*使用局部变量使用局部变量使用局部变量使用局部变量d*/d*/printfprintf(%d,d);(%d,d);main()main()intint a=3;a=3;fun(a);fun(a);d+=a+;/*d+=a+;/*使用全局变量使用全局变量使用全局变量使用全局变量d*/d*/printfprintf(%d,d);(%d,d);运行结果:运行结果:8484结论:在同一源程序文件中,若外部变量与局部变量同名,则结论:在同一源程序文件中,若外部变量与局部变量同名,则在局部变量的作用范围内,外

51、部变量不起作用。在局部变量的作用范围内,外部变量不起作用。局部变量和全局变量小结局部变量和全局变量小结n n局部变量:保证了函数之间的独立性。(常用)局部变量:保证了函数之间的独立性。(常用)n n全局变量:增加了函数之间数据传递的通道,但全局变量:增加了函数之间数据传递的通道,但降低了函数间的独立性,降低了程序的清晰性,降低了函数间的独立性,降低了程序的清晰性,因此副作用太大。除非特别需要时,一般不用。因此副作用太大。除非特别需要时,一般不用。n n占用内存情况:占用内存情况:局部变量局部变量仅当他所在的函数被调用时才存在,执行仅当他所在的函数被调用时才存在,执行完该函数返回后,该变量不再存

52、在完该函数返回后,该变量不再存在全局变量全局变量在程序的全部执行过程中一直存在,直至在程序的全部执行过程中一直存在,直至程序执行完,才释放它所占的内存空间程序执行完,才释放它所占的内存空间8.6 变量的存储类别变量的存储类别n n变量和函数均有两个属性:变量和函数均有两个属性:数据类型和存储类别数据类型和存储类别数据类型和存储类别数据类型和存储类别存储类别指数据在内存中的存储方式存储类别指数据在内存中的存储方式。根据变量的根据变量的“生存期生存期”不同,变量的存储类别包含以下四种:不同,变量的存储类别包含以下四种:n n自动的自动的:autoauton n静态的静态的:staticstatic

53、n n寄存器的寄存器的:register register n n外部的外部的:externextern自动的(自动的(auto)变量变量n n函数的形参和在函数中定义的变量(通常省略函数的形参和在函数中定义的变量(通常省略存储类别,)即隐含指定为自动变量。前面存储类别,)即隐含指定为自动变量。前面1717章中的变量均属自动变量。章中的变量均属自动变量。n n自动变量在需要时系统给他门分配存储空间,自动变量在需要时系统给他门分配存储空间,在函数调用结束时自动释放这些存储空间。在函数调用结束时自动释放这些存储空间。n n例例autoauto int int a=2,b=3;a=2,b=3;与与i

54、ntint a=2,b=3;a=2,b=3;等价。等价。静态的(静态的(static)n n1 1、静态局部变量:、静态局部变量:作用域为本函数内部作用域为本函数内部存储类别为静态存储类,因此其生存期与该函数所存储类别为静态存储类,因此其生存期与该函数所在程序运行期间相同。即当函数调用结束时能保在程序运行期间相同。即当函数调用结束时能保留原值,在下一次调用该函数时该变量的值是上留原值,在下一次调用该函数时该变量的值是上一次函数调用结束时的值,直至程序运行结束。一次函数调用结束时的值,直至程序运行结束。n n例例(next page)next page)funcfunc(intint a,a,i

55、ntint b)/*b)/*例例例例8.6.1*/8.6.1*/staticstatic int int m=0,i=2 m=0,i=2;/*;/*静态局部变量静态局部变量静态局部变量静态局部变量m,I*/m,I*/i+=m+1;i+=m+1;m=i+a+b;m=i+a+b;return(m);return(m);main()main()intint k=4,m=1,p;k=4,m=1,p;/*/*局部变量局部变量局部变量局部变量k,m,p*/k,m,p*/p=p=funcfunc(k,m);(k,m);printf printf(%5d,p);(%5d,p);p=p=funcfunc(k,m

56、);(k,m);printf printf(%5dn,p);(%5dn,p);运行结果:运行结果:8 17 8 17 /*/*图示执行过程中变量的存储空间占用及值的变化情况图示执行过程中变量的存储空间占用及值的变化情况*/*/intint d=1;d=1;/*/*全局变量全局变量d*/*d*/*例例8.6.2*/8.6.2*/fun(fun(intint p)p)staticstatic int int d=5;d=5;/*/*静态局部变量静态局部变量d*/d*/d+=p;d+=p;printf printf(%5d,d);(%5d,d);return(d);return(d);main()m

57、ain()intint a=3;a=3;/*/*自动变量自动变量 a*/a*/printfprintf(%5dn,fun(a+fun(d);(%5dn,fun(a+fun(d);运行结果:运行结果:6 15 15 6 15 15Register 变量变量n nregister register int int k;k;则给变量则给变量k k分配的空间为某个寄存器。分配的空间为某个寄存器。n n优点:速度快。优点:速度快。n n只有局部变量和形参可以定义为只有局部变量和形参可以定义为registerregister变量。变量。因为机器的寄存器数量有限,因此该类型不常因为机器的寄存器数量有限,因此

58、该类型不常用。用。外部的(外部的(extern)变量变量n n用用externextern声明外部变量,是为了扩展外部变量声明外部变量,是为了扩展外部变量的作用域。的作用域。n n因外部变量不常用,因此因外部变量不常用,因此externextern也很少使用。也很少使用。n n必须使用外部变量时,一般建议使用静态全局必须使用外部变量时,一般建议使用静态全局变量。即在函数体外定义变量时存储类别为:变量。即在函数体外定义变量时存储类别为:staticstatic 如如 staticstatic int int a=2;a=2;f()f()变量变量 a a的作用范围仅限于本源程序文件内。其它的作用范

59、围仅限于本源程序文件内。其它程序中即使用程序中即使用externextern int int a;a;声明也不能引用声明也不能引用a a。8.7内部函数与外部函数内部函数与外部函数n n外部函数:如不加特别说明,函数都是全局的,外部函数:如不加特别说明,函数都是全局的,即外部的,一个函数可以调用另一文件中的函数。即外部的,一个函数可以调用另一文件中的函数。(项目文件的使用(项目文件的使用)n n内部函数:存储类别为内部函数:存储类别为staticstatic,该函数仅限于本该函数仅限于本程序文件使用,其它程序不能程序文件使用,其它程序不能调用之。综合题综合题1n n编程实现小学生算术练习系统:

60、主菜单包括编程实现小学生算术练习系统:主菜单包括5 5项(加项(加法、减法、乘法、除法、退出),前四项中每一项法、减法、乘法、除法、退出),前四项中每一项又包括子菜单(一级、二级、三级、返回又包括子菜单(一级、二级、三级、返回4 4项),其项),其中一级实现中一级实现1010以内的运算,二级实现以内的运算,二级实现5050以内的整数以内的整数运算,三级实现运算,三级实现100100以内的整数运算;进入某一级后,以内的整数运算;进入某一级后,反复练习(由机器产生两个随机数,用户输入运算反复练习(由机器产生两个随机数,用户输入运算结果,输出正确或错误)待结束时给出本级题目中结果,输出正确或错误)待

61、结束时给出本级题目中计算正确的百分比。计算正确的百分比。n n要求每个功能分别用函数实现。程序:要求每个功能分别用函数实现。程序:l8_t.cl8_t.c综合题综合题2n n自动阅卷程序自动阅卷程序:设单选题设单选题2020个(个(2 2分分/题),多选题题),多选题2020个(每题个(每题4 4个供选答案,个供选答案,3 3分分/题,且只要与答案不一题,且只要与答案不一致即错)。编写函数实现:阅单选题,阅多选题,致即错)。编写函数实现:阅单选题,阅多选题,阅一个人的答题;编写主函数实现批阅阅一个人的答题;编写主函数实现批阅N N个人的答个人的答题卡(正确答案在主程序中输入)。题卡(正确答案在

62、主程序中输入)。n n分析:分析:n nMain()Main():1)1)输入正确答案,分别存入一维数组输入正确答案,分别存入一维数组dddd,二二维数组维数组ssss;2);2)批阅批阅N N个人的答题(用循环),将个人的答题(用循环),将成绩存入数组成绩存入数组scsc。3 3)输出每个人的最后成绩。输出每个人的最后成绩。n nPerson():Person():函数类型为函数类型为intint;参数两个:参数两个:dddd,ssss;函函数体:数体:1 1)输入某人的答案,分别存入)输入某人的答案,分别存入dd1dd1和和ss1ss1,2 2)分别调用函数分别调用函数single()si

63、ngle()和和many()many()判别对错并计分,判别对错并计分,返回总成绩。返回总成绩。n nSingle():Single():函数类型函数类型intint,参数参数dddd,dd1,dd1;函数体:函数体:统计数组统计数组dddd与与dd1dd1中相同元素的个数,乘中相同元素的个数,乘2 2即得单选即得单选题的成绩,返回该成绩。题的成绩,返回该成绩。n nMany():Many():函数类型函数类型intint,参数参数ssss,ss1;,ss1;函数体:函数体:统计数组统计数组ssss与数组与数组ss1ss1中对应行元素相同的行数,乘中对应行元素相同的行数,乘3 3即得多选题的成

64、绩,并返回。即得多选题的成绩,并返回。然后分析各函数的具体实现算法。然后分析各函数的具体实现算法。程序程序1 1:l8_3_2.cl8_3_2.c分析程序中的传地址调用,嵌套调用时程序的执行过分析程序中的传地址调用,嵌套调用时程序的执行过程。程。程序程序2 2:l8_3_2_q.c l8_3_2_q.c 定义存放正确答案的数组为全局的,定义存放正确答案的数组为全局的,则则dddd,ssss将不作为参数使用。(一般情况使用参数传将不作为参数使用。(一般情况使用参数传递)递)#include include stdiostdio.h /*.h /*程序程序1*/1*/#define N 400 /

65、*num of person*/define N 400 /*num of person*/#define NUM 20 /*num of question*/#define NUM 20 /*num of question*/main()main()char char dd ddNUM+1,NUM+1,ssssNUM+15;NUM+15;int int scN+1,i;scN+1,i;printf printf(n enter right answer of single select:n);(n enter right answer of single select:n);printf p

66、rintf(n(format:press enter after finished(n(format:press enter after finished inputing inputing all of all of answers.n);answers.n);for(i=1;i=NUM;i+)for(i=1;i=NUM;i+)dd ddi=i=getchargetchar();();getchar getchar();();printf(n enter answer of multi select:n);printf(nformat:(press enter after inputing a question)n);for(i=1;i=NUM;i+)gets(ssi);for(i=1;i=N;i+)sci=person(dd,ss);printf(n no:score:);for(i=1;i=N;i+)printf(n%-6d%-6d,i,sci);intint person(char person(char dd dd,char,char ss ss5)5)char dd121,

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