收藏 分销(赏)

c语言函数章节经典教案ppt课件.ppt

上传人:二*** 文档编号:12609231 上传时间:2025-11-10 格式:PPT 页数:69 大小:745.50KB 下载积分:5 金币
下载 相关 举报
c语言函数章节经典教案ppt课件.ppt_第1页
第1页 / 共69页
本文档共69页,全文阅读请下载到手机保存,查看更方便
资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,.,*,C语言程序设计,Lec,4,函数,1,.,引言,例:求一些圆盘的面积,圆盘半径分别为:,3.24,、,2.13,、,0.865,、,3.746,、,12.3364,、,8.421,/,设圆周率为,3.1416,,可写出下面程序:,#include,int main(),printf(radius:%f,area:%fn,3.24,3.24*3.24*3.1416);,printf(radius:%f,area:%fn,2.13,2.13*,2.12,*,3.1415,);,繁琐的东西很容易弄错,不易修改,标准函数有限,需求无限。,2,.,引言,如果有求圆面积的函数,double c_area(double r),如果有打印圆面积的函数,pc_area(double r),int main(),printf(radius:%f,area:%fn,3.24,c_area(3.24),);,printf(radius:%f,area:%fn,2.13,c_area(2.13),);,函数能使程序变短,,变得易写,/,易理解,/,易修改,int main(),pc_area(3.24);,pc_area(2.13);,3,.,引言,半径,3.24,高,2.4,的圆锥体积:,外半径,5.3,,内半径,3.07,,高,4.2,的空心圆柱体积:,2.4*,c_area(3.24),/3.0,(,c_area(5.3)-c_area(3.07),)*4.2,4,.,目标,学会把常用的代码定义为函数,学会在程序中使用函数,掌握C语言提供的常用库函数,了解递归的基本原理,5,.,主要内容,函数定义,函数调用,C语言常用函数,函数与递归,变量作用域,6,.,4.1 函数定义,将实现某个功能的代码变成函数,7,.,函数定义,把一段,计算,定义成函数并给以命名,定义后就可以,在任何需要的地方通过名字调用,。,/,定义函数,c_area,的程序片段:,double c_area(double r),return r*r*3.1416;,8,.,定义函数的要素,函数头,函数名:使用函数需要的名称,合法标识符,返回值类型,函数计算结果的数据类型,参数表,完成计算需要的数据(,数量和类型,),函数体,double c_area (double r),return r*r*3.1416;,返回值类型,函数名,参数表,函数体,函数头,实现函数功能的代码,,由一对大括号包围,9,函数返回值,函数返回值表示函数内代码计算的结果,一个函数,最多只能有一个,返回值,返回值通常是计算结果或者表示计算状态的信息,,由调用者使用,如果函数有返回值函数,必须指定返回值类型,,如果函数不需要返回值,必须,使用,void,作为函数返回值类型。,函数返回值通过,return,语句返回,,return,语句一旦执行,整个函数就结束。,10,.,函数返回值,一个函数中可以有多条,return,语句,但,只会执行其中一条,。,return,语句形式:,return,表达式,;,return,语句中表达式求值的类型应该和函数返回值类型一致,如果不一致会自动进行类型转换,返回值类型为,void,时,不需要,return,语句或者写成,return;,11,.,函数定义示例,void pc_area(double r),printf(r=%f,S=%fn,r,3.14159265*r*r);,double c_area(double r),return r*r*3.1416;,int max(int a,int b),if(ab)return a;,return b;,int compare(int x,int y),if(x=y)return 0;,else if(x y),return,1;,else return-1;,12,关于return语句,double c_area(double r),return r*r*3.1416;,int main(),double v=2.4*,c_area(3.24),/3.0;,printf(v=%fn,v);,int main(),double s=,c_area(3.24);,double v=2.4*,s,/3.0;,printf(v=%fn,v);,需要注意返回值类型为,void,的函数不能放在表达式中参与运算,13,函数参数表,函数可以有,0,个或多个参数,这些参数称为,形式参数,每个参数必须指明,类型,和,参数名称,函数参数是函数内的,局部变量,,只在函数体内有效,函数参数只有在函数被调用时才有效,函数参数的初始值由调用者传入(通过实际参数以值拷贝的方式传入),14,.,形参和实参,形参:在函数定义中括号内的标识符,与函数调用时的实参一一对应,实参:在调用函数的括号中使用的表达式,它的值被传入函数并赋值给函数的对应形参。,15,.,形参和实参,#include,/,定义函数,double c_area(double,r,),return r*r*3.1416;,int main(),double v,radius=3.24;,/,调用函数,v=2.4*,c_area(,radius,),/3.0;,return 0;,形参,实参,函数调用时,,实参,radius,的值,(3.24),传递给形参,r,16,.,函数定义不能嵌套,#include,#include,double c_area(double r),return,pow(r,2),*3.1416;,int main(),double v;,v=2.4*,c_area(3.24),/3.0;,return 0;,#include,#include,int main(),double c_area(double r),return,pow(r,2),*3.1416;,double v;,v=2.4*,c_area(3.24),/3.0;,return 0;,17,.,4.2 函数调用,18,.,调用系统函数,包含必要的头文件,其本质是将,函数原型,添加到程序中,在需要的地方使用函数,传入类型和数量正确的实际参数,函数返回值可以作为表达式的一部分,#include,#include,int main(),double sum=0;,int n=1;,while(n=100),sum=sum+,sin(1.0/n);,n=n+1;,printf(sum=%fn,sum);,return 0;,函数原型就是,函数头部加上分号,,,其作用是告诉编译器函数应该以什么形式调用,19,.,调用,自定义,函数,方法,1,(函数定义放在调用函数之前):,在需要的地方使用函数,传入类型和数量正确的实际参数,函数返回值可以作为表达式的一部分,#include,/c_area,函数在调用前定义,double c_area(double r),return r*r*3.1416;,int main(),double v;,printf(radius:%f,area:%fn,3.24,c_area(3.24),);,v=2.4*,c_area(3.24),/3.0;,return 0;,20,.,调用,自定义,函数,方法,2,(函数定义放在调用函数之后):,在,函数调用之前,给出,函数原型,在需要的地方使用函数,传入类型和数量正确的实际参数,函数返回值可以作为表达式的一部分,#include,/,函数原型在调用之前,double c_area(double r);,int main(),double v;,printf(radius:%f,area:%fn,3.24,c_area(3.24),);,v=2.4*,c_area(3.24),/3.0;,return 0;,/,函数定义在调用之后,double c_area(double r),return r*r*3.1416;,21,.,函数调用的若干问题,C,语言是一个函数式语言,所有可执行语句都必须放在某个函数体内,调用函数的函数称为,主调函数,,被调用的函数称为,被调函数,当函数调用发生时,主调函数暂停,程序控制转入被调函数,被调函数执行结束后,主调函数继续,22,.,函数调用的若干问题,#include,#include,double c_area(double r),return,pow(r,2),*3.1416;,int main(),double v;,v=2.4*,c_area(3.24),/3.0;,return 0;,main,函数,c_area,函数,pow,函数,c_area(3.24),pow(r,2),23,.,参数传递机制,形式参数在函数调用时才分配存储空间,并接受实际参数的值,实际参数可以为复杂的表达式,在函数调用前获得计算,形式参数与实际参数可同名,也可不同名,24,.,参数传递机制,参数较多时,实际参数值逐一赋值,它们必须保持数目、类型、顺序的一致,参数的赋值过程单向不可逆,函数内部对形式参数值的修改不会反映到实际参数中,函数参数一般为函数输入集的一部分,函数输出集一般使用返回值表示,只有使用特殊的手段,(,指针,/,数组,),才可以将函数参数作为函数输出集的一部分,25,.,参数传递机制,void swap(int a,int b),int t;,t=a;a=b;b=t;,int main(),int a=5,b=3;,printf(before swap:a=%d;b=%dn,a,b);,swap(a,b);,printf(after swap:a=%d;b=%dn,a,b);,return 0;,swap,函数中的,a,和,b,与,main,函数中的,a,和,b,是什么关系?,两个,printf,输出的结果是什么?,26,.,swap,函数数据区,main,函数数据区,void swap(int a,int b),int t;,/2,t=a;a=b;b=t;,/3,int main(),int a=5,b=3;,/1,swap(a,b);,/4,return 0;,5,a,0 x0012ff24,内存地址,值,变量,3,b,0 x0012ff28,3,a,0 x0012ff24,5,b,0 x0012ff28,5,a,0 x0012ff7c,3,b,0 x0012ff78,内存地址,值,变量,5,a,0 x0012ff7c,3,b,0 x0012ff78,27,.,函数示例,1.,请写一个程序,给出指定整数范围,1,,,10000,内的所有完数。判断是不是完数用一个函数完成。,int isPerfectNumber(int n),int i;,for(i=1,sum=0;i=n/2;i+),if(n%i=0),sum+=i;,return sum=n;,28,.,函数示例,2.写一个函数求两个整数的最大公约数,int gcd(int m,int n),int i;,int min=m1;i-),if(m%i=0&n%i=0),break;,return i;,29,.,函数示例,3.写一个函数判断一个数是不是素数,用函数返回值表示判断结果(非0表示是素数,0 表示不是素数),int isPrime(int n),int i,isprime=1;,for(i=2;in;i+),if(n%i=0),isprime=0;,break;,return i=n;,30,.,课堂练习,写一个函数判断传入的整数,n(100n=1,返回值表示正确转换并赋值的字段数,经常用来判断输入格式是否正确,40,.,scanf,返回值示例,(,scanf.c,),#include,int main(),int n=0;,int a=0,b=0;,n=scanf(%d%d,printf(n=%dn,n,);,printf(a=%d b=%dn,a,b);,return 0;,输入,1,:,3 4,输入,2,:,3 4.5,输入,3,:,3 a,输出,1,:,n=2,a=3 b=4,输出,2,:,n=2,a=3 b=4,输出,1,:,n=1,a=3 b=0,41,.,输入输出函数,int getchar(),从标准输入流(,stdin,)读取一个字符,缓冲输入,需要按下回车后才能获取到值,正常情况下,返回值表示读入的字符,如果返回值是,EOF,(,-1,)表示读错误或到了流结束位置,int putchar(int ch),将字符,ch,写入标准输出流(,stdout,),示例:将输入的一行小写字符转换成大写字符。(,chario.c,),42,.,时间函数,#include,time_t time(time_t*timer),获得从,1970/1/1,至今的秒数,time_t,可以看作整数类型,clock_t clock();,获得从程序开始运行至今处理器经过的时钟数,clock_t,可以看作整数类型,CLOCKS_PER_SEC,表示每秒有多少个时钟的常数,43,.,时间函数,(,time.c,),#include,#include,int main(),int start,finish;,double time;,start=clock();,.,finish=clock();,time=(finish-start)*1.0/CLOCKS_PER_SEC;,.,return 0;,对这一段程序计时,44,.,随机数函数,#include,int,rand(),产生一个,0,RAND_MAX,范围内的伪随机数,RAND_MAX,是一个系统常数,可以直接使用,void,srand,(unsigned,int,seed),设置伪随机数序列的种子,如果不设定随机数系列的种子,同一个程序两次运行得到的随机数完全相同,通常以时间作为随机数种子,45,.,随机数函数,产生,5,个随机数,(,rand1.c,),#include,#include,int main(),int i;,printf(RAND_MAX is%d.n,RAND_MAX,);,printf(Five numbers generated as follows:n);,for(i=0;i 5;i+),printf(“%d,rand(),);,printf(n);,return 0;,46,.,随机函数,用时间做种子产生,5,个随机数,(,rand2.c,),#include,#include,#include,int main(),int i;,printf(Five numbers generated as follows:n);,srand(int)time(NULL);,for(i=0;i 5;i+),printf(%d;,rand(),);,printf(n);,return 0;,47,.,随机函数,生成,5,个,low,high,范围内的随机数,(,rand3.c,),#include,#include,#include,int main(),int i,low=10,high=20;,srand(int)time(NULL);,for(i=0;i 1,,考虑,n 1,个圆盘,如果能将,n-1,个圆盘移动到某个塔座上,则可以移动第,n,个圆盘,策略:首先将,n 1,个圆盘移动到塔座,Y,上,然后将第,n,个圆盘移动到,Z,上,最后再将,n-1,个圆盘从,Y,上移动到,Z,上,57,.,汉诺塔(,hanoi,)问题,void MoveHanoi(unsigned int n,/,圆盘数量,char from,/,起始位置,char tmp,/,中转位置,char to),/,目标位置,if(n=1),/,递归结束条件,将圆盘,1,从,from,移动到,to,else,将,n 1,个圆盘从,from,以,to,为中转移动到,tmp;,/,递归,将圆盘,n,从,from,移动到,to,将,n-1,个圆盘从,tmp,以,from,为中转移动到,to;,/,递归,58,.,递归的缺点,函数调用需要额外的空间(栈)来完成,在调用次数很多的情况下会降低程序效率,递归调用中的重复计算,59,.,Fibonacci数列的两种求解方法(fib.c),/,使用递归求,Fibonacci,数列,int fib_recursion(int n),if(n=0|n=1),return 1;,return fib_recursion(n-1),+fib_recursion(n-2);,/,使用循环求,Fibonacci,数列,int fib_loop(int n),int fn,fn_1=1,fn_2=1,i;,if(n=0|n=1)return 1;,for(i=2;i=n;i+),fn=fn_1+fn_2;/,计算,f(n),fn_2=fn_1;/,更新,f(n-2),fn_1=fn;/,更新,f(n-1),return fn;,递归到循环的转换常常需要借助于高级的程序设计技术和一定的数据结构才能完成,60,.,兔子繁殖问题(Fibonacci数列),假设有一对兔子,一个月后成长为大兔子,从第二个月开始,每对大兔子生一对小兔子。不考虑兔子的死亡,求第,n,个月的兔子总数,月份,小兔子,大兔子,总数,0,1,0,1,1,0,1,1,2,1,1,2,3,1,2,3,4,2,3,5,5,3,5,8,61,兔子繁殖问题(Fibonacci数列),递推过程,F(n-1)=M2+,(M2+M1),F(n)=(M2+M1)+(M2+M1+M2),F(n)=F(n-2)+F(n-1),F(0)=1,F(1)=1,/,初始条件,F(n-2)=M1+,M2,/,设第,n-2,个月有,M1,对小兔子,,/M2,对小兔子,62,.,走楼梯(Fibonacci数列),楼梯有,n,阶台阶,上楼可以一步上,1,阶,也可以一步上,2,阶,编一程序计算共有多少种不同的走法,.,63,.,用递归方法解决求一个整数各位数字之和,假设整数为,n,,各位数字之和为,sum,递归结束条件:,n10,,,sum=,个位数,+,去掉个位数之后各位数字之和,64,.,#include,int sum(int n),if(n10),return n;,else,return n%10+sum(n/10);,int main(),int n;,scanf(%d,printf(sum=%dn,sum(n);,return 0;,65,.,小结,定义函数的要素,函数头,函数名,使用函数需要的名称,合法的标识符,返回值类型,函数计算结果的类型,参数表,完成计算需要的数据(,数量和类型,),函数体,double c_area (double r),return r*r*3.1416;,返回值类型,函数名,参数表,函数体,函数头,66,.,小结,函数定义中的形参和函数调用中的实参,#include,#include,double c_area(double r),return,pow(r,2),*3.1416;,int main(),double v;,v=2.4*,c_area(3.24),/3.0;,return 0;,形参,实参,实参,实参,形参是定义函数时用来表示函数输入数据类型和名称的变量定义,实参是调用函数时实际传入的数据,可以是变量、常数、表达式或其他函数调用返回的值,67,小结,局部变量,在函数内部定义的变量、形式参数、复合结构内定义的变量,全局变量,在所有函数之外定义的变量,递归函数,函数直接或间接调用自己形成递归,68,.,作业,P,76,P,77,:,8,,,15,P,129,P,130,:,5,,,20,69,.,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服