




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章函数
本章导读掌握C语言中常见的内置函数理解函数原型和函数的返回值熟练掌握自定义函数的定义和调用理解变量的作用域理解变量的存储类型理解参数传递的方式:传值预处理指令宏定义条件编译函数的优点voidmain(){::::::if(x>y)max1=x;elsemax1=y;
if(a>b)max2=a;elsemax2=b:::::}重复多次的同一计算类型voidmain(){::::::max1=max(x,y);max2=max(a,b);:::::}intmax(inta,intb){intres;res=a>b?a:b;returnres;}函数主程序ans函数可以把相对独立的某个功能抽象出来,使之成为程序中的一个独立实体。可以在同一个程序或其他程序中多次重复使用函数的优点(1)使程序变得更简短而清晰;(2)提高了代码的重用性;(3)有利于程序维护;(4)可以提高程序开发的效率。常见内置函数内置函数头文件用途doublesqrt(doublex)math.h计算x的平方根doublepow(doublex,doubley)计算x的y次幂doubleceil(doublex)求不小于x的最小整数,并以double形式显示doublefloor(doublex)求不大于x的最大整数,并以double形式显示inttoupper(intx)ctype.h如果x为小写字母,则返回对应的大写字母inttolower(intx)如果x为大写字母,则返回对应的小写字母intrand(void)stdlib.h产生一个随机数voidexit(intretval)终止程序
函数的定义与调用一、定义函数的定义与调用二、函数的调用调用形式:函数名(实参表)例1intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}main(){inti=2,p;p=f(i,i++);printf("%d",p);}函数的定义与调用三、函数的参数及传递方式形式参数:定义函数时函数名后面括号中的变量名。实际参数:调用函数时函数名后面括号中的表达式。说明:实参必须有确定的值,形参必须指定类型,形参与实参类型一致,个数相同,若形参与实参类型不一致,自动按形参类型转换——函数调用转换,形参在函数被调用前不占内存,函数调用时为形参分配内存,调用结束时内存释放。函数的定义与调用函数参数的传递方式传值调用例2参数传递示例#include<stdio.h>swap(inta,intb){inttemp;temp=a;a=b;b=temp;printf(“inswapfunction\n”);printf("a=%d,\tb=%d\n",a,b);}main(){intx=7,y=11;printf(“inmainfunction,beforeswapped\n”);printf("x=%d,\ty=%d\n",x,y);swap(x,y);printf(“inmainfunction,afterswapped\n”);
printf("x=%d,\ty=%d\n",x,y);}运行结果:inmainfunction,beforeswappedx=7,y=11inswapfunctiona=11,b=7inmainfunction,afterswappedx=7,y=11…内存空间mainswapxyab711711本例参数的传递采用了传递值调用的方式。子函数swap的作用是交换a、b的值,但在调用函数main中,x、y的值依然保持不变。这是因为传值调用仅仅将实参x、y的值拷贝到swap的形参a、b中,在swap中交换的是形参a、b的值,并未影响到main中相应实参的值。如果希望swap中形参的操作能够影响到main中实参的值,可以使用传地址调用(见后续章节)。
函数的形参与实参有如下特点:(1)形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量;(2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值;(3)实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配的错误;(4)函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
返回语句:形式:return(表达式);或return表达式;或return;功能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数。说明:(1)函数至多可以返回一个值,不能返回多个值;(2)返回值的数据类型必须与函数原型中返回值的数据类型匹配;(3)当遇到return语句时,函数执行将终止。程序控制流将立即返回调用函数。函数的返回值函数的原型对使用被调用函数的要求:(1)必须是已存在的函数;(2)库函数:#include<*.h>;(3)用户自定义函数:函数类型原型说明。函数原型说明在形式上与函数头部类似,最后加一个分号。原型说明中参数表里的参数名可以不写(只写参数类型)。函数声明一般形式:
函数类型函数名(形参类型[形参名],…..);或函数类型函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验。注意:函数定义与函数声明不同。定义是指对函数功能的确立,从无到有对函数进行规划,而声明是对已经存在的函数进行说明并通知给编译系统,便于编译工作顺利完成。例3函数原型main(){floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}函数定义与函数声明不同。定义是指对函数功能的确立,从无到有对函数进行规划,而声明是对已经存在的函数进行说明并通知给编译系统,便于编译工作顺利完成。
函数的调用函数的调用方式:嵌套调用递归调用嵌套调用从一个函数调用另一个函数称为函数的嵌套调用
递归调用函数直接或间接的调用自身叫函数的递归调用。递归调用C编译系统对递归函数的自调用次数没有限制;每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息。实际中不是所有的问题都可以采用递归调用的方法。只有满足下列要求的问题才可使用递归调用方法来解决:能够将原有的问题化为一个新的问题,而新的问题的解决办法与原有问题的解决办法相同,按这一原则依次地化分下去,最终化分出来的新的问题可以解决。
递归调用例4求n的阶乘。#include<stdio.h>longfac(intn){longf;if(n<0)printf("n<0,dataerror!");elseif(n==0)f=1;elsef=fac(n-1)*n;return(f);}main(){intn;longy;printf("Inputaintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%ld",n,y);}递归调用5!=5*4!?4!=4*3!?3!=3*2!?2!=2*1!!1!=112624120递推结束开始回归递归调用递归调用的过程可分为如下两个阶段:第一阶段称为“递推”阶段:将原问题不断化为新问题,逐渐从未知的向已知的方向推测,最终达到已知的条件,即递归结束条件。第二阶段称为“回归”阶段:该阶段是从已知条件出发。按“递推”的逆过程,逐一求值回归,最后到递推的开始之处,完成递归调用。可见,“回归”的过程是“递推”的逆过程。递归调用(1)当函数调用自己时,在内存栈中为新的局部变量和参数分配内存,函数的程序用这些变量和参数重新运行;(2)递归调用的层次越多,同名变量的占用的存储单元也就越多。一定要记住,每次函数的调用,系统都会为该函数的变量开辟新的内存空间;(3)当本次调用的函数运行结束时,系统将释放本次调用时所占用的内存空间。程序的流程返回到上一层的调用点,同时取得当初进入该层时,函数中的变量和形参所占用的内存空间的数据;(4)所有递归问题都可以用非递归的方法来解决,但对于一些比较复杂的递归问题用非递归的方法往往使程序变得十分复杂难以读懂,而函数的递归调用在解决这类问题时能使程序简洁明了有较好的可读性;但由于递归调用过程中,系统要为每一层调用中的变量开辟内存空间、要记住每一层调用后的返回点、要增加许多额外的开销,因此函数的递归调用通常会降低程序的运行效率。对函数的多次递归调用可能造成堆栈的溢出,不过溢出的可能性不大。递归调用例5打印十进制整数对应的二进制码。方案#1:从最高位开始打印缺点:不知道位数的情况下难以操作方案#2:从最低位开始打印缺点:在不缓存中间结果的情况下打印的顺序与实际顺序相反思路:应该结合两种方案,从最低位开始获得每一位数字,利用递归机制中的栈缓存每一位数字,直到数字的最高位被获得,然后从最高位开始顺序打印即可。示例:打印a=10的二进制码最低位是:a%2=0将数右移一位:a=a/2=5最低位是:a%2=1将数右移一位:a=a/2=2最低位是:a%2=0将数右移一位:a=a/2=1最低位是:a%2=1将数右移一位:a=a/2=0a=0时表示所有的位都已获得,然后将获得最低位逆向打印,即得到结果是1010由此可知,打印一个整数的二进制可递归表示为:P(a)=先执行P(a/2),然后执行P(a%2)P(a)表示打印整数a的二进制码用递归函数实现如下:voidp(intn){if(n>1){p(n/2);p(n%2);}else{printf(“%d”,n);
}}变量的作用域与存储类型变量的作用域变量是对程序中数据的存储空间的抽象,必须先定义后使用,定义后其作用范围是受约束的。变量的有效使用范围就是作用域,其规则是:每个变量仅在定义它的语句块(包含下级语句块)内有效
变量的作用域与存储类型变量的作用域与存储类型变量的属性包括:操作属性:变量所持有的数据的性质,又称数据类型;存储属性:数据在内存中的存储方式,又称存储类型。变量定义格式:[存储类型]数据类型变量表;变量除作用范围受约束外,变量值存在的时间也受约束,变量不一定在程序执行过程中始终存在,即变量有生存期,变量值按(生存期)来分类,变量可分为静态存储变量和动态存储变量。所谓静态存储方式是指在程序运行期间分配固定的存储空间的方式。动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。变量的作用域与存储类型存储类型
名称说明auto自动变量局部变量在缺省存储类型的情况下归为自动变量。register寄存器变量存放在CPU的寄存器中。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。
static静态变量在程序执行时存在,并且只要整个程序在运行,就可以继续访问该变量。extern外部变量作用域是整个程序,包含该程序的各个文件。生存期非常长,它在该程序运行结束后,才释放内存。例6静态变量使用示例voiddisplay(){ staticintm=0;m++;if(m%5==0)printf(“\n”);elseprintf(“”);}voidmain(){ inti;for(i=0;i<20;i++){printf("%d",i);display();}}输出:012345678910111213141516171819在display中定义了一个静态的局部变量m用于换行控制,由于静态局部变量在整个程序运行期有效,存放于其中的数据并不会因为display调用结束而释放,而是一直存在于m中,这是与动态变量不同的地方。
预处理指令C语言预处理器是C编译程序的一部分,它负责分析处理几种特殊的指令,这些指令被称为预处理指令。宏定义宏定义语句是将一个标识符定义为一个字符串,在程序中出现的标识符在编译之前被替换为该字符串,这个过程叫“宏替换”(或宏展开)。宏定义带参数的宏定义的展开过程:在程序中如果有带实参的宏,则按#define命令行中指定的字符串从左到右进行置换。如果串中包含有宏中的形参,则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参,如果宏定义中的字符串中的字符不是参数字符,则保留。宏定义(1)对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参。特别要注意多参数的情况;(2)在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。宏定义例7宏展开示例#definePI3.1415926#defineS(r)PI*(r)*(r)main(){floata,b,area;a=1;b=2;area=S(a+b);printf(“area
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 天津市红桥区复兴中学2025年初三4月中考复习质量监测卷(七)物理试题含解析
- 江西服装学院《大学英语非艺术类》2023-2024学年第一学期期末试卷
- 西藏林芝二中2024-2025学年高三第三次模拟考试试题英语试题含解析
- 浙江树人学院《建筑结构设计A》2023-2024学年第二学期期末试卷
- 郑州旅游职业学院《计算机视觉基础及应用》2023-2024学年第二学期期末试卷
- 中南林业科技大学《中外剧作家及作品研究》2023-2024学年第二学期期末试卷
- 临沂科技职业学院《建筑工程制图与识图》2023-2024学年第二学期期末试卷
- 山东省滨州市三校联考2024-2025学年高三下学期动态性教学质量检测试题考前适应卷物理试题含解析
- 上饶幼儿师范高等专科学校《物流专业英语》2023-2024学年第二学期期末试卷
- 山东司法警官职业学院《建筑设备基础》2023-2024学年第一学期期末试卷
- 小学特色课程《口风琴课程》校本教材
- 《新疆大学版学术期刊目录》(人文社科)
- 肛瘘LIFT术式介绍
- 上下游购销合同的范本.文档
- 《有色金属材料制备与应用》课件 5-铝合金的净化处理
- 当前社会思潮与国家意识形态安全
- JGJT296-2013 高抛免振捣混凝土应用技术规程
- DB6110-T 039-2023 桔梗栽培技术规范
- 部编版初中语文文言文主题分类梳理1
- 第8课 用制度体系保证人民当家做主
- 砂子检验报告-焦化
评论
0/150
提交评论