《C语言程序设计函数程序设计.pptx》由会员分享,可在线阅读,更多相关《C语言程序设计函数程序设计.pptx(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计(第3版)张磊编著 清华大学出版社第6 6章 数组程序设计u6.1 函数概述 u6.2 自定义函数示例u6.3 函数定义及调用 u6.4 函数嵌套和递归函数u6.5 数组作为函数的参数u6.6 函数应用举例第1页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.1函数概述 C C语言程序的特点:函数化结构语言程序的特点:函数化结构 函数分类:系统函数、用户函数函数分类:系统函数、用户函数 系统函数:系统函数:printf()printf()、scanf()scanf()、sqrt()sqrt()等等 用户函数:用户函数:在程序中编写的函数在程序中编写的函数,又称,又称
2、自定义函数自定义函数。用户函数的特例:用户函数的特例:main()main()函数函数 如果在程序中经常需要某种处理,就可以编写一个函数,在需如果在程序中经常需要某种处理,就可以编写一个函数,在需要这种处理时,就调用该函数。要这种处理时,就调用该函数。示例示例计算a!+b!+c!第2页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.26.2自定义函数示例自定义函数示例例例6-16-1编程计算表达式a!+b!+c!的值。l程序结构只有main()函数的阶乘程序#includevoid main()int a,b,c,i;long t,sum;printf(Input a,b,c:)
3、;scanf(%d,%d,%d,&a,&b,&c);for(t=1,i=1;i=a;i+)t=t*i;sum=t;for(t=1,i=1;i=b;i+)t=t*i;sum+=t;for(t=1,i=1;i=c;i+)t=t*i;sum+=t;printf(SUM=%ldn,sum);l使用自定义函数的阶乘程序#include void main()long f(int n);int a,b,c,i;printf(Input a,b,c:);scanf(%d,%d,%d,&a,&b,&c);printf(SUM=%ldn,f(a)+f(b)+f(c);longf(intn)longf(intn)
4、/*/*计算阶乘的函数计算阶乘的函数*/longt;longt;inti;inti;for(t=1,i=1;i=n;i+)for(t=1,i=1;i=n;i+)t*=i;t*=i;return(t);return(t);求求n!n!函数函数调用函数调用函数f()f()求求c!c!第3页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3函数的定义及调用6.3.1 函数的定义6.3.2 函数值和return命令6.3.3 函数调用第4页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.1函数定义 函数定义的一般格式函数定义的一般格式函数类型函数类型 函数名函数名(形式
5、参数表形式参数表)函数体函数体 形式参数表的格式形式参数表的格式数据类型数据类型 变量变量1,1,数据类型数据类型 变量变量2,2,数据类型数据类型 变量变量n n函数的值函数的值的类型的类型第5页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社例例6-26-2 定义连续输出定义连续输出5050个个*字符的函数。字符的函数。voidp_star50(void)voidp_star50(void)inti;inti;for(i=1;i=50;i+)for(i=1;i=50;i+)putchar(*);putchar(*);6.3.1函数定义无形参无形参有形参有形参例例6-36-3 定义
6、连续输出定义连续输出n n个个*字符的函数。字符的函数。voidp_star(intn)voidp_star(intn)inti;inti;for(i=1;i=n;i+)for(i=1;iy?x:y;return(m);return(m);float max(float x,float y)if(xy)returnx;returnx;elsereturny;returny;第8页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.2函数值和return命令例例6-56-5int sum(int n)int s,i;for(s=0,i=1;i=n;i+)s+=i;return(s)
7、;第9页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用1 1函数原型和函数声明函数原型和函数声明 函数原型函数原型函数原型是是定义函数时函数体以外的那些内容。函数原型是是定义函数时函数体以外的那些内容。一般形式:一般形式:函数类型函数类型 函数名函数名(数据类型数据类型11形参形参1,1,类型类型22形参形参2,2,类型类型nn形参形参n)n)简化形式:简化形式:函数类型函数类型 函数名(数据类型函数名(数据类型1,1,数据类型数据类型2,2,数据类型数据类型n n)函数声明函数声明函数声明是在主调函数的函数体说明部分描述被调函数原型。函数声明是在主调函数的函数体
8、说明部分描述被调函数原型。函数调用函数调用函数调用是对已定义函数的具体应用。函数调用是对已定义函数的具体应用。一般形式:一般形式:函数名函数名(实参表实参表)第10页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用/*program e6-6.c*/#includevoid main()voidp_star50(void);voidp_star50(void);int k;for(k=1;k=20;k+)p_star50();p_star50();putchar(n);例例6-66-6 调用调用p_star50()p_star50()函数,连续输出函数,连续输出20
9、20行行*字符串,每行字符串,每行5050个个*字符。字符。voidp_star50(void)voidp_star50(void)int i;for(i=1;i=50;i+)putchar(*);return;函数原型及函数声明函数调用第11页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用/*programe6-7.c*/*programe6-7.c*/#include#includevoidmain()voidmain()voidp_star(intn);voidp_star(intn);intk;intk;for(k=1;k=5;k+)for(k=1;k=5
10、;k+)p_star(k);p_star(k);putchar(n);putchar(n);例例6-76-7 调用调用p_star()p_star()函数,输出函数,输出*字符图案。字符图案。*voidp_star(intn)voidp_star(intn)inti;inti;for(i=1;i=n;i+)for(i=1;i=n;i+)putchar(*);putchar(*);return;return;函数原型及函数原型及函数声明函数声明函数调用函数调用函数定义函数定义函数实参函数实参函数形参函数形参第12页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用例例6
11、-86-8 调用求和函数调用求和函数sum()sum(),计算表达式,计算表达式/*programe6-8.c*/*programe6-8.c*/#include#includevoidmain()voidmain()intsum(int);intsum(int);printf(%dn,printf(%dn,sum(20)+sum(50);sum(20)+sum(50);intsum(intn)intsum(intn)ints,i;ints,i;for(s=0,i=1;i=n;i+)for(s=0,i=1;i=n;i+)s+=i;s+=i;return(s);return(s);第13页/共4
12、2页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用n n函数调用的三种形式函数调用的三种形式 当被调用函数为当被调用函数为voidvoid类型时,函数无返回值,函数类型时,函数无返回值,函数调用是一个独立的语句。调用是一个独立的语句。当被调用函数有返回值时,函数调用出现在表达式当被调用函数有返回值时,函数调用出现在表达式中,是表达式的一部分。中,是表达式的一部分。函数调用也可以作为一个函数的实参。函数调用也可以作为一个函数的实参。例例6-96-9 利用求两个数的最大数函数利用求两个数的最大数函数max()max(),求得三个数的最,求得三个数的最大数。大数。#include
13、void main()float max(float,float);float a,b,c;printf(a,b,c:);scanf(%f,%f,%f,&a,&b,&c);printf(Max=%fn,max(max(max(a,b)max(a,b),c);,c);float max(float x,float y)float m;m=xy?x:y;return(m);函数调用作为函数调用作为函数的实参函数的实参第14页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用 注意注意函数调用时,实参和形参按照在参数表中的位置对应传值。例例6-106-10 编写输出n个连续
14、的任意字符的函数p_string(),并调用该函数输出一个5行的“*”三角形图案#include#includevoidmain()voidmain()voidp_string(int,char);voidp_string(int,char);intk;intk;for(k=1;k=5;k+)for(k=1;k=5;k+)p_string(p_string(k,*k,*);putchar(n);putchar(n);voidvoidp_string(p_string(intn,charchintn,charch)inti;inti;for(i=1;i=n;i+)for(i=1;i=n;i+)p
15、utchar(ch);putchar(ch);return;return;按位置按位置对应对应 传送传送第15页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.4函数嵌套和递归函数 6.4.1 6.4.1 函数嵌套函数嵌套 6.4.2 6.4.2 递归函数递归函数第16页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.4.1函数嵌套 函数嵌套是指在一个用户函数的函数体中,又出现了另外用函数嵌套是指在一个用户函数的函数体中,又出现了另外用户函数的调用。如函数户函数的调用。如函数a a调用函数调用函数b b,函数,函数b b又调用函数又调用函数c c等。等。#inclu
16、devoid main()long fac(int);long cmn(int,int);int m,n;printf(m,n=);scanf(%d,%d,&m,&n);printf(C(%d,%d)=%ldn,m,n,cmn(m,n)cmn(m,n);long fac(int k)/*定义求k!的函数*/int i;long t;for(i=1,t=1;i1n1时,其值为时,其值为sum(n-1)+nsum(n-1)+n。由此,定义递归函数:。由此,定义递归函数:longsum(intn)longsum(intn)if(n=1)if(n=1)return(1);return(1);elsee
17、lsereturn(sum(n-1)+n);return(sum(n-1)+n);第20页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社 6.4.2递归函数n n计算计算sum(3)sum(3)的处理过程的处理过程 高到低进行递推描述。高到低进行递推描述。调用调用sum(3)sum(3),将其描述为,将其描述为sum(2)+3sum(2)+3;调用调用sum(2)sum(2),将其描述为,将其描述为sum(1)+2sum(1)+2;调用调用sum(1)sum(1),问题已到最低层,有确定值:,问题已到最低层,有确定值:sum(1)=1sum(1)=1;由低到高逐级求得上层结果由低到
18、高逐级求得上层结果。由由sum(1)+2sum(1)+2求得求得sum(2)sum(2);由由sum(2)+3sum(2)+3求得求得sum(3)sum(3);完整程序代码完整程序代码完整程序代码完整程序代码#include#includevoid main()void main()long sum(int);long sum(int);int n;int n;printf(n=);printf(n=);scanf(%d,&n);scanf(%d,&n);printf(Sum=%dn,sum(n);printf(Sum=%dn,sum(n);long sum(int n)long sum(in
19、t n)if(n=1)if(n=1)return(1);return(1);else else return(sum(n-1)+n);return(sum(n-1)+n);第21页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.4.2递归函数2非公式递归问题有的问题不能直接用一个递归公式进行描述,但可以用递归方法进行描述,我们将其归类为非公式递归问题。例例例例6-146-146-146-14 汉诺塔问题。有三个柱和n个大小各不相同的盘子,开始时,所有盘子以塔状叠放在柱A上,要求按一定规则,将柱A上的所有盘子移动到柱B上,柱C为移动缓冲住。移动规则:一次只能移动一个盘子。任何时候不
20、能把盘子放在比它小的盘子的上面。第22页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.4.2递归函数n n汉诺塔问题递归实现过程汉诺塔问题递归实现过程汉诺塔问题递归实现过程汉诺塔问题递归实现过程若只有一个盘子若只有一个盘子若只有一个盘子若只有一个盘子,则直接从,则直接从,则直接从,则直接从 A A A A 移到移到移到移到 B B B B,问题结束;,问题结束;,问题结束;,问题结束;若有若有若有若有n n n n(n1n1n1n1)个盘子)个盘子)个盘子)个盘子,则须经过如下三个步骤:,则须经过如下三个步骤:,则须经过如下三个步骤:,则须经过如下三个步骤:第一步:按照移动规则
21、,把第一步:按照移动规则,把第一步:按照移动规则,把第一步:按照移动规则,把A A A A上面的上面的上面的上面的 n-1 n-1 n-1 n-1 个盘子,移到个盘子,移到个盘子,移到个盘子,移到C C C C。第二步:将第二步:将第二步:将第二步:将A A A A上仅有的一只盘子(也就是最大的一只)直接移到柱上仅有的一只盘子(也就是最大的一只)直接移到柱上仅有的一只盘子(也就是最大的一只)直接移到柱上仅有的一只盘子(也就是最大的一只)直接移到柱B B B B上。上。上。上。第三步:用第一步所述方法,将第三步:用第一步所述方法,将第三步:用第一步所述方法,将第三步:用第一步所述方法,将C C
22、C C柱上的柱上的柱上的柱上的n-1n-1n-1n-1个盘子移到个盘子移到个盘子移到个盘子移到B B B B柱上。与第一柱上。与第一柱上。与第一柱上。与第一步一样,这一步实际上是由一系列更小的一次仅移一个盘子的操作组成。步一样,这一步实际上是由一系列更小的一次仅移一个盘子的操作组成。步一样,这一步实际上是由一系列更小的一次仅移一个盘子的操作组成。步一样,这一步实际上是由一系列更小的一次仅移一个盘子的操作组成。BA汉诺塔问题的递归算法:汉诺塔问题的递归算法:汉诺塔问题的递归算法:汉诺塔问题的递归算法:hanoi(nhanoi(nhanoi(nhanoi(n个盘个盘个盘个盘,AB,AB,AB,AB
23、,缓柱缓柱缓柱缓柱C)C)C)C)if(n=1)if(n=1)if(n=1)if(n=1)直接从直接从直接从直接从A A A A移到移到移到移到B B B B else else else else hanoi(n-1 hanoi(n-1 hanoi(n-1 hanoi(n-1个盘个盘个盘个盘,AC,AC,AC,AC,缓柱缓柱缓柱缓柱B)B)B)B)移动移动移动移动n n n n号盘子:号盘子:号盘子:号盘子:ABABABAB hanoi(n-1 hanoi(n-1 hanoi(n-1 hanoi(n-1个盘个盘个盘个盘,CB,CB,CB,CB,缓柱缓柱缓柱缓柱A)A)A)A)#include
24、#include void main()void main()int disks;int disks;void hanoi(int,char,char,char);void hanoi(int,char,char,char);printf(Number of disks:);printf(Number of disks:);scanf(%d,&disks);scanf(%d,&disks);printf(n);printf(n);hanoi(disks,A,B,C);hanoi(disks,A,B,C);void hanoi(int n,char A,char B,char void hano
25、i(int n,char A,char B,char C)C)if(n=1)if(n=1)printf(%c-%c ,A,B);printf(%c-%c ,A,B);return;return;elseelse hanoi(n-1,A,C,B);hanoi(n-1,A,C,B);printf(%c-%c ,A,B);printf(%c-%c ,A,B);hanoi(n-1,C,B,A);hanoi(n-1,C,B,A);BA第23页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.5数组作为函数的参数 6.5.1 6.5.1 数组元素作为函数参数数组元素作为函数参数 6.5.2 6
26、.5.2 一维数组名作为函数参数一维数组名作为函数参数 6.5.3 6.5.3 用一维数组求解二维数组问题用一维数组求解二维数组问题数组作为函数参数的目的,是为了实现数组数据在函数间的传送。第24页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.5.1数组元素作为函数参数n数组元素作为函数的参数时,只传送作为实参的数组元素,此时按使用其他简单变量的方法使用数组元素。例例6-156-15 把一个整型数组的所有素数找出来把一个整型数组的所有素数找出来。l l求解问题的思路求解问题的思路 设计判断素数的函数设计判断素数的函数prime()prime(),函数原型:,函数原型:intpr
27、ime(intk)intprime(intk)当当k k为素数时,函数值为为素数时,函数值为1 1;否则,函数值为;否则,函数值为0 0。在主函数在主函数main()main()中建立一个自然数数组中建立一个自然数数组naturalnatural,然后用它的每,然后用它的每一个数组元素调用一个数组元素调用prime()prime()函数求素数。函数求素数。int prime(int k)int sk,i;int flag=1;sk=sqrt(k);for(i=2;i=sk;i+)if(k%i=0)flag=0;break;return(flag);#define N 10#include#in
28、cludevoid main()int prime(int);int i,naturalN;printf(Data:);for(i=0;iN;i+)scanf(%d,&naturali);for(i=0;iN;i+)if(prime(naturaliprime(naturali )printf(%d ,naturali);printf(n);数组元数组元素作函素作函数参数数参数第25页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.5.2一维数组名作为函数参数数组名的实质就是数组的首地址。数组名作为函数参数数组名作为函数参数数组名作为函数参数数组名作为函数参数时传送的是数组的开始
29、地址时传送的是数组的开始地址时传送的是数组的开始地址时传送的是数组的开始地址,是一种传址调用。形参数组和实参数组要在各自的函数中进行等同的定义。例例6-166-16 定义求一维数组最大元素值的函数定义求一维数组最大元素值的函数v_max()v_max(),并,并在主函数中调用它求数组元素的最大值。在主函数中调用它求数组元素的最大值。第26页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.5.2一维数组名作为函数参数/*program e6-16.c*/#include#define N 10void main()int v_max(int aN);int datadataN,i;
30、printf(Data:);for(i=0;iN;i+)scanf(%d,&datai);printf(Max=%dn,v_max(datadata);int v_max(int aN)int i;int max=a0;for(i=1;iN;i+)if(maxai)max=ai;return(max);v_max()函数调用开始时的数组状态 第27页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.5.2一维数组名作为函数参数/*programe6-16-1.c*/#include#defineN10voidmain()void input(int,int);void input(
31、int,int);int v_max(int,int);int v_max(int,int);intdata50;printf(Data:);input(N,data);input(N,data);printf(Max=%dn,v_max(N,data);v_max(N,data);int v_max(int n,int a)int v_max(int n,int a)inti;intmax=a0;for(i=1;in;i+)if(maxai)max=ai;return(max);void input(int n,int a)void input(int n,int a)inti;for(i=
32、0;in;i+)scanf(%d,&ai);l l程序改进,注意数组参数的变化程序改进,注意数组参数的变化程序改进,注意数组参数的变化程序改进,注意数组参数的变化第28页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.5.3用一维数组求解二维数组问题二维数组在内存中按行逐列存储,各个数组元素依次占用连续的存储二维数组在内存中按行逐列存储,各个数组元素依次占用连续的存储单元,存储后的状态与一维数组是没有区别的。因此,可以用一个对应单元,存储后的状态与一维数组是没有区别的。因此,可以用一个对应的一维数组来处理二维数组。的一维数组来处理二维数组。uu以以2222数组数组examplee
33、xample为例说明二维数组与一维数组的关系为例说明二维数组与一维数组的关系 二维数组二维数组exampleexample可视为由可视为由example0example0和和example1example1两个元素构两个元素构成的一维数组成的一维数组,example0,example0是是exampleexample第第0 0行的一维数组,行的一维数组,example1example1是是exampleexample第第1 1行的一维数组。数组行的一维数组。数组exampleexample的首地址可用的首地址可用example0example0表表示。示。若把一维数组若把一维数组p p映射到映
34、射到mnmn的二维数组的二维数组exampleexample的存储空间,则二的存储空间,则二维数组元素和一维数组元素有如下对应关系:维数组元素和一维数组元素有如下对应关系:exampleijexampleij对应于对应于pi*n+jpi*n+jexample0 example0 example0 example0 example00example00p0p0p0p0example01example01p1p1p1p1example1 example1 example1 example1 example10example10p2p2p2p2example11example11p3p3p3p3第2
35、9页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.5.3用一维数组求解二维数组问题例例6-176-17求下列34矩阵的所有元素的和。/*programe6-17.c*/#includevoidmain()intsum_array(int,int,int);intarr34=16,27,8,-6,-17,21,5,19,66,9,58,86;printf(Sum=%dn,sum_array(3,4,arr0);intsum_array(intm,intn,inta)inti,s=0;for(i=0;im*n;i+)s+=ai;return(s);第30页/共42页C语言程序设计(
36、第3版)张磊编著 清华大学出版社6.6函数应用举例 6.6.16.6.1计算长方体的面积计算长方体的面积 6.6.26.6.2利用递归函数计算利用递归函数计算FibonacciFibonacci数列数列 6.6.36.6.3排序函数的设计与应用排序函数的设计与应用第31页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.6.1计算长方体的面积例例6-186-18 设计一个计算矩形面积的函数,并调用该函数计算长方体的设计一个计算矩形面积的函数,并调用该函数计算长方体的面积。面积。问题分析问题分析 设矩形面积函数为设矩形面积函数为area()area(),原型:,原型:float ar
37、ea(foat,float)float area(foat,float)设长方体的长、宽、高分别为设长方体的长、宽、高分别为a a、b b、c c,面积为,面积为s s:s=2(area(a,b)+area(b,c)+area(a,c)s=2(area(a,b)+area(b,c)+area(a,c)设计主函数设计主函数main()main(),在其中输入,在其中输入a a、b b、c c,然后调用,然后调用area()area()计算计算长方体面积,并输出结果。长方体面积,并输出结果。#includevoidmain()floatarea(float,float);floata,b,c,s;
38、printf(a,b,c:);scanf(%f,%f,%f,&a,&b,&c);s=(area(a,b)+area(b,c)+area(a,c)*2;printf(S=%fn,s);floatarea(floatx,floaty)return(x*y);第32页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.6.2利用递归函数计算Fibonacci数列例例6-196-19 计算计算FibonacciFibonacci数列的第数列的第n n个数。个数。问题分析与算法设计问题分析与算法设计 描述计算描述计算FibonacciFibonacci数的递归公式数的递归公式 根据根据fib(
39、n)fib(n)的递归公式,设计递归函数的递归公式,设计递归函数 long fib(int n)long fib(int n)在主函数在主函数main()main()中输入数据中输入数据n n,然后调用,然后调用fib()fib()函数求得第函数求得第n n个个FibonacciFibonacci数,并输出结果。数,并输出结果。/*programe6-19.c*/#includevoidmain()longfib(int);intn;printf(n=);scanf(%d,&n);printf(Fibonacci(%d):%ldn,n,fib(n);longfib(intn)if(n=1|n=
40、2)return(1);elsereturn(fib(n-1)+fib(n-2);第33页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.6.3排序函数的设计与应用例例6-206-20 设计一个对一维数组排序的设计一个对一维数组排序的sort()sort()函数,并调用它实现数组排序。函数,并调用它实现数组排序。问题分析与算法设计问题分析与算法设计 设计排序函数设计排序函数sort()sort(),排序算法使用冒泡排序法。,排序算法使用冒泡排序法。sort()sort()函数原型函数原型 void sort(int,int)void sort(int,int)设计设计input(
41、)input()实现数组输入、设计实现数组输入、设计output()output()实现数组输出。函数原型:实现数组输出。函数原型:void input(int,int)void input(int,int)void output(int,int)void output(int,int)设计主函数设计主函数mian()mian(),在其中定义数组,在其中定义数组datadata。调用调用input()input()函数建立函数建立datadata数组。数组。调用调用output()output()函数输出函数输出datadata数组。数组。调用调用sort()sort()函数对函数对datad
42、ata数组排序。数组排序。调用调用output()output()函数输出排序后的结果。函数输出排序后的结果。实现程序实现程序对应参加排序的元素数对应排序的数组名/*program e6-20.c*/#include#define N 10void main()void sort(int,int);void input(int,int);void output(int,int);int i,dataN;input(N N,datadata);output(N N,datadata);sort(N N,datadata);output(N N,datadata);void input(intin
43、t n n,intainta)int i;for(i=0;in;i+)scanf(%d,&ai);void output(intnintn,intint aa)int i;for(i=0;in;i+)printf(%d ,ai);printf(n);voidsort(voidsort(intint n n,intint aa)inti,j,temp;inti,j,temp;for(i=1;in;i+)for(i=1;in;i+)for(j=0;jn-i;j+)for(j=0;jaj+1)if(ajaj+1)temp=aj;aj=aj+1;aj+1=temp;temp=aj;aj=aj+1;aj
44、+1=temp;第34页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.7变量的作用域和存储类型 6.7.16.7.1变量的作用域变量的作用域 6.7.26.7.2变量的存储类型变量的存储类型 第35页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.7.1变量的作用域1 1局部变量局部变量在函数体内定义的变量在函数体内定义的变量称为称为局部变量局部变量,也称为,也称为内部变量。局部变量只内部变量。局部变量只能在定义它的函数中使能在定义它的函数中使用。用。例例例例 6-216-21 局部变量举例局部变量举例局部变量举例局部变量举例#include#includevoi
45、d main()void main()void p_star50(void);void p_star50(void);int int i i;for(i=1;i=20;i+)for(i=1;i=20;i+)p_star50();p_star50();putchar(n);putchar(n);void p_star50(void)void p_star50(void)intint i i;for(i=1;i=50;i+)for(i=1;i=50;i+)putchar(*);putchar(*);return;return;第36页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.7
46、.1变量的作用域2.2.全局变量全局变量全局变量是在函数之外定义的变量全局变量是在函数之外定义的变量。在任何一个函数之外的位。在任何一个函数之外的位置,都可以定义全局变量。在一个程序中,凡是在全局变量之置,都可以定义全局变量。在一个程序中,凡是在全局变量之后定义的函数,都可以使用在其之前定义的全局变量。因此,后定义的函数,都可以使用在其之前定义的全局变量。因此,一个全局变量,可以被多个函数使用一个全局变量,可以被多个函数使用,但并不一定能被所在程但并不一定能被所在程序中的每一个函数使用,全局变量也有一定的作用范围。序中的每一个函数使用,全局变量也有一定的作用范围。第37页/共42页C语言程序设
47、计(第3版)张磊编著 清华大学出版社6.7.1变量的作用域例例6-226-22 局部变量和全局变量示例。局部变量和全局变量示例。/*programe6-22.c*/*programe6-22.c*/#include#includeinta=3,b=5;inta=3,b=5;voidmain()voidmain()intmax(int,int);intmax(int,int);inta=8;inta=8;printf(MAX=%dn,max(a,b);printf(MAX=%dn,max(a,b);intmax(intm,intn)intmax(intm,intn)return(mn?m:n);
48、return(mn?m:n);定义全定义全局变量局变量 定义局定义局部变量部变量 局部变量局部变量 全局变量全局变量第38页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.4.2变量的存储类型1 1autoauto型变量型变量autoauto型变量通常称为自动变量,只有函数的局部变量才能定义型变量通常称为自动变量,只有函数的局部变量才能定义为为autoauto型。型。autoauto型变量在函数被调用时为其分配存储空间,存型变量在函数被调用时为其分配存储空间,存储于内存的动态存储区,函数执行结束时存储空间自动释放。储于内存的动态存储区,函数执行结束时存储空间自动释放。autoau
49、to型变量在赋值以前,具有不确定的值。型变量在赋值以前,具有不确定的值。autoauto型变量的定义形式型变量的定义形式auto auto 数据类型数据类型 变量名;变量名;在定义局部变量时,如果缺省存储类型项,则系统默认为存储在定义局部变量时,如果缺省存储类型项,则系统默认为存储类型是类型是autoauto型。型。2 2staticstatic型变量型变量 定义的形式定义的形式static static 数据类型数据类型 变量名;变量名;在函数内定义的静态变量称为静态局部变量,在函数外定义的在函数内定义的静态变量称为静态局部变量,在函数外定义的静态变量称为静态全局变量。静态变量称为静态全局变
50、量。staticstatic型局部变量并不因函数运行型局部变量并不因函数运行结束而消失,而是始终存在结束而消失,而是始终存在,当再次进入该函数时当再次进入该函数时,将保留上次的将保留上次的结果。结果。例例6-236-236-236-23 计算并输出计算并输出1 1 1 1到到5 5 5 5的阶乘值。的阶乘值。#include#include#include#includevoid main()void main()void main()void main()int fac(int);int fac(int);int fac(int);int fac(int);int i;int i;int i