书签 分享 收藏 举报 版权申诉 / 75
上传文档赚钱

类型C语言课件第八章.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:5100806
  • 上传时间:2023-02-11
  • 格式:PPT
  • 页数:75
  • 大小:950.54KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《C语言课件第八章.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    语言 课件 第八
    资源描述:

    1、 教学目与要求:教学目与要求:明确明确C程序由一个或多个函数构成,掌握函数的定义方法,程序由一个或多个函数构成,掌握函数的定义方法,熟悉函数的传值调用,嵌套调用,递归调用的执行过程;熟悉函数的传值调用,嵌套调用,递归调用的执行过程;掌握变量的类型,作用域,生存期等概念,正确使用动态掌握变量的类型,作用域,生存期等概念,正确使用动态变量,静态变量。变量,静态变量。教学内容:教学内容:概述;函数定义的一般形式;函数的参数和函数的值;函概述;函数定义的一般形式;函数的参数和函数的值;函数的调用;函数的嵌套调用;函数的递归调用;数组作为数的调用;函数的嵌套调用;函数的递归调用;数组作为函数参数;局部变

    2、量和全局变量;变量的存储类别;内部函数参数;局部变量和全局变量;变量的存储类别;内部函数和外部函数;如何运行一个多文件的程序。函数和外部函数;如何运行一个多文件的程序。教学重点与难点:教学重点与难点:重点是函数的定义和调用,变量的作用域和生存期难点是重点是函数的定义和调用,变量的作用域和生存期难点是函数的嵌套调用与递归调用。函数的嵌套调用与递归调用。Ch8 函数函数 特点:特点:各模块相对独立、功能单一、结构清晰、接口简单各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性控制了程序设计的复杂性缩短开发周期缩短开发周期避免程序开发的重复劳动避免程序开发的重复劳动易于维护和功能扩充

    3、易于维护和功能扩充l 8.1 概述概述uC是模块化程序设计语言是模块化程序设计语言 基本思想:将一个大的程序按基本思想:将一个大的程序按功能功能分割成一些分割成一些小模块小模块开发方法开发方法:自上向下,逐步细化自上向下,逐步细化&一个一个C C程序由一个程序由一个 或多个程序模块组成或多个程序模块组成,每个每个 程序模块作为一个源程序文件程序模块作为一个源程序文件&C C是是函数式函数式语言语言,一个源程序文件由一个或多个函数一个源程序文件由一个或多个函数 以及其他有关内容组成以及其他有关内容组成.&一个一个C C程序程序必须有且只能有一个名为必须有且只能有一个名为mainmain的主函数的

    4、主函数&C程序的执行总是程序的执行总是从从mainmain函数开始,函数开始,mainmain函数结束时函数结束时结束结束&函数函数不能嵌套定义不能嵌套定义,可以可以嵌套嵌套调用调用,但不能调用但不能调用mainmain函数函数.&所有子函数都是所有子函数都是平行的,平行的,任何函数任何函数都不属于都不属于其他函数其他函数 C是模块化程序设计语言是模块化程序设计语言源程序文件1预编译命令说明部分执行部分函数1函数n源程序文件i源程序文件nC程序C C程序结构程序结构 函数分类函数分类 从从用户角度用户角度标准函数(库函数):由系统提供标准函数(库函数):由系统提供用户自定义函数用户自定义函数

    5、从从函数形式函数形式无参函数无参函数有参函数有参函数使用使用库函数库函数应注意:应注意:1、函数、函数功能功能2、函数参数的、函数参数的数目和顺序数目和顺序,及各参数意义和,及各参数意义和类型类型3、函数返回值意义和类型、函数返回值意义和类型4、需要使用的包含文件、需要使用的包含文件 8.2 函数定义的一般格式合法标识符合法标识符函数返回值类函数返回值类型型缺省缺省int型型无返回值无返回值void函数体函数体类型标识符类型标识符 函数名函数名()说明部分说明部分语句部分语句部分例例 空函数空函数 dummy()函数体为空函数体为空例例 无参函数无参函数 printstar()printf(“

    6、*n”);或或 printstar(void)printf(“*n”);8.2.18.2.1无参函数无参函数定义的一般格式定义的一般格式 8.2.2 有参函数定义有参函数定义 的一般格式的一般格式合法标识符合法标识符函数返回值类函数返回值类型型缺省缺省int型型无返回值无返回值void函数体函数体类型标识符类型标识符 函数名函数名(形参类型说明表形参类型说明表)说明部分说明部分语句部分语句部分例例 有参函数有参函数 int max(int x,int y)int z;z=xy?x:y;return(z);例例 有参函数号有参函数号 int max(int x,y)int z;z=xy?x:y;

    7、return(z);函数类型函数类型 函数名(形参表)函数名(形参表)形参类型说明形参类型说明说明部分说明部分语句部分语句部分传统风格传统风格:例例 有参函数(传统风格)有参函数(传统风格)int max(x,y)int x,y;int z;z=xy?x:y;return(z);8.2.3 空函数空函数void 函数名函数名()作用作用:在程序设计中往往根据需要确定若干模块在程序设计中往往根据需要确定若干模块,分别由一些分别由一些 函数实现函数实现,而在第一阶段中设计最基本的模块而在第一阶段中设计最基本的模块,其他一些其他一些 次要功能或锦上添花的功能则在以后需要时陆续补上次要功能或锦上添花的

    8、功能则在以后需要时陆续补上,在编写程序的开始阶段在编写程序的开始阶段,可以在将来要扩充的地方写一可以在将来要扩充的地方写一 个空函数个空函数.8.3.1 形参与实参形参与实参 形式参数:定义函数时函数名后面括号中的变量名形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的参数实际参数:调用函数时函数名后面括号中的参数例例 比较两个数并输出大者比较两个数并输出大者max(int x,int y)int z;z=xy?x:y;return(z);main()int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Max is%d

    9、,c);8.3 函数参数和函数的值函数参数和函数的值说明:说明:形参在函数被调用前不占内存形参在函数被调用前不占内存;函函数调用时为形参分配内存;调用结数调用时为形参分配内存;调用结束,内存释放束,内存释放实参可为常量实参可为常量,变量或表达式变量或表达式,但但必须有确定的值必须有确定的值,调用时实参的值调用时实参的值传给形参传给形参.形参必须指定类型形参必须指定类型形参与实参形参与实参类型一致,个数相同类型一致,个数相同若形参与实参类型不一致,自动若形参与实参类型不一致,自动按形参类型转换按形参类型转换函数调用函数调用转换转换实参到形参是单向的值传递反过实参到形参是单向的值传递反过来不行来不

    10、行.例例 计算计算x的立方的立方#include float cube(float x)return(x*x*x);main()float a,product;printf(Please input value of a:);scanf(%f,&a);product=cube(a);printf(”Cube of%.4f is%.4fn,a,product);xaproduct1.21.21.728返回语句返回语句形式:形式:return(表达式表达式);或或 return 表达式表达式;或或 return;功能功能:使程序控制从:使程序控制从被调用函数被调用函数返回到返回到调用函数调用函数中

    11、,中,同时把返同时把返回回值带给调用函数值带给调用函数说明:说明:函数中可有多个函数中可有多个return语句语句若无若无return语句,遇语句,遇时,自动返回调用函数时,自动返回调用函数,返回的是一个返回的是一个不确定的值不确定的值若函数类型与若函数类型与return语句中表达式值的语句中表达式值的类型不一致类型不一致,按前,按前者为准,自动转换者为准,自动转换-函数调用转换函数调用转换void型函数型函数没有返回值没有返回值例例 无返回值函数无返回值函数 void swap(int x,int y)int temp;temp=x;x=y;y=temp;8.3.2 函数的返回值函数的返回值

    12、 printstar()printf(*);main()int a;a=printstar();printf(%d,a);例例:下列函数的不同。下列函数的不同。void printstar()printf(*);main()int a;a=printstar();printf(%d,a);*10 编译错误编译错误not an allowed type例例:函数返回值类型转换函数返回值类型转换max(float x,float y)float z;z=xy?x:y;return(z);main()float a,b;int c;scanf(%f%f,&a,&b);c=max(a,b);print

    13、f(Max is%dn,c);教学目与要求:教学目与要求:熟悉函数的传值调用熟悉函数的传值调用嵌套调用嵌套调用递归调用的执行过程;递归调用的执行过程;教学内容:教学内容:函数的嵌套调用;函数的嵌套调用;函数的递归调用;函数的递归调用;数组作为函数参数;数组作为函数参数;教学重点与难点:教学重点与难点:函数的嵌套调用与递归调用。函数的嵌套调用与递归调用。Ch8 函数函数(2)8.4 8.4 函数的调用函数的调用8.4.1调用的一般形式调用的一般形式 函数名函数名(实参表列实参表列);说明:说明:实参与形参实参与形参个数相等,类型一致,按顺序一一对应个数相等,类型一致,按顺序一一对应实参表求值顺序

    14、,因系统而定(实参表求值顺序,因系统而定(Turbo C 自右向左自右向左)8.4.2 调用方式调用方式 函数语句:函数语句:例例 printstar();printf(“Hello,World!n”);函数表达式:函数表达式:例例 m=max(a,b)*2;函数参数:函数参数:例例 printf(“%d”,max(a,b);m=max(a,max(b,c);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);void main()int i=2,p;p=f(i,+i);printf(%d,p);例例 参数

    15、求值顺序参数求值顺序int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);void main()int i=2,p;p=f(i,i+);printf(%d,p);运行结果:运行结果:0TC运行结果:运行结果:1VC :0对被调用函数要求:对被调用函数要求:必须是必须是已存在已存在的函数的函数库函数应该使用库函数应该使用#include 用户自定义函数或者在调用前面,或者先有用户自定义函数或者在调用前面,或者先有函数类型说明函数类型说明告诉编译系统告诉编译系统函数类型、参数个数及类型,以便检验函数类型、参数个数

    16、及类型,以便检验函数定义函数定义与与函数声明函数声明不同不同函数定义函数定义是指函数功能的确立,包括函数名、值、形参以及是指函数功能的确立,包括函数名、值、形参以及函数体,是一个完整的、独立的函数单位。函数体,是一个完整的、独立的函数单位。函数声明函数声明告诉编译系统告诉编译系统函数类型、参数个数及类型,以便检函数类型、参数个数及类型,以便检验验8.4.3 对被调用函数的声明和函数原型对被调用函数的声明和函数原型例例 函数函数声声明举例明举例float add(float x,float y)float z;z=x+y;return(z);void main()float a,b,c;scan

    17、f(%f,%f,&a,&b);c=add(a,b);printf(sum is%f,c);被调函数出现在主调函数被调函数出现在主调函数之前,不必函数之前,不必函数声声明明/*ch8-4.c*/void main()float add(float x,float y);float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sum is%f,c);float add(float x,float y)float z;z=x+y;return(z);void main()int a,b;int c;scanf(%f,%f,&a,&b);c=max(a,b);

    18、printf(Max is%dn,c);max(int x,int y)int z;z=xy?x:y;return(z);int型函数可不作函数说型函数可不作函数说声声明明(Borland C+不行)不行)8.4.3 对被调用函数的声明和函数原型对被调用函数的声明和函数原型 函数的声明简称函数原型函数的声明简称函数原型.一般情况下,函数的一般情况下,函数的声明与函数定声明与函数定义的第一行(函数首部)基本相同,但差一个分号义的第一行(函数首部)基本相同,但差一个分号,因此,可以简因此,可以简单地照写已经定义的函数的首部,再加一个分号,就成了声明。单地照写已经定义的函数的首部,再加一个分号,就成

    19、了声明。函数原型的形式函数原型的形式 (1)函数类型函数类型 函数名函数名(形参类型形参类型1,形参类型,形参类型2,.形参类型形参类型n);(2)函数类型函数类型 函数名函数名(形参类型形参类型1 参数名参数名1,形参类型形参类型2 参数名参数名2,.,形参类型形参类型n 参数名参数名n);编译系统不检查参数名,参数名是什么无所谓编译系统不检查参数名,参数名是什么无所谓函数说明位置:函数说明位置:程序的数据说明部分(函数内或外程序的数据说明部分(函数内或外)下列情况下,可不作函数说明下列情况下,可不作函数说明 被调用函数定义出现在主调函数之前被调用函数定义出现在主调函数之前 如果已经在头文件

    20、的开头(在所有函数之前)已经对本文如果已经在头文件的开头(在所有函数之前)已经对本文件中所调用的函数进行了声明,则在各函数中不必再说明。件中所调用的函数进行了声明,则在各函数中不必再说明。若函数返值是若函数返值是char或或int型型,系统自动按,系统自动按int型处理型处理int sum(int a,int b)a=a+b;b=a+b;return(a);void main()int a=1,b=3,c;c=sum(a,b);printf(%d,%d,%d,a,b,c);例例 读程序写出程序结果。读程序写出程序结果。1,3,4void main()float add(float a,floa

    21、t b);float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sum is%f,c);float add(float x,float y)float z;z=x+y;return(z);8.5 8.5 函数的嵌套调用函数的嵌套调用main()调用函数调用函数a结束结束a函数函数b函数函数调用函数调用函数bu嵌套调用嵌套调用 C规定:规定:函数定义不可嵌套函数定义不可嵌套,但,但可以嵌套调用可以嵌套调用函数函数,即在调用一个函数的过程中又调用另一个函数。即在调用一个函数的过程中又调用另一个函数。例例 求三个数中最大数和最小数的差值求三个数中最大数和最

    22、小数的差值#include int dif(int x,int y,int z);int max(int x,int y,int z);int min(int x,int y,int z);void main()int a,b,c,d;scanf(%d%d%d,&a,&b,&c);d=dif(a,b,c);printf(Max-Min=%dn,d);int dif(int x,int y,int z)return max(x,y,z)-min(x,y,z);int max(int x,int y,int z)int r;r=xy?x:y;return(rz?r:z);int min(int x

    23、,int y,int z)int r;r=xy?x:y;return(rz?r:z);main()调用函数调用函数dif输出输出结束结束dif函数函数max函数函数调用函数调用函数max调用函数调用函数minmin函数函数float fac(int k)float t=1;int i;for(i=2;i=k;i+)t*=i;return t;void main()float c;int m,n;scanf(“%d,%d”,&m,&n);c=fac(n)/(fac(m)*fac(n-m);printf(“%f”,c);例例 求求)!(!mnmncmn分析:分析:重复三次求阶乘运算,只是每次的值不

    24、同。将求阶乘重复三次求阶乘运算,只是每次的值不同。将求阶乘的过程编成一个函数,以不同的参数值来调用函数。的过程编成一个函数,以不同的参数值来调用函数。说明说明:C编译系统对递归函数的自调用编译系统对递归函数的自调用次数没有限制次数没有限制每调用函数一次,在每调用函数一次,在内存堆栈区分配空间内存堆栈区分配空间,用于,用于存放函数变存放函数变量、返回值量、返回值等信息,所以递归次数过多,可能引起堆栈溢出等信息,所以递归次数过多,可能引起堆栈溢出l 8.68.6 函数的递归调用函数的递归调用 定义:函数定义:函数直接或间接的调用自身直接或间接的调用自身叫函数的递归调用叫函数的递归调用f()调调f调

    25、调f2调调f1f1()f2()int f(int x)int y,z;z=f(y);.return(2*z);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);此两种递归都此两种递归都无法结束无法结束,应,应有有某种条件某种条件控控制递归调用结制递归调用结束。束。例例 8.8)1(2)1()1(10)(nnagennageint age(int n)int c;if(n=1)c=10;else c=age(n-1)+2;return(c);void main()printf(“

    26、%dn”,age(5);age(5)=age(4)+1age(4)=age(3)+1age(3)=age(2)+1age(2)=age(1)+1age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18例例 8.8 求求n的阶乘的阶乘)1()!1()1,0(1!nnnnn/*ch8_8.c*/#include float fac(int n)float f;if(n0)printf(n0,data error!);else if(n=0|n=1)f=1;else f=fac(n-1)*n;return(f);void main()int n;float y;pr

    27、intf(Input a integer number:);scanf(%d,&n);y=fac(n);printf(%d!=%15.0f,n,y);递归调用的实现递归调用的实现主程序主程序(1)输出输出f(4);4 f(4);(1)n=4top(2)s=4*f(3)n3 f(3);(2)n=3 (1)n=4 top(3)s=3*f(2)n2 f(2);(3)n=2 (2)n=3 (1)n=4 top(4)s=2*f(1)n1(4)n=1 (3)n=2 (2)n=3 (1)n=4 tops s=3*2*1;(2)3(1)4top s=2*1(3)2(2)3(1)4top s=4*3*2*1 (

    28、1)4top返回返回(3)2(2)3(1)4top(4)1结束结束输出输出24)1()!1()1,0(1!nnnnn例例:用数组求用数组求Fibonacci数列前数列前20个数个数)3()2(12)1(1121nFFFnFnFnnnlong int fac(int n)long int f;if(n=1|n=2)f=1;else f=fac(n-1)+fac(n-2);return f;void main()int i;for(i=1;i%cn,getone,putone);void hanoi(int n,char one,char two,char three)if(n=1)move(on

    29、e,three);else hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);main()int m;printf(Input the number of disks:);scanf(%d,&m);printf(The steps to moving%3d disks:n,m);hanoi(m,A,B,C);ABC从上面分析可以看出,当n大于等于2时,移动的过程可分解为三个步骤:第一步 把A上的n-1个圆盘移到B上;第二步 把A上的一个圆盘移到C上;第三步 把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的

    30、。本题算法分析如下,设A上有n个盘子。如果n=1,则将圆盘从A直接移动到C。如果n=2,则:1.将A上的n-1(等于1)个圆盘移到B上;2.再将A上的一个圆盘移到C上;3.最后将B上的n-1(等于1)个圆盘移到C上。如果n=3,则:A.将A上的n-1(等于2,令其为n)个圆盘移到B(借助于C),步骤如下:(1)将A上的n-1(等于1)个圆盘移到C上。(2)将A上的一个圆盘移到B。(3)将C上的n-1(等于1)个圆盘移到B。B.将A上的一个圆盘移到C。C.将B上的n-1(等于2,令其为n)个圆盘移到C(借助A),步骤如下:(1)将B上的n-1(等于1)个圆盘移到A。(2)将B上的一个盘子移到C。

    31、(3)将A上的n-1(等于1)个圆盘移到C。到此,完成了三个圆盘的移动过程。【举例举例】将从键盘输入的字符序列逆置输出,用递归函数来实现。比如,从键盘上输入:比如,从键盘上输入:ABCD回车;算法将输出:回车;算法将输出:DCBA。void Reversed()char ch;ch=getchar();if(ch!=n)reversed();if(ch!=n)printf(“%c”,ch);【举例举例】将从键盘输入的十进制正整数以二进制形式输出。用递归函数来实现。比如,从键盘上输入:比如,从键盘上输入:13回车;回车;算法将输出:算法将输出:1101。#include void main()i

    32、nt n;void bin(int);scanf(%d,&n);bin(n);void bin(int n)int r;r=n%2;n=n/2;if(n!=0)bin(n);printf(%d,r);Bina.c函数的递归调用小结函数的递归调用小结u用递归法编写函数的方法用递归法编写函数的方法(1)分解分解:将原问题分解为若干小问题,其中:将原问题分解为若干小问题,其中至少至少有一个小问有一个小问题与原问题题与原问题性质完全相同性质完全相同;(2)找递归出口找递归出口(即(即递归结束条件递归结束条件):利用出口的结果逐步回):利用出口的结果逐步回代即可得到原问题的解。代即可得到原问题的解。u递

    33、归法的优点递归法的优点(1)编写的程序比较简洁清楚,增加了可读性;)编写的程序比较简洁清楚,增加了可读性;(2)有些问题)有些问题(如如Hanoi塔问题塔问题)用其他方法较难而用递归方法用其他方法较难而用递归方法较易;较易;(3)便于进行算法的复杂性分析。)便于进行算法的复杂性分析。u递归法的缺点递归法的缺点:时间:时间和和空间空间的代价较大。的代价较大。注注:递归算法都可以转换为非递归算法。递归算法都可以转换为非递归算法。作业 8.4 8.5 8.6 8.7 教学目与要求:教学目与要求:理解数组作为函数参数;理解局部变量和全局变理解数组作为函数参数;理解局部变量和全局变量;了解变量的存储类别

    34、和内部函数和外部函数;量;了解变量的存储类别和内部函数和外部函数;知道如何运行一个多文件的程序。知道如何运行一个多文件的程序。教学内容:教学内容:数组作为函数参数;局部变量和全局变量;变量数组作为函数参数;局部变量和全局变量;变量的存储类别;内部函数和外部函数;如何运行一的存储类别;内部函数和外部函数;如何运行一个多文件的程序。个多文件的程序。教学重点与难点:教学重点与难点:重点是数组作为函数参数,变量的作用域和生存重点是数组作为函数参数,变量的作用域和生存期是难点期是难点Ch8 函数函数(3)8.7 8.7 数组作为函数参数数组作为函数参数 函数参数传递方式函数参数传递方式值传递值传递方式方

    35、式方式:函数调用时方式:函数调用时,为形参分配单元为形参分配单元,并将实参的值并将实参的值复制复制到形参中;到形参中;调用结束,调用结束,形参单元被释放形参单元被释放,实参单元仍保留并维持,实参单元仍保留并维持原值原值特点:特点:形参与实参占用形参与实参占用不同不同的内存单元的内存单元 单向单向传递传递#include swap(int a,int b)int temp;temp=a;a=b;b=temp;void main()int x=7,y=11;swap(x,y);printf(x=%d,ty=%dn,x,y);地址传递地址传递方式:函数调用时,将数据的方式:函数调用时,将数据的存储地

    36、址存储地址作为参数传递给形参作为参数传递给形参特点:特点:形参与实参占用形参与实参占用同样同样的存储单元的存储单元“双向双向”传递传递 实参和形参必须是实参和形参必须是地址地址常量或变量常量或变量8.7.18.7.1数组元素作函数实参数组元素作函数实参值传递值传递 8.7 8.7 数组作为函数参数数组作为函数参数int max(int x,int y)return(xy?x:y);void main()int a10,i,m;for(i=0;i10;i+)scanf(“%d”,&ai);m=a0;for(i=1;i10;i+)m=max(m,ai);printf(“max=%d”,m);若函数

    37、的形参是数组,对应的若函数的形参是数组,对应的实参必须是数组名或指针变量。实参必须是数组名或指针变量。int max(int x10)int i,m=x0;for(i=1;i10;i+)if(mxi)m=xi;return m;void main()int a10,i;for(i=0;i10;i+)scanf(“%d”,&ai);printf(“max=%d”,max(a);说明:说明:应该在主调函数和被调函数中分别定应该在主调函数和被调函数中分别定义数组义数组,不能只在一方定义不能只在一方定义.实参数组与形参数组的实参数组与形参数组的类型必须一致类型必须一致用数组名做参数时,传递的是数组的用

    38、数组名做参数时,传递的是数组的首地址,形参数组的大小不起作用首地址,形参数组的大小不起作用.形参数组形参数组可以不指定大小可以不指定大小,只用一个,只用一个方括号方括号,可另设一参数,传递数组元素可另设一参数,传递数组元素的个数的个数1.数组做函数参数时,形参数组和实参数组做函数参数时,形参数组和实参数组数组共享同一内存单位共享同一内存单位例例 求求10个任意整数中的最大值个任意整数中的最大值8.7.2 数组名作函数参数数组名作函数参数地址传递地址传递int max(int x,int n)int i,m=x0;for(i=1;in;i+)if(mxi)m=xi;return m;void m

    39、ain()int a10,i;for(i=0;i10;i+)scanf(“%d”,&ai);printf(“max=%d”,max(a,10);8-73.c8-71.c8-72.c例例 求学生的平均成绩求学生的平均成绩#include float average(int stu10,int n);void main()int score10,i;float av;printf(Input 10 scores:n);for(i=0;i10;i+)scanf(%d,&scorei);av=average(score,10);printf(Average is:%.2f,av);float aver

    40、age(int stu10,int n)int i;float av,total=0;for(i=0;in;i+)total+=stui;av=total/n;return av;实参用数组名实参用数组名形参用数组定义,int stu.2109score562312.88stu数组排序数组排序-简单选择排序简单选择排序void sort(int array,int n)int i,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;if(k!=i)t=arrayi;arrayi=arrayk;arrayk=t;void m

    41、ain()void sort(int array,int n);int a10,i;for(i=0;i10;i+)scanf(%d,&ai);sort(a,10);for(i=0;i10;i+)printf(%d,ai);0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0例例 数组排序数组排序-简单选择排序简单选择排序void sort(int array,int n)int i,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;if(k!=i)t=arrayi;a

    42、rrayi=arrayk;arrayk=t;main()void sort(int array,int n);int a10,i;for(i=0;i10;i+)scanf(%d,&ai);sort(a,10);for(i=0;i10;i+)printf(%d,ai);printf(n);kjjkjkjjjjj0123456789a4968573299927137688array949kk1368i=1例例 数组元素与数组名数组元素与数组名 作函数参数比较作函数参数比较12a调用前调用前a0a112a调用调用a0a112xy21xy交换交换12a返回返回#include void swap2(i

    43、nt x,int y)int z;z=x;x=y;y=z;main()int a2=1,2;swap2(a0,a1);printf(a0=%dna1=%dn,a0,a1);值传递值传递12a调用前调用前12ax调用调用21ax交换交换21a返回返回#include void swap2(int x)int z;z=x0;x0=x1;x1=z;main()int a2=1,2;swap2(a);printf(a0=%dna1=%dn,a0,a1);地址传递地址传递例例 数组元素与数组元素与 数组名数组名 作函数参数比较作函数参数比较8.7.18.7.1数组元素作函数实参数组元素作函数实参值传递值

    44、传递 8.7 8.7 数组作为函数参数数组作为函数参数8.7.2 8.7.2 一维数组作函数参数一维数组作函数参数地址传递地址传递int max(int x4)int i,j,m=x00;for(i=0;i3;i+)for(j=0;j4;j+)if(mxij)m=xij;return m;void main()int a34=1,3,5,7,9,2,4,6,8,10,15,13,17,5;printf(“max=%d”,max(a);1.多数数组元素可以作为函数的参数多数数组元素可以作为函数的参数2.如果形参是多维数组,可以省略如果形参是多维数组,可以省略第一维第一维的大小,但不能省略其他维的

    45、大小。的大小,但不能省略其他维的大小。8.7.3 8.7.3 多维数组与函数参数多维数组与函数参数int max(int x34)int max(int x4)int max(int x3)()int max(int x)()例:有一个例:有一个34的矩阵,求最大元的矩阵,求最大元素的值。素的值。8-73.c例例 求二维数组中各行元素之和求二维数组中各行元素之和get_sum_row(int x3,int result,int row,int col)int i,j;for(i=0;irow;i+)resulti=0;for(j=0;jcol;j+)resulti+=xij;main()int

    46、 a23=3,6,9,1,4,7;int sum_row2,row=2,col=3,i;get_sum_row(a,sum_row,row,col);for(i=0;irow;i+)printf(The sum of row%d=%dn,i+1,sum_rowi);314679asum_rowxresult18128.8.1 局部变量局部变量-内部变量内部变量定义:在定义:在函数内定义函数内定义,只在本函数内有效只在本函数内有效说明:说明:main中定义的变量只在中定义的变量只在main中有效中有效不同函数中同名变量,占不同内存单元不同函数中同名变量,占不同内存单元形参属于局部变量形参属于局部

    47、变量在一个函数内在一个函数内,可定义在复合语句中有效的变量可定义在复合语句中有效的变量局部变量可用存储类型局部变量可用存储类型:auto register static (默认为默认为auto)float f1(int a)int b,c;.char f2(int x,int y)int i,j;main()int m,n;.a,b,c有效有效x,y,i,j有效有效m,n有效有效运行结果:运行结果:5 4 3 2 1例:复合语句中的变量例:复合语句中的变量#define N 5main()int i;int aN=1,2,3,4,5;for(i=0;iN/2;i+)int temp;temp=

    48、ai;ai=aN-i-1;aN-i-1=temp;for(i=0;iN;i+)printf(%d ,ai);例例 不同函数中同名变量不同函数中同名变量main()int a,b;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=4sub:a=6,b=7main:a=3,b=4 8.8 8.8 局部变量和全局变量局部变量和全局变量8.8.2 全局变量全局变量-外部变量外部

    49、变量定义:在定义:在函数外定义函数外定义,可为,可为本文件所有函数共用本文件所有函数共用有效范围:从有效范围:从定义变量的位置开始定义变量的位置开始到本源文件结束,及有到本源文件结束,及有extern说明说明的其它源文件的其它源文件应尽量少使用全局变量,因为:应尽量少使用全局变量,因为:Y全局变量在程序全部执行过程中占用存储单元全局变量在程序全部执行过程中占用存储单元Y降低了函数的通用性、可靠性,可移植性降低了函数的通用性、可靠性,可移植性Y降低程序清晰性,容易出错降低程序清晰性,容易出错 定义定义 说明说明u次数:次数:只能只能1次次 可说明多次可说明多次u位置:位置:所有函数之外所有函数之

    50、外 函数内或函数外函数内或函数外u分配内存:分配内存:分配内存分配内存,可初始化可初始化 不分配内存不分配内存,不可初始化不可初始化外部变量说明:外部变量说明:extern 数据类型数据类型 变量表;变量表;外部变量定义与外部变量说明不同外部变量定义与外部变量说明不同若外部变量与局部变量同名,则外部变量被屏蔽若外部变量与局部变量同名,则外部变量被屏蔽外部变量可用存储类型外部变量可用存储类型:缺省缺省 或或 static全局变量增加了函数间数据联系的渠道全局变量增加了函数间数据联系的渠道,通过函数调用可通过函数调用可得到一个以上的值得到一个以上的值,一般将全局变量名的第一个字母大写一般将全局变量

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:C语言课件第八章.ppt
    链接地址:https://www.163wenku.com/p-5100806.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库