版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计Lec4函数2021/5/91引言例:求一些圆盘的面积,圆盘半径分别为:3.24、2.13、0.865、3.746、12.3364、8.421//设圆周率为3.1416,可写出下面程序:#include<stdio.h>intmain(){printf("radius:%f,area:%f\n",3.24,3.24*3.24*3.1416);printf("radius:%f,area:%f\n",2.13,2.13*2.12*3.1415);…}繁琐的东西很容易弄错,不易修改标准函数有限,需求无限。2021/5/92西安电子科技大学计算机学院引言如果有求圆面积的函数doublec_area(doubler)如果有打印圆面积的函数pc_area(doubler)intmain(){printf("radius:%f,area:%f\n",3.24,c_area(3.24));printf("radius:%f,area:%f\n",2.13,c_area(2.13));…}函数能使程序变短,变得易写/易理解/易修改intmain(){
pc_area(3.24);
pc_area(2.13);…}2021/5/93西安电子科技大学计算机学院引言半径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.22021/5/94西安电子科技大学计算机学院目标学会把常用的代码定义为函数学会在程序中使用函数掌握C语言提供的常用库函数了解递归的基本原理2021/5/95西安电子科技大学计算机学院主要内容函数定义函数调用C语言常用函数函数与递归变量作用域2021/5/96西安电子科技大学计算机学院4.1函数定义将实现某个功能的代码变成函数2021/5/97西安电子科技大学计算机学院函数定义把一段计算定义成函数并给以命名,定义后就可以在任何需要的地方通过名字调用。//定义函数c_area的程序片段:doublec_area(doubler){returnr*r*3.1416;}2021/5/98西安电子科技大学计算机学院定义函数的要素函数头函数名:使用函数需要的名称,合法标识符返回值类型—函数计算结果的数据类型参数表—完成计算需要的数据(数量和类型)函数体doublec_area(doubler)
{returnr*r*3.1416;}返回值类型函数名参数表函数体函数头实现函数功能的代码,由一对大括号包围2021/5/99函数返回值函数返回值表示函数内代码计算的结果一个函数最多只能有一个返回值,返回值通常是计算结果或者表示计算状态的信息,由调用者使用如果函数有返回值函数必须指定返回值类型,如果函数不需要返回值必须使用void作为函数返回值类型。函数返回值通过return语句返回,return语句一旦执行,整个函数就结束。2021/5/910西安电子科技大学计算机学院函数返回值一个函数中可以有多条return语句,但只会执行其中一条。return语句形式:return表达式;return语句中表达式求值的类型应该和函数返回值类型一致,如果不一致会自动进行类型转换返回值类型为void时,不需要return语句或者写成return;2021/5/911西安电子科技大学计算机学院函数定义示例voidpc_area(doubler){
printf("r=%f,S=%f\n",r,3.14159265*r*r);}doublec_area(doubler){returnr*r*3.1416;}intmax(inta,intb){
if(a>b)returna;returnb;}intcompare(intx,inty){if(x==y)return0;elseif(x>y)return1;elsereturn-1;}2021/5/912关于return语句doublec_area(doubler){returnr*r*3.1416;}intmain(){doublev=2.4*c_area(3.24)/3.0;printf("v=%f\n",v);}intmain(){doubles=c_area(3.24);
doublev=2.4*s/3.0;printf("v=%f\n",v);}需要注意返回值类型为void的函数不能放在表达式中参与运算2021/5/913函数参数表函数可以有0个或多个参数,这些参数称为形式参数每个参数必须指明类型和参数名称函数参数是函数内的局部变量,只在函数体内有效函数参数只有在函数被调用时才有效函数参数的初始值由调用者传入(通过实际参数以值拷贝的方式传入)2021/5/914西安电子科技大学计算机学院形参和实参形参:在函数定义中括号内的标识符,与函数调用时的实参一一对应实参:在调用函数的括号中使用的表达式,它的值被传入函数并赋值给函数的对应形参。2021/5/915西安电子科技大学计算机学院形参和实参#include<stdio.h>//定义函数doublec_area(doubler){returnr*r*3.1416;}intmain(){doublev,radius=3.24;//调用函数v=2.4*c_area(radius)/3.0;return0;}形参实参函数调用时,实参radius的值(3.24)传递给形参r2021/5/916西安电子科技大学计算机学院函数定义不能嵌套#include<stdio.h>#include<math.h>doublec_area(doubler){returnpow(r,2)*3.1416;}intmain(){doublev;v=2.4*c_area(3.24)/3.0;return0;}#include<stdio.h>#include<math.h>intmain(){doublec_area(doubler){returnpow(r,2)*3.1416;}doublev;v=2.4*c_area(3.24)/3.0;
return0;}2021/5/917西安电子科技大学计算机学院4.2函数调用2021/5/918西安电子科技大学计算机学院调用系统函数包含必要的头文件,其本质是将函数原型添加到程序中在需要的地方使用函数,传入类型和数量正确的实际参数,函数返回值可以作为表达式的一部分#include<stdio.h>#include<math.h>intmain(){doublesum=0;intn=1;while(n<=100){sum=sum+sin(1.0/n);
n=n+1;}
printf("sum=%f\n",sum);return0;}函数原型就是函数头部加上分号,其作用是告诉编译器函数应该以什么形式调用2021/5/919西安电子科技大学计算机学院调用自定义函数方法1(函数定义放在调用函数之前):在需要的地方使用函数,传入类型和数量正确的实际参数,函数返回值可以作为表达式的一部分#include<stdio.h>//c_area函数在调用前定义doublec_area(doubler){returnr*r*3.1416;}intmain(){doublev;printf("radius:%f,area:%f\n", 3.24,
c_area(3.24));v=2.4*c_area(3.24)/3.0;
return0;}2021/5/920西安电子科技大学计算机学院调用自定义函数方法2(函数定义放在调用函数之后):在函数调用之前给出函数原型在需要的地方使用函数,传入类型和数量正确的实际参数,函数返回值可以作为表达式的一部分#include<stdio.h>//函数原型在调用之前doublec_area(doubler);intmain(){doublev;printf("radius:%f,area:%f\n", 3.24,
c_area(3.24));v=2.4*c_area(3.24)/3.0;return0;}//函数定义在调用之后doublec_area(doubler){returnr*r*3.1416;}2021/5/921西安电子科技大学计算机学院函数调用的若干问题C语言是一个函数式语言,所有可执行语句都必须放在某个函数体内调用函数的函数称为主调函数,被调用的函数称为被调函数当函数调用发生时,主调函数暂停,程序控制转入被调函数,被调函数执行结束后,主调函数继续2021/5/922西安电子科技大学计算机学院函数调用的若干问题#include<stdio.h>#include<math.h>doublec_area(doubler){returnpow(r,2)*3.1416;}intmain(){doublev;v=2.4*c_area(3.24)/3.0;return0;}main函数c_area函数pow函数c_area(3.24)pow(r,2)2021/5/923西安电子科技大学计算机学院参数传递机制形式参数在函数调用时才分配存储空间,并接受实际参数的值实际参数可以为复杂的表达式,在函数调用前获得计算形式参数与实际参数可同名,也可不同名2021/5/924西安电子科技大学计算机学院参数传递机制参数较多时,实际参数值逐一赋值,它们必须保持数目、类型、顺序的一致参数的赋值过程单向不可逆,函数内部对形式参数值的修改不会反映到实际参数中函数参数一般为函数输入集的一部分,函数输出集一般使用返回值表示,只有使用特殊的手段(指针/数组)才可以将函数参数作为函数输出集的一部分2021/5/925西安电子科技大学计算机学院参数传递机制voidswap(inta,intb){intt;t=a;a=b;b=t;}intmain(){inta=5,b=3;
printf("beforeswap:a=%d;b=%d\n",a,b);swap(a,b);printf("afterswap:a=%d;b=%d\n",a,b);return0;}swap函数中的a和b与main函数中的a和b是什么关系?两个printf输出的结果是什么?2021/5/926西安电子科技大学计算机学院swap函数数据区main函数数据区voidswap(inta,intb){intt;//2t=a;a=b;b=t;//3}intmain(){inta=5,b=3;//1
swap(a,b);//4return0;}5a0x0012ff24内存地址值变量3b0x0012ff283a0x0012ff245b0x0012ff285a0x0012ff7c3b0x0012ff78内存地址值变量5a0x0012ff7c3b0x0012ff782021/5/927函数示例1.请写一个程序,给出指定整数范围[1,10000]内的所有完数。判断是不是完数用一个函数完成。intisPerfectNumber(intn){inti;for(i=1,sum=0;i<=n/2;i++){if(n%i==0)sum+=i;}returnsum==n;}2021/5/928西安电子科技大学计算机学院函数示例2.写一个函数求两个整数的最大公约数intgcd(intm,intn){inti;intmin=m<n?m:n;for(i=min;i>1;i--){if(m%i==0&&n%i==0) break;
}
returni;}2021/5/929西安电子科技大学计算机学院函数示例3.写一个函数判断一个数是不是素数,用函数返回值表示判断结果(非0表示是素数,0表示不是素数)intisPrime(intn){inti,isprime=1;for(i=2;i<n;i++){if(n%i==0){isprime=0;break;}}returni==n;}2021/5/930西安电子科技大学计算机学院课堂练习写一个函数判断传入的整数n(100<n<1000)是不是“水仙花数”,是返回1,否则返回0如果一个3位整数各位数字的立方和等于这个数就是水仙花数2021/5/931西安电子科技大学计算机学院4.3变量作用域(教材5.4)2021/5/932西安电子科技大学计算机学院swap函数的问题参数传递是赋值传递,修改函数参数(形参)对原来的数据(实参)没有影响,因此不能完成交换数据的任务解决方法方法1:修改需要交换的数据的作用域,将其变为全局变量方法2:通过参数传递需要交换的数据的地址2021/5/933西安电子科技大学计算机学院变量作用域作用域:变量的有效范围,也就是变量的生存范围局部变量:函数参数,其作用域为整个函数函数内的变量,其作用域为变量定义位置到函数结束位置复合语句内的变量,其作用域为变量定义位置到复合语句结束位置全局变量定义在所有函数之外的变量,其作用域为变量定义位置到程序结束位置2021/5/934西安电子科技大学计算机学院#include<stdio.h>inta=10,b=10;//全局变量voidfunc1(){printf("func1:a=%d,b=%d\n",a,b);}voidfunc2(){inta=30,b=30;printf("func2:a=%d,b=%d\n",a,b);}intc=1,d=1;voidfunc3(inta,intb){printf("fuc3:a=%d,b=%d\n",a,b);}intmain(){inta=20,b=20;…{inta=40,b=40;…}…}全局变量a,b的作用域全局变量c,d的作用域局部变量a,b的作用域函数参数a,b的作用域main函数局部变量a,b的作用域复合结构内a,b的作用域2021/5/935使用全局变量的swap函数voidswap(){intt;
t=a;a=b;b=t;}intmain(){printf("beforeswap:a=%d;b=%d\n",a,b);swap();printf("afterswap:a=%d;b=%d\n",a,b);return0;}inta=5,b=3;2021/5/936西安电子科技大学计算机学院4.4C语言常用函数2021/5/937西安电子科技大学计算机学院数学函数#include<math.h>doublesin(doublerad);doublesqrt(intn);doublepow(double,double);doublefabs(double);doublelog(doublex);doublelog10(doublex);2021/5/938西安电子科技大学计算机学院输入输出函数#include<stdio.h>printf—格式化输出scanf—格式化输入getchar—输入一个字符putchar—输出一个字符2021/5/939西安电子科技大学计算机学院输入输出函数intscanf(constchar*format[,argument]...);可变参数-参数个数>=1返回值表示正确转换并赋值的字段数,经常用来判断输入格式是否正确2021/5/940西安电子科技大学计算机学院scanf返回值示例(scanf.c)#include<stdio.h>intmain(){intn=0;inta=0,b=0;n=scanf("%d%d",&a,&b);printf("n=%d\n",n,);printf("a=%db=%d\n",a,b);return0;}输入1:34输入2:34.5输入3:3a输出1:n=2a=3b=4输出2:n=2a=3b=4输出1:n=1a=3b=02021/5/941西安电子科技大学计算机学院输入输出函数intgetchar()—从标准输入流(stdin)读取一个字符缓冲输入,需要按下回车后才能获取到值正常情况下,返回值表示读入的字符如果返回值是EOF(-1)表示读错误或到了流结束位置intputchar(intch)—将字符ch写入标准输出流(stdout)示例:将输入的一行小写字符转换成大写字符。(chario.c)2021/5/942西安电子科技大学计算机学院时间函数#include<time.h>time_ttime(time_t*timer)—获得从1970/1/1至今的秒数time_t可以看作整数类型clock_tclock();—获得从程序开始运行至今处理器经过的时钟数clock_t可以看作整数类型CLOCKS_PER_SEC—表示每秒有多少个时钟的常数2021/5/943西安电子科技大学计算机学院时间函数(time.c)#include<stdio.h>#include<time.h>intmain(){intstart,finish;doubletime;
start=clock();...…finish=clock();time=(finish-start)*1.0/CLOCKS_PER_SEC;….return0;}对这一段程序计时2021/5/944西安电子科技大学计算机学院随机数函数#include<stdlib.h>intrand()—产生一个[0,RAND_MAX]范围内的伪随机数RAND_MAX是一个系统常数,可以直接使用voidsrand(unsignedintseed)—设置伪随机数序列的种子如果不设定随机数系列的种子,同一个程序两次运行得到的随机数完全相同通常以时间作为随机数种子2021/5/945西安电子科技大学计算机学院随机数函数产生5个随机数(rand1.c)#include<stdio.h>#include<stdlib.h>intmain(){inti;printf("RAND_MAXis%d.\n",RAND_MAX);printf("Fivenumbersgeneratedasfollows:\n");for(i=0;i<5;i++)printf(“%d",rand());printf("\n");return0;}2021/5/946西安电子科技大学计算机学院随机函数用时间做种子产生5个随机数(rand2.c)#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){inti;printf("Fivenumbersgeneratedasfollows:\n");
srand((int)time(NULL));for(i=0;i<5;i++) printf("%d;",rand());printf("\n");return0;}2021/5/947西安电子科技大学计算机学院随机函数生成5个[low,high]范围内的随机数(rand3.c)#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){inti,low=10,high=20;srand((int)time(NULL));for(i=0;i<5;i++) printf("%d;",low+(rand()%(high-low)));printf("\n");return0;}2021/5/948西安电子科技大学计算机学院4.5函数与递归(教材4.3)2021/5/949西安电子科技大学计算机学院引言函数调用可以嵌套,即在一个函数中调用另一个函数如果一个函数调用自己就会构成递归调用doublec_area(doubler){returnpow(r,2)*3.1416;}2021/5/950西安电子科技大学计算机学院递归函数示例求n!Fibonacci数列intfac(intn){if(n==0)return1;returnn*fac(n-1);}intfib(intn){if(n==0||n==1)return1;returnfib(n-1)+fib(n-2);}intmain(){printf("3!=%d",fac(3));}intmain(){printf("F(5)=%d",fib(5));}2021/5/951西安电子科技大学计算机学院递归函数的调用过程2021/5/952西安电子科技大学计算机学院使用递归的条件具有递归定义的形式有明确的结束条件结束条件递归定义2021/5/953西安电子科技大学计算机学院汉诺塔(hanoi)问题假设有三个分别命名为X、Y和Z的塔座,在塔座X上插有n个直径大小不同、依小到大分别编号为1,2,...,n的圆盘,如图所示:要求将塔座X上的n个圆盘移动到塔座Z上并按相同顺序叠放,圆盘移动时必须遵循下述规则:每次只能移动一个圆盘;圆盘可以插在X、Y与Z中的任意塔座上;任何时刻都不能将较大的圆盘压在较小的圆盘上。如何实现移动圆盘的操作呢?2021/5/954西安电子科技大学计算机学院汉诺塔(hanoi)问题2021/5/955西安电子科技大学计算机学院汉诺塔(hanoi)问题待解决的问题Q1:是否存在某种简单情形,问题很容易解决Q2:是否可将原始问题分解成性质相同但规模较小的子问题,且新问题的解答对原始问题有关键意义2021/5/956西安电子科技大学计算机学院汉诺塔(hanoi)问题解决方案A1:只有一个圆盘时是最简单情形A2:对于n>1,考虑n–1个圆盘,如果能将n-1个圆盘移动到某个塔座上,则可以移动第n个圆盘策略:首先将n–1个圆盘移动到塔座Y上,然后将第n个圆盘移动到Z上,最后再将n-1个圆盘从Y上移动到Z上2021/5/957西安电子科技大学计算机学院汉诺塔(hanoi)问题voidMoveHanoi(unsignedintn, //圆盘数量charfrom, //起始位置chartmp, //中转位置charto){ //目标位置if(n==1)//递归结束条件
将圆盘1从from移动到toelse{
将n–1个圆盘从from以to为中转移动到tmp;
//递归
将圆盘n从from移动到to
将n-1个圆盘从tmp以from为中转移动到to;//递归}}2021/5/958西安电子科技大学计算机学院递归的缺点函数调用需要额外的空间(栈)来完成,在调用次数很多的情况下会降低程序效率递归调用中的重复计算2021/5/959西安电子科技大学计算机学院Fibonacci数列的两种求解方法(fib.c)//使用递归求Fibonacci数列intfib_recursion(intn){if(n==0||n==1)return1;returnfib_recursion(n-1)+fib_recursion(n-2);}//使用循环求Fibonacci数列intfib_loop(intn){intfn,fn_1=1,fn_2=1,i;if(n==0||n==1) return1;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)}returnfn;}递归到循环的转换常常需要借助于高级的程序设计技术和一定的数据结构才能完成2021/5/960西安电子科技大学计算机学院兔子繁殖问题(Fibonacci数列)假设有一对兔子,一个月后成长
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年智能工厂数据采集与治理体系建设
- 2026年用户单位联合研制单位申报材料编写要点
- 2026年继续教育培训项目立项与课程开发标准化手册
- 四川省成都市简阳市2026年初三第三次质检生物试题含解析
- 天津市南开大附属中学2026届初三三模化学试题含解析
- 2026年陕西省宝鸡市扶风县重点达标名校校初三第三次模拟化学试题含解析
- 贵州省从江县2026年初三下学期期中考化学试题含解析
- 2026年天津市河西区第四中学初三年级四月考试化学试题试卷含解析
- 甘肃省民乐县第四中学2026年初三适应性月考(八)化学试题含解析
- 广东省湛江地区六校联考2026届初三第二学期化学试题统练(8)含解析
- 2026四川成都市金牛国投人力资源服务有限公司招聘金牛区街区规划师8人考试参考试题及答案解析
- CMA质量手册(2025版)-符合27025、评审准则
- 真人cs广告策划方案
- 海岛游策划方案
- 洁净车间安全施工方案
- 《中租联工程机械操作标准-旋挖钻机司机》征求意见稿
- 2023年考研考博-考博英语-煤炭科学研究总院考试历年高频考点真题荟萃带答案
- Peppa-Pig第1-38集英文字幕整理
- 统计用产品分类目录
- 雅培Perclose血管缝合器使用过程中常见问题及解决方法
- 中小学生课外读物负面清单自查表
评论
0/150
提交评论