




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、制作人:制作人: 黄黄 荧荧制作人单位:河师大数学与信息科学学院制作人单位:河师大数学与信息科学学院第八章 函数& C函数的定义与使用 (重点 ) ( C函数的定义、函数的调用、函数参数的传递、函数的返回值)& C函数的说明& 地址传递:数组作为参数(重点 )& 局部变量与全局变量& 递归函数& 局部变量的存储形式& 内部函数和外部函数8.1 函数概述一一 什么样的实际问题通常用什么样的实际问题通常用c函数来解决函数来解决?1 当实际问题有多项任务时当实际问题有多项任务时,通常用通常用来实现它的来实现它的.如如, 软件程序有成千上万行,由几十人来编写软件程序有成千上万行,由几十人来编写,如何分
2、配任如何分配任务最合适?务最合适? 2 当一段当一段功能代码功能代码可能在程序中反复出现时可能在程序中反复出现时,可以将这段可以将这段代码编成代码编成c函数函数,反复调用反复调用.如如, 计算组合数:计算组合数:)!57100(!57!1008.1 函数概述 C C函数是一个函数是一个被命名的被命名的、独立的代码段独立的代码段。它往往用来执行一个特。它往往用来执行一个特定的任务,如计算某一个值做为函数值返回定的任务,如计算某一个值做为函数值返回, ,当然也可以只作一当然也可以只作一些动作些动作, ,如画一个图形等等如画一个图形等等, ,不返回值。不返回值。 1) 1) 从用户使用的角度分从用户
3、使用的角度分: : 标准函数标准函数 ( (库函数库函数) ) 自定义自定义函数函数(!)(!) 2) 2)从函数的形式的角度分从函数的形式的角度分 无参函数无参函数 有参函数有参函数float max(float x,floatfloat x,float y y) float z; z=xy?x:y; void mycat() printf( / - / n); printf( ( = T =) n); printf( ( oy?x:y; void mycat() printf( / - / n); printf( ( = T =) n); printf( ( o ) nn);指出函数返回值
4、的类型指出函数返回值的类型为函数传递计算时为函数传递计算时的数据的数据返回返回(送回送回)函数的计算结果函数的计算结果这段代码的名字这段代码的名字对对C C函数调用的感性认识函数调用的感性认识例例 求两个实数的最大值求两个实数的最大值#include stdio.h#include /=/=/函数功能函数功能: :求两个实数求两个实数x,yx,y的最大值的最大值/入口参数入口参数: : 两个实数两个实数x,yx,y/ / 用变量用变量 float x,floatfloat x,float y y来传递来传递/返回值返回值: x,y: x,y的最大值的最大值/=/=float max(float
5、 x,floatfloat x,float y y) /函数的定义 xy?x:y;/=/=主函数主函数 void main()void main() float x,y,z1,z2; float x,y,z1,z2; printf printf(请输入实数请输入实数x y:nx y:n);); scanf(%f%f,&x,&y scanf(%f%f,&x,&y);); z1= z1=; ; /函数的调用 z2=z2=; ; printf(max1=%.1fn,z1); printf(max1=%.1fn,z1); printf(max2=%.1fn,z2); printf(max2=%.1fn
6、,z2); 例例 输出两个输出两个 小猫小猫 字符图形字符图形#include stdio.h#include /=/=/函数功能函数功能: : 输出输出 小猫小猫 字符图形字符图形/入口参数入口参数: :无无/返回值返回值: : 无无/=/=void mycatvoid mycat() /() /无参函数无参函数 printf printf( / - / ( / - / nn); ; printf printf( (= T =) n)( (= T =) n); ; printf( ( oo ) nn);); /=/=主函数主函数void main()void main() ; ; print
7、f(nprintf(n); ; ; ; 例例 输出带位置控制的字符图形输出带位置控制的字符图形#include stdio.h#include /=/=/函数功能函数功能: : 输出输出n n个个空格空格/入口参数入口参数: : 空格个数空格个数 / / 用变量用变量 intint n n 来传递来传递/返回值返回值: : 无无/=/=void nblank(intvoid nblank(int n) n) intint i; i; for(i=0;in;i+)for(i=0;ioo) nn);); /=/=主函数主函数void main()void main() ; ; ; ; ; ; 分析
8、分析: : 将输出将输出n n个空格个空格单独编成函数单独编成函数. .例例 编写一个函数编写一个函数, ,判断整数判断整数n n是否是一个完数是否是一个完数, ,并在主函数利用此函数找出并在主函数利用此函数找出200200以内的完数以内的完数. .算法分析算法分析: :函数功能函数功能: : 判断整数判断整数n n是否是一个完数是否是一个完数. .整数整数n n判断结果判断结果 ( (真真, ,假假(1,0) (1,0) #include stdio.h#include /=/=/函数功能函数功能: :判断整数判断整数n n是否是一个完数是否是一个完数/入口参数入口参数: :整数整数n ,n
9、 ,用变量用变量intint n n 来传递来传递/返回值返回值: :判断结果判断结果( (真真, ,假假(1,0)(1,0)/=/=int iswanshu(intint iswanshu(int n) n) int int flag=0,sum=0,i; flag=0,sum=0,i; if( sum=n)flagif( sum=n)flag=1; =1; /=/=主函数主函数 void main()void main() int int n; n; for(n for(n=1;n200;n+)=1;n200;n+) if( if()printf(%4d,n);)printf(%4d,n)
10、; printf(n printf(n);); 作业: P202Ex 8.1 8.3Ex 8.1 8.38.3 函数的参数和函数的值函数的参数和函数的值(细说函数细说函数)例例8.28.2 #include stdio.h#include /=/=/函数功能函数功能: :求两个整数的最大值来传递求两个整数的最大值来传递/入口参数入口参数: :两个整数两个整数, ,用用int x,intint x,int y y来传递来传递/返回值返回值: :两个整数的最大值两个整数的最大值/=/=int max(int x,intint max(int x,int y) y) /函数的定义函数的定义 int
11、int z; z; z= xy? x: y;z= xy? x: y; return(zreturn(z);); /=/=主函数主函数void main()void main() intint a,b,c; a,b,c; printf(Enter printf(Enter a,b: ); a,b: ); scanf(%d,%d,&a,&b scanf(%d,%d,&a,&b); ); c= c=max(a,bmax(a,b) ); ; /函数的调用函数的调用 printf(printf(maxmax= %dn= %dn,c);,c); 形式参数:函数定义中的参数. (占位置的参数)实际参数:函数
12、调用中的参数.(真正应用的参数)必须是一一对应必须是一一对应!8.3 函数的参数和函数的值函数的参数和函数的值(细说函数细说函数)2 2 函数参数的传递过程函数参数的传递过程: :#include /函数功能:求两个整数的最大值/入口参数: 两个整数/返回值:两个整数的最大值int max(int x,int y) /函数的定义 int z; z= xy? x: y; return(z);/=void main() int a,b,c; a=5; b=9; c=max(a,b); /函数的调用 printf(max= %dn,c);59ab:调用前:调用结束:59a:b:9z:Copy!Cop
13、y!return()9c59x:y:59a:b:调用时:1 1 形式形式参数参数和实在和实在参数参数8.3 函数的参数和函数的值函数的参数和函数的值(细说函数细说函数)练习练习: :分析程序的执行过程分析程序的执行过程, ,写出输出结果写出输出结果#include /=自定义函数int pp(int a,int b) /函数的定义 int c; a+; b+; c= a+b; printf(pp:a= %d,b=%d,c=%dn,a,b,c); return c;/=主函数void main() int a,b,c; a=5; b=9; c=pp(a,b); /函数的调用 printf(主:a
14、= %d,b=%d,c=%dn,a,b,c);pp:a=6,b=10,c=16主:a=5,b=9,c=168.3 函数的参数和函数的值函数的参数和函数的值(细说函数细说函数)如如, ,intint max(int max(int x,int x,int y) y) intint z; z;z=(xy)?x:yz=(xy)?x:y; ;return(zreturn(z);); 函数的返回值函数的返回值就是就是, 如如, ,int max(int x,intint max(int x,int y) y) if(x if(xy) return x;y) return x; return y; ret
15、urn y; 如如, ,int max(int x,intint max(int x,int y) y) return (xy)?x:y return (xy)?x:y; ; 关于返回函数值的几点说明关于返回函数值的几点说明: 如果函数有返回值,就必须使用如果函数有返回值,就必须使用 return return 语句语句 一个函数中可以有一个以上的一个函数中可以有一个以上的 return 语句,但不论执行到哪个语句,但不论执行到哪个 return 都将结束都将结束函数的调用返回主调函数函数的调用返回主调函数,所以所以。 return return 语句中的括号可以省略;语句中的括号可以省略;r
16、eturn return 后面的值可以是一个表达式。后面的值可以是一个表达式。 当当 return 语句中的语句中的数值数值表达式的类型表达式的类型与函数类型不符时与函数类型不符时,系统会做自动类型转换系统会做自动类型转换函数的类型就是函数值的类型函数的类型就是函数值的类型.8.4 函数的调用一一 函数调用的一般形式函数调用的一般形式说明:说明: 调用无参函数,省略实参,但括号不能省调用无参函数,省略实参,但括号不能省 实参与形参实参与形参必须必须,个数相等,个数相等,对应类型相同,必要时使用强制类型转换对应类型相同,必要时使用强制类型转换二二 函数调用的两种方式函数调用的两种方式1 函数语句
17、函数语句如如, printf (%d, p); 和和 mycat();* 这种方式不考虑函数有没有返回值,因此对这种方式不考虑函数有没有返回值,因此对任何类型任何类型的函数都适用的函数都适用2 函数表达式函数表达式: 函数的返回值函数的返回值参与参与运算运算如如, m =;m = 3 * ;printf( Max is %d, );* 这种调用方式不能用于这种调用方式不能用于 void 型函数型函数!#include /函数功能:求最大值int max(int x,int y) return xy?x:y;/=void main() int a,b,c; a=5; b=9; c=; print
18、f(max= %dn,c);8.4 函数的调用三三 函数的声明和原型函数的声明和原型例例#include void main() float a,b,c; printf(Enter a,b: ); scanf(%f,%f,&a,&b); c=max(a,b); printf(max= %fn,c);/函数功能函数功能:求实数求实数x和和y的最大值的最大值max( float x, float y) /函数的定义 return xy? x: y; 函数声明(三种形式)如: float max(float x, float y ); 或 float max (float, float ); 或 f
19、loat max ( );编写函数注意事项小结编写函数注意事项小结1 C函数函数: 一个一个C函数往往是用于完成某一函数往往是用于完成某一2 函数参数函数参数: 完成此完成此,需要设置函数参数进行传递,需要设置函数参数进行传递3 函数体的执行部分函数体的执行部分: 就是实现此就是实现此的的4 函数的返回值函数的返回值: 如果此如果此有有,可以,可以作为返作为返回值回值8.5 函数的嵌套调用函数的嵌套调用嵌套调用嵌套调用C C规定:规定:函数定义不可嵌套函数定义不可嵌套,但但函数调用可以嵌套函数调用可以嵌套例例 输出带位置控制的字符小猫图形输出带位置控制的字符小猫图形#include stdio
20、.h#include /=/=/函数功能函数功能: : 输出输出n n个个空格空格/入口参数入口参数: : 空格个数空格个数, ,用变量用变量intint n n来传递来传递/返回值返回值: : 无无/=/= void nblank(int void nblank(int n) n) intint i; i; for(i=0;in;i+)for(i=0;ioo0真 假 y=f(x) x=xpoint(x1,x2)y1=f(x1)#include stdio.h#include #include math.h#include /=/=/函数功能:求多项式的值函数功能:求多项式的值/入口参数入口参
21、数: : 自变量自变量: : 用变量用变量float xfloat x来传递来传递/返回值返回值: : 多项式的值多项式的值/=/=float f(float x)float f(float x) return (x-5.0) return (x-5.0)* *x+16.0)x+16.0)* *x-80.0;x-80.0;/=/=/函数功能:求弦与函数功能:求弦与x x轴的交点(弦截点:根的近似值)轴的交点(弦截点:根的近似值)/入口参数入口参数:x:x区间的两个端点区间的两个端点, ,用变量用变量float x1,float x2float x1,float x2来传递来传递/返回值返回值:
22、x:x轴上的弦截点轴上的弦截点/=/=float xpoint(floatfloat xpoint(float x1,float x2) x1,float x2) float x; float x;x=(x1x=(x1* *f(x2)-x2f(x2)-x2* *f(x1)/(f(x2)-f(x1);f(x1)/(f(x2)-f(x1);return x;return x; 程序程序: 求求多项式的值多项式的值和和弦截点弦截点的子函数的子函数)()()()(121221xfxfxfxxfxx08016523xxx/=/=/函数功能:用弦截法求方程的近似根函数功能:用弦截法求方程的近似根/入口参数
23、入口参数: x: x区间的两个端点区间的两个端点: x1, x2: x1, x2/返回值返回值: : 方程的近似根方程的近似根/=/=float root(float x1,float x2)float root(float x1,float x2) float x,y,y1; float x,y,y1; y1=f(x1); y1=f(x1); do do x=xpoint(x1,x2); x=xpoint(x1,x2); /求弦截点求弦截点y=f(xy=f(x);); if(y if(y* *y10)x1=x;y1=y; y10)x1=x;y1=y; /取端点函数值异号的小区间取端点函数值异
24、号的小区间 else x2=x;else x2=x; while( while(););return x;return x; 程序程序: : 中心子函数中心子函数: : 用用弦截法弦截法求求方程的近似根方程的近似根返回近似根 x x2=x|y|1e-6x1=x, y1=yy*y10真 假 y=f(x) x=xpoint(x1,x2) y1=f(x1)xyf(x )0 x1x2xf(x1)f(x2)/主函数主函数void main()void main() float x1,x2,x,f1,f2; /x1=2,x2=6 (0,10) float x1,x2,x,f1,f2; /x1=2,x2=6
25、 (0,10) 近似根近似根=5.00=5.00 do do printf(input printf(input x1,x2: n); x1,x2: n); scanf(%f%f,&x1,&x2); scanf(%f%f,&x1,&x2); f1=f(x1); f2=f(x2); f1=f(x1); f2=f(x2); while(f1 while(f1* *f20);f20); / /* *输入的容错处理输入的容错处理* */ / x=root(x1,x2); x=root(x1,x2); printf printf(方程的一个近似根是方程的一个近似根是: %.4fn,x);: %.4fn,
26、x); 程序程序: 主函数主函数递归调用v定义:l 函数的嵌套调用是指一个函数调用另一个函数;l 函数的递归调用则是指函数自身调用自身v 分类:l直接递归:自身调用自身l间接递归:函数A调用B,B又调用A。8.6 函数的递归调用分析:分析: 要求出要求出 f(4)f(3)f(2)f(1)f(0)f(4)f(3)f(2)f(1)f(0)(此为回归过程)(此为回归过程) 31 15 7 3 1 31 15 7 3 1 (此为递推过程)(此为递推过程)如,给出一个函数的递推公式:如,给出一个函数的递推公式: f(nf(n)= 1 n=0()= 1 n=0(递推初始值递推初始值) ) 2f(n-1)+
27、1 n0( 2f(n-1)+1 n0(递推公式递推公式) )求求f(4). f(4). 又如又如: Fibonacci数列数列f fn n= = 1 n=1,21 n=1,2 f fn-1n-1+f+fn-2n-2 n n3 3例例 8.7 8.7 用用c c函数实现递归函数函数实现递归函数 5 5个人坐在一起,后一个人总比前个人坐在一起,后一个人总比前一个人大一个人大2 2岁,且第一个人是岁,且第一个人是1010岁,求岁,求第五个人的岁数。第五个人的岁数。依题意可得:依题意可得:age(nage(n)= 10 n=1()= 10 n=1(第一人第一人) ) age(n-1)+2 n1 age
28、(n-1)+2 n1 后一人与前一人的年龄关系后一人与前一人的年龄关系#include stdio.h#include /=/=/函数功能函数功能: : 计算递归函数的值计算递归函数的值/入口参数入口参数: : 整数整数n n/返回值返回值: :递归函数在递归函数在n n处的值处的值/=/=intint age(intage(int n) n) int int c; c; if(n if(n=1) c=10;=1) c=10; else c= else c=; ; return c; return c; /主函数主函数void main()void main() int int n=5; n=
29、5; printf(age(%d)=%dn, printf(age(%d)=%dn, , ,);); age(5)age(5)输出结果输出结果c=age(4)+2c=age(4)+2c=18c=18c=age(3)+2c=age(3)+2c=16c=16c=age(2)+2c=age(2)+2c=14c=14c=age(1)+2c=age(1)+2c=12c=12c=10c=10void mainvoid mainageagen=5n=5ageagen=4n=4ageagen=3n=3ageagen=2n=2ageagen=1n=1注意要点注意要点: 递归函数实际上是一个分段函数递归函数实际上
30、是一个分段函数.一一般用般用if语句来编写就可以语句来编写就可以. 不过还应注意到不过还应注意到,递归函数有递归函数有自身调自身调用自身用自身的特性的特性,按按,写好写好其中的其中的函数调用函数调用才行才行.例例8.8 8.8 求求n n的阶乘的阶乘) 1()!1() 1 , 0(1!nnnnn#include stdio.h#include /=/=/函数功能函数功能: :求求n n的阶乘的阶乘/入口参数入口参数: : 整数整数n n/返回值返回值: n: n的阶乘的阶乘/=/=double fac(intdouble fac(int n) n) double f; double f; if
31、(n0) printf(n if(n0) printf(n0,data error!);0,data error!); else if(n=0|n=1) f=1; else if(n=0|n=1) f=1; else else f= nf= n* * ; ; return f ; return f ; /主函数主函数void main()void main() int int n; n; double y; double y; printf printf(请输入一个整数请输入一个整数: );: ); scanf(%d,&n scanf(%d,&n);); y=fac(n y=fac(n););
32、 printf(%d! =%g,n,y printf(%d! =%g,n,y);); ABC这是一个古老的数学问题这是一个古老的数学问题: 古代有一个梵塔,塔内有古代有一个梵塔,塔内有3 3个针个针A A、B B、C C,开始时,开始时A A针上有针上有6464个盘子,个盘子,盘子大小不等,大的在下小的在上。盘子大小不等,大的在下小的在上。 有个老和尚想把这有个老和尚想把这6464个盘子从个盘子从A A针移到针移到C C针上:但要求针上:但要求 1)1)一次只能移动一个一次只能移动一个 2)2)大盘子不能放在小盘子之上。大盘子不能放在小盘子之上。例8.9 Hanoi问题小小C,中中B,小小B,
33、大大C,小小A,中中C,小小C.借助借助C,C,将小、中盘移到将小、中盘移到B B上上一次到位的直接移动一次到位的直接移动借助借助A,A,将小、中盘移到将小、中盘移到C C上上先考虑先考虑3 3个盘子:个盘子:ABC更一般的,对更一般的,对n n个盘子:个盘子:同样分为三步:同样分为三步: 设设hanoi(nhanoi(n, A, B, C ), A, B, C )表示将表示将n n个盘子从个盘子从A A借助借助B B移到移到C C上。上。1 1)将)将A A上的上边的上的上边的n-1n-1个盘子借助个盘子借助C C移到移到B B上。上。 hanoi(n-1, A, C, B )hanoi(n
34、-1, A, C, B )2 2)将)将A A上剩下的一个盘子,直接移到上剩下的一个盘子,直接移到C C上。上。 move(A, C)move(A, C)3) 3) 将将B B上的上的n-1n-1个盘子借助个盘子借助A A移到移到C C上。上。 hanoi(n-1, B, A, C )hanoi(n-1, B, A, C )完成此三步即完成了完成此三步即完成了n n个盘子的移动。个盘子的移动。#include stdio.h#include /函数功能函数功能: :显示一次直接移动显示一次直接移动/入口参数入口参数: :代表两个针的字符代表两个针的字符void move(char getone
35、, char putonevoid move(char getone, char putone) ) printf(%c-%cn,getone,putone printf(%c-%cn,getone,putone););/函数功能函数功能: : 显示显示n n个盘子的移动过程个盘子的移动过程/入口参数入口参数: :盘子个数和代表三个针的字符盘子个数和代表三个针的字符void hanoi(intvoid hanoi(int n,char one,char two,char three) n,char one,char two,char three) if(n=1)move(one,three);
36、 if(n=1)move(one,three); else else hanoi(n-1,one,three,two);hanoi(n-1,one,three,two); move(one,threemove(one,three);); hanoi(n-1,two,one,three);hanoi(n-1,two,one,three); /主函数主函数void main()void main() int int m; m; printf printf(请输入盘子的个数请输入盘子的个数:(=5):(=5): );); scanf(%d,&m scanf(%d,&m);); printf prin
37、tf( %3d ( %3d 个盘子的移动过程为个盘子的移动过程为:n,m:n,m);); hanoi(m,A,B,C hanoi(m,A,B,C);); onetwothree对对n n个盘子:个盘子:1 1)hanoi(n-1, A, C, B )hanoi(n-1, A, C, B )2 2) move(A, C)move(A, C)3) hanoi(n-1, B, A, C )3) hanoi(n-1, B, A, C )作业: P202Ex 8.13Ex 8.131 1 数组数组作为函数实参作为函数实参 与简单变量一样与简单变量一样, ,数组元素作实参也是数组元素作实参也是. . 如:
38、如:printf(%5d,ai);printf(%5d,ai);2 2 作为函数的实参作为函数的实参 数组作为函数参数的传递过程数组作为函数参数的传递过程- 8.7 数组作为函数的参数 与与 的比较的比较: :例例1 1#include stdio.h#include /=/=自定义函数自定义函数void pp(int x,intvoid pp(int x,int y) y) /函数的定义函数的定义 x+; y+; x+; y+; printf(pp: printf(pp:%d, %dn%d, %dn,x,y,x,y);); /=/=主函数主函数void main()void main() i
39、ntint a,b a,b; ; a=5; b=9; a=5; b=9; pp(a,b pp(a,b) ); ; / /函数的调用函数的调用 printfprintf(主:主:%d, %dn%d, %dn,a,b,a,b);); 例例2 2#include stdio.h#include /=/=自定义函数自定义函数void pp(void pp() ) x0+; x1+; x0+; x1+; printf(pp: printf(pp:%d,%dn%d,%dn,x0,x1);,x0,x1); /=/=主函数主函数void main()void main() intint a2; a2; a0=
40、5; a1=9; a0=5; a1=9; pp( pp( ) ); ; printf printf(主主: :%d,%dn%d,%dn,a0,a1);,a0,a1); a0a1 注意注意: 当要当要时时, 需要需要,传递传递!例8.11 利用函数求10个学生的平均成绩。#include stdio.h#include #define N0 10#define N0 10/=/=/函数功能函数功能: :求求n n个分数的平均值个分数的平均值/入口参数入口参数: : / 2)/ 2)分数的个数(数组长度)分数的个数(数组长度) /返回值返回值:n:n个分数的平均值个分数的平均值/=/=float
41、average(float average(,int,int n) n) float aver,sum=0; int float aver,sum=0; int i; i; aver=sum/n; aver=sum/n; return(aver); return(aver); /主函数主函数void main()void main() float float aver, aver, scoreN0 scoreN0 ; ; intint i; i; printfprintf(请键入请键入%d%d个分数个分数:n,N0);:n,N0); aver=average(aver=average(,N0)
42、;,N0); printf printf(平均分数平均分数=%5.2fn,aver);=%5.2fn,aver); 例例8.13 8.13 定义函数实现选择法排序定义函数实现选择法排序 算法分析:算法分析: a a0 0 a a1 1 a a2 2 a a3 3 a a4 4 a a5 5a a1 1 a a2 2 a a3 3 a a4 4 a a5 5a a2 2 a a3 3 a a4 4 a a5 5a a3 3 a a4 4 a a5 5a a4 4 a a5 5注意,这种方法是在注意,这种方法是在 一趟一趟 比较中找到比较中找到, ,交换一次交换一次, ,将最小数交换到前面将最小数
43、交换到前面!k=0,akk=0,akk=1,akk=1,akk=2,akk=2,akk=3,akk=3,akk=4,akk=4,ak#include stdio.h#include #define N0 10#define N0 10/=/=/ / 函数功能:排序整型数组函数功能:排序整型数组/ / 与数据的个数与数据的个数/ / 返回值返回值: : 无无/=/=void sort(void sort(,int,int n) n) int t,i,j,k int t,i,j,k; ; for(i for(i=0;in-1;i+) =0;in-1;i+) if(k if(k!=i)!=i) t=
44、ak;ak=ai;ai t=ak;ak=ai;ai=t;=t; 例例8.13 8.13 用选择法排序用选择法排序/=/=/ / 函数功能:输出整型数组函数功能:输出整型数组/ 与数据的个数与数据的个数/ / 返回值返回值: : 无无/=/=void outputa(void outputa(,int,int n) n) intint i; i; for(i=0;in;ifor(i=0;in;i+)+) if(i%10=0)printf(n); if(i%10=0)printf(n); printf(%4d, ai printf(%4d, ai); ); printf(n printf(n);
45、); /=/=主函数主函数void main()void main() int int ; ; printf printf(排序前排序前:n);:n); outputa( outputa( ,N0);,N0); sort( sort( ,N0);,N0); printf printf(排序后排序后:n); :n); outputa( outputa( ,N0);,N0); 3 名作为函数的参数:名作为函数的参数:例例8.14 8.14 求求3 34 4矩阵的最大值。矩阵的最大值。#include stdio.h#include /=/=/ / 函数功能:求二维数组的最大值函数功能:求二维数组的
46、最大值/入口参数:入口参数: /返回值:返回值: 二维数组的最大值二维数组的最大值/=/=int max_value(intint max_value(int) ) int i,j,max int i,j,max; ; max=array00; max=array00; for(i for(i=0;i3;i+) =0;i3;i+) for(j for(j=0;j4;j+) =0;jmax)max) max=arrayij max=arrayij; return max; return max; /=/=主函数主函数void main()void main() intint a34=1,3,5,
47、7, a34=1,3,5,7,2,4,6,8,15,17,34,12;2,4,6,8,15,17,34,12; printf printf(矩阵的最大值是矩阵的最大值是:%dn:%dn, );); 实参实参形参形参传递方式传递方式 常量、变量、常量、变量、表达式、数组元素表达式、数组元素变量变量值传递值传递( () )(不可能改变实参)(不可能改变实参)数组名数组名数组数组地址传递地址传递( () )(可以改变实参数组)(可以改变实参数组)值传递值传递, , z1=; z2=;地址传递地址传递, , sort( ,N0); m=max_value( )3 3 字符数组作为形式参数字符数组作为形
48、式参数#include stdio.h#include /=/=/函数功能函数功能: : 连接两个字符串连接两个字符串/入口参数入口参数: : /, ,传递传递/ / /返回值返回值: :无无/=/=int mystrcat(int mystrcat() ) int i,j int i,j; ; for(i=0; ai;i for(i=0; ai;i+)+) for(j=0; ai+j=bj;j for(j=0; ai+j=bj;j+)+) /=/=主函数主函数void main()void main() char s150,s250; char s150,s250; printf print
49、f(请输入两个字符串请输入两个字符串:n);:n); gets(s1); gets(s2); gets(s1); gets(s2); printf printf(串串s1: %sn,s1);s1: %sn,s1); printf printf(串串s2: %sn,s2);s2: %sn,s2); Ex8.6 Ex8.6 编写一个函数编写一个函数, ,将两个字符串连接将两个字符串连接, ,在主函数中输入两个字符在主函数中输入两个字符串输出连接结果。串输出连接结果。作业: P202Ex 8.4 8.11 Ex 8.4 8.11 8.8 局部变量与全局变量一、一、局部局部变量变量(内部变量内部变量)
50、float f1 ( int n ) int i , j ;char f2 ( float x, float y ) float z ;void main ( ) int a , b , c ;(三种三种):1、在一个函数内部定义的变量、在一个函数内部定义的变量2、函数的形式参数、函数的形式参数3、在某个复合语句中定义的变量、在某个复合语句中定义的变量 i,j 有效有效 z 有效有效 a,b,c 有效有效 n 有效有效 x,y 有效有效void main ( )int a , b , c ;int d ;d = a + b ; d 有效有效说明:说明: 1 1、局部变量只在、局部变量只在 本函
51、数内本函数内 有效有效2 2、如果局部变量的有效范围有重、如果局部变量的有效范围有重叠,则有效范围小的优先叠,则有效范围小的优先3 3 局部变量的一个重要用途是局部变量的一个重要用途是, ,利于分模块集体编程利于分模块集体编程 如,如,void main()void main() intint a,b,ca,b,c; ;a=1;b=2;c=0;a=1;b=2;c=0; intint c; c;c=a+bc=a+b; ;printf(1printf(1:%dn,c%dn,c);); printf(2 printf(2:%dn,c%dn,c); ); 局部优先局部优先 c有效有效8.8 局部变量与
52、全局变量一、一、局部局部变量变量(内部变量内部变量)1、在一个函数内部定义的变量、在一个函数内部定义的变量2、函数的形式参数、函数的形式参数3、在某个复合语句中定义的变量、在某个复合语句中定义的变量float float f(intf(int a) a) int int b ; b ;. . intint f2(int a) f2(int a) int int b ; b ;. void main()void main() int m,nint m,n; ;. . . . . . . 在在函数之外定义的变量函数之外定义的变量全局变量的有效范围是:全局变量的有效范围是: 从定义变量的位置开始到源
53、文从定义变量的位置开始到源文件结束。件结束。全局变量的用途:全局变量的用途: 利用全局变量可以在函数间传利用全局变量可以在函数间传递数据,递数据,。 p, q有效有效8.8 局部变量与全局变量 在函数内部定义的变量在函数内部定义的变量,用以用以例8.12 有10个学生的学习成绩,在一个函数中求平均分、最高分和最低分。#include #include /=/=函数功能函数功能: :求平均分、最高最低分求平均分、最高最低分/入口参数:放分数的数组和长度入口参数:放分数的数组和长度/=/=返回值:平均分返回值:平均分float average(float score,intfloat averag
54、e(float score,int n) n) int int i ; float sum=score0; i ; float sum=score0; max=min=score0; max=min=score0; for(i=1;in;i for(i=1;i) ) =scorei=scorei; else if(scorei else if(scoreimin)min) =scorei=scorei; ; return sum/n ;return sum/n ; /=/=主函数主函数void main()void main() float ave,score10= float ave,sco
55、re10=90,80,60,50,98,78,68,99,76,88;90,80,60,50,98,78,68,99,76,88; printf(Max=%fnMin= %fn printf(Max=%fnMin= %fn Average=%6.2fn,max,min,ave); Average=%6.2fn,max,min,ave); 例例8.16 8.16 全局变量与局部变量同名时,全局变量被全局变量与局部变量同名时,全局变量被 屏蔽屏蔽 : #include stdio.h#include int max(int a,intint max(int a,int b) b) int int
56、c; c; c=ab?a:b; c=ab?a:b; return c; return c;void main()void main() printf(%dn printf(%dn , max(a,b); , max(a,b); 仅局部变量仅局部变量a a和全局变量和全局变量b b在在mainmain中有效。中有效。运行结果:8例8.12 有10个学生的学习成绩,在一个函数中求平均分、最高分和最低分。(方法2)#include #include /=/=函数功能函数功能: :求平均分、最高最低分求平均分、最高最低分/入口参数:放分数的数组和长度入口参数:放分数的数组和长度/=/=返回值:平均分返
57、回值:平均分float average(float score,intfloat average(float score,int n, n, ) ) int i ; float m,s,sum int i ; float m,s,sum=score0;=score0; m=s=score0; m=s=score0; for(i=1;in;i for(i=1;im)m) m=scorei m=scorei; else if(scorei else if(scoreis)s) s=scorei s=scorei; ; return sum/n ;return sum/n ; /主函数主函数void
58、 main()void main() float avefloat ave, ,score10=score10=90,80,60,50,98,78,68,99,76,88;90,80,60,50,98,78,68,99,76,88; printf(Max=%fnMin= %fn printf(Max=%fnMin= %fn Average=%6.2fn,max,min,ave); Average=%6.2fn,max,min,ave); 作业: P202Ex 8.9 (Ex 8.9 (要求用两种方法做要求用两种方法做.).)8.9 8.9 变量的变量的( (变量的第二个属性变量的第二个属性,
59、,变量的又一分类方式变量的又一分类方式) )分配固定存储单元分配固定存储单元,如全如全局变量、静态局部变量(局变量、静态局部变量(static变量)等等变量)等等使用时分配存储单元,不用使用时分配存储单元,不用时释放。时释放。如,形式参数、一般的局部变量等等如,形式参数、一般的局部变量等等程序区程序区静态存储区静态存储区动态存储区动态存储区用户能用的存储区域用户能用的存储区域一一 变量的变量的静态存储静态存储和和动态存储动态存储分配固定存储单元分配固定存储单元使用时分配存储单元,不用时释放使用时分配存储单元,不用时释放1) 1) 自动变量自动变量:动态存储区:动态存储区 如如, auto in
60、t, auto int i; i; intint i; i; 2) 2) : : 静态存储区静态存储区 如如, , int int a; a; 例例8.17 8.17 考察静态考察静态局部变量局部变量的值。的值。#include #include void main()void main() intint f(intf(int) ); ; int int a=2,i;a=2,i; for( for(i i=1;=1;i=i=3;3;i+)i+) printf(%d printf(%d, , ,f(f(a a);); intint f( f( intint a )a ) auto int aut
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 渠道建设项目可行性研究报告
- 中国微型汽车行业市场深度研究及发展趋势预测报告
- 农产品电商中心项目建设周期
- 教育培训基地建设项目目标
- 环保化学助剂项目可行性研究报告(立项备案下载可编辑)
- 割绒厨房用巾行业深度研究报告
- 有限合伙股权激励协议合同(3篇)
- 阜新生物医药制品项目评估报告
- 2022-2027年中国红外光理疗仪行业市场全景评估及发展战略规划报告
- 兄妹借钱合同范本
- TTT培训教材(-55张)课件
- 煤炭物流园区总体规划(2016-2030)参考范本
- 道德与法治《上学路上》教案教学设计(公开课)
- XXX酒店预收款收据 Deposit Receipt办公模板
- 六郁汤-古今医鉴卷四-方剂加减变化汇总
- 汽车公司APQP质量门检查表
- 哈工大微电子工艺绪论01单晶硅
- 数据结构教学课件:chapter8
- 玉米杂交种制种技术汇总
- T∕ACSC 01-2022 辅助生殖医学中心建设标准(高清最新版)
- 线性空间的定义与性质
评论
0/150
提交评论