C语言程序设计 - 第7章 函数_第1页
C语言程序设计 - 第7章 函数_第2页
C语言程序设计 - 第7章 函数_第3页
C语言程序设计 - 第7章 函数_第4页
C语言程序设计 - 第7章 函数_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

小小顶梁柱—函数C语言程序设计第七章本章目录01.函数的定义02.函数的调用03.函数的声明04.变量的作用域05.趣味实例7.1函数的定义将功能封装为独立模块定义函数一般形式类型说明符函数名(形参列表)

{说明部分执行部分}各部分详解“类型说明符”是指函数返回值的类型。函数类型可以省略,当不指明函数类型时,系统默认的是整型。函数名:遵循标识符命名规则,不可省略,用于调用函数形参列表:函数的输入接口,接收外部传递的数据。函数体:包裹在{}中的代码块,实现具体功能,函数内部应有自己的说明语句和执行语句,花括号{}是不可以省略的。函数的参数形式参数(形参)函数定义时括号内声明的变量,仅在函数内部有效(局部变量)。作用是接收调用者传递的数据,作为函数执行的输入。实际参数在函数调用中传递数据的参数称为实际参数,简称实参。代码示例例如:求两个整数的较大者的max函数,在该程序中,子函数中的变量x、y是形参,主函数中的变量a、b是实参。函数参数说明实例函数的参数函数参数说明:1)函数的形参可以有多个,可以相同类型,也可以是不同类型,如intmax(intx,inty)或者intmax(intx,floaty)。相同类型也不可以省略形参前的类型说明,如intmax(intx,y)。2)形参必须是变量,但实参可以是常量、变量和表达式,例如C=max(10,a+b)。3)实参类型必须与形参类型兼容。4)在C语言中,函数进行的是“值传递”,将实参的值传递给形参。这种传递是单向的,即形参的变化并不传递给实参。这是由于形参和实参在内存中分别占用不同的内存单元,形参单元的值改变不会影响到实参单元中的值。函数的参数在函数max()中x、y的值有变化时,在main()函数中实参a和b的值仍然是5和6。因为值的传递是a—>x,b—>y,但不能反向传递,这就是“单向值传递”函数参数传递参数传递示意图函数的返回值函数的返回值--return语句功能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数。作用:函数与外界交互的重要接口,传递计算结果。return语句书写形式return(表达式);

或return表达式;

或return;使用说明:1)

函数中可有多个return语句,但每次只能有一条被执行。2)若函数类型与return语句中表达式值的类型不一致,按前者为准,此时系统将对数值进行类型转换。3)如果明确表示不需要返回值,可用void型函数,

即定义函数时,类型定义为void型,而且函数中可不必使用return语句。4)

如果函数中没有return语句,并不代表没有返回值,而是返回

个不确定的值。实例体验:分析:前面学习的圆面积编程是在主函数中编写的,本例中用子函数编写,其程序段与以前类似,只不过要确定函数名、参数和返回值等内容。例7-1定义一个函数,其功能是已知半径r,求圆的面积。程序代码:floatcirclearea(intr){floatarea;area=3.14*r*r;return(area);}实例体验:问题描述:棋盘上的米粒在一个古老的王国里,国王为了奖励一位聪明的数学家,决定在棋盘上放米粒作为奖励。第1个格子放1粒米,第2个格子放2粒,第3个格子放6粒,第4个格子放24粒…每个格子的米粒数都是前一个格子数的倍数。数学家微笑着对国王说:"陛下,这个奖励看似简单,但随着格子数的增加,米粒数会迅速增长,最终会超出您的想象。"国王不以为然,认为这不过是些小数目。然而,

当数学家计算出第20个格子的米粒数时,国王惊呆了—那是一个天文数字!这就是求解阶乘的故事。下面我们尝试使用函数来解决求阶乘的问题。例7-2求阶乘—函数的优越性。实例体验:程序代码:#include<stdio.h>longfactorial(intn){inti,result=1;for(i=1;i<=n;i++)result*=i;returnresult;}例7-2求阶乘—函数的优越性。main(){intnum1,num2;printf("请输入两个整数:");scanf("%d%d",&num1,&num2);printf("%d!=%ld\n",num1,factorial(num1));printf("%d!=%ld\n",num2,factorial(num2));}7.2函数的调用使用已定义的功能模块函数的调用形式函数的调用形式主函数使用被调函数的功能,称为函数的调用。在C语言中,只有在函数调用时,函数体中定义的功能才会被执行。C语言中函数调用的一般形式为:函数名(类型形参,类型形参,…);对无参函数调用时,则无实际参数表。实际参数表中的参数可以是常数、变量或其他构造类型数据及表达式,各实参之间用逗号分隔。例如:d=max(a,b);或d=max(3,a);或d=max(max(a,b),c)函数的调用形式函数表达式表达式包含函数项时,要求函数必须有返回值,以函数的返回值参与表达式的运算。“z=max(x,y);”是一个赋值表达式,把max的返回值赋予变量z函数语句函数调用的一般形式加上分号即构成函数语句。无论函数是否有返回值,都可用这种方式调用。printf("%d",a);scanf("%d",&b);函数实参函数可以作为另一个函数调用的实际参数出现,这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须有返回值。printf("%d",max(x,y));/*把max()调用的返回值作为printf()函数的实参*/函数调用的语法要求语法规则1)调用函数时,定义和说明的函数名必须与被调用的函数名完全一样;实参的个数、类型和形参的个数、类型一致。2)C语言规定函数必须先定义,后调用,即被调用的函数必须在调用之前加以说明或在调用函数之前定义。3)C语言中的函数定义都是相互平行的、独立的,不允许嵌套定义函数,但允许嵌套调用函数(在调用一个函数的过程中,再调用另一个函数)main(){intmax(intx,inty);inta,b;intc;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}

7-3找出两个整数的最大值程序执行流程实例体验:实例体验:问题描述:智能书法评分系统在中华传统文化中,书法是一门极具艺术价值的技艺。随着现代科技的发展,我们可以通过计算机程序来辅助评估书法的质量。假设你正在开发一个“智能书法评分系统”,该系统可以根据用户输入的书法作品的笔画长度、笔画粗细、字形结构等参数,自动计算出书法作品的评分。例7-4传统文化与现代科技的结合—智能书法评分系统。实例体验:程序代码:#include<stdio.h>floatscore(floatlen,floatthi,floatstr)//计算书法评分的函数{return(len*0.4)+(thi*0.3)+(str*0.3);}voidprint(floats)//输出评分和评价的函数{printf("书法作品评分为:%.2f\n",s);if(s>=90){printf("评价:优秀\n");}elseif(s>=70){printf("评价:良好\n");}elseif(s>=60){printf("评价:及格\n");}else{printf("评价:需要改进\n");}}main(){floatlen,thi,str;printf("请输入书法作品的笔画长度评分:");scanf("%f",&len);printf("请输入书法作品的笔画粗细评分:");scanf("%f",&thi);printf("请输入书法作品的字形结构评分:");scanf("%f",&str);floats=score(len,thi,str);//调用函数计算评分print(s);//调用函数输出评分和评价}例7-4传统文化与现代科技的结合—智能书法评分系统。7.3函数的声明告诉编译器函数的存在函数声明的格式在主调函数中调用某函数之前,应对该被调函数进行声明,其作用是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值进行相应的处理。书写格式与说明一般形式:类型说明符被调函数名(类型形参,类型形参,…);1.在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:intmax(int,int);2.函数的声明和函数的定义有本质上的不同,主要区别在以下两个方面:1)函数的定义是编写一段程序,应有函数的具体功能语句—函数体;而函数的声明仅是向编译系统的一个说明,不含具体的执行动作。2)在程序中,函数的定义只能有一次,而函数的声明可以有多次。函数声明的位置与作用域函数声明位置:函数内或函数外。intmax(intx,inty);main(){intmax(intx,inty);inta,b;intc;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}

小贴士:在下列情况下,无需进行函数声明:1)被调用函数定义出现在主调函数之前,如上例中,将max()函数段写在主函数的前面max()函数就可以不声明。2)若函数返值是int或char型,也可不声明函数,系统自动按int型处理。在所有函数外部声明被调用函数,其后所有函数都可以调用该函数在调用函数内部声明被调用函数,只有调用函数内部才可调用该函数实例体验:程序代码:fun1(inta,intb){intc;a+=a;b+=b;c=fun2(a,b);returnc*c;}fun2(inta,intb){intc;c=a*b%5;returnc;}main(){intx=21,y=12;printf(“fun1(x,y)=%d,”,fun1(x,y));printf(“x=%d,y=%d”,x,y);}例7-6运行下面的程序,观察现象,找出原因并修改程序。7.4变量的作用域变量在何处起作用局部变量核心定义局部变量是在函数内部声明的变量,包括函数的形参。这些变量只在声明它的函数内部使用,在函数外不能使用,即“谁声明谁使用”说明1)形参属于局部变量。2)main()函数中定义的变量只在main()函数中有效,不能因为在main()函数中定义就在整个文件或程序中有效。main()函数也不能使用其他函数中定义的变量。3)不同函数中的同名变量,占有不同内存单元,因此不会相互影响。4)复合语句中定义的变量也属于局部变量,变量的作用域在复合语句内,这种复合语句也称为“分程序”或“程序块”。代码示例(C语言)floatf1(inta){intb,c;…}charf2(intx,inty){inti,j;…}main(){intm,n;…}a、b、c有效x、y、i、j有效m、n有效全局变量核心定义在函数外定义的变量称为全局变量,又称全程变量或外部变量。全局变量的有效范围是从定义的位置直至它所在源程序文件的结束。说明1)全局变量的作用域从定义位置开始,在这个范围内的任何地方都可使用(包括函数中)。2)全局变量可以作用于它所在的整个程序或外部的程序,但需要另外说明,其存储类型也会影响其作用的范围。3)若全局变量与局部变量同名,则全局变量被屏蔽。4)全局变量的使用增加了函数之间传递数据的途径。当函数需返回多个结果时,可通过全局变量实现数据传递。5)应尽量少使用全局变量,因为全局变量在程序执行过程中占用存储单元,若使用过多,很难判断出全局变量的当前值,因此降低程序清晰性,容易出错。实例体验:程序代码:#include<stdio.h>sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}main(){inta,b;a=3;b=4;sub();printf("main:a=%d,b=%d\n",a,b);printf("main:a=%d,b=%d\n",a,b);}例7-7局部变量示例实例体验:问题描述:古代天文历法与现代气象预测在中国古代天文历法中,如24节气,展现了中华民族在天文观测和气象预测方面的卓越智慧。随着现代科技的发展,我们可以通过计算机程序来模拟和监测节气温度变化,从而更精准地预测天气。请开发一个“节气温度监测系统”,根据用户输入的节气温度数据,判断当前温度是否在正常范围内,并输出相应的提示信息。例7-8古代天文历法与现代气象预测—节气温度监测系统实例体验:程序代码:#include<stdio.h>sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}main(){inta,b;a=3;b=4;sub();printf("main:a=%d,b=%d\n",a,b);printf("main:a=%d,b=%d\n",a,b);}例7-8

古代天文历法与现代气象预测—节气温度监测系统实例体验:程序代码:#include<stdio.h>floatminTemp,maxTemp;voidtemperature(floattemp){if(temp<minTemp){printf("温度过低,注意保暖\n");}elseif(temp>maxTemp){printf(

温馨提示

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

评论

0/150

提交评论