已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,有参函数intmax(intx,inty)intz;z=xy?x:y;return(z);,无参函数voidprintstar(void)printf(“*n”);,7.2函数的定义,1、函数定义的一般格式,存储类别函数类型函数名(形参列表)说明部分语句部分,函数带回来的值的类型若缺省为:int整型函数没有返回值定义void,2,2、函数的返回返回语句的形式:功能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数说明:只能返回一个值,而不能返回多个值。,return(表达式);return表达式;return;,3,函数语句printstar(10);表达式方式函数调用出现在表达式中,函数的返回值参加表达式的运算。c=5*max(a,b);作为函数的参数printf(“max=%d”,max(a,b);c=max(k,max(i,j);,函数的调用方式,4,【例7-3】输出数字金字塔,#includevoidmain(void)intnum;voidpyramid(intn);printf(请输入金字塔的层数:);scanf(%d,请输入金字塔的层数:5122333444455555Pressanykeytocontinue,5,voidpyramid(intn)inti,j;for(i=1;i=n;i+)for(j=1;j=n-i;j+)/*输出左侧空格*/printf();for(j=1;j=i;j+)/*输出数字*/printf(%d,i);printf(“n”);/*换行*/,请输入金字塔的层数:5122333444455555Pressanykeytocontinue,6,【例7-4】判断素数,#includestdio.h#includemath.hintprime(intn)intk,i,result;k=sqrt(n);for(i=2;ik)result=1;elseresult=0;returnresult;,【例4-16】判断n是否为素数P75for(i=2;isqrt(n)printf(%disaprimenumber!n,n);elseprintf(%disnotaprimenumber!n,n);,7,voidmain(void)inta=1777,b=1991;if(prime(a)printf(%d是素数n,a);elseprintf(%d不是素数n,a);if(prime(b)printf(%d是素数n,b);elseprintf(%d不是素数n,b);,1777是素数1991不是素数,8,【例7-5】编写函数,交换两个变量的数值,#includestdio.hvoidswap(intx,inty);voidmain(void)inta,b;printf(请输入交换的数值:);scanf(%d%d,请输入交换的数值:711交换前a=7,b=11交换后a=7,b=11,9,为什么没有实现数值的交换?函数间的参数传递,形式参数和实际参数形参:定义函数时,函数名后括号内的变量。形式参数只有在函数被调用时才分配变量空间(产生),并在函数调用结束后,释放变量空间(消失)。实参:调用函数时,函数名后括号内的表达式。形式参数与实际参数的关系形参与实参类型一致,个数相同。若类型不一致,自动按形参类型转换。,10,参数“值”传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向值传递(形参的改变并不影响实参),为什么没有实现数值的交换?函数间的参数传递,11,7.3数组作为参数的函数调用,形参数组与实参数组公用一块内存空间参数是“地址”传递方式本质上仍然是“值”传递,只是传递的值是“地址”形参与实参指向同样的存储单元实参和形参必须是地址常量或地址变量“双向”传递形参的改变影响实参,12,函数中如何知道数组的长度呢?,C语言没有为函数提供任何简便的方法来确定传递给它的数组的长度。但是,处理数组,长度是必须的,所以通常要把数组长度也作为形式参数。,例如:intfun(inta,intn),13,【例7-6】求数组中元素的最大值,#includestdio.h#defineN10floatmax_array(floata,intn);voidmain(void)floatarrayN,max;inti;printf(请输入%d个实数:n,N);for(i=0;iN;i+)scanf(%f,请输入10个实数:2.1最大的数组元素值是:9.00Pressanykeytocontinue,14,【例7-6】求数组中元素的最大值。,floatmax_array(floata,intn)inti;floatmax;max=a0;for(i=1;imax)max=ai;returnmax;,可以说明数组长度或不说明数组的长度,15,【例7-8】编写函数实现字符串的复制,#includestdio.h#includestring.h#defineN80voidcopy_string(charfrom,charto);voidmain(void)charaN,bN;printf(请输入一串字符串:n);gets(a);copy_string(a,b);puts(b);,字符串是以一维字符数组形式存放的,所以字符串的传递与一维数组的传递方式相同。,16,voidcopy_string(charfrom,charto)inti;for(i=0;fromi!=0;i+)toi=fromi;toi=0;,请输入一串字符串:ILoveChina!ILoveChina!,由于字符串具有结束标识0,所以函数定义中不需要数组长度参数,exercisevc1,17,【例7-9】编写函数实现学生成绩按平均分排名,学生成绩存储在一个二维数组中,#includestdio.h#defineM5/*学生人数*/#defineN5/*成绩科数*/voidsort_score(floatscoreN,floatave);voidmain(void)floatscoreMN=80.0,85.0,78.0,97.0,68.0,90.0,97.0,89.0,88.0,92.0,60.0,75.0,79.0,95.0,56.0,98.0,61.0,78.0,99.0,68.0,80.0,89.0,98.0,97.0,88.0;floataveM;inti,j;,18,【例7-9】编写函数实现学生成绩按平均分排名,学生成绩存储在一个二维数组中。,sort_score(score,ave);for(i=0;iM;i+)/*按排名输出学生成绩*/printf(第%d名学生平均成绩:%.2fn,i+1,avei);for(j=0;jN;j+)printf(%10.2f,scoreij);printf(n);,第1名学生的平均成绩为:91.2090.0097.0089.0088.0092.00第2名学生的平均成绩为:90.4080.0089.0098.0097.0088.00第3名学生的平均成绩为:81.6080.0085.0078.0097.0068.00第4名学生的平均成绩为:80.8098.0061.0078.0099.0068.00第5名学生的平均成绩为:73.0060.0075.0079.0095.0056.00,19,voidsort_score(floatscoreN,floatave)floatsum,temp;inti,j,k;for(i=0;iM;i+)/*计算平均成绩*/sum=0;for(j=0;jN;j+)sum=sum+scoreij;avei=sum/N;,在C语言中,当形式参数是多维数组时,可以忽略第一维的长度,后面的维数必须书写,计算平均成绩并排序的函数,20,for(i=0;iM-1;i+)/*成绩排序*/for(j=i+1;jM;j+)if(aveiavej)temp=avei;avei=avej;avej=temp;for(k=0;ky?x:y);,23,7.4函数的嵌套调用,说明:函数定义时不可嵌套调用时可以嵌套其它函数,main(),调用函数a,结束,a函数,b函数,调用函数b,main.a();.inta()/a定义.b();.intb()/b定义.,24,【例7-10】编写函数计算最大公约数和最小公倍数,#includestdio.hintgys(inta,intb);intgbs(inta,intb);voidmain(void)intx,y;printf(输入两个整数:n);scanf(%d%d,25,【例7-10】编写函数计算最大公约数和最小公倍数。,intgys(inta,intb)inti;for(i=a=1;i-)if(a%i=0,26,【例7-10】编写函数计算最大公约数和最小公倍数。,intgbs(inta,intb)intt=a*b/gys(a,b);returnt;,27,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值之差的平方和,它描述的是数据波动的情况,均方差等于方差的平方根,#includestdio.h#includemath.h#defineN10floataverage(floata,intn);floatvariance(floata,intn,floatave);floatrms(floata,intn);,28,voidmain(void)floatxN,var;inti;printf(输入%d个数值:n,N);for(i=0;iN;i+)scanf(%f,29,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。,floataverage(floata,intn)inti;floatsum=0.0;for(i=0;in;i+)sum=sum+ai;returnsum/n;/返回数组的平均值,30,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。,floatvariance(floata,intn,floatave)inti;floatvar;var=0.0;for(i=0;in;i+)var=var+pow(ai-ave),2);returnvar;/计算方差,31,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。,floatrms(floata,intn)inti;floatave,var;ave=average(a,n);var=variance(a,n,ave);var=sqrt(var);/计算均方差returnvar;,输入10个数值:1.02.03.04.05.06.07.08.09.010.0这些数值的均方差为:9.0830,32,intf(intx)inty,z;z=f(y);.return(2*z);,7.5函数的递归调用,定义:函数直接或间接的调用自身叫函数的递归调用,intf1(intx)inty,z;z=f2(y);.return(2*z);intf2(intt)inta,c;c=f1(a);.return(3+c);,33,说明C编译系统对递归函数的自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,34,【例7-12】编写函数计算整数的阶乘,doublefact(intn);main()intn;scanf(“%d”,35,fac(intn),doublef;,if(n=1|n=0),fac(n-1),return(24);,1,fac(intn),doublef;,if(n=1|n=0),fac(n-1),return(6);,2,fac(intn),doublef;,if(n=1|n=0),fac(n-1),return(2);,3,fac(intn),doublef;,if(n=1|n=0),f=1;,return(1);,4,36,7.6变量的作用域,变量定义的3个基本位置,函数内部,函数参数,函数外部,内部变量,外部变量,(局部变量),(全局变量),37,局部变量,定义:在函数内定义,只在本函数内有效说明main中定义的变量只在main中有效形参属于局部变量,即只在函数中有效不同函数中同名变量,占不同内存单元复合语句中定义的变量,只在复合语句中有效,38,main()inta=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,说明不同函数中同名变量,占不同的存储单元,3,4,6,7,39,#defineN5main()inti;intaN=1,2,3,4,5;for(i=0;iN/2;i+)inttemp;temp=ai;ai=aN-i-1;aN-i-1=temp;printf(%d,temp);for(i=0;ib?a:b;return(c);main()inta=8;printf(max=%d,max(a,b);,运行结果:max=8,例全局变量与同名,_起作用,局部变量,局部变量,43,7.7变量的存储类型,静态存储区,动态存储区,程序运行期间分配固定存储空间,程序运行期间根据需要,动态分配存储空间,Extern,Static,Register,auto,变量的存储类型规定了该变量数据在内存中的存储区域。在不同存储区域存储的数据,有不同的生存期。,44,auto变量,定义:auto数据类型变量名使用范围函数中的形参函数内部的变量复合语句中定义的变量说明:没有做特殊说明的变量都是auto变量特点:动态分配存储空间退出函数后自动释放空间,45,register变量,定义方法:register数据类型变量名使用范围:函数内部使用条件:当某些变量使用频繁时优点:提高执行效率,intfac(intn)registerinti,f;for(i=1;i=n;i+)f=f*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广告业统计调查制度2026
- 2027届白山市高考适应性考试物理试卷(含答案解析)
- 2026 年秋季开学 理性看待得失 保持平和进取心态
- 2026年北师大版小学六年级语文上册第八单元第21课《草原》完整教案
- 3.1《别了“不列颠尼亚”》课件(内嵌视频) 2026-2027学年统编版高二语文选择性必修上册
- 无障碍康复环境
- 中医四季养生知识科普
- 幼儿健康卫生教育
- 淹溺性心脏停搏心肺复苏专家共识
- 2026秋人教版化学九年级上册第一单元《走进化学世界》测试卷2(含答案)
- 2026年共青团入团考试试题附标准答案
- 2026郑州市新初一三科分班摸底卷摸底卷
- 2026年渭南市大荔县数学三下期末统考模拟试题含答案
- (2026年)痔疮的诊断和治疗健康宣教课件
- 老年人慢性病管理与护理
- T∕CEA 0051-2026 电梯对重块和配重块
- (2026年)血气分析临床解读课件
- 给水用聚乙烯(pe)管道系统第部分管件
- 2024江苏省招聘社区工作者真题题及答案
- 2025年安徽省信用融资担保集团有限公司招聘17人笔试模拟试题及答案
- 雨水井安全管理制度
评论
0/150
提交评论