vb设计-c4-1、2(函数)_第1页
vb设计-c4-1、2(函数)_第2页
vb设计-c4-1、2(函数)_第3页
vb设计-c4-1、2(函数)_第4页
vb设计-c4-1、2(函数)_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

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

文档简介

1,C语言程序设计(电子教案),滕永晨Tyc_T兰州理工大学计通学院,第四章 函数, 概述 函数的定义和调用 函数之间值的传递 函数的嵌套调用 函数的递归调用 变量的存储类别和作用域,C 是函数型语言, C 程序的基本部件是函数。 一个函数完成一个特定功能,整个程序的功能靠一系列的函数调用来实现。 C程序的执行顺序与函数出现的顺序无关,只与函数的调用顺序有关。 库函数. 使用库函数时应当包含其头文件. 如:数学函数 #include 用户自己定义的函数,综述,C函数分类,1) 除main函数外,其它函数可相互调用,2)函数不可嵌套定义,函数间具有全局性、平行性,3)函数分为有参函数和无参函数,4)程序从main开始执行,最后又回到main函数结束。,注意:,一、 和主函数放在同一个程序中 二、 以独立文件的形式存入磁盘中,子函数的存放形式,函数定义 函数定义的一般形式: 函数名(形参表) 形参类型说明; 说明部分 执行部分 1.有参函数: 定义 如:int add(x,y) int x,y; int sum; sum=x+y; return sum; ,调用方式: 函数名(实参表列); 无值返回: 进行某种操作 有值返回: 通过return语句返回 如: 计算: 1!+2!+3!+4!+5!,int p(n) int n; int i,t; for(t=1,i=1;i=n;i+) t=t*i; return(t);,#includestdio.hmain( )int s,i; for(s=0,i=1;iy? x:y;return(z);,a,b,c,x,y,z,10,15,15,10,15,15,xyz,形参: 出现被调用函数中的参数。,形式参数与实际参数,max(x, y)int x, y; int z; z=xy? x:y;return(z);,c=max(a, b); 在main主函数中,c=max(a, b); 在main主函数中,注意: 实参可为表达式, 其传递为值传递。, 实参可为常量、变量或表达式,实参与形参类型必须一致。, 在被定义的函数中,必须指定形参的类型,可在形参说明部分说明,也可在形参表列中说明。如,如:int max(int x, int y), ,C语言中将数据从一个函数传到另一个函数的方式有三种: 一、 用return语句从函数中返回一个函数值; 二、 通过形参和实参的结合进行传值; 三、 用全局变量在不同函数间通过数据共享实现数值传递。 一、用return语句从函数中返回一个函数值 见前面例子,函数间的传值,二、通过形参和实参的结合进行传值 1.单向值传递 形参为一般变量,实参将值传给形参 实参 形参 main( ) void swap(int x, int y); int a,b; scanf(%d%d, ,3,5,a,b,x,实参 形参,y,3,5,main( ) swap( ),3,5,3,temp,2 .地址传递(双向传递) 1)用指针方式 实参是地址(指针),形参得到该地址后对其中数据进行操作,主调函数在实参(地址)中即可得到结果。 main( ) void swap(int *p1,int *p2); int a,b; scanf(%d%d, ,实参&a,&b,2FA0H,3120H,2FA0H,3120H,3,5,形参*p1,*p2,main( ),swap( ),temp,3,5,3,&a,&b,p2,p1,2)用数组方式选择排序法: 选择排序法的基本思路是在N个数中,找出最小的一个数,使它与X(0)互换,然后,从N-1个数中,找一个最小的数,使它与X(1)互换,依次类推,直至剩下最后一个数据为止。,【例】选择法排序的算法分析,选择法排序算法的流程图:,设有n个数,存放在数组An中 1)第1遍:从中选出最小的数,与第 1个数交换位置; (演示),2)第2遍:除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;(演示),3)依次类推,选择了n-1次后,这个数列已按升序排列。,A0,A7,第 1 遍i=0 p=0,排序前,apaj?,p=5,j=1,j=2,j=3,j=4,j=5,交换,p=1,p=2,j=6,j=7,成立,成立,成立,按升序排序,A0,A7,ApAj,j=2,j=3,j=4,j=5,交换,p=2,j=6,j=7,第 2 遍 i=1 p=1,第 1 遍结束后的数据,for(i=0;iaj) p=j; if(i!=p) /*交换ai和ap*/ s=ai; ai=ap; ap=s; for(i=0;in;i+) printf(%d,ai);,选择法排序(升序)的C程序:,思考:如果按降序排,程序如何修改?,【例】选择法排序,选择法排序(升序)的完整程序:#include void sort(int b ,int n) int i,j,p,t; for(i=0;in-1;i+) p=i; for(j=i+1;jn;j+) if(bjbp) p=j; t=bp;bp=bi;bi=t; main( ) int a5,i; for(i=0;i5;i+) scanf(%d, ,【例】冒泡排序法,算法分析:如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n-j次两两比较。比较的顺序从前往后,经过一趟比较后,将最值沉底(换到最后一个元素位置),最大值沉底为升序,最小值沉底为降序。,# include main()int a5,i,j,t; printf(Please input 5 numbers: ); for(i=0;iaj+1) t=aj; aj=aj+1; aj+1=t; printf(The sorted numbers: ); for(i=0;i5;i+) printf(%d ,ai); printf(n);,三.用全局变量在不同函数间通过数据共享传值 例子:一个一维数组中存放10个学生的成绩,写一个函数求出平均分,最高分和最低分. #include float max,min; float average(float b,int n) int i;float sum=0.0; max=min=b0; for(i=1;ibi)min=bi; return (sum/n); ,想得到三个结果,除了一个函数返回值外,还可利用全局变量,得到另外两个值.,main( ) float a10,ave; int i; for(i=0;i10;i+) scanf(%f, ,作 业,1、计算s=14+24+34+N 4 2、对于自然数m、n,用设计子函数的方法,求m、n的最小公倍数和最大公约数。3、有M个学生,学习N门课程,已知所有学生的各科成绩,编程:分别求每个学生的平均成绩和每门课程的平均成绩。,4.6 函数的嵌套调用 在调用一个函数的同时,这个被调函数又调用了另外的函数,这样的调用结构称为函数的嵌套调用.例子:计算 4!+5!+6!+7! main( )中调用f1( )计算4个阶乘的和, f1( )中调用f2( )计算阶乘.,main( ),调 f2( ),f1( ),f2( ),return 或 ,return 或 ,调 f2( ),return 或 ,调 f1( ),#include main( ) int p( );int s;s=p( );printf(s=%dn,s);,int p( )int f(int n);int i,y=0;for(i=4;i=7;i+) y=y+f(i);return y;,int f(int n)int i,t=1;for(i=1;i1),例2:用递归的方法求费波那契数列(0,1,1,2,3,5,8,.)f2=f1+1; fn=fn-1+fn-2;,例4:古代金典汉诺塔(Tower of Hanoi)问题,例3用递归算法及欧几里德法求最大公约数 gcd(b,a%b) b!=0 a b=0,gcd(a,b)=,例1: 用递归的方法求n!#include double fact(int n); int main(void ) int n; scanf(%d, ,例4:古代金典汉诺塔(Tower of Hanoi)问题,A,B,C,将3个盘子从A移到C的全过程,将2个盘子从A移到B,A,B,C,将3个盘子从A移到C的全过程,将2个盘子从A移到B,A,B,C,将3个盘子从A移到C的全过程,将1个盘子从A移到C,A,B,C,将3个盘子从A移到C的全过程,将1个盘子从A移到C,A,B,C,将3个盘子从A移到C的全过程,将2个盘子从B移到C,A,B,C,将3个盘子从A移到C的全过程,将2个盘子从B移到C,A,B,C,将2个盘子从A移到B的过程,将1个盘子从A移到C,A,B,C,将2个盘子从A移到B的过程,将1个盘子从A移到C,A,B,C,将2个盘子从A移到B的过程,将1个盘子从A移到B,A,B,C,将2个盘子从A移到B的过程,将1个盘子从A移到B,A,B,C,将2个盘子从A移到B的过程,将1个盘子从C移到B,A,B,C,将2个盘子从A移到B的过程,将1个盘子从C移到B,A,B,C,将2个盘子从B移到C的过程,A,B,C,将2个盘子从B移到C的过程,A,B,C,将2个盘子从B移到C的过程,A,B,C,将2个盘子从B移到C的过程,由上面的分析可知:将n个盘子从A座移到C座可以分解为以下3个步骤:(1) 将A上n-1个盘借助C座先移到B座上(2) 把A座上剩下的一个盘移到C座上(3) 将n-1个盘从B座借助于座移到C座上,#include int main() void hanoi(int n,char one,char two,char three); int m; printf(the number of diskes:); scanf(%d,void hanoi(int n,char one,char two, char three) void move(char x,char y); if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); ,void move(char x,char y) printf(%c-%cn,x,y); ,作 业,1、写一个计算返回正整数n的m次幂的函数。 2、输入2个正整数m和n(m1, n500),统计并输出m和n之间的素数的个数以及这些素数的和。素数就是只能被1和自身整除的正整数,最小的素数是2。要求定义并调用函数prime(m)判断m是否为素数,当m为素数时返回1,否则返回0。,作业(续),3、从键盘任意输入一个正整数判断其奇偶性。要求定义一个判断奇偶性的函数even(n),当n为偶数时返回1,否则返回0。4、用递归的方法求n!。,变量的作用域,一、局部变量,凡在函数(含main 函数)内部定义的变量称为局部变量。,局部性: 局部变量仅在函数内部有效,它包括:,2、形式参数;3、在复合语句中可定义仅复合语句中有效的临时变量。,不同的函数可具有同名变量, 它们占不同的内存单元, 互不影响。,1、函数中定义的变量;,二、全局变量,一个源文件中,在所有函数之外定义的变量为全局变量。,有效性: 自定义位置开始至文件结尾全部有效。,1. 全局变量所作用到的函数,相当于这些函数的公共变量。在某函数中改变其值后,其它函数中该变量值亦相应改变。 好处: 函数之间值传递。,2. 不要随意使用全局变量。一是始终占据内存单元;二是由于函数依赖于外部定义的变量,减少了通用性。,3. 不在全局变量作用域内的函数。若要使用全局(外)变量,需在函数体内加上extern保留字于以说明。,4. 全局和局部变量同名时,局部变量有效。,char f2(x,y); int c, y; int i, j; main ( ) ,例: int p=1, q=5; float f1(a) int a; int b, c; char c1, c2;,p,q的作用范围,c1, c2的作用范围,例:分析m作为全局变量和局部变量在程序中各个部分时的值。,m2=13 /*全局变量的m的值*/,m1=3 /*局部变量m的值*/,3 /*函数调用的结果*/,其运行结果为:,一、变量在内存中的存储区,从变量值存在的时间(即生存期)来分,有静态存储变量和动态存储变量.,变量的存储类别,以上为两大类,又分为四种具体形式,1. 自动型变量(auto)2. 静态(static)变量3. 寄存器型变量4. 外部(extern)变量,静态存储变量: 存放于静态存储区,在程序整个运行过程中,始终占据固定的内存单元。,动态存储变量: 存放于动态存储区,根据程序的运行状态(如:函数调用)而临时分配的单元,且单元并不固定。,一、局部变量,则: a, b为自动型,存入动态区。在该函数被调用时才分配单元,函数调用结束时释放。auto一般省略。,静态方式: static int a, b;,动态方式: auto int a, b;,则: a, b存入静态区,在程序运行期间 a, b始终占据固定存储单元。, 若定义时赋初值,则程序运行中仅在第一次调用时赋初值,第二次调用不再赋初值,而是使用上一次调用的值。, 若不赋初值,则系统置初值0,而动态变量不赋初值则值不确定。,可以静态方式存储 , 又可以动态方式存储。,#include int fac (int n) static int f=1; f=f*n; return(f); main ( ) int i; for (i=1; i=5; i+) printf (%d!=%dn, i, fac(i);,例:求n!,运行结果为: 1!1 2!2 3!6 4!24 5!120,每一次调用fac(i),打印一个i!,同时保留这个i!的值以便下次再乘(i+1)。,分析下列程序的运行结果:#include void fun( ) static int a; a+=2; printf(%d,a); main( ) int k; for(k=1;k=4;k+)fun( );printf(n); ,运行结果为:2468,分析下列程序的运行结果: #include f(int a) int b=0; static int c=3; a=c+,b+; return a; main( ) int a=2,i,k; for(i=0;i2;i+) k=f(a+); printf(%d, %d n,k,a); ,运行结果为:4,当动态局部变量在一个函数中反复被用达到数百次以上时,为了提高效率,可将其存入寄存器中(有限个),而不存入内存的动态区中,以提高运算速度。,说明方式 register int i, j=1;, 不可多, 一般13个, 必要时使用。,寄存器型变量,二、全局变量,在函数外部中定义,它们一定存放在静态存贮区中。,全局变量即可被本文件中各函数用,亦可被其它源文件中的函数引用。,1. 只被本文件中的函数引用,全局变量本身一定是存放在静态区的。但若加上 static. 即:,st

温馨提示

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

评论

0/150

提交评论