C语言程序基础教程.pptx

上传人:wuy****n92 文档编号:70101632 上传时间:2023-01-16 格式:PPTX 页数:294 大小:1.76MB
返回 下载 相关 举报
C语言程序基础教程.pptx_第1页
第1页 / 共294页
C语言程序基础教程.pptx_第2页
第2页 / 共294页
点击查看更多>>
资源描述

《C语言程序基础教程.pptx》由会员分享,可在线阅读,更多相关《C语言程序基础教程.pptx(294页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C语言程序基础教程语言程序基础教程(第(第8-13章)章)第8章 函数 C语言程序设计 第八章 函数概述函数定义的一般形式函数参数和函数的值函数的调用函数的嵌套调用函数的递归调用数组作为函数参数局部变量和全局变量变量的存储类别内部函数和外部函数运行一个多文件的程序本章学习目标:C语言程序设计 第八章 函数认识到函数是一种简化程序结构的重要手段;理解函数调用和函数调用过程中的参数传递;理解函数原型(声明)和怎样写函数原型;能够用前几章的知识实现简单的函数;能够用return语句实现函数的返回值;能够理解函数调用过程中形式参数和实际参数的关系,理解数组名作为函数参数时代表的意义;能够理解函数的嵌套

2、调用和递归调用机制。8.1 概述函数的概念 C语言程序设计 第八章 函数一个大的程序一般应分为若干个程序模块,每个模块实现一个特定的功能,这些模块称为子程序,在C语言中子程序用函数实现。mainabca1abb1b2不能被调用所有函数都是平行的,不能嵌套定义分为:库函数和自定义函数 C语言程序设计 第八章 函数一、常规方法:各函数包含在一个文件中例T8-1.c#includevoidmain()voidprintstar();voidprint_message();printstar();print_message();printstar();voidprintstar()printf(“*n

3、”);voidprint_message()printf(“_How_do_you_do!n”);运行结果:*Howdoyoudo!*C语言程序设计 第八章 函数二、工程的方法 例:某程序由四个文件组成,其中,一个文件包含主函数,两个文件包含两个被调用函数。一个为工程文件,包含这个程序的三个文件名。操作:Alt+pProjectname:T8-1-4.prjAlt+R结果同上T8-1-1.cmain()p1();p2();p1();T8-1-2.cp1()printf(“*n”);T8-1-3.cp2()printf(“Howdoyoudo!n”);T8-1-4.prjT8-1-1T8-1-2

4、T8-1-3 C语言程序设计 第八章 函数三、文件包含的方法 在主函数中使用文件包含预编译命令,将不在本文件而在其它文件中的函数进行预编译处理把各文件中的函数包含到本文件中来,然后一起进行编译、连接、运行。T8-1-5.c#include“T8-1-2.c”#include“T8-1-3.c”main()p1();p2();p1();运行结果同上几点说明:(1)一个源文件由一个或者多个函数组成。(2)一个C程序由一个或者多个源文件组成。(3)C程序的执行从main 函数开始。(4)所有的子函数都是平行的。(5)从用户的角度看,函数分库函数和自定义函数。(6)函数形式:无参函数:主调函数无数据传

5、送给被调函数,可带或不带返回值。有参函数:主调函数与被调函数间有参数传递,主调函数可将实参传送给被调函数的形参,被调函数的数据可返回主调函数。C语言程序设计 第八章 函数根据(1)(2)(3)可知,逻辑上一个C语言程序是由函数构成的,C语言程序从主函数开始执行,在主函数中调用其他函数,这些函数可能又调用别的函数,主函数执行完毕代表整个程序结束。主函数只能调用不能被调用。物理上一个程序由一个或者若干个文件(源文件)构成,函数分别放置在这些文件中。8.2 函数定义的一般形式无参函数的定义形式v类型标识符:l用于指定函数带回的值的类型,不写时为int型。l不带回值时可以不写。C语言程序设计 第八章

6、函数类型标识符 函数名()说明部分 语句例 无参函数 printstar()printf(“*n”);或 printstar(void)printf(“*n”);合法标识符合法标识符函数体函数体有参函数定义的一般形式 C语言程序设计 第八章 函数类型标识符 函数名(形式参数表列)说明部分 语句现代风格:函数返回值类型函数返回值类型隐含为隐含为intint型型函数体函数体例 有参函数(现代风格)intmax(intx,inty)intz;z=xy?x:y;return(z);例 有参函数(现代风格)intmax(intx,y)intz;z=xy?x:y;return(z);空函数v为扩充功能预留

7、,在主调函数中先占一个位置。C语言程序设计 第八章 函数类型标识符 函数名()例 空函数 dummy()函数体为空函数体为空对形参的声明的传统方式v即把对形参的声明放在函数定义的下一行类型标识符 函数名(形参表)形参类型说明说明部分 语句例 有参函数(传统风格)intmax(x,y)intx,y;intz;z=xy?x:y;return(z);8.3 函数参数和函数的值形式参数和实际参数v形式参数:定义函数时函数名后面括号中的变量名v实际参数:调用函数时函数名后面括号中的表达式 C语言程序设计 第八章 函数例8.2比较两个数并输出大者#includevoidmain()intmax(intx,

8、inty);inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);max(intx,inty)intz;z=xy?x:y;return(z);形参实参c=max(a,b);(main函数)(max函数)max(intx,inty)intz;z=xy?x:y;return(z);运行:7,8Maxis8v几点说明:l实参可以是常量、变量或表达式。必须有确定的值。当函数调用时,将实参的值传递给形参,若是数组名,则传送的是数组首地址。l形参必须指定类型,只能是简单变量或数组,不能是常量或表达式l形参与实参类型一致,个数相同顺序相同。l若形参

9、与实参类型不一致,自动按形参类型转换函数调用转换l形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放l实参对形参的数据传送是值传送,也是单向传送,当被调函数的形参发生变化时,并不改变主调函数实参的值。形、实参占据的是不同的存储单元 C语言程序设计 第八章 函数 C语言程序设计 第八章 函数例:形、实参占据的是不同的存储单元#includevoidmain()inta=2,b=3;printf(“a=%d,b=%dn”,a,b);printf(“&a=%x,&b=%xn”,&a,&b);add(a,b);printf(“a=%d,b=%dn”,a,b);printf(“&a

10、=%x,&b=%xn”,&a,&b);add(intx,inty)x=x+8;y=y+12;printf(“x=%d,y=%dn”,x,y);printf(“&x=%x,&y=%xn”,&x,&y);2+8=103+12=1523ffd2ffd4ffd6ffd8xayb运行结果:a=2,b=3&a=ffd6,&b=ffd8x=10,y=15&x=ffd2,&y=ffd4a=2,b=3&a=ffd6,&b=ffd8函数的返回值v返回语句形式:return(表达式);或 return表达式;v功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数 C语言程序设计 第八章 函数说明:函

11、数的返回值,必须用 return语句带回。return语句只能把一个返值传递给调用函数。函数中可有多个return语句,执行哪一个由程序执行情况来定。if(ab)return(a);elsereturn(b);return后的值可以是一个表达式,如:return(xy?x:y);返回值的类型为定义的函数类型,不指定的按整型处理。如:intmax(intx,inty)floatmin(floata,floatb)doubleabc(floatd1,floatd2)l若 return语句中表达式类型与函数类型不一致,则转换为函数类型。l若无return语句,遇时,自动返回调用函数。可能返回一个不确

12、定或无用的值。l无返回值的函数,定义为 void类型。C语言程序设计 第八章 函数printstar()printf(*);main()inta;a=printstar();printf(%d,a);例:无return语句,函数带回不确定值输出:10voidprintstar()printf(*);main()inta;a=printstar();printf(%d,a);编译错误!C语言程序设计 第八章 函数voidswap(intx,inty)inttemp;temp=x;x=y;y=temp;例:无返回值函数例8.3:函数返回值类型转换#includevoidmain()intmax(f

13、loatx,floaty);floata,b;intc;scanf(%f,%f,&a,&b);c=max(a,b);printf(Maxis%dn,c);max(floatx,floaty)floatz;z=xy?x:y;return(z);输入:1.5,2.5输出:Maxis28.4 函数的调用主调函数:主动去调用其它函数 被调函数:被其它函数所调用函数调用的一般形式函数名(实参表列)v说明:l实参表列:有确定值的数据或表达式l实参与形参个数相等,类型一致,按顺序一一对应,当有多个实参时,实参间用“,”分隔l实参表求值顺序,因系统而定(TurboC自右向左)l调用无参函数时,实参表列为空,但

14、()不能省 C语言程序设计 第八章 函数 C语言程序设计 第八章 函数#includevoidmain()intf(inta,intb);inti=2,p;p=f(i,+i);printf(%d,p);intf(inta,intb)intc;if(ab)c=1;elseif(a=b)c=0;elsec=-1;return(c);例8.4参数求值顺序按自右向左求值函数调用等于f(3,3)运行结果:0按自左向右求值函数调用等于f(2,3)运行结果:-1为使程序有通用性:需自右向左求值时,需自右向左求值时,改为:改为:j=+i;j=+i;p=f(j,j);p=f(j,j);需自左向右求值时,需自左向

15、右求值时,改为:改为:j=i;j=i;k=+i;k=+i;p=f(j,k);p=f(j,k);Printf(“%d,%d”,i,i+);/*同样存在此情况*/函数调用的方式按函数在程序中出现的位置,有三种调用方式:v函数语句:以独立的语句去调用函数。不要求有返回值,仅完成一定的操作。例 printstar();printf(“Hello,World!n”);v函数表达式:函数返回一个确定值,以参加表达式的运算。不可用于void例 m=max(a,b)*2;v函数参数:函数调用作为另一个函数的参数。例 printf(“%d”,max(a,b);/*输出大数*/m=max(a,max(b,c);/

16、*三数比大小*/C语言程序设计 第八章 函数对被调用函数的声明和函数原型v对被调用函数要求:l必须是已存在的函数l库函数:#includel用户自定义函数:如果被调函数定义在主调函数之后,那么在主调函数中对被调函数作声明。C语言程序设计 第八章 函数函数声明一般形式:函数类型 函数名(形参类型 形参名,.);或 函数类型 函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验C语言中函数声明称为函数原型。函数定义与函数声明不同,声明只与函数定义的第一行相同。声明可以不写形参名,只写形参类型。函数说明位置:程序的数据说明部分(函数内或外)C语言程序设计 第八章 函数#includevo

17、idmain()floatadd(floatx,floaty);/*对被调用函数的声明*/floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);floatadd(floatx,floaty)/*函数首部*/floatz;/*函数体 z=x+y;return(z);floatadd(float,float);例8.5对被调用的函数作声明输入:3.6,6.5输出:sumis10.100000v说明:l旧版本C中函数声明不采用函数原型,只声明函数名和函数类型。如:floatadd()l函数调用之前,如果未对函数作声明,则编译系统把第一次

18、遇到的函数形式作为函数声明,并默认为int型。即:函数类型是int型可以不作函数声明,最好作声明。l被调用函数的定义(程序)在主调函数之前,可以不加函数声明。l在所有函数定义前,已在函数外部做了函数声明,则在各主调函数中可以不加函数声明。C语言程序设计 第八章 函数#includefloatadd(floatx,floaty)floatz;z=x+y;return(z);main()floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);被调函数出现在主调函被调函数出现在主调函数数之前,不必函数说明之前,不必函数说明voidmain

19、()floata,b;intc;scanf(%f,%f,&a,&b);c=max(a,b);printf(Maxis%dn,c);max(floatx,floaty)floatz;z=xy?x:y;return(z);intint型函数可不作函数说明型函数可不作函数说明charletter(char,char);floatf(float,float);intI(float,float);main()charletter(charc1,charc2)floatf(floatx,floaty)IntI(floatj,floatk)在函数外面做函数说明在函数外面做函数说明 C语言程序设计 第八章 函

20、数main()调fun()结束fun()返回保存:返回地址当前现场恢复:主调程序现场返回地址函数调用的执行过程8.5 函数的嵌套调用 C语言程序设计 第八章 函数不允许嵌套定义,函数间的关系是平行的、独立的。C中的函数:允许嵌套调用,即在调用某函数过程中又调用另一函数。main()调用函数a结束a函数b函数调用函数b C语言程序设计 第八章 函数#includeintfun1(intx,inty);voidmain(void)inta,b;scanf(“%d%d”,&a,&b);printf(“Theresultis:%dn”,fun1(a,b);intfun1(intx,inty)intfu

21、n2(intm);return(fun2(x)+fun2(y);intfun2(intm)return(m*m);例 输入两个整数,求平方和输入:34输出:Theresultis:25 C语言程序设计 第八章 函数#includeintdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain()inta,b,c,d;scanf(%d%d%d,&a,&b,&c);d=dif(a,b,c);printf(Max-Min=%dn,d);例 求三个数中最大数和最小数的差值intdif(intx,inty,int

22、z)returnmax(x,y,z)-min(x,y,z);intmax(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);intmin(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);main()调用函数dif输出结束dif函数max函数调用函数max调用函数minmin函数skip C语言程序设计 第八章 函数例8.6用弦截法求方程 的根yxf(x)0 x1x2xf(x1)f(x2)1.取x1,x2两点,求得f(x1),f(x2)。异号:x1,x2之间必有一根。同号:改变x1,x2,直到f(x1),f(x2)异号

23、为止。2.连f(x1),f(x2)两点(弦)交x轴于x。X点的坐标求法:求X点的x坐标 从x值得f(x)3.若f(x)与f(x1)同号,则根必在(x,x2)区间,此时将x1=x;若f(x)与f(x2)同号,则根必在(x1,x)区间,此时将x2=x;4.重复步骤2和3,直到|f(x)|为止,设10-6,则 f(x)0用三个函数实现各部分的功能:函数f(x):求x的函数:x3-5x2+16x-80函数xpoint(x1,x2):求弦与x轴交点X的x坐标 函数root(x1,x2):求(x1,x2)区间的实根 C语言程序设计 第八章 函数求弦与x轴的交点x输入x1,x2,求f(x1),f(x2)直到

24、f(x1)与f(x2)异号y=f(x),y1=f(x1)y与y1同号真假x1=xy1=yx2=x直到|y|root=x输出 rootroot函数main()调用函数root输出根 x结束root函数xpoint函数调用函数xpoint调用函数ff函数 C语言程序设计 第八章 函数#include#includefloatf(floatx)floaty;y=(x-5.0)*x+16.0)*x-80.0;return(y);floatxpoint(floatx1,floatx2)floaty;y=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1);return(y);floatroot

25、(floatx1,floatx2)floatx,y,y1;y1=f(x1);dox=xpoint(x1,x2);y=f(x);if(y*y10)y1=y;x1=x;elsex2=x;while(fabs(y)=0.0001);return(x);voidmain()floatx1,x2,f1,f2,x;doprintf(“inputx1,x2:n”);scanf(“%f%f”,&x1,&x2);f1=f(x1);f2=f(x2);while(f1*f2=0);x=root(x1,x2);printf(“Arootofequationis%8.4fn”,x);运行情况:Inputx1,x2:2,

26、6Arootofequationis5.00008.6 函数的递归调用递归:在函数调用过程中,直接或间接的调用自身。递归调用方式v直接递归调用:在函数体内又调用自身 C语言程序设计 第八章 函数f()调fintf(intx)inty,z;z=f(y);.return(2*z);v间接递归调用:当函数1去调用另一函数2时,而另一函数2反过来又调用函数1自身。C语言程序设计 第八章 函数调f2调f1f1()f2()intf1(intx)inty,z;z=f2(y);.return(2*z);intf2(intt)inta,c;c=f1(a);.return(3+c);v解决无终止递归调用的方法是:

27、确定好结束递归的条件。条件成立,进行递归 用if语句控制 条件不成立,结束递归 C语言程序设计 第八章 函数例8.7有5个人,第5个人比第4个人大2岁,第4个人比第3个人大2岁,第2个人比第1个人大2岁,第1个人10岁,问第5个人多大?age(5)age(4)age(3)age(2)age(1)=2+age(4)=2+age(3)=2+age(2)=2+age(1)=10=18=16=14=1210n=1数学模型:age(n)=age(n-1)+2n1age(intn)intc;if(n=1)c=10;elsec=2+age(n-1);return(c);#includevoidmain()p

28、rintf(“%dn”,age(5);运行结果:18回推回推递推递推有些问题,可以用递推,也可以用递归的方法解决。v递推:从一个已知的事实出发,按一定规律推出下一个事实,再从已知的新的事实,推出下一个新的事实.C语言程序设计 第八章 函数例 用递推法求n!,即从1开始,乘2,乘3.一直到n#includevoidmain()inti,s=1;for(i=1;i=5;i+)s=s*i;printf(“s=%dn”,s);运行结果:s=120v递归:在函数调用自身时,要给出结束递归的条件。l先回推再递推l如:n!,5!=54!4!=43!3!=32!2!=21!1!=10!=1 C语言程序设计 第

29、八章 函数1(n=0,1)n!=n*(n-1)!(n1)#includevoidmain()floatfac(intn);intn;floaty;printf(Inputaintegernumber:);scanf(%d,&n);y=fac(n);printf(%d!=%15d,n,y);floatfac(intn)floatf;if(n0)printf(n0,dataerror!);elseif(n=0|n=1)f=1;elsef=fac(n-1)*n;return(f);运行:inputaintegernumber:1010!=3628800例8.8用递归方法求n!十九世纪未,欧洲珍奇商店

30、出现一种汉诺塔游戏,推销材料介十九世纪未,欧洲珍奇商店出现一种汉诺塔游戏,推销材料介绍说:古代印度布拉玛庙里的僧侣们正在玩这种游戏,如果游戏绍说:古代印度布拉玛庙里的僧侣们正在玩这种游戏,如果游戏结束,世界未日即来临。结束,世界未日即来临。是一个只能用递归方法解决的问题是一个只能用递归方法解决的问题。规则及分析:规则及分析:n n个盘子从一根针移到另一根针,每次只能移动一个盘子,不允个盘子从一根针移到另一根针,每次只能移动一个盘子,不允许大盘在小盘上面。许大盘在小盘上面。共有三根针,共有三根针,n n个盘子由个盘子由A A移到移到C C,需移动的次数是,需移动的次数是2 2n n-1,-1,若

31、若6464个个盘子移动的次数为:盘子移动的次数为:2 26464-1=18,446,744,073,709,551,600-1=18,446,744,073,709,551,600一年的秒数是:一年的秒数是:365x24x60 x60=31536000365x24x60 x60=31536000=58494217355=58494217355年年 即即:5849:5849亿年亿年,从能源角度推算从能源角度推算,太阳系寿命只有太阳系寿命只有150150亿年亿年 C语言程序设计 第八章 函数例8.9Hanoi(汉诺)塔问题 BCAv方法与步骤l将A上n-1个盘子借助C移到B。l把A上剩下一个盘子送

32、到Cl将n-1个盘子从B借助A移到C C语言程序设计 第八章 函数BCAv简化实例:将A上3个盘子移到C步骤:1.A上两个盘子借助C移到B2.A上最后一个盘子移到C(可直接完成)3.B上两个盘子借助A移到C第一步进一步分解:1.1A上一个盘子从AC1.2A上一个盘子从AB1.3C上一个盘子从CB第三步进一步分解:3.1B上一个盘子从BA3.2B上一个盘子从BC3.3A上一个盘子从AC共移动共移动7 7步:步:2 23 3-1-1次次所以,所以,n n个盘要移动个盘要移动2 2n n-1-1次次v结论:上面三个步骤包含两类操作l步骤1和3都是将n-1个盘子从一个针移到另一个针上(n1时),这是一

33、个递归的过程;方法一样,只是针的名称不同而已,为使问题一般化,将步骤1和3表示为:将one针上的n-1个盘子移到two针,借助 three针,只是对应关系不同。第一步对应关系:oneAtwoBthreeC第三步对应关系:oneBtwoCthreeAl将1个盘子从一个针上移到另一针上。v因此,可以用两个函数分别实现上面两类操作,用hanoi函数实现第一类操作,用move函数实现第2类操作。lhanoi(n,one,two,three)将n个盘从 onethree借助twolmove(x,y)将1个盘从xy座,x、y根据情况取代ABC座中的1个。C语言程序设计 第八章 函数 C语言程序设计 第八章

34、 函数例8.9用递归方法解决Hanoi(汉诺)塔问题的程序#includevoidmain()voidhanoi(intn,charone,chartwo,charthree);intm;printf(Inputthenumberofdiskes:);scanf(%d,&m);printf(Thesteptomoving%3ddiskes:n,m);hanoi(m,A,B,C);voidhanoi(intn,charone,chartwo,charthree)voidmove(charx,chary);if(n=1)move(one,three);elsehanoi(n-1,one,three

35、,two);move(one,three);hanoi(n-1,two,one,three);voidmove(charx,chary)printf(%c-%cn,x,y);运行:inputnumberofdiskes:3thesteptomoving3diskes:ACABCBACBABCAC8.7 数组作为函数参数数组元素作函数实参值传递 C语言程序设计 第八章 函数例8.10两个数组比较大小 a a和和b b为有为有1010个元素的整型数组个元素的整型数组比较两数组对应元素比较两数组对应元素变量变量n,m,kn,m,k分别记录分别记录aibi,ai=bi,aibi,ai=bi,aik,n

36、k,认为数组认为数组abab若若nk,nk,认为数组认为数组abab若若n=k,n=k,认为数组认为数组a=ba=b432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2n=0m=0k=1n=0m=1k=1n=1m=1k=1n=1m=1k=2n=2m=1k=2 C语言程序设计 第八章 函数#includevoidmain()intlarge(intx,inty)inta10,b10,i,n=0,m=0,k=0;printf(Entera

37、rraya:n);for(i=0;i10;i+)scanf(%d,&ai);printf(n);printf(Enterarrayb:n);for(i=0;i10;i+)scanf(%d,&bi);printf(n);for(i=0;ibi%dtimesn”,n);printf(“ai=bi%dtimesn”,m);printf(“aik)printf(“arrayaislargerthanarraybn”);elseif(ny)flag=1;elseif(xbi3timeai=bi1timeaibi1timearrayaislargethenarrayb数组名可作函数参数实参和形参都应用数组

38、名 C语言程序设计 第八章 函数例8.11求学生的平均成绩 floataverage(floatarray10)inti;floataver,sum=array0;for(i=1;i10;i+)sum=sum+arrayi;aver=sum/10;return(aver);#includevoidmain()floataverage(floatarray10);floatscore10,aver;inti;printf(Input10scores:n);for(i=0;i10;i+)scanf(%f,&scorei);printf(“n”);aver=average(score);printf

39、(Averageis:%5.2f,aver);实参用数组名实参用数组名形参用数组定义形参用数组定义floatfloatarrayarray.2109score562312.88array几点说明:C语言程序设计 第八章 函数v地址传递l调用函数时,对形参数组元素的操作,实际上也是对实参数组元素的操作。v在主调函数与被调函数分别定义数组,且类型应一致l如:array是形参数组名,score是实参数组名。形参数组大小(多维数组第一维)可不指定在定义数组时在数组名后面跟一个空的方括弧C编译对形参数组大小不检查,即使定义了也不起作用。形参数组名是地址变量 调用时,只是将实参数组的首地址传给形参数组,因

40、此scoren和arrayn指的是同一单元 C语言程序设计 第八章 函数例8.12求两组学生的平均成绩,形参数组长度缺省#includevoidmain()floataverage(floatarray,intn);floatscore_15=98.5,97,91.5,60,55;floatscore_210=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5;printf(“TheaverageofclaseAis%6.2fn”,average(score_1,5);printf(“TheaverageofclaseBis%6.2fn”,average(sco

41、re_2,10);floataverage(floatarray,intn)inti;floataver,sum=array0;for(i=1;in;i+)sum=sum+arrayi;aver=sum/n;return(aver);运行:TheaverageofclassAis80.40TheaverageofclassBis78.20另设一个参数,传递需另设一个参数,传递需要处理的数组元素个数要处理的数组元素个数v数组名作函数参数时,实参和形参两个数组共占同一段内存单元,形参数组的元素值改变会使实参数组元素的值同时变化。C语言程序设计 第八章 函数例8.13用选择法对数组中的10个整数按由

42、小到大排序#includevoidmain()voidsort(intarray,intn);inta10,i;printf(“enterthearrayn”);for(i=0;i10;i+)scanf(%d,&ai);sort(a,10);printf(“thesortedarray:n”);for(i=0;i10;i+)printf(%d,ai);printf(n);C语言程序设计 第八章 函数voidsort(intarray,intn)inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;t=arrayi;

43、arrayi=arrayk;arrayk=t;0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0选择法排序思路选择法排序思路 C语言程序设计 第八章 函数kjjkjkjjjjj0123456789a4968573299927137688array949kk1368i=1voidsort(intarray,intn)inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;t=arrayi;arrayi=arrayk;arrayk=t;选择法排序思路选择法排序思路

44、C语言程序设计 第八章 函数0123456789a9132732495768768899arrayi=8voidsort(intarray,intn)inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;t=arrayi;arrayi=arrayk;arrayk=t;选择法排序思路选择法排序思路用多维数组名作函数参数v可以用多维数组名作实参和形参v形参数组定义时,只能省略第一维的大小说明。lC编译不检查第一维的大小,而且数组名作函数参数是地址传送,所以形参数组第一维大小任意,可以和实参数组的维数不同。实参数组定义:

45、intscore510形参数组定义:intarray310或 intarray810l合法的定义:intarray310;或 intarray10l错误的定义:intarray;intarray3;C语言程序设计 第八章 函数 C语言程序设计 第八章 函数例8.14求34矩阵中各元素的最大值#includevoidmain()intmax_value(intarray4);inta34=1,3,5,7,2,4,6,8,15,17,34,12;printf(maxvalueis%dn,max_value(a);intmax_value(intarray34)inti,j,k,max;max=ar

46、ray00;for(i=0;i3;i+)for(j=0;jmax)max=arrayij;return(max);多维形参数组第一维维数可省略,第二维必须相同 intarray4 C语言程序设计 第八章 函数例 求二维数组中各行元素之和get_sum_row(intx3,intresult,introw,intcol)inti,j;for(i=0;irow;i+)resulti=0;for(j=0;jcol;j+)resulti+=xij;main()inta23=3,6,9,1,4,7;intsum_row2,row=2,col=3,i;get_sum_row(a,sum_row,row,c

47、ol);for(i=0;irow;i+)printf(Thesumofrow%d=%dn,i+1,sum_rowi);314679asum_rowxresult18128.8 局部变量和全局变量变量按其作用域,可分为局部变量和全局变量。局部变量内部变量v定义:在函数内定义,只在本函数内有效v说明:lmain中定义的变量只在main中有效l不同函数中同名变量,占不同内存单元l形参属于局部变量l可定义在复合语句中有效的变量l局部变量可用存储类型:autoregisterstatic(默认为auto)C语言程序设计 第八章 函数 C语言程序设计 第八章 函数floatf1(inta)intb,c;.

48、charf2(intx,inty)inti,j;main()intm,n;.a,b,c有效x,y,i,j有效m,n有效例 不同函数中同名变量voidmain()inta,b;a=3;b=4;printf(main:a=%d,b=%dn,a,b);sub();printf(main:a=%d,b=%dn,a,b);sub()inta,b;a=6;b=7;printf(sub:a=%d,b=%dn,a,b);运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4 C语言程序设计 第八章 函数运行结果:54321例 复合语句中变量#defineN5voidmain()int

49、i;intaN=1,2,3,4,5;for(i=0;iN/2;i+)inttemp;temp=ai;ai=aN-i-1;aN-i-1=temp;for(i=0;iN;i+)printf(%d,ai);main()inta,b;intc;c=a+b;a,b范围c范围全局变量外部变量v定义:在函数外定义,可为本文件所有函数共用,也叫外部变量。v有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件v几点说明:l全局变量的使用,增加了函数间数据联系的渠道,同一文件中的所有函数都能引用全局变量的值,当某函数改变了全局变量的值时,便会影响其它的函数。C语言程序设计 第八章 函数习

50、惯上,全局变量名的第一个字母用大写。使用全局变量可以减少函数的实参和形参个数。不必要时不要使用全局变量全局变量在程序执行的全过程都占用存储单元。不利于程序的移植。程序的可读性变差。全局与局部变量重名时,在函数内部将屏蔽全局变量。C语言程序设计 第八章 函数intp=1,q=5;floatf1(a)inta;intb,c;.intf3().charc1,c2;charf2(intx,inty)inti,j;main()intm,n;.c1,c2的作用范围p,q的作用范围 C语言程序设计 第八章 函数例 全局变量的作用域及其使用情况inta=1;f1()intb;b=a+3;printf(“f1:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁