4.1-自定义函数省名师优质课赛课获奖课件市赛课一等奖课件_第1页
4.1-自定义函数省名师优质课赛课获奖课件市赛课一等奖课件_第2页
4.1-自定义函数省名师优质课赛课获奖课件市赛课一等奖课件_第3页
4.1-自定义函数省名师优质课赛课获奖课件市赛课一等奖课件_第4页
4.1-自定义函数省名师优质课赛课获奖课件市赛课一等奖课件_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4.1自定义函数函数定义、调用、申明函数类型、返回值函数嵌套与迭代字符串与数组在函数中使用变量作用域、可见性、生存期第1页概述问题:程序越来越长。难于了解且可读性下降。重复代码增多,某段程序可能被执行屡次。某一问题中代码,无法在其它同类问题中再用,必须重复原来设计编码过程。函数是一个机制,能够有效地分解复杂描述,控制程序规模和复杂性。需要抽象成函数程序段:功效独立、含有独立逻辑意义程序段重复出现代码段函数机制提供好处:便于自顶向下在模块化程序设计函数能够被屡次调用,使我们工作能够在他人基础上继续,而无须重新开始经过在适当地方使用函数,能够减短源程序长度更轻易定位和隔离有错误函数第2页函数类型库函数printfscanf自定义函数main其它需要自己开发函数自定义函数能够成为C程序库一部分,所以C能够自己不停扩充。不论是库函数还是自定义函数,一旦设计和封装好以后,就能够看做是一个“黑盒子”,我们给它一些参数,它就会给我们反馈回一些结果。第3页多函数程序voidprintline(void){ inti; for(i=1;i<40;i++)

printf(“*”); printf(“\n”);}main(){ printline();}第4页模块化程序设计模块化程序设计是应用于软件系统设计与开发一个策略。它能够把大型程序组织成小而独立程序段,称之为模块。是一个对问题求解“分而治之”方法。当模块经过标识和设计后,能够组织成一个自顶向下分层结构。在C语言中,每个模块就是一个函数,负责完成单个任务。与函数相关三个元素:函数定义、调用、申明。第5页函数定义函数返回值类型名函数名(类型名形参1,类型名形参2…)/*头部*/{/*函数体*/ 局部变量申明部分

函数语句部分 返回语句部分}第6页函数定义举例:voidprintline(inta,intb){ inti; for(i=0;i<a;i++) printf(“_”); for(i=0;i<b;i++) printf(“_”); printf(“\n”); return;}说明:不要在函数头末尾使用分号形参列表中,变量之间用逗号分隔开,最终用括号括起来参数变量申明不能组合在一起没有参数能够使用void,也能够为空第7页返回值及其类型返回语句形式以下:return表示式;或return(表示式);或return;return作用:退出函数,并带回函数值。例:intmul(intx,inty){ intp; p=x*y; return(p);}第8页返回值及其类型默认情况下,函数返回值类型是int类型假如函数头中使用类型描述符,能够强制转换返回值数据类型例:intproduct(void){ return(2.5*3.0);}第9页函数调用使用函数名+实参列表进行调用实参和形参必须在数据类型、次序、数量上相匹配多个实参必须使用逗号分隔开例:main(){ inty; y=mul(10,5); printf(“%d\n”,y);}第10页第11页第12页调用示例mul(10,5);mul(m,5);mul(10,n);mul(m,n);mul(m+5,10);mul(10,mul(m,n));第13页返回一个值函数能够像其它变量一样使用在表示式中printf(“%d\n”,mul(p,q));y=mul(p,q)/(p+q);if(mul(m,n)>total)printf(“Large”);mul(a,b)=15;/*函数不能用在赋值语句左边*/第14页函数申明与变量一样,全部函数在使用前需要申明,函数申明又叫做函数原型。函数申明由4部分组成函数类型(返回值)函数名参数列表终止分号形式以下:

函数类型函数名(参数类型参数列表);例:intmul(intm,intn);第15页函数申明申明中参数名是可选(即能够不写)假如函数没有形参,那么参数列表能够写作(void)假如函数返回值是int型,则返回值类型是可选(即能够不写)假如无返回值,那么返回值类型必须是void当申明类型与函数定义中类型不匹配时,会产生编译错误。良好编程格调是在main函数前面全局申明区间中申明函数原型第16页函数申明intmul(intm,intn);等价于intmul(int,int);intmul(inta,intb);mul(int,int);当函数既无参数,又无返回值时,应写为:voiddisplay(void);第17页函数申明所在位置决定了在程序中其它函数是否能够使用它。函数申明能够放在程序中以下两个地方:(1)全部函数(包含main函数)之前。此时,这种申明对程序中全部函数都是可用。(2)函数定义中。这种申明主要是被包含它函数使用。假如没有函数申明,C将假设函数返回类型是整型,参数类型与形式定义相匹配。第18页形参加实参在函数原型和定义中参数称为形参,在函数调用中参数称为实参调用语句中实参能够是常量、变量或表示式若使用变量作为实参,变量在函数调用之前必须已经赋值形参加实参在类型、次序、数量上必须严格匹配,不过名称不需要匹配C语言中实参和形参之间数据传递方式叫“值传递”,数据只能从实参单向传递给形参。实参多于形参,多出实参将被丢弃。若实参少于形参,未匹配形参将被初始化为垃圾值。第19页函数类型依据是否有参数、是否有返回值,能够将函数分为以下几个类型无参数无返回值函数有参数无返回值函数有参数有返回值函数无参数但有一个返回值函数返回多个值函数第20页无参数无返回值函数函数没有参数时,不从调用函数接收任何数据;函数没有返回值时,调用函数不会从被调用函数接收任何数据不返回值函数不能用在表示式中,只能作为一个单独语句不返回任何值时,return语句是可选。实际上,函数闭括号就表示该函数运行结束,控制权返回给调用函数第21页无参数无返回值函数voidprintline(void);voidvalue(void);main(){ printline();

value(); printline();}voidprintline(void){ inti; for(i=1;i<=35;i++) printf("%c",‘*'); printf("\n");}voidvalue(void){ intyear,period; floatinrate,sum,principal; scanf("%f%f%d",&principal,&inrate,&period); sum=principal; for(year=1;year<=period;year++) sum=sum*(1+inrate); printf("\n%8.2f%5.2f%5d%12.2f\n",principal,inrate,period,sum);}第22页第23页有参数无返回值函数voidprintline(charch);voidvalue(floatprincipal,floatinrate,intperiod);main(){ intperiod; floatinrate,principal; scanf("%f%f%d",&principal,&inrate,&period); printline('-');

value(principal,inrate,period); printline('-');}voidprintline(charch){ inti; for(i=1;i<=35;i++) printf("%c",ch); printf("\n");}voidvalue(floatprincipal,floatinrate,intperiod){ intyear; floatsum; sum=principal; for(year=1;year<=period;year++) sum=sum*(1+inrate); printf("\n%8.2f%5.2f%5d%12.2f\n",principal,inrate,period,sum);}第24页第25页有参数有返回值函数voidprintline(charch,intlen);value(floatprincipal,floatinrate,intperiod);main(){ intperiod; floatinrate,principal,amount; scanf("%f%f%d",&principal,&inrate,&period); printline('-',52);

amount=value(principal,inrate,period); printf("\n%8.2f%5.2f%5d%12.2f\n",principal,inrate,period,amount); printline('-',52);}voidprintline(charch,intlen){ inti; for(i=1;i<=len;i++) printf("%c",ch); printf("\n");}value(floatprincipal,floatinrate,intperiod){ intyear; floatsum; sum=principal; for(year=1;year<=period;year++) sum=sum*(1+inrate); return(sum);}第26页第27页有参数有返回值函数当没有显式地指定函数返回类型时,将默认返回整型值。所以,若计算值是浮点型时,小数部分会被截除当有必要接收特殊数据类型时,就需要显式地指定返回类型第28页计算xy次幂doublepower(intx,inty);main(){ intx,y; printf("请输入x和y\n"); scanf("%d%d",&x,&y); printf(“xy次幂等于%f\n",power(x,y));}doublepower(intx,inty){ doublep=1.0; if(y>=0) while(y--) p*=x; else while(y++)p/=x; returnp;}第29页无参数但有一个返回值函数intget_number(void);main(){ intm=get_number();}intget_number(void){ intnumber; scanf(“%d”,&number); returnnumber;}第30页返回多个值函数return只能返回一个值,假如需要从函数中取得更多信息,需要使用指针传递方式,使用地址运算符&和间接运算符*,将在后面章节介绍。第31页函数嵌套计算floatratio(intx,inty,intz);intdifference(intx,inty);main(){ inta,b,c; scanf(“%d%d%d”,&a,&b,&c); printf(“%f\n”,ratio(a,b,c));}floatratio(intx,inty,intz){ if(defference(y,z)) return(x/(y-z)); else return0.0;}intdifference(intp,intq){ if(p!=q) return1; else return0;}第32页函数递归调用假如一个函数不停地调用它本身,我们称之为递归调用。例:main(){ printf("Hello!\n"); main();}采取递归算法需要前提条件是,当且仅当一个存在预期收敛时,才可采取递归算法,不然,就不能使用递归算法。递归其实是方便了程序员难为了机器,递归能够经过数学公式很方便转换为程序。其优点就是易了解,轻易编程。第33页计算n阶乘factorial(intn);main(){ factorial(3); printf("%d\n",factorial(3));}factorial(intn){ if(n==1) return1; else returnn*factorial(n-1);}第34页计算n阶乘调用过程fact=3*factorial(2) =3*2*factorial(1) =3*2*1 =6第35页函数递归调用采取递归方法来处理问题,必须符合以下三个条件:1、能够把要处理问题转化为一个新问题,而这个新问题处理方法仍与原来处理方法相同,只是所处理对象有规律地递增或递减。即处理问题方法相同,调用函数参数每次不一样(有规律递增或递减),假如没有规律也就不能适用递归调用。2、能够应用这个转化过程使问题得到处理。使用其它方法比较麻烦或极难处理,而使用递归方法能够很好地处理问题。3、必定要有一个明确结束递归条件。一定要能够在适当地方结束递归调用,不然可能造成系统瓦解。第36页用递归算法按位输出一个正整数N,请描述输入整数“185”后实现过程voidfountain(intn){ if(n>10) fountain(n/10); printf("%d",n%10);}main(){intm;scanf("%d",&m);fountain(m);}第37页变量作用域、可见性和生存期变量作用域是指一个变量在程序哪些位置可用变量可见性是指程序能够从内存访问变量能力变量生存期是指程序运行时,变量存在时间第38页变量作用域、可见性和生存期在C语言中,变量不但属于某种数据类型,而且还含有某种存放类型常见变量存放类型:自动变量(内部变量、局部变量)外部变量(全局变量)静态变量存放器变量第39页变量作用域、可见性和生存期自动变量(内部变量、局部变量)是指在某个函数中申明变量,它只能在该函数中使用,当调用该函数时创建,退出时自动销毁。自动变量是一个函数私有变量,能够使用auto关键字来显式地申明。main(){ intnumber;}main(){

autointnumber;}第40页变量作用域、可见性和生存期自动变量值不能被其它函数更改,所以确保了同一程序不一样函数中能够使用相同变量名,而不会引发混乱。例:voidfunc1(void);voidfunc2(void);main(){ intm=1000; func2(); printf(“%d\n”,m);}voidfunc1(void){ intm=10; printf(“%d\n”,m);}voidfunc2(void){ intm=100; func1(); printf(“%d\n”,m);}第41页变量m在一个函数中赋值不会影响在其它函数中赋值,当离开某个函数时,该函数局部变量m就被销毁第42页变量作用域、可见性和生存期外部变量是指在整个程序中都是存在而且活动变量。外部变量能够被全部函数访问。外部变量在函数外面进行申明。局部变量与外部变量同名时,局部变量优先级高例1:

intnumber; floatlength=7.5; main() { ………… } func1() { ………… }第43页变量作用域、可见性和生存期外部变量值能够被全部函数使用和更改。例:intfunc1(void);intfunc2(void);intfunc3(void);intx;main(){ x=10; printf(“x=%d\n”,x); printf(“x=%d\n”,func1();); printf(“x=%d\n”,func2();); printf(“x=%d\n”,func3(););}func1(void){ x=x+10;}func2(void){ intx=1; returnx;}func3(void){ x=x+10;}第44页第45页变量作用域、可见性和生存期因为程序中全部函数都能够访问全局变量,所以能够用来在函数之间传递值。使用全局变量,将使函数丧失独立性和重用性,任何函数都能够使用和修改其值。全局变量从申明之处起到程序末尾可用。全局变量若没有赋初值,则默认初始化为0。第46页变量作用域、可见

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论