版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章函数8.1函数概述8.2函数定义的一般形式8.3函数参数和函数的值8.4函数的调用8.5函数的嵌套调用8.7数组作为函数参数8.8局部变量和全局变量8.9变量的存储类别8.1函数概述一、有关C函数的介绍一个源程序文件由一个或多个函数组成(一个源程序文件是一个编译单位)2.一个C程序由一个或多个源程序文件组成3.C程序从main函数开始执行,
调用其他函数后再返回到main函数4.所有函数都是平行的,定义函数时是互相独立的,
函数之间可以互相调用,但是不能调用main函数#include<stdio.h>#include<math.h>main(){inta,b,c;
scanf(“%d%d”,&a,&b);c=a+abs(b);
printf(“c=%d\n”,c);}二、C函数的分类1.从用户使用角度分为:标准函数和用户自定义函数2.从函数的形式分为:无参函数和有参函数#include<stdio.h>intmax(intx,inty){intz;if(x>y)z=x;elsez=y;
return(z);}main(){inta,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);printf(“max=%d”,c);}函数定义函数调用形式参数#include<stdio.h>main(){printf(“******\n”);printf(“good\n”);printf(“******\n”);}#include<stdio.h>list(){printf(“******\n”);}main(){list();printf(“good\n”);
list();}实在参数(3)形式参数①书写格式:每一个参数都要写上数据类型和参数名,参数之间以逗号分隔。②作用:表示将从主函数中接收哪些类型的信息例:intmax(intx,inty){intz;z=x>y?x:y;return(z);}(4)函数体:由变量声明和语句组成①函数体内定义的变量是局部量,只在执行该函数时存在②函数体可以为空(即存在空函数)f(){}8.3函数参数和函数的值一、形式参数和实在参数1.形式参数:在定义函数时写在函数名后面的括号内的变量2.实在参数:在调用函数时写在函数名后面的括号内的变量3.说明程序在编译时不为形参分配存储空间,只有当函数被调用时,形参被分配存储空间,在调用结束后,形参所占的空间被释放(2)实参可以是常量,变量或表达式(有确定的值)(3)实参和形参的类型应相同或赋值相容(4)实参对形参的数据传递是“值传递”,即单向传递二、函数的返回值1.函数的返回值通过函数中return语句获得
return语句的作用:使流程返回主调函数;
将函数值送回到调用表达式中2.函数类型决定函数返回值的类型一般函数值的类型和return语句中表达式的类型应一致如果二者不一致,则以函数值的类型为准3.有的函数中没有return语句,因为它不需要带回值,这时可以将函数类型定义为void型voidlist(){printf(“******\n”);}4.一个函数允许有一个或多个return语句,但每个return后的表达式类型要相同;当执行到其中任何一个return语句时会立即返回主调函数intfun(intn){if(n>10)return(n);elsereturn(2*n);}
4.函数调用过程:(1)形参与实参各自占有一个独立的存储空间
(2)形参的存储空间在函数被调用时才分配
(3)函数返回时,形参占据的临时存储区被撤消
特点:函数中对形参变量的操作不会影响到实参#include<stdio.h>intf(intx,inty){x=x+2;y=y*2;
return(x+y);}main(){inta,b,c;scanf(“%d%d”,&a,&b);
c=f(a,b);
printf(“%d\n”,c);}假设输入为:35main函数f函数abcxy353551015#include<stdio.h>main(){intf(intx,inty);inta,b,c;scanf(“%d%d”,&a,&b);c=f(a,b);printf(“%d\n”,c);}intf(intx,inty){x=x+2;y=y*2;return(x+y);}#include<stdio.h>intf(intx,inty);main(){inta,b,c;scanf(“%d%d”,&a,&b);c=f(a,b);printf(“%d\n”,c);}intf(intx,inty){x=x+2;y=y*2;return(x+y);}4.声明的位置:(1)在main函数中声明(2)所有函数进行外部声明函数声明函数声明函数定义函数定义8.5函数的嵌套调用C语言规定函数定义都是平行的、独立的,即函数不能进行嵌套的定义,但是函数可以进行嵌套调用
.
函数的嵌套调用是指在调用一个函数的过程中调用另一个函数.main(){:fun();:}voidfun(void){:g();:}main函数fun函数g函数调用调用嵌套调用#include<stdio.h>voidfa(void){putchar(‘a’);}voidfb(void){fa();putchar(‘t’);}main(){putchar(‘c’);fb();}main输出c调用fb结束fb调用fa输出tfa输出a结束结束输出结果:cat8.6函数的递归调用1.函数递归调用的概念:在调用一个函数的过程中又直接或间接地调用该函数自己复习上次内容(提问)1、函数分类:标准自定义有参无参2、函数定义:intmax(intx,inty){}3、函数形参实参4、函数调用:函数语句函数表达式函数参数5、函数返回值:return(z)6、函数声明:在main()中声明在所有函数外部声明7、函数嵌套调用8.7数组作为函数参数一、数组元素作函数参数其用法与变量作实在参数一样,是单向传递。例已知10个三角形的边,求它们的面积。#include“math.h”floatarea(floata,floatb,floatc){floatp,s;p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c));return(s);}数组元素就是下标变量,它与普通变量并无区别。数组元素只能用作函数实参,其用法与普通变量完全相同:在发生函数调用时,把数组元素的值传送给形参,实现单向值传送。例写一函数,统计字符串中字母的个数。intp(charc){if(c>='a'&&c<='z'||c>='A'&&c<='Z')
return(1);elsereturn(0);}main(){inti,num=0;charstr[255];printf("Inputastring:");gets(str);for(i=0;str[i]!='\0';i++)if(p(str[i]))num++; puts(str); printf("num=%d\n",num);
}
说明:(1)用数组元素作实参时,只要数组类型和函数的形参类型一致即可,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。(2)在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送,是把实参变量的值赋予形参变量。#include<stdio.h>main(){inti,sum,s[40];floatave;for(i=0;i<=39;i++)scanf(“%d”,&s[i]);
sum=0;for(i=0;i<=39;i++)sum=sum+s[i];ave=sum/40;
printf(“ave=%f”,ave);}#include<stdio.h>floataverage(ints[40]);main(){inti,sc[40];floataver;for(i=0;i<=39;i++)scanf(“%d”,&sc[i]);
aver=average(sc);printf(“aver=%f”,aver);}floataverage(ints[40]){intsum,i;floatave;
sum=0;for(i=0;i<=39;i++)sum=sum+s[i];
ave=sum/40;return(ave);}例:求某班成绩的平均分数组占用存储空间sc[0]sc[1]sc[2]::::sc[39]mainaverages[0]s[1]s[2]::::s[39]main输入sc的40个元素aver=average(sc)输出aver调用averagescssum=0计算sum返回ave的值结束ave=sum/40788490::::668.8(8.9)变量的作用域和存储方式一、局部变量:指在一个函数内部定义的变量,它只在本函数的范围内有效,在此函数之外不能使用这些变量说明:1.main函数中定义的变量是局部变量,它们只能在main函数中使用2.不同函数中可以使用相同名字的变量,它们互不干扰3.形式参数也是局部变量4.可在一个复合语句中定义变量,它们只在复合语句内有效变量分类按生存期静态存储变量动态存储变量按作用域全局变量局部变量#include<stdio.h>sort(inta[],intn);main(){intb[6],i;for(i=0;i<6;i++)scanf(“%d”,&b[i]);sort(b,6);for(i=0;i<6;i++)printf(“%3d”,b[i]);
}
sort(
inta[],intn){
inti,j,k;
for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(a[k]>a[j])k=j;if(k!=i){intt;
t=a[i];a[i]=a[k];a[k]=t;}}}main函数中的局部变量:b和isort函数中的局部变量:i,j,k参数a和n也是局部变量t是复合语句中的局部变量,只能在以下3个赋值语句中使用二、全局变量:指在所有函数之外定义的变量(外部变量),
它的有效范围从定义变量的位置开始到本源文件结束#include<stdio.h>intp=1,q=5;floatf1(inta){floatr;:}ints[10];intf2(intb,intc);{intsum;:}floatm,n;main(){floatx,y;:}全局变量m和n的有效范围全局变量数组s的有效范围全局变量p和q的有效范围2.建议不要过多的使用全局变量
(1)全局变量在程序的执行过程中一直占用存储单元
(2)它使函数的通用性降低
(3)它会降低程序的清晰性3.在一个源文件中如果局部变量和全局变量同名,在局部变量起作用的范围内,全局变量不起作用#include<stdio.h>intx=10;f(){intx=1;x=x+1;printf(“x=%d\n”,x);}main(){x=x+1;
printf(“x=%d\t”,x);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB5111T49-2024西坝生姜 种姜繁殖技术规程
- DB3303T+080-2024《“共享社·幸福里”建设规范》
- 瞳孔-七上生物探究
- 煤炭行业在精准扶贫中的作用考核试卷
- 低温仓储的物流组织与运输分拨考核试卷
- 石棉与文化遗产的关系考核试卷
- 医疗废弃物的分类与处置方法考核试卷
- 2025年高考物理专项复习:光电效应及原子结构模型(分层练)(解析版)
- 中等教育的学生创新与科研能力培养考核试卷
- 企业培训中的模拟演练方法考核试卷
- 2024年二级制图员技能理论考试题库大全-上(单选题)
- 2024中国中煤招聘笔试冲刺题(带答案解析)
- 《湖南省医疗保险“双通道”管理药品使用申请表》
- 2024年航天科技集团一院18所招聘21人公开引进高层次人才和急需紧缺人才笔试参考题库(共500题)答案详解版
- 《海滨小城》第二课时 公开课一等奖创新教学设计
- 城市轨道综合实训总结报告
- MOOC 宪法学-西南政法大学 中国大学慕课答案
- 学生的权利与义务-学生的法律地位及权利保护
- 【教案】心灵的幻象+教学设计-高一美术湘美版(2019)美术鉴赏
- 人教版2022-2023学年三年级语文上册期中试卷及答案
- GB/T 20001.1-2024标准起草规则第1部分:术语
评论
0/150
提交评论