高级语言程序设计教学课件第7章

上传人:工**** 文档编号:586344143 上传时间:2024-09-04 格式:PPT 页数:71 大小:702KB
返回 下载 相关 举报
高级语言程序设计教学课件第7章_第1页
第1页 / 共71页
高级语言程序设计教学课件第7章_第2页
第2页 / 共71页
高级语言程序设计教学课件第7章_第3页
第3页 / 共71页
高级语言程序设计教学课件第7章_第4页
第4页 / 共71页
高级语言程序设计教学课件第7章_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《高级语言程序设计教学课件第7章》由会员分享,可在线阅读,更多相关《高级语言程序设计教学课件第7章(71页珍藏版)》请在金锄头文库上搜索。

1、1第第7章章 函数函数2 2第第7章章 函数函数n 函数的概念函数的概念n 函数的简单调用函数的简单调用n 数组作为函数参数的调用数组作为函数参数的调用n 函数的嵌套调用函数的嵌套调用n 函数的递归调用函数的递归调用n 变量的作用域变量的作用域n 变量的存储类别变量的存储类别3 3学习目标学习目标n n函数定义函数定义和和函数调用函数调用n n掌握掌握数组作为参数的函数调用数组作为参数的函数调用n n掌握函数的掌握函数的嵌套和递归调用嵌套和递归调用n n掌握掌握变量作用域变量作用域n n了解了解变量存储类别变量存储类别4 47.1 函数的概念函数的概念n1、C是模块化程序设计语言是模块化程序设

2、计语言C是是函数式函数式函数式函数式语言语言必须必须有且只有一个名为有且只有一个名为有且只有一个名为有且只有一个名为mainmain的主函数的主函数的主函数的主函数C程序的执行总是从程序的执行总是从mainmain函数开始,在函数开始,在函数开始,在函数开始,在mainmain中中中中结束结束结束结束所有函数是平行的,所有函数是平行的,函数不能嵌套定义函数不能嵌套定义函数不能嵌套定义函数不能嵌套定义, ,可以可以可以可以嵌嵌嵌嵌套套套套调用调用调用调用C C程序程序源程序文件源程序文件1 1源程序文件源程序文件i i源程序文件源程序文件n n预编译命令预编译命令函数函数1 1函数函数n n说明

3、部分说明部分执行部分执行部分C C程序结构程序结构C C程序程序源程序文件源程序文件预编译命令预编译命令主函数主函数mainmain说明部分说明部分执行部分执行部分目前编写的目前编写的C C程序程序#include #include stdio.hstdio.hvoidvoid main main ( void ( void ) ) float float x, y, z;x, y, z; floatfloat average ( average (floatfloat a, a, floatfloat b); b); printf( printf(输入输入输入输入2 2个数值:个数值:个数值

4、:个数值:);); scanf(%f %f, &x, &y); scanf(%f %f, &x, &y); z = average(x, y); z = average(x, y); printf(%.2f printf(%.2f和和和和%.2f%.2f的平均值为:的平均值为:的平均值为:的平均值为:%.2fn“, x, y, z); %.2fn“, x, y, z); float float average(average(float float a a, float , float b)b) float float c;c; c = (a+b)/2c = (a+b)/2; ; return

5、 return c;c; 5 55【例例例例7-17-1】 计算两个数的平均值。主函数主函数子函数子函数函数声明函数声明函数声明函数声明函数调用函数调用函数调用函数调用函数定义函数定义函数定义函数定义函数返回值函数返回值函数返回值函数返回值6 6简单的函数举例简单的函数举例简单的函数举例简单的函数举例main()main() printf(“* * * * * * * * * *n”); printf(“* * * * * * * * * *n”); printf(“ How do you do!n”); printf(“ How do you do!n”); printf(“* * * *

6、* * * * * *n”); printf(“* * * * * * * * * *n”); 要求在屏幕上输出下列的图形要求在屏幕上输出下列的图形要求在屏幕上输出下列的图形要求在屏幕上输出下列的图形* * * * * * * * * * * * * * * * * * * * How do you do!How do you do!* * * * * * * * * * * * * * * * * * *7 7简单的简单的简单的简单的函数举例函数举例函数举例函数举例#include #include void printstar(int num);void printstar(int num

7、); main()main() printstar(10); printstar(10); printf(“ How do you do!n”); printf(“ How do you do!n”); printstar(10);printstar(10); 函数声明函数声明函数声明函数声明函数调用函数调用函数调用函数调用void printstar(int num)void printstar(int num) int i; int i; for(i=0; inum; for(i=0; i y ? x : y ; z = x y ? x : y ; return z return z ;

8、; main( ) main( ) int a=5, b=9, c; int a=5, b=9, c;c = c = max( a , b );max( a , b );printf(“Max = %d”, c);printf(“Max = %d”, c); 例:例:求两个数中的最大值求两个数中的最大值 函数定义函数定义函数定义函数定义函数调用函数调用函数调用函数调用函数返回值函数返回值函数返回值函数返回值9 9n2、函数分类、函数分类从用户角度从用户角度标准函数(库函数):由系统提供标准函数(库函数):由系统提供用户自定义函数用户自定义函数 printstar(int num)从函数形式从函

9、数形式无参函数无参函数有参函数有参函数strlen(字符数组名字符数组名)1010使用库函数应注意的问题使用库函数应注意的问题1、函数、函数功能功能2、函数、函数参数参数的数目和顺序,及各参数意义和的数目和顺序,及各参数意义和类型类型3、函数、函数返回值返回值的意义和类型的意义和类型4、需要使用的包含、需要使用的包含头文件头文件strlen(str) 1111例例例例 有参函数有参函数有参函数有参函数 int maxint max(int x, int y(int x, int y) ) int z; int z; z=xy?x:y; z=xy?x:y; return(z); return(z

10、); 例例例例 无参函数无参函数无参函数无参函数 printstar( )printstar( ) printf(“*n”); printf(“*n”); 或或或或 voidvoid printstar( printstar(voidvoid) ) printf(“*n”); printf(“*n”); 7.2 函数的定义函数的定义n1、函数定义的一般格式、函数定义的一般格式 存储类别存储类别存储类别存储类别 函数类型函数类型函数类型函数类型 函数名(函数名(函数名(函数名(形参列表形参列表形参列表形参列表) 说明部分说明部分说明部分说明部分语句部分语句部分语句部分语句部分 例例例例 有参函数

11、有参函数有参函数有参函数 int max(int max(int x, yint x, y) ) int z; int z; z=xy?x:y; z=xy?x:y; return(z); return(z); 例例例例 空函数空函数空函数空函数 /调用此函数时,什么都不做调用此函数时,什么都不做调用此函数时,什么都不做调用此函数时,什么都不做 dummy( )dummy( ) 函数体为空函数体为空函数体为空函数体为空函数带回来的值的类型函数带回来的值的类型函数带回来的值的类型函数带回来的值的类型 若缺省为:若缺省为:若缺省为:若缺省为:intint整型整型整型整型 函数没有返回值函数没有返回值

12、函数没有返回值函数没有返回值定义为定义为定义为定义为voidvoid 1212n2、函数的返回值、函数的返回值返回语句的形式:返回语句的形式:功能:使程序控制从功能:使程序控制从被调用函数被调用函数被调用函数被调用函数返回到返回到调用函数调用函数调用函数调用函数中,同中,同时时把返回值带给调用函数把返回值带给调用函数把返回值带给调用函数把返回值带给调用函数说明:说明:只能返回一个值只能返回一个值只能返回一个值只能返回一个值,而不能返回多个值。,而不能返回多个值。 return(x,y); return return ( (表达式表达式表达式表达式) );returnreturn 表达式表达式表

13、达式表达式; ;return;return; 1313n函数函数语句语句 printstar(printstar(1010) );n表达式方式表达式方式 函数调用出现在表达式中,函数的返回值参加函数调用出现在表达式中,函数的返回值参加表达式的运算。表达式的运算。 c=5*max(a,b)max(a,b);n作为函数的参数作为函数的参数 printf(“max=%d”, max(a,b)max(a,b) ); c=max(k,max(i,j)max(k,max(i,j);函数的调用方式函数的调用方式int max(int x,int y)int max(int x,int y) int z; i

14、nt z; z = x y ? x : y; z = x y ? x : y; return(z); return(z); 1414【例例7-3】 输出数字金字塔输出数字金字塔#include #include void main(void)void main(void) int num; int num; void pyramid(int n);void pyramid(int n); printf( printf(请输入金字塔的层数:请输入金字塔的层数:请输入金字塔的层数:请输入金字塔的层数:); ); scanf(%d,&num); scanf(%d,&num); pyramid(num

15、); pyramid(num); 请输入金字塔的层数:请输入金字塔的层数:5 1 2 2 3 3 3 4 4 4 45 5 5 5 5Press any key to continue1515void pyramid(int n) void pyramid(int n) int i, j; int i, j; for(i=1; i= for(i=1; i=n n; i+); i+) for(j=1; j=n-i; j+) for(j=1; j=n-i; j+) /*/*输出左侧空格输出左侧空格输出左侧空格输出左侧空格* */ / printf( ); printf( ); for(j=1; j

16、=i; j+) for(j=1; j=i; j+) /*/*输出数字输出数字输出数字输出数字* */ / printf(%d ,i); printf(%d ,i); printf(“n”); printf(“n”); /*/*换行换行换行换行* */ / 请输入金字塔的层数:请输入金字塔的层数:5 1 2 2 3 3 3 4 4 4 45 5 5 5 5Press any key to continue1616【例例7-4】 判断素数判断素数#include stdio.h#include stdio.h#include math.h#include math.hint prime(int n

17、) int prime(int n) int k, i, result; int k, i, result; k = sqrt(n); k = sqrt(n); for(i = 2; i = k; i+) for(i = 2; i k) result = 1; if(i k) result = 1; else result = 0; else result = 0; return result; return result; 【例例例例4-164-16】判断判断判断判断n n是否为素数是否为素数是否为素数是否为素数 P75P75for( i=2; i=sqrt(n); i+)for( i=2;

18、 isqrt(n)if(isqrt(n) printf(%d is a prime number!n , n);printf(%d is a prime number!n , n);elseelse printf(%d is not a prime number!n, n);printf(%d is not a prime number!n, n);1717void main(void)void main(void) int a = 1777, b = 1991; int a = 1777, b = 1991; if( if( prime(a)prime(a) ) ) printf(%d pr

19、intf(%d是素数是素数是素数是素数n,a);n,a); else else printf(%d printf(%d不是素数不是素数不是素数不是素数n,a);n,a); if( if( prime(b)prime(b) ) ) printf(%d printf(%d是素数是素数是素数是素数n,b);n,b); else else printf(%d printf(%d不是素数不是素数不是素数不是素数n,b);n,b); 1777是素数是素数1991不是素数不是素数1818说明:说明:函数中可有多个函数中可有多个return语句语句, 但是,当程序执行但是,当程序执行到第一个到第一个retur

20、n语句时,函数执行完毕,后面的程语句时,函数执行完毕,后面的程序不再执行,返回到函数调用处序不再执行,返回到函数调用处若无若无return语句,遇语句,遇 时自动返回调用函数时自动返回调用函数void型函数型函数没有返回值的函数没有返回值的函数若若return返回值的类型和函数返回值的类型和函数类型不一致类型不一致类型不一致类型不一致,系统,系统自自自自动转换成函数类型动转换成函数类型动转换成函数类型动转换成函数类型后返回后返回voidvoid printstar(int n) printstar(int n) for(i=0; in; i+) for(i=0; iy) if (xy) ret

21、urnreturn x; x; else else returnreturn y; y; int fun()int fun() returnreturn 10; 10; int a = 5; int a = 5; returnreturn a; a; #include stdio.h#include stdio.hintint average(float a, float b) average(float a, float b) float c; float c; c = (a+b)/2; c = (a+b)/2; return c;return c; int main(void)int ma

22、in(void) float x, y, z; float x, y, z; x = 10.0; x = 10.0; y = 5.0; y = 5.0; z = average(x, y); z = average(x, y); printf(“%.2fn, z); printf(“%.2fn, z); Press any key to continuePress any key to continue1919【例例7-5】编写编写函数函数,交换两个变量的,交换两个变量的数值数值#include stdio.h#include stdio.hvoid swap(int x, int y);vo

23、id swap(int x, int y);void main(void)void main(void) int a, b; int a, b; printf( printf(请输入交换的数值:请输入交换的数值:请输入交换的数值:请输入交换的数值:);); scanf(%d%d, &a, &b); scanf(%d%d, &a, &b); printf( printf(交换前交换前交换前交换前a=%d,b=%dn, a, b);a=%d,b=%dn, a, b); swap(a, b); swap(a, b); printf( printf(交换后交换后交换后交换后a=%d,b=%dn, a,

24、 b);a=%d,b=%dn, a, b); void swap(int x, int y) void swap(int x, int y) int temp; int temp; temp = x; x = y; y = temp; temp = x; x = y; y = temp; 请输入交换的数值:请输入交换的数值:7 11交换前交换前a=7,b=11交换后交换后a=7,b=112020为什么没有实现数值的交换?为什么没有实现数值的交换?函数间的参数传递函数间的参数传递n形式参数和实际参数形式参数和实际参数n 形参形参形参形参:定义函数时,函数名后括号内的变量。:定义函数时,函数名后括

25、号内的变量。形式参数只有在形式参数只有在函数被调用时函数被调用时函数被调用时函数被调用时才分配变量空间(才分配变量空间(产生产生产生产生),),并在函数调用并在函数调用结束后结束后结束后结束后,释放变量空间(,释放变量空间(消失消失消失消失)。)。 实参实参实参实参:调用函数时,函数名后括号内的表达式。:调用函数时,函数名后括号内的表达式。n形式参数与实际参数的关系形式参数与实际参数的关系 形参与实参类型一致,个数相同。形参与实参类型一致,个数相同。 若类型不一致,自动按形参类型转换。若类型不一致,自动按形参类型转换。main() int a,b,c; scanf(%d,%d,&a,&b);

26、c=max(a, ba, b); printf(Max is %d,c);max(int x, int yint x, int y) int z; z=xy?x:y; return(z);实参实参形参形参2121【例例7-5】编写程序,交换两个变量的编写程序,交换两个变量的数值数值#include stdio.h#include stdio.hvoid swap(int x, int y);void swap(int x, int y);void main(void)void main(void) int a, b; int a, b; printf( printf(请输入交换的数值:请输入交

27、换的数值:请输入交换的数值:请输入交换的数值:);); scanf(%d%d, &a, &b); scanf(%d%d, &a, &b); printf( printf(交换前交换前交换前交换前a=%d,b=%dn, a, b);a=%d,b=%dn, a, b); swap(a, b); swap(a, b); printf( printf(交换后交换后交换后交换后a=%d,b=%dn, a, b);a=%d,b=%dn, a, b); void swap(int x, int y) void swap(int x, int y) int temp; int temp; temp = x;

28、x = y; y = temp; temp = x; x = y; y = temp; a ab b7 71111x xy y7 7111111117 7调用前调用前调用前调用前调用时调用时调用时调用时调用结束调用结束调用结束调用结束实参实参形参形参2222结论结论n参数参数“值值”传递传递方式方式方式:方式:函数调用时函数调用时,为形参分配单元为形参分配单元,并将并将实参的值复制到实参的值复制到实参的值复制到实参的值复制到形参中形参中形参中形参中调用结束,形参单元被释放,实参单元仍保留并维调用结束,形参单元被释放,实参单元仍保留并维持原值持原值特点:特点:形参与实参占用不同的内存单元形参与实

29、参占用不同的内存单元单向值传递(形参的改变并不影响实参)单向值传递(形参的改变并不影响实参)27277.3 数组作为参数的函数调用数组作为参数的函数调用 n当形式参数是一维数组时,可以说明数组当形式参数是一维数组时,可以说明数组长度或不说明数组的长度长度或不说明数组的长度形参数组与实参数组形参数组与实参数组公用一块内存空间公用一块内存空间公用一块内存空间公用一块内存空间main()main() int b6=, c; int b6=, c; c = fun(b); c = fun(b); int fun( int fun( int a6int a6 ) ) int aint ab bb5b5b

30、4b4b3b3b2b2b1b1b0b0a a调用前调用前调用前调用前调用时调用时调用时调用时调用后调用后调用后调用后2828n参数的参数的“地址地址”传递传递方式方式方式:函数调用时,将数据的方式:函数调用时,将数据的存储地址作为参存储地址作为参存储地址作为参存储地址作为参数数数数传递给形参传递给形参函数调用后,形式参数数组函数调用后,形式参数数组a并没有像实际参并没有像实际参数数组数数组b一样再次申请一块连续的空间,而是一样再次申请一块连续的空间,而是使得数组使得数组a与数组与数组b首地址相同。这样,在函数首地址相同。这样,在函数中访问数组中访问数组a中的元素实际上等同于访问数组中的元素实际

31、上等同于访问数组b中的元素,从而实现数组参数传递中的元素,从而实现数组参数传递2929特点:特点:本质上仍然是本质上仍然是本质上仍然是本质上仍然是“ “值值值值” ”传递,只是传递的值是传递,只是传递的值是传递,只是传递的值是传递,只是传递的值是“ “地址地址地址地址” ”形参与实参指向同样的存储单元形参与实参指向同样的存储单元实参和形参必须是实参和形参必须是地址常量地址常量地址常量地址常量或或地址变量地址变量地址变量地址变量“双向双向”传递传递形参的改变影响实参形参的改变影响实参3030函数中如何知道数组的长度呢?函数中如何知道数组的长度呢?nC语言没有为函数提供任何简便的方法来确语言没有为

32、函数提供任何简便的方法来确定传递给它的数组的长度。但是,处理数定传递给它的数组的长度。但是,处理数组,长度是必须的,所以通常要把数组长组,长度是必须的,所以通常要把数组长度也作为形式参数。度也作为形式参数。 例如:例如:例如:例如:int fun(int a, int n)int fun(int a, int n) 3131【例例7-6】求数组中元素的最大值求数组中元素的最大值#include stdio.h#include stdio.h#define N 10#define N 10float max_array(float a, int n); float max_array(float

33、 a, int n); void main(void)void main(void) float arrayN, max; float arrayN, max; int i; int i; printf( printf(请输入请输入请输入请输入%d%d个实数:个实数:个实数:个实数:n, N);n, N); for(i = 0;i N; i+) for(i = 0;i N; i+) scanf(%f, &arrayi); scanf(%f, &arrayi); max = max = max_array(array, N);max_array(array, N); printf(“ print

34、f(“最大的数组元素值是:最大的数组元素值是:最大的数组元素值是:最大的数组元素值是:%.2fn, max);%.2fn, max); 请输入请输入1010个实数:个实数:Press any key to continuePress any key to continue3232【例例7-6】求数组中元素的最大值。求数组中元素的最大值。 float max_array(float a, int n) float max_array(float a, int n) int i; int i; float max; float max; max = a0; max = a0; for(i = 1;

35、 i n; i+) for(i = 1; i max) if(ai max) max = ai; max = ai; return max; return max; 可以说明数组长度或不可以说明数组长度或不说明数组的长度说明数组的长度3333【例例7-7】比较两个数组比较两个数组a和和b的大小,比较的大小,比较规则为:规则为:n用用m,n和和k分别记录两个数组对应元素的比分别记录两个数组对应元素的比较结果,较结果,如果如果ai大于大于bi,m+,否则如果否则如果ai等于等于bi,k+,否则否则n+。n如果如果mn,数组,数组a大于大于b,n否则如果否则如果mn,数组,数组a小于小于b,n否则数

36、组否则数组a等于等于b。 3434#include stdio.h#include stdio.h#define N 5#define N 5int cmp_array(int a, int b, int length); int cmp_array(int a, int b, int length); void main(void)void main(void) int aN, bN, cmp,i; int aN, bN, cmp,i; printf( printf(请输入数组请输入数组请输入数组请输入数组1 1:%d%d个整数:个整数:个整数:个整数:n, N); n, N); for(i

37、 = 0;i N; i+) for(i = 0;i N; i+) scanf(%d, &ai); scanf(%d, &ai); printf( printf(请输入数组请输入数组请输入数组请输入数组2 2:%d%d个整数:个整数:个整数:个整数:n, N);n, N); for(i = 0;i N; i+) for(i = 0;i 0) printf( if(cmp0) printf(数组数组数组数组1 1大于数组大于数组大于数组大于数组2n);2n); else if(cmp0)printf( else if(cmp0)printf(数组数组数组数组1 1小于数组小于数组小于数组小于数组2

38、n);2n); else printf( else printf(数组数组数组数组1 1等于数组等于数组等于数组等于数组2n);2n); 请输入数组请输入数组1 1:5 5个整数:个整数:1 2 3 4 51 2 3 4 5请输入数组请输入数组2 2:5 5个整数:个整数:3 4 5 1 23 4 5 1 2数组数组1 1小于数组小于数组2 2Press any key to continuePress any key to continue3636int cmp_array(int a, int b, int length) int cmp_array(int a, int b, int l

39、ength) int i, result, m, n, k; int i, result, m, n, k; m = n = k = 0; m = n = k = 0; for(i=0; ilength; i+) for(i=0; i bi) m+; if(ai bi) m+; else if(ai bi) n+; else if(ai n) if(m n) result = 1; result = 1; else if(m n) result = -1; else if(m n) result = -1; else else result = 0; result = 0; return re

40、sult; return result; 3737【例例7-8】编写函数实现字符串的复制编写函数实现字符串的复制#include stdio.h#include stdio.h#include string.h#include string.h#define N 80#define N 80void copy_string(char from, char to); void copy_string(char from, char to); void main(void)void main(void) char aN, bN; char aN, bN; printf( printf(请输入一串字

41、符串:请输入一串字符串:请输入一串字符串:请输入一串字符串:n);n); gets(a); gets(a); copy_string(a, b); copy_string(a, b); puts(b); puts(b); 字符串是以一维字符数组字符串是以一维字符数组形式存放的,所以字符串形式存放的,所以字符串的传递与一维数组的传递的传递与一维数组的传递方式相同。方式相同。3838void copy_string(char from, char to) void copy_string(char from, char to) int i; int i; for(i = 0; fromi!= 0;

42、 i+) for(i = 0; fromi!= 0; i+) toi = fromi; toi = fromi; toi = 0; toi = 0; 请输入一串字符串:请输入一串字符串:I Love China!I Love China!由于字符串具有结束标识由于字符串具有结束标识0,所以函数定义中不,所以函数定义中不需要数组长度参数需要数组长度参数3939【例例7-9】编写函数实现学生成绩按平均分排编写函数实现学生成绩按平均分排名,学生成绩存储在一个二维数组中名,学生成绩存储在一个二维数组中#include stdio.h#include stdio.h#define M 5 #define

43、 M 5 /*/*学生人数学生人数学生人数学生人数* */ /#define N 5 #define N 5 /*/*成绩科数成绩科数成绩科数成绩科数* */ /void sort_score(float scorevoid sort_score(float scoreN N, float ave); , float ave); void main(void)void main(void) float scoreMN = float scoreMN = 80.0, 85.0, 78.0, 97.0, 68.0,80.0, 85.0, 78.0, 97.0, 68.0,90.0, 97.0, 8

44、9.0, 88.0, 92.0,90.0, 97.0, 89.0, 88.0, 92.0,60.0, 75.0, 79.0, 95.0, 56.0,60.0, 75.0, 79.0, 95.0, 56.0,98.0, 61.0, 78.0, 99.0, 68.0,98.0, 61.0, 78.0, 99.0, 68.0,80.0, 89.0, 98.0, 97.0, 88.0;80.0, 89.0, 98.0, 97.0, 88.0; float aveM; float aveM; int i, j; int i, j;4040【例例7-9】编写函数实现学生成绩按平均分编写函数实现学生成绩按平

45、均分排名,学生成绩存储在一个二维数组中。排名,学生成绩存储在一个二维数组中。 sort_score(score, ave); sort_score(score, ave); for(i = 0;i M; i+) for(i = 0;i M; i+) /*/*按排名输出学生成绩按排名输出学生成绩按排名输出学生成绩按排名输出学生成绩* */ / printf(printf(第第第第%d%d名学生平均成绩:名学生平均成绩:名学生平均成绩:名学生平均成绩:%.2fn, i+1, avei);%.2fn, i+1, avei);for(j=0; jN; j+)for(j=0; jN; j+)printf

46、(%10.2f, scoreij);printf(%10.2f, scoreij);printf(n);printf(n); 4141void sort_score(float scoreN, float ave)void sort_score(float scoreN, float ave) float sum, temp; float sum, temp; int i, j, k; int i, j, k; for(i=0; i for(i=0; iM M; i+) ; i+) /*/*计算平均成绩计算平均成绩* */ / sum = 0; sum = 0; for(j=0; j for(

47、j=0; jN N; j+); j+) sum = sum + scoreij; sum = sum + scoreij; avei = sum/N; avei = sum/N; 在在C C语言中,当形式参数是多维语言中,当形式参数是多维数组时,可以忽略第一维的长数组时,可以忽略第一维的长度,度,后面的维数必须书写后面的维数必须书写后面的维数必须书写后面的维数必须书写计算平均成绩并排序的函数计算平均成绩并排序的函数4242 for(i=0; iM-1; i+) for(i=0; iM-1; i+) /*/*成绩排序成绩排序* */ / for(j=i+1; jM; j+) for(j=i+1;

48、 jM; j+) if(avei avej) if(avei avej) temp = avei; temp = avei; avei = avej; avei = avej; avej = temp; avej = temp; for(k=0; kN; k+) for(k=0; ky?x:y); return (xy?x:y); 45457.4 函数的嵌套调用函数的嵌套调用n说明说明:函数定义时不可嵌套函数定义时不可嵌套调用时可以嵌套其它函数调用时可以嵌套其它函数main( )调用函数调用函数a结束结束a函数函数b函数函数调用函数调用函数bmainmain . . a(); a(); . .

49、 int a() int a() /a/a定义定义定义定义 . . b(); b(); . . int b() int b() /b/b定义定义定义定义 . . 4646【例例7-10】编写函数计算最大公约数和最小编写函数计算最大公约数和最小公倍数公倍数#include stdio.h#include stdio.hint gys(int a, int b); int gys(int a, int b); int gbs(int a, int b); int gbs(int a, int b); void main(void)void main(void) int x, y; int x, y

50、; printf( printf(输入两个整数:输入两个整数:输入两个整数:输入两个整数:n);n); scanf(%d%d, &x, &y); scanf(%d%d, &x, &y); printf(%d printf(%d和和和和%d%d的最大公约数是:的最大公约数是:的最大公约数是:的最大公约数是:%d, x, y, gys(x, %d, x, y, gys(x, y);y); printf( printf(,最小公倍数是,最小公倍数是,最小公倍数是,最小公倍数是%dn, gbs(x, y);%dn, gbs(x, y); 4747【例7-10】编写函数计算最大公约数和最小公倍数。 in

51、t gys(int a, int b)int gys(int a, int b) int i; int i; for(i=a=1; i-) for(i=a=1; i-) if(a%i=0 & b%i=0) break; if(a%i=0 & b%i=0) break; return i; return i; 4848【例7-10】编写函数计算最大公约数和最小公倍数。 int gbs(int a, int b) int gbs(int a, int b) int t = a*b/gys(a,b); int t = a*b/gys(a,b); return t; return t; 4949【例例

52、例例7-117-11】编写函数计算数组元素的均方差。方差编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根的是数据波动的情况,均方差等于方差的平方根#include stdio.h#include stdio.h#include math.h#include math.h#define N 10#define N 10float average(float a, int n); float average(float a, int n); float variance(float

53、a, int n, float ave);float variance(float a, int n, float ave);float rms(float a, int n); float rms(float a, int n); 5050void main(void)void main(void) float xN, var; float xN, var; int i; int i; printf( printf(输入输入输入输入%d%d个数值:个数值:个数值:个数值:n,N);n,N); for(i = 0;i N; i+) for(i = 0;i N; i+) scanf(%f, &x

54、i); scanf(%f, &xi); var = var = rms(x, N);rms(x, N); printf( printf(这些数值的均方差为:这些数值的均方差为:这些数值的均方差为:这些数值的均方差为:%.4fn, var);%.4fn, var); 5151【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。 float average(float a, int n)float average(float a, int n) int i; int i; float sum = 0.0; floa

55、t sum = 0.0; for(i=0; in; i+) for(i=0; in; i+) sum = sum + ai; sum = sum + ai; return sum/n; return sum/n; 5252【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。 float variance(float a, int n, float ave)float variance(float a, int n, float ave) int i; int i; float var; float var; v

56、ar = 0.0; var = 0.0; for(i=0; in; i+) for(i=0; in; i+) var = var + pow(ai - ave), 2); var = var + pow(ai - ave), 2); return var; return var; 5353【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。 float rms(float a, int n)float rms(float a, int n) int i; int i; float ave, var; float

57、 ave, var; ave = average(a, n); ave = average(a, n); var = variance(a, n, ave); var = variance(a, n, ave); var = sqrt(var); var = sqrt(var); return var; return var; 输入输入10个数值:个数值:5454int f(int x)f(int x) int y,z; z=f(y);z=f(y); . return(2*z);7.5 函数的递归调用函数的递归调用n定义:函数直接或间接的调用自身叫定义:函数直接或间接的调用自身叫函数的递归调用

58、函数的递归调用int f1(int x)f1(int x) int y,z; z=f2(y);z=f2(y); . return(2*z);intint f2(int t) f2(int t) int a,c; c=f1(a);c=f1(a); . return(3+c);5555n说明说明C编译系统对递归函数的自调用次数没有限制编译系统对递归函数的自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出数过多,可能引起堆栈溢出5656【例例7-12

59、】编写函数计算整数的阶乘编写函数计算整数的阶乘double fact(int n); double fact(int n); main()main() int n int n; scanf(“%d”,&n);scanf(“%d”,&n); printf(“%d!=%.0fn,fact(n); printf(“%d!=%.0fn,fact(n); double fact(int n)double fact(int n) double f; double f; if(n=1 | n=0) if(n=1 | n=0) f=1; f=1; else else f=fact(n-1)*n; f=fact

60、(n-1)*n; return (f); return (f); 5757double fac(int n)double fac(int n) double f; double f; if(n=1 | n=0) if(n=1 | n=0) f=1; f=1; else else f=fac(n-1)*n; f=fac(n-1)*n; return(f); return(f); n=4n=4double fac(int n)double fac(int n) double f; double f; if(n=1 | n=0) if(n=1 | n=0) f=1; f=1; else else f

61、=fac(n-1)*n; f=fac(n-1)*n; return(f); return(f); n=3n=3double fac(int n)double fac(int n) double f; double f; if(n=1 | n=0) if(n=1 | n=0) f=1; f=1; else else f=fac(n-1)*n; f=fac(n-1)*n; return(f); return(f); n=2n=2double fac(int n)double fac(int n) double f; double f; if(n=1 | n=0) if(n=1 | n=0) f=1

62、; f=1; else else f=fac(n-1)*n; f=fac(n-1)*n; return(f); return(f); n=1n=1fac(int n)fac(int n) doubledouble f f; ; if(n=1 | n=0) if(n=1 | n=0)fac(n-1)fac(n-1) return( return(2424); );1 1fac(int n)fac(int n) doubledouble f f; ; if(n=1 | n=0) if(n=1 | n=0)fac(n-1)fac(n-1) return( return(6 6); );2 2fac(

63、int n)fac(int n) doubledouble f f; ; if(n=1 | n=0) if(n=1 | n=0)fac(n-1)fac(n-1) return( return(2 2); );3 3fac(int n)fac(int n) doubledouble f f; ; if(n=1 | n=0) if(n=1 | n=0)f=1;f=1; return( return(1 1); );4 458587.6 变量的作用域变量的作用域 n变量定义的变量定义的3个基本位置个基本位置函数函数函数函数内内内内部部部部函数参数函数参数函数参数函数参数函数函数函数函数外外外外部部部

64、部内部变量内部变量内部变量内部变量外部变量外部变量外部变量外部变量(局部变量)(局部变量)(局部变量)(局部变量)(全局变量)(全局变量)(全局变量)(全局变量)5959局部变量局部变量n定义:定义:在函数内定义,只在本函数内有效在函数内定义,只在本函数内有效n说明说明main中定义的变量只在中定义的变量只在main中有效中有效形参属于局部变量形参属于局部变量,即只在函数中有效,即只在函数中有效不同函数中同名变量,占不同内存单元不同函数中同名变量,占不同内存单元 复合语句中复合语句中定义的变量,只在复合语句中有效定义的变量,只在复合语句中有效float f1(int a) float f1(i

65、nt a) int b,c; int b,c; . . char f2(int x,int y)char f2(int x,int y) int i,j; int i,j; main()main() int m,n; int m,n; . . a,b,ca,b,c有效有效有效有效x,y,i,jx,y,i,j有效有效有效有效m,nm,n有效有效有效有效6060main()main() int a=3, b=4;int a=3, b=4; printf(main:a=%d,b=%dn, a, b); printf(main:a=%d,b=%dn, a, b); sub(); sub(); prin

66、tf(main:a=%d,b=%dn, a, b); printf(main:a=%d,b=%dn, a, b); sub()sub() int a, b; int a, b; a=6; a=6; b=7; b=7; printf(sub:a=%d,b=%dn, a, b); printf(sub:a=%d,b=%dn, a, b); main:a=3,b=4sub:a=6,b=7main:a=3,b=4说明说明说明说明 不同函数中同名变量,占不同的存储单元不同函数中同名变量,占不同的存储单元不同函数中同名变量,占不同的存储单元不同函数中同名变量,占不同的存储单元b ba ab ba a3 3

67、4 46 67 76161#define N 5#define N 5main()main() int i; int i; int aN=1, 2, 3, 4, 5 ; int aN=1, 2, 3, 4, 5 ; for(i=0; iN/2; i+) for(i=0; iN/2; i+) int temp; int temp; temp=ai; temp=ai; ai=aN-i-1; ai=aN-i-1; aN-i-1=temp; aN-i-1=temp; printf(%d , temp); printf(%d , temp); for(i=0; iN; i+) for(i=0; ib?a

68、:b; c = ab?a:b; return(c); return(c); main()main() int a=8; int a=8; printf(max=%d, max(a, b); printf(max=%d, max(a, b); 运行结果:运行结果:max=8例例例例 全局变量与全局变量与 同名,同名,_起作用起作用局部变量局部变量局部变量局部变量局部变量局部变量局部变量局部变量65657.7 变量的存储类型变量的存储类型 静态存储区静态存储区静态存储区静态存储区动态存储区动态存储区动态存储区动态存储区程序运行期间分配程序运行期间分配固定固定固定固定存储空间存储空间存储空间存储空间

69、程序运行期间根据需要程序运行期间根据需要,动态动态动态动态分配存储空间分配存储空间ExternExternStaticStaticRegisterRegisterautoauto 变量的存储类型规定了该变量数据在内存中的存储区域。在不同存储区域存储的数据,有不同的生存期。生存期。6666auto变量变量n定义:定义:auto 数据类型数据类型 变量名变量名使用范围使用范围函数中的形参函数中的形参函数内部的变量函数内部的变量复合语句中定义的变量复合语句中定义的变量说明:没有做特殊说明的变量都是说明:没有做特殊说明的变量都是auto变量变量特点:特点:动态分配存储空间动态分配存储空间退出函数后自动

70、释放空间退出函数后自动释放空间6767register变量变量n定义方法:定义方法:register 数据类型数据类型 变量名变量名使用范围:函数内部使用范围:函数内部使用条件:当某些变量使用频繁时使用条件:当某些变量使用频繁时优点:提高执行效率优点:提高执行效率int fac(int n)int fac(int n) register int i, f;register int i, f; for(i=1; i=n; i+) for(i=1; i=n; i+) f = f*i; f = f*i; return f; return f; main()main() int i; int i; f

71、or(i=1; i=5; i+) for(i=1; i=5; i+) printf(“%d!=%d”, i, fac(i); printf(“%d!=%d”, i, fac(i); 6868static变量变量n定义方法:定义方法:static 数据类型数据类型 变量名变量名使用范围:函数的使用范围:函数的内部内部内部内部和函数和函数外部外部外部外部特点:特点:在静态存储区分配存储单元,在程序的整个运行期在静态存储区分配存储单元,在程序的整个运行期间都不释放空间间都不释放空间 静态变量是编译时赋初值,即只赋值一次静态变量是编译时赋初值,即只赋值一次静态变量是编译时赋初值,即只赋值一次静态变量是

72、编译时赋初值,即只赋值一次若静态变量不赋初值,则系统指定为若静态变量不赋初值,则系统指定为0(对数值型)(对数值型)或空字符(对字符型)或空字符(对字符型)局部静态变量在函数调用结束后仍然存在于静态存局部静态变量在函数调用结束后仍然存在于静态存储区,但其他函数是不能引用的储区,但其他函数是不能引用的6969静态变量举例静态变量举例f(int a)f(int a) int b=0; int b=0; staticstatic c=3; c=3; b=b+1; b=b+1; c=c+1; c=c+1; return (a+b+c); return (a+b+c); main()main() int

73、 a=2, i; int a=2, i; for(i=1; i3; i+) for(i=1; i3; i+) printf(“%d”, f(a); printf(“%d”, f(a); 静态静态静态静态存储区存储区存储区存储区动态动态动态动态存储区存储区存储区存储区f: c34 4main: a2main: i1f: b0f: a215 51 12 37070extern变量变量n定义方法:定义方法:extern 数据类型数据类型 变量名变量名说明说明extern不是变量定义不是变量定义,只是扩展全局变量作用域只是扩展全局变量作用域int p=1, q=5;int p=1, q=5;float

74、 f1(int a) int b,c; int f3() char c1, c2;char c1, c2;char f2(int x,int y) int i,j; main() int m,n; .extern char c1, c2;extern char c1, c2;extern char c1, c2;extern char c1, c2;7171自动赋初值自动赋初值自动赋初值自动赋初值0 0或空字符或空字符或空字符或空字符不确定不确定不确定不确定编译时赋初值,只赋一次编译时赋初值,只赋一次编译时赋初值,只赋一次编译时赋初值,只赋一次每次函数调用时每次函数调用时每次函数调用时每次函数

75、调用时其它文件其它文件其它文件其它文件本文件本文件本文件本文件定义变量的函数或复合语句内定义变量的函数或复合语句内定义变量的函数或复合语句内定义变量的函数或复合语句内程序整个运行期间程序整个运行期间程序整个运行期间程序整个运行期间函数调用开始至结束函数调用开始至结束函数调用开始至结束函数调用开始至结束静态存储区静态存储区静态存储区静态存储区寄存器寄存器寄存器寄存器动态区动态区动态区动态区静态存储静态存储静态存储静态存储动态存储动态存储动态存储动态存储externextern全局全局全局全局staticstatic局部局部局部局部staticstaticregisterregisterautoauto未赋初值未赋初值未赋初值未赋初值赋初值赋初值赋初值赋初值作用域作用域作用域作用域生存期生存期生存期生存期存储区存储区存储区存储区存储方式存储方式存储方式存储方式存储类别存储类别存储类别存储类别全局变量全局变量全局变量全局变量局部变量局部变量局部变量局部变量变量存储类型变量存储类型

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号