版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章函数与编译预处理程序设计基础1第4章函数与编译预处理
4.1函数概述4.2函数定义与调用4.3局部变量和全局变量4.4变量的生存期和存储类别4.5
编译预处理24.1函数概述……C程序源程序文件n函数1函数m……源程序文件1函数1函数n4.1.1函数简介3【例】
#include<stdio.h>voidprint_line()/*函数定义*/{printf("*********************************\n");}voidprint_text()/*函数定义*/{printf("WelcometoBeijing\n");}voidmain(){print_line();/*函数调用*/print_text();/*函数调用*/print_line();/*函数调用*/}程序的执行总是从main函数开始4voidmain函数{
……
调用函数
print_line();
……}函数
print_line(){
……
}5⑴一个C源程序可以由一个或多个源程序文件组成。C编译系统在对C源程序进行编译时是以文件为单位进行的。⑵一个C源程序文件可以由一个或多个函数组成。所有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。⑶在一个C程序中,有且仅有一个主函数main。C程序的执行总是从main函数开始,调用其它函数后最终回到main函数,在main函数中结束整个程序的运行。说明6⑷函数的种类从使用的角度看:①标准函数(库函数)库函数是由系统提供的。如:getchar()、sin(x)等。在程序中可以直接调用它们。附录B列出了C的部分库函数。②用户自定义函数。如:例中的print_line()函数。7由C编译系统定义的一种函数,存放在系统函数库中,用户可以根据需要随时调用常用函数如:fabs、sqrt、sin、pow、rand(常用数学函数参见教材P100表4-1和附录B
)函数调用形式:函数名([参数表])例如:
sqrt(x)4.1.2数学库函数8例#include<math.h>#include<stdio.h>voidmain(){floatx=4.5;
printf("%f,%f,%f\n",sqrt(x),pow(x,2),fabs(-x));}输出结果:2.121320,20.250000,4.50000094.2.1函数的定义函数定义的一般形式函数类型函数名(类型名形式参数1,…
){说明语句
执行语句}例如:求两个数的最大值。
int
max(int
x,inty){intz;z=x>y?x:y;return(z);}4.2函数定义及调用10#include<stdio.h>int
cube(inty);/*函数原型声明*/voidmain(){
int
x,last,nowcb;last=1;printf("1~5之间,相邻两数的立方差是:\n");
for(x=2;x<=5;x++){
nowcb=cube(x);/*函数调用*/
printf("%d",nowcb-last);last=nowcb;}
printf("\n");}/*函数定义*/
int
cube(inty)/*函数首部*/{returny*y*y;}例4-1编写一个函数cube,计算整数的立方。花括号中也可以为空,这种函数叫空函数。不能在函数体内定义其他函数,即函数不能嵌套定义。11函数名(实参表列)在C语言中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用。例如:①welcome();/*函数调用语句*/②if(iabs(a)>max)max=iabs(a);
/*函数调用构成表达式*/
③m=max(c,max(a,b));/*函数调用作为函数参数*/4.2.2函数的调用函数调用的一般形式:12voidswap(intx,inty){intz;z=x;x=y;y=z;
printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;
swap(a,b);
printf("\na=%d,b=%d\n",a,b);}4.2.3函数参数传递与返回值1.函数的参数传递(值传递)程序输出结果:x=20,y=10a=10,b=20形式参数(形参)实际参数(实参)【例】编一程序,将主函数中的两个变量的值传递给swap函数中的两个形参,交换两个形参的值。单向值传递13有关形参和实参的说明:
①当函数被调用时才给形参分配内存单元。调用结束,所占内存被释放。②实参可以是常量、变量或表达式,但要求它们有确定的值。③实参与形参类型要一致,字符型与整型兼容。④实参与形参的个数必须相等。在函数调用时,实参的值赋给与之相对应的形参。“单向值传递”。14函数的返回值是通过return语句带回到主调函数的功能:终止函数的运行,返回主调函数,若有返回值,将返回值带回主调函数。说明:①若函数没有返回值,return语句可以省略。②return语句中的表达式类型一般应和函数的类型一致,如果不一致,系统自动将表达式类型转换为函数类型。2.函数的返回值return语句格式:return;或return表达式
;15【例】计算并输出圆的面积。#include<stdio.h>s(intr){return3.14*r*r;}voidmain(){intr;
scanf("%d",&r);
printf("%d\n",s(r));}自动转换为int型程序运行情况如下:2'12说明:①函数的类型决定了函数返回值的类型。若省略函数的类型,系统默认其为int型。②无返回值的函数应将其类型定义为void(空)类型。16【例4-8】编写函数实现两组变量的显示定义2组,共8个整型变量a1……a4,b1……b4,要求:输入字符a和整数1,显示a1变量的值,输入字符b和整数1,显示b1变量的值……17#include<stdio.h>int
ArrayOperating(int
i,char
ch){inta1=1,a2=0,a3=3,a4=5;
intb1=2,b2=0,b3=4,b4=3;
switch(i){case1:
switch(ch) {case'a':returna1;case'b':returnb1; }case2:……case3:……case4:……}}voidmain(){int
i;char
ch;
printf("输入显示的变量,形式如:a1或b4:");
scanf("%c%d",&ch,&i);
printf("%c%d=%d\n",ch,
i,ArrayOperating(i,ch));}184.2.4函数的嵌套调用main函数{
……
调用函数A;
……}函数A{……
调用函数B;
……}函数B{
……
……
……}19【例】函数的嵌套调用main(){intn=3;
printf("%d\n",sub1(n));}sub1(intn){int
i,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序输出结果:920
4.2.5对被调函数的声明和函数原型变量要先定义后使用,函数也如此。即被调函数的定义要出现在主调函数的定义之前。如swap函数.voidswap(intx,inty){…}main(){…
swap(a,b);
}main(){…c=max(a,b);}max(int
x,inty){…}允许整型函数(且参数也是整型)的定义出现在主调函数之后。如max函数.21对被调函数进行声明的一般形式
函数类型函数名(参数类型1
参数名1,…);或函数类型函数名(参数类型1,参数类型2,…);第二种形式省略了参数名,此种形式也称为函数的原型。如果非整型函数在主调函数之后定义,则应在主调函数中或主调函数之前对被调函数进行声明。22#include<stdio.h>voidmain(){floatcalc(float
x,float
y,char
opr);floata,b;charopr;
printf("\n输入四则运算表达式:");
scanf("%f%c%f",&a,&opr,&b);
if(opr=='+'||opr=='-'||opr=='*'||opr=='/')printf("%5.2f%c%5.2f=%6.2f\n",a,opr,b,calc(a,b,opr));elseprintf("非法运算符!\n");}floatcalc(float
x,float
y,char
opr){switch(opr){case'+':return(x+y); case'-':return(x-y); case'*':return(x*y); case'/':return(x/y);}}}对被调函数的声明【例4-12】计算并输出两个数的和、差、积、商。234.3局部变量和全局变量变量的作用域:变量在程序中可以被使用的范围。根据变量的作用域可以将变量分为局部变量和全局变量。局部变量(内部变量):在函数内或复合语句内定义的变量以及形参。作用域:函数内或复合语句内。4.3.1局部作用域和局部变量【例】分析下面程序的运行结果及变量的作用域。24voidsub(int
a,int
b){
int
c;a=a+b;b=b+a;c=b-a;printf("sub:\ta=%db=%dc=%d\n",a,b,c);}局部变量voidmain(){
int
a=1,b=1,c=1;
printf("main:\ta=%db=%dc=%d\n",a,b,c);
sub(a,b);
printf("main:\ta=%db=%dc=%d\n",a,b,c);
{
int
a=2,b=2;
printf("comp:\ta=%db=%dc=%d\n",a,b,c);}
printf("main:\ta=%db=%dc=%d\n",a,b,c);}局部变量局部变量“分程序”或“程序块”程序输出结果:main: a=1b=1c=1sub: a=2b=3c=1main:a=1b=1c=1comp:a=2b=2c=1main: a=1b=1c=1254.3.2全局作用域和全局变量全局变量(外部变量):在函数外部定义的变量。作用域:从定义变量的位置开始到本源文件结束。如在其作用域内的函数或分程序中定义了同名局部变量,则在局部变量的作用域内,同名全局变量暂时不起作用。【例】全局变量和局部变量的作用域。26int
a=5; voidf(int
x,int
y) {
int
b,c; b=a+x;c=a-y;printf("%d\t%d\t%d\n",a,b,c);}局部变量main(){int
b=6,c=7;
f(b,c);
printf("%d\t%d\t%d\n",a,b,c);
{
int
a=9,b=8;
printf("%d\t%d\t%d\n",a,b,c);
{
c=10;
printf("%d\t%d\t%d\n",a,b,c);
}
printf("%d\t%d\t%d\n",a,b,c);
}
printf("%d\t%d\t%d\n",a,b,c);}局部变量局部变量程序输出结果:511-2567987981098105610全局变量“分程序”或“程序块”int274.4变量的生存期和存储类别4.4.1变量的生存期变量的生存期:变量在内存中占据存储空间的时间。程序代码区静态存储区动态存储区存储分配动态存储变量静态存储变量284.4.2变量的存储类别变量的属性数据类型:决定为变量分配内存单元的长度,数据的存放形式,数的范围。存储类别:决定了变量的生存期,给它分配在哪个存储区。29变量定义语句的一般形式存储类别数据类型变量名1,…,变量名n;auto(自动的)register(寄存器的)static(静态的)
extern(外部的)301.自动变量(auto类别)main()
{int
x,y;…}main()
{auto
int
x,y;…}自动变量等价可省局部变量可以定义为自动变量。31main(){int
a,b,c;
printf(“Entera,b:\n”);
scanf(“%d%d”,&a,&b);c=sum(a,b);
printf(“Sum=%d\n”,c);}sum(int
a,intb){intc=0;
c=a+b;
return(c);}printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);c=a+b;return(c);printf(“Sum=%d\n”,c);main()Entera,b:内存用户区静态存储区am
不定bm
不定cm
不定12<回车>as=1bs=2cs=0bm=2am=1sum(int
a,intb)Sum=3程序程序区动态存储区观察下列程序运行时变量的存储情况单击开始运行as=1bs=2cs=3运行结束cm=3
32⑴内存分配调用函数或执行分程序时在动态存储区为其分配存储单元,函数或分程序执行结束,所占内存空间即刻释放。⑵变量的初值定义变量时若没赋初值,变量的初值不确定;如果赋初值则每次函数被调用时执行一次赋值操作。⑶生存期在函数或分程序执行期间。⑷作用域自动变量所在的函数内或分程序内。自动变量332.静态变量(static类别)除形参外,局部变量和全局变量都可以定义为静态变量。static
int
a;main(){floatx,y;…}f(){static
int
b=1;……}全局静态变量局部静态变量自动变量不能省34⑴内存分配编译时,将其分配在内存的静态存储区中,程序运行结束释放该单元。⑵静态变量的初值若定义时未赋初值,在编译时,系统自动赋初值为0;若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值。⑶生存期整个程序的执行期间。⑷作用域局部静态变量的作用域是它所在的函数或分程序。全局静态变量的作用域是从定义处开始到本源文件结束。静态变量35staticintb=0;main(){int a=2,i;for(i=0;i<2;i++)
printf("%4d",f(a));
printf("\n");}int
f(inta){staticintc=3;b++;c++;return(a+b+c);}【例】静态变量的使用。main()for(i=0;i<2;i++)printf("%4d",f(a));int
f(inta)b++;c++;return(a+b+c);for(i=0;i<2;i++)printf("%4d",f(a));int
f(inta)b++;c++;return(a+b+c);printf("\n");for(i=0;i<2;i++)36int
c;staticint
a;main(){floatx,y;…}chars;f(){staticint
b=1;……}3.外部变量(extern
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024中国电信吉林四平分公司校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国建筑国际工程公司招聘35人易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国华电集团清洁能源限公司华南分公司面向华电系统内公开招聘1人易考易错模拟试题(共500题)试卷后附参考答案
- 2024东方航空公司江西分公司招聘地面服务部特种车辆司机1名易考易错模拟试题(共500题)试卷后附参考答案
- 2024上海市汽车修理限公司招聘若干人易考易错模拟试题(共500题)试卷后附参考答案
- 2024“才聚齐鲁成就未来”山东海洋集团安全生产管理人才夏季招聘8人易考易错模拟试题(共500题)试卷后附参考答案
- 第2章 科学和文明的起源-东方文明1 3学时课件
- 2024浙江绍兴市本级卫生健康单位赴浙江中医药大学开展应届医学类毕业生招聘53人笔试核心备考题库及答案解析
- 2025年国网智慧车联网技术有限公司招聘3人笔试核心备考题库及答案解析
- 6新沪科版八年级物理第一学期期末考试试题(含答案)(适用于山东)
- 《中国痤疮治疗指南》解读
- 期末复习《艾青诗选》 统编版语文九年级上册
- 第3章(1)工程电磁兼容(第二版)(路宏敏)
- 学校食堂食品安全自查总结报告
- 创伤骨科新进展新技术
- 大班科学《球体和圆柱体》
- 食管癌围手术期护理教学查房
- MOOC 以案说法-中南财经政法大学 中国大学慕课答案
- 黑龙江省齐齐哈尔市依安县等4地2023-2024学年九年级上学期期末历史试题
- 2024年应急救护知识考试题库300题(含答案)
- 中国电信未来五年信息化发展规划方案出台
评论
0/150
提交评论