c语言程序设计现代方法PPT_第1页
c语言程序设计现代方法PPT_第2页
c语言程序设计现代方法PPT_第3页
c语言程序设计现代方法PPT_第4页
c语言程序设计现代方法PPT_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

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

文档简介

1,第9章,函数,本章要点,函数的定义函数的调用函数的声明形式参数vs实际参数递归,2,概述,函数简单来说就是一连串组合在一起并且命名的语句。每个函数本质上是一个自带声明和语句的小程序。函数的优点:可以利用函数把程序划分成小块,这样便于人们理解和修改程序。可以避免重复编写可多次使用的代码。一个函数最初可能是某个程序的一部分,但可以将其用于其他程序中。,3,Copyright2008W.W.Norton在函数开始处放置的单词double表示了average函数的返回类型(returntype)。标识符a和标识符b(即函数的形式参数(parameter)表示在调用average函数时提供的求平均值的两个数。,5,Copyright2008W.W.Nortonaverage的返回值没有保存;程序显示出这个值后就把它丢弃了。如果需要在稍后的程序中用到返回值,可以把这个返回值赋值给变量:avg=average(x,y);,8,Copyright2008W.W.Nortonintmain(void)doublex,y,z;printf(Enterthreenumbers:);scanf(%lf%lf%lf,10,Copyright2008W.W.Nortonvoid是一种没有值的类型。print_count函数的调用必须自成一个语句:print_count(i);程序countdown.c在循环内调用了print_count函数10次。,11,Copyright2008W.W.Nortonintmain(void)inti;for(i=10;i0;-i)print_count(i);return0;,12,Copyright2008W.W.Norton为了调用不带实际参数的函数,需要写出函数名并且后面跟上一对圆括号:print_pun();即使没有实际参数也必须显示圆括号。程序pun2.c测试了print_pun函数。,13,Copyright2008W.W.Nortonintmain(void)print_pun();return0;,14,Copyright2008W.W.Norton如果返回类型很冗长,比如unsignedlongint类型,那么把返回类型单独放在一行是非常有用的。,17,Copyright2008W.W.Norton/*declaration*/sum=a+b;/*statement*/returnsum/2;/*statement*/,19,Copyright2008W.W.Norton/*WRONG*/这条语句是合法的,但是不起作用。,22,Copyright2008W.W.Nortonprint_pun();非void型的函数调用产生的值可存储在变量中,还可以进行测试、显示或者其他用途:avg=average(x,y);if(average(x,y)0)printf(Averageispositiven);printf(Theaverageis%gn,average(x,y);,23,Copyright2008W.W.Norton/*discardsreturnvalue*/这个调用是一个表达式语句的示例:一个计算出了表达式值但是将其丢弃的语句。,24,Copyright2008W.W.Norton通常会丢掉printfs的返回值:printf(Hi,Mom!n);/*discardsreturnvalue*/,25,Copyright2008W.W.Norton使用(void)可以使别人清楚编写者是故意扔掉返回值的,而不是忘记了。,26,Copyright2008W.W.Nortonif(n=1)returnfalse;for(divisor=2;divisor*divisor=n;divisor+)if(n%divisor=0)returnfalse;returntrue;,28,Copyright2008W.W.Nortonprintf(Enteranumber:);scanf(%d,29,Copyright2008W.W.Nortonprintf(Enterthreenumbers:);scanf(%lf%lf%lf,31,Copyright2008W.W.Norton函数的声明必须与函数的定义一致。下面是为average函数添加了声明后程序的样子:,35,Copyright2008W.W.Norton/*DECLARATION*/intmain(void)doublex,y,z;printf(Enterthreenumbers:);scanf(%lf%lf%lf,36,Copyright2008W.W.Norton通常最好是不要忽略形式参数的名字。,37,Copyright2008W.W.Nortonfor(i=1;i0)result=result*x;returnresult;,42,Copyright2008W.W.Nortonfrac_part=x-int_part;,43,Copyright2008W.W.Norton可惜的是,变量i和d不会因为赋值给int_part和frac_part而受到影响。第11章中将阐述如何使decompose函数正确地工作。,44,Copyright2008W.W.Nortonprintf(Square:%dn,square(x);return0;intsquare(intn)returnn*n;在调用square函数时,编译器没有遇到原型,所以不知道该函数期望有int类型的实际参数。,48,Copyright2008W.W.Norton当然更好的解决方案是在调用square函数前提供其原型。在C99中,调用square之前不提供声明或者定义是错误的。,49,Copyright2008W.W.Nortonfor(i=0;in;i+)sum+=ai;returnsum;因为sum_array需要知道a的长度,所以我们需要将其作为第二个参数提供出来。,51,Copyright2008W.W.Norton通常情况下,如果愿意可以忽略形式参数的名字:intsum_array(int,int);,52,Copyright2008W.W.Nortontotal=sum_array(b,LEN);注意,在把数组名传递给函数时,不要在数组名的后边放置方括号:total=sum_array(b,LEN);/*WRONG*/,53,Copyright2008W.W.Norton,54,Copyright2008W.W.Norton/*WRONG*/sum_array函数将超出数组的末尾,导致不可知的行为。,55,Copyright2008W.W.Nortonfor(i=0;in;i+)ai=0;,56,Copyright2008W.W.Norton数组型实际参数的元素可以修改似乎与C语言中实际参数的值传递相矛盾。第12章中将解释这其实不矛盾。,57,Copyright2008W.W.Nortonfor(i=0;in;i+)for(j=0;jLEN;j+)sum+=aij;returnsum;,58,Copyright2008W.W.Norton/*Version1*/另一种写法是用*(星号)取代数组长度:intsum_array(intn,inta*);/*Version2a*/,62,Copyright2008W.W.Norton/*Version2b*/,63,Copyright2008W.W.Norton/*Version3a*/intsum_array(int,int);/*Version3b*/让括号为空不是一个好的选择,因为这样并没有说明n和a的关系。,64,Copyright2008W.W.Nortonfor(i=0;in;i+)for(j=0;j=0?n:0;,75,Copyright2008W.W.Norton/*returninavoidfunction*/例子:voidprint_int(inti)if(i0)return;printf(%d,i);,77,Copyright2008W.W.Nortonreturn;/*OK,butnotneeded*/这里return语句不是必需的。如果非void函数到达了函数体的末尾(也就是说没有执行return语句),那么如果程序试图使用函数的返回值,其行为将是未定义的。,78,Copyright2008W.W.Norton/*normaltermination*/,82,Copyright2008W.W.Norton传递EXIT_FAILURE表示异常终止:exit(EXIT_FAILURE);EXIT_SUCCESS和EXIT_FAILURE是定义在中的宏。EXIT_SUCCESS和EXIT_FAILURE的值都是事先定义的,通常分别为0和1。,83,Copyright2008W.W.Norton等价于exit(表达式);return语句和exit函数之间的差异是:不管哪个函数调用exit函数都会导致程序终止。Return语句仅当由main函数调用时才会导致程序终止。,84,Copyright2008W.W.Nortonelsereturnn*fact(n-1);,85,Copyright2008W.W.Nortonfact(3)发现3不是小于或等于1,所以它调用fact(2),此函数发现2不是小于或等于1,所以它调用fact(1),此函数发现1是小于或等于1的,所以它返回1,从而导致fact(2)返回21=2,从而导致fact(3)返回32=6。,递归,86,Copyright2008W.W.Nortonelsereturnx*power(x,n-1);,87,Copyright2008W.W.Norton一旦被调用,fact函数和power函数都会仔细地测试“终止条件”。所有递归函数都需要某些类型的终止条件。,88,Copyright2008W.W.Nortonintsplit(inta,intlow,inthigh);intmain(void)intaN,i;printf(Enter%dnumberstobesorted:,N);for(i=0;i=high)return;middle=split(a,low,high);quicksort(a,low,middle-1);quicksort(a,middle+1,high);,97,Copyright2008W.W.Nortonfor(;)while(low=high)break;alow+=ahigh;while(low=high)break;ahigh-=alow;ahigh=part_element;returnhigh;,98,Copyright2008W.W.Nortonvoidhanoi(intn,charone,chartwo,charthree)/*递归函数*/if(n=1)move(one,three);elsehanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);main()intm;printf(Inputthenumberofdisks:);scanf(%d,103,Copyright2008W.W.Norton&Company.Allrightsreserved.,世界何时毁灭?,不管汉诺塔传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?利用递归的方法,假设有n片,移动次数是f(n)。显然f=1,f=3,f=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2n-1。n=64时:f(64)=264-1=18446744073709551615假如每秒钟一次,共需多长时间呢?一年365天有31536000秒,闰年366天有31622400秒,平均每年31556952秒,计算一下:184467440

温馨提示

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

评论

0/150

提交评论