




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,有参函数 int max(int x, int y) int z; z=xy?x:y; return(z); ,无参函数 void printstar(void) printf(“*n”); ,7.2 函数的定义,1、函数定义的一般格式,存储类别 函数类型 函数名(形参列表) 说明部分 语句部分 ,函数带回来的值的类型 若缺省为:int整型 函数没有返回值定义void,2,2、函数的返回 返回语句的形式: 功能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数 说明:只能返回一个值,而不能返回多个值。,return (表达式); return 表达式; return;,3,函数语句 printstar(10); 表达式方式 函数调用出现在表达式中,函数的返回值参加表达式的运算。 c=5*max(a,b); 作为函数的参数 printf(“max=%d”, max(a,b) ); c=max(k,max(i,j);,函数的调用方式,4,【例7-3】 输出数字金字塔,#include void main(void) int num; void pyramid(int n); printf(“请输入金字塔的层数:“); scanf(“%d“, ,请输入金字塔的层数:5 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 Press any key to continue,5,void pyramid(int n) int i, j; for(i=1; i=n; i+) for(j=1; j=n-i; j+) /*输出左侧空格*/ printf(“ “); for(j=1; j=i; j+) /*输出数字*/ printf(“%d “,i); printf(“n”); /*换行*/ ,请输入金字塔的层数:5 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 Press any key to continue,6,【例7-4】 判断素数,#include “stdio.h“ #include “math.h“ int prime(int n) int k, i, result; k = sqrt(n); for(i = 2; i k) result = 1; else result = 0; return result; ,【例4-16】判断n是否为素数 P75 for( i=2; isqrt(n) printf(“%d is a prime number!n “, n); else printf(“%d is not a prime number!n“, n);,7,void main(void) int a = 1777, b = 1991; if( prime(a) ) printf(“%d是素数n“,a); else printf(“%d不是素数n“,a); if( prime(b) ) printf(“%d是素数n“,b); else printf(“%d不是素数n“,b); ,1777是素数 1991不是素数,8,【例7-5】编写函数,交换两个变量的数值,#include “stdio.h“ void swap(int x, int y); void main(void) int a, b; printf(“请输入交换的数值:“); scanf(“%d%d“, ,请输入交换的数值:7 11 交换前a=7,b=11 交换后a=7,b=11,9,为什么没有实现数值的交换? 函数间的参数传递,形式参数和实际参数 形参:定义函数时,函数名后括号内的变量。 形式参数只有在函数被调用时才分配变量空间(产生),并在函数调用结束后,释放变量空间(消失)。 实参:调用函数时,函数名后括号内的表达式。 形式参数与实际参数的关系 形参与实参类型一致,个数相同。 若类型不一致,自动按形参类型转换。,10,参数“值”传递方式 方式: 函数调用时,为形参分配单元,并将实参的值复制到形参中 调用结束,形参单元被释放,实参单元仍保留并维持原值 特点: 形参与实参占用不同的内存单元 单向值传递(形参的改变并不影响实参),为什么没有实现数值的交换? 函数间的参数传递,11,7.3 数组作为参数的函数调用,形参数组与实参数组公用一块内存空间 参数是“地址”传递方式 本质上仍然是“值”传递,只是传递的值是“地址” 形参与实参指向同样的存储单元 实参和形参必须是地址常量或地址变量 “双向”传递形参的改变影响实参,12,函数中如何知道数组的长度呢?,C语言没有为函数提供任何简便的方法来确定传递给它的数组的长度。但是,处理数组,长度是必须的,所以通常要把数组长度也作为形式参数。,例如: int fun(int a, int n) ,13,【例7-6】求数组中元素的最大值,#include “stdio.h“ #define N 10 float max_array(float a, int n); void main(void) float arrayN, max; int i; printf(“请输入%d个实数:n“, N); for(i = 0;i N; i+) scanf(“%f“, ,请输入10个实数: 1.2 2.3 3.4 4.5 5.6 6.7 7.8 8.9 9.0 2.1 最大的数组元素值是:9.00 Press any key to continue,14,【例7-6】求数组中元素的最大值。,float max_array(float a, int n) int i; float max; max = a0; for(i = 1; i max) max = ai; return max; ,可以说明数组长度或不说明数组的长度,15,【例7-8】编写函数实现字符串的复制,#include “stdio.h“ #include “string.h“ #define N 80 void copy_string(char from, char to); void main(void) char aN, bN; printf(“请输入一串字符串:n“); gets(a); copy_string(a, b); puts(b); ,字符串是以一维字符数组 形式存放的,所以字符串 的传递与一维数组的传递 方式相同。,16,void copy_string(char from, char to) int i; for(i = 0; fromi!= 0; i+) toi = fromi; toi = 0; ,请输入一串字符串: I Love China! I Love China!,由于字符串具有结束标识0,所以函数定义中不需要数组长度参数,,17,【例7-9】编写函数实现学生成绩按平均分排名,学生成绩存储在一个二维数组中,#include “stdio.h“ #define M 5 /*学生人数*/ #define N 5 /*成绩科数*/ void sort_score(float scoreN, float ave); void main(void) float scoreMN = 80.0, 85.0, 78.0, 97.0, 68.0, 90.0, 97.0, 89.0, 88.0, 92.0, 60.0, 75.0, 79.0, 95.0, 56.0, 98.0, 61.0, 78.0, 99.0, 68.0, 80.0, 89.0, 98.0, 97.0, 88.0; float aveM; int i, j;,18,【例7-9】编写函数实现学生成绩按平均分排名,学生成绩存储在一个二维数组中。,sort_score(score, ave); for(i = 0;i M; i+) /*按排名输出学生成绩*/ printf(“第%d名学生平均成绩:%.2fn“, i+1, avei); for(j=0; jN; j+) printf(“%10.2f“, scoreij); printf(“n“); ,第1名学生的平均成绩为:91.20 90.00 97.00 89.00 88.00 92.00 第2名学生的平均成绩为:90.40 80.00 89.00 98.00 97.00 88.00 第3名学生的平均成绩为:81.60 80.00 85.00 78.00 97.00 68.00 第4名学生的平均成绩为:80.80 98.00 61.00 78.00 99.00 68.00 第5名学生的平均成绩为:73.00 60.00 75.00 79.00 95.00 56.00,19,void sort_score(float scoreN, float ave) float sum, temp; int i, j, k; for(i=0; iM; i+) /*计算平均成绩*/ sum = 0; for(j=0; jN; j+) sum = sum + scoreij; avei = sum/N; ,在C语言中,当形式参数是多维数组时,可以忽略第一维的长度,后面的维数必须书写,计算平均成绩并排序的函数,20,for(i=0; iM-1; i+) /*成绩排序*/ for(j=i+1; jM; j+) if(avei avej) temp = avei; avei = avej; avej = temp; for(k=0; kN; k+) temp = scoreik; scoreik = scorejk; scorejk = temp; ,21,地址传递 在主调函数与被调函数要分别定义数组,并且数组类型应一致,如不一致将出错 形参数组是一维数组,大小可不指定; 是多维数组第一维可不指定 形参数组名是地址变量,数组做函数参数的说明,22,7.4 函数的嵌套调用,说明: 函数定义时不可嵌套 调用时可以嵌套其它函数,main() int m,n; printf(“%d“, max(m,n); ,int max(int x,int y) return (xy?x:y); ,23,7.4 函数的嵌套调用,说明: 函数定义时不可嵌套 调用时可以嵌套其它函数,main( ),调用函数a,结束,a函数,b函数,调用函数b,main . a(); . int a() /a定义 . b(); . int b() /b定义 . ,24,【例7-10】编写函数计算最大公约数和最小公倍数,#include “stdio.h“ int gys(int a, int b); int gbs(int a, int b); void main(void) int x, y; printf(“输入两个整数:n“); scanf(“%d%d“, ,25,【例7-10】编写函数计算最大公约数和最小公倍数。,int gys(int a, int b) int i; for(i=a=1; i-) if(a%i=0 ,26,【例7-10】编写函数计算最大公约数和最小公倍数。,int gbs(int a, int b) int t = a*b/gys(a,b); return t; ,27,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值之差的平方和,它描述的是数据波动的情况,均方差等于方差的平方根,#include “stdio.h“ #include “math.h“ #define N 10 float average(float a, int n); float variance(float a, int n, float ave); float rms(float a, int n);,28,void main(void) float xN, var; int i; printf(“输入%d个数值:n“,N); for(i = 0;i N; i+) scanf(“%f“, ,29,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。,float average(float a, int n) int i; float sum = 0.0; for(i=0; in; i+) sum = sum + ai; return sum/n; /返回数组的平均值 ,30,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。,float variance(float a, int n, float ave) int i; float var; var = 0.0; for(i=0; in; i+) var = var + pow(ai - ave), 2); return var; /计算方差 ,31,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。,float rms(float a, int n) int i; float ave, var; ave = average(a, n); var = variance(a, n, ave); var = sqrt(var); /计算均方差 return var; ,输入10个数值: 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 这些数值的均方差为:9.0830,32,int f(int x) int y,z; z=f(y); . return(2*z); ,7.5 函数的递归调用,定义:函数直接或间接的调用自身叫函数的递归调用,int f1(int x) int y,z; z=f2(y); . return(2*z); int f2(int t) int a,c; c=f1(a); . return(3+c); ,33,说明 C编译系统对递归函数的自调用次数没有限制 每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,34,【例7-12】编写函数计算整数的阶乘,double fact(int n); main() int n; scanf(“%d”, ,35,fac(int n),double f;,if(n=1 | n=0),fac(n-1),return(24);,1,fac(int n),double f;,if(n=1 | n=0),fac(n-1),return(6);,2,fac(int n),double f;,if(n=1 | n=0),fac(n-1),return(2);,3,fac(int n),double f;,if(n=1 | n=0),f=1;,return(1);,4,36,7.6 变量的作用域,变量定义的3个基本位置,函数内部,函数参数,函数外部,内部变量,外部变量,(局部变量),(全局变量),37,局部变量,定义:在函数内定义,只在本函数内有效 说明 main中定义的变量只在main中有效 形参属于局部变量,即只在函数中有效 不同函数中同名变量,占不同内存单元 复合语句中定义的变量,只在复合语句中有效,38,main() int a=3, b=4; printf(“main:a=%d,b=%dn“, a, b); sub(); printf(“main:a=%d,b=%dn“, a, b); sub() int a, b; a=6; b=7; printf(“sub:a=%d,b=%dn“, a, b); ,main:a=3,b=4 sub:a=6,b=7 main:a=3,b=4,说明 不同函数中同名变量,占不同的存储单元,3,4,6,7,39,#define N 5 main() int i; int aN=1, 2, 3, 4, 5 ; for(i=0; iN/2; i+) int temp; temp=ai; ai=aN-i-1; aN-i-1=temp; printf(“%d “, temp); for(i=0; iN; i+) printf(“%d “, ai); ,说明 复合语句中定义的变量,只在复合语句中有效,40,全局变量,定义:在函数外定义,可为本文件所有函数共用 有效范围: 从定义变量的位置开始到本文件结束,应尽少使用全局变量,因为: 全局变量在程序全部执行过程中占用存储单元 降低了函数的通用性、可靠性、可移植性 降低程序清晰性,容易出错 局部变量与全局变量重名时,局部优先,41,例 全局变量说明(在同一文件中),int p=1,q=5; float f1(int a) int b,c; int f3() char c1,c2; char f2(int x,int y) int i,j; main() int m,n; . ,p,q的作用范围,c1,c2的作用范围,42,int a=3, b=5; max(int a, int b) int c; c = ab?a:b; return(c); main() int a=8; printf(“max=%d“, max(a, b); ,运行结果:max=8,例 全局变量与 同名,_起作用,局部变量,局部变量,43,7.7 变量的存储类型,静态存储区,动态存储区,程序运行期间分配固定存储空间,程序运行期间根据需要,动态分配存储空间,Extern,Static,Register,auto,变量的存储类型规定了该变量数据在内存中的存储区域。在不同存储区域存储的数据,有不同的生存期。,44,auto变量,定义:auto 数据类型 变量名 使用范围 函数中的形参 函数内部的变量 复合语句中定义的变量 说明:没有做特殊说明的变量都是auto变量 特点: 动态分配存储空间 退出函数后自动释放空间,45,register变量,定义方法:register 数据类型 变量名 使用范围
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 承德高速招聘考试题库及答案
- 化工工程师考试题及答案
- 2025年项目合作合同
- 2025年广西专业技术人员公需科目考试试题和答案
- 2025年广西梧州市公需课培训(专业技术人员继续教育)试题及答案
- 珠宝鉴定专业考试试题及答案
- 地理开卷考试题型及答案
- 安徽二造考试真题及答案
- 中级数学考试题库及答案
- 五级验光员考试题库及答案
- 乡级增补叶酸培训课件
- 信访诉求书撰写指南2025
- 2024邯郸大名县招聘村(居)党务、村务(居务)工作者354名招聘笔试备考试题及1套参考答案详解
- 医生法律法规知识培训课件
- 人教版 2024 版历史八年级上册第五单元 第 13 课《国共合作与北伐战争》检测卷
- 小学数学教师新课标考试试题(含答案)
- 农村处理矛盾纠纷课件
- 厂房搬迁管理办法
- 保险学考试题(附答案)
- 中药处方点评管理办法
- 国企纪法教育实施路径
评论
0/150
提交评论