C语言程序设计PPT教学课件-第七章 用函数实现模块化程序设计.ppt_第1页
C语言程序设计PPT教学课件-第七章 用函数实现模块化程序设计.ppt_第2页
C语言程序设计PPT教学课件-第七章 用函数实现模块化程序设计.ppt_第3页
C语言程序设计PPT教学课件-第七章 用函数实现模块化程序设计.ppt_第4页
C语言程序设计PPT教学课件-第七章 用函数实现模块化程序设计.ppt_第5页
免费预览已结束,剩余72页可下载查看

下载本文档

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

文档简介

第七章 用函数实现模块化程序设计,交实验报告140页3题 格式:按照上机指导书171页附录d格式书写 采用统一的实验报告纸,算法是解决具体问题的方案,基本要求:根据给出的算法编写程序,7.1 为什么要用函数,实际的软件开发,实际问题往往由多个基本问题构成。 要求软件开发人员首先分析问题,将问题分解为基本问题。 其次,逐个解决每个基本问题。,程序与问题的关系,对软件开发人员的要求,分析并分解问题(高级要求)。 设计解决基本问题的函数(基本要求)。,例,ia 和 ib 为两个整数,ia 是基数,ib 是指数. 如何计算,变量result保存最后结果,base为底数,exponent为指数。 result=1; for(counter=1;counter=exponent;counter+) result*=base;,计算35、 55、 85,问题,如果要分别计算100对整数的次幂,需要多少for?,解决方案,我们制造一个零件(函数),它负责计算次幂 当需要计算次幂时,告诉零件基数和指数,零件返回结果。 函数就象提供服务的人。,第一个角度: 程序就是机器。 函数就是零件。 程序由函数构成。 第二个角度: 函数可以为其他函数提供服务,就象服务人员。,1. 什么是函数?,函数就是可以完成某项基本任务的一组语句。 函数名是唯一的。 函数可以被其他的函数使用,称为函数的调用。,参数,主调用函数给被调用函数一些数据,即参数。 被调用函数根据参数值完成相应的工作。,返回值,被调用函数完成工作后,可能会返回某些数据作为计算结果。,函数的要素,函数名 参数 返回值 函数体(语句),函数调用示例:,一个源文件由一个或多个函数组成,是一个独立编译单元。 一个c程序由一个或多个源文件组成; c程序执行总是从main函数开始,调用其他函数后流程回到main。 函数不能嵌套定义,但可互相调用。注意不能调用main函数。,函数的分类,有参函数例(输出两数中大者) #include main( ) int max(int x,int y); int n1,n2,a; scanf(“%d,%d“,无参函数例 main() print_star(); print_message(); print_star() ; print_star() prinf(“* n”); print_message() prinf(“ hello! n ”); ,7.2 怎样定义函数,例如: print_message() printf(“hello! n ”);,例如:求x和y二者中大者 int max (int x, int y) /*x,y为形参*/ int z; /*函数体中变量的说明*/ z=xy?x:y; return (z) ; /*将z的值作为函数返回值*/,若无参数,类型标识符写void或不写,四、 形式参数和实际参数,有确定值的常量、变量或表达式,函数不加类型说明按整型处理,函数和return类型不一致以函数类型为准。,函数不返回值定义为void,六、函数值的类型,小结,int power ( int ibase, int iexponent ) 返回类型: int 函数名: power 形式参数: ibase,iexponent 形式参数的数值由实际参数决定。,注意:,int power ( int ibase, int iexponent ) 谁是被定义的函数? 谁是参数? 第一个int的作用是什么? 后两个int的作用是什么? 函数的使用者应该明确指明什么,才能使用函数?,调用函数就是使用函数。 调用函数之前,必须首先声明函数。 声明函数就是声明:函数名、函数返回值的类型和参数的类型。 例: int power(int, int);,7.3 调用函数,一、函数调用的一般形式,函数名(实际参数表),有参数函数,无参数函数,函数名(),二、函数调用的具体方式,在程序编译阶段,对调用函数的合法性进行全面检查。如没有函数声明,编译到包含函数调用的语句时(如xx(a,b)),编译系统不知道xx是函数名,也无法判断实参(a,b)的类型和个数是否正确,无法进行正确性的检查。只有在运行时才会发现实参与形参的类型或个数不一致,出现运行错误。,7.4、对被调用函数的声明和函数原型,在c语言中,以上的函数说明称为函数原型。,/*定义add函数*/ float add (float x,float y) float z; z=x+y; return (z); ,main() float add(float x,float y); float a, b, c; scanf(“ %f, %f”, ,对被调用函数的说明,作为表达式被调用,3. 被调用函数是库函数的函数说明,文件开头用#include命令将调用库函数时需用到的信息“包含”到文件中(对这些库函数的原型说明全部都写在对应的头文件里)。,常用的头文件: # include “stdio.h” # include “math.h” # include “string.h”,4.省略被调用函数声明的三种情况,float add (float x,float y) float z; z=x+y; return (z); main() float a, b, c; scanf(“ %f, %f”, ,(1)被调函数定义在主函数前,(2)函数返回值为整型或字符型,系统按整型处理。,所有函数定义前,在函数的外部已说明函数类型。,char letter( char,char); float f(float,float ); int i(float,float); main( ) . char letter (char c1,char c2) float f(float x,float y) int i(float,float) ,在所有函数之前说明函数类型,此处不必说明,定义函数letter、f和i,复习,函数的要素: 名字、返回值、参数和代码 定义函数: 编写代码 声明函数: 声明名字、参数类型和返回值类型 调用函数: 给出名字和实际参数,如果有返回值则保存。,main() int i; long t; t=1; for(i=1; i=n; i+) t=t*i; printf(“n!=%ldn”,t); ,long xx(int x) long t=1; int i; if(x=0) printf(“error”); else for(i=1;i=x,i+) t=t*i; return (t); main() int n;long s; scanf(“%d”,例1:编写函数,求n!。,例题1:求1+2+3+.+100的和。 main() int i,s=0; for (i=1;i=100;i+) s=s+i; printf(“s=%d”,s);,例2:编写函数,求1+2+3+.n。,int mm(int x) int t=0; int i; for(i=1;i=x,i+) t=t+i; return (t); main() int n; int s; scanf(“%d”,执行细节 - 步骤,程序将从主函数开始执行 当发生函数调用时,主调用函数暂停 实际函数的值将被复制给形式参数(不需要任何语句,程序自动做该项工作). 被调用函数执行 遇到返回语句时,被调用函数将结果返回给主调用函数 主调用函数恢复执行,执行细节-存储分配,被调用函数执行前,系统为其变量分配内存空间(包括形式参数)。 实际参数的值被复制给形式参数 (值传递). 当被调用函数结束执行后,内存空间将被释放,下次调用时重新分配。,例:,你可以判断出下面程序的结果吗? 程序的执行过程是怎样的?,void swap(int ia, int ib) int itemp; itemp=ia; ia=ib; ib=itemp; main() int ifirst=13, isecond=27; swap(ifirst, isecond); printf(“nia is %d“, ifirst); printf(“nib is %d“, isecond); ,main() int ifirst=13; int isecond=27; swap(ifirst, isecond); printf(“nifirst is %d“, ifirst); printf(“nisecond is %d“, isecond); ,ifirst=13 isecond=27,ifirst=13 isecond=27 ib=27 ia=13 itemp,main() int ifirst=13; int isecond=27; swap(ifirst, isecond); printf(“nifirst is %d“, ifirst); printf(“nisecond is %d“, isecond); ,void swap(int ia, int ib) int itemp; itemp=ia; ia=ib; ib=itemp; ,ifirst=13 isecond=27 ib=27 ia=13 itemp,ifirst=13 isecond=27 ib=13 ia=27 itemp,main() int ifirst=13; int isecond=27; swap(ifirst, isecond); printf(“nifirst is %d“, ifirst); printf(“nisecond is %d“, isecond); ,ifirst=13 isecond=27,总结,参数传递的时候,实际参数的数值复制给形式参数 形式参数是实际参数的“复印件”。 修改形式参数,不影响实际参数的数值。 这一机制称为:call-by-value,7.5 函数的嵌套调用,例题:编写函数,求1!+3!+5!+.k! 其中k是小于9的奇数,要求该函数中调用求阶乘函数求出各阶乘的值。,double xx(int x) double t=1; int i; for(i=1;i=x,i+) t=t*i; return (t) ; double yy(int m) double s=0; int i; for(i=1;i=m;i+) if (i%2!=0) s=s+xx(i); return(s); main() int n; double sum; scanf(“%d”,7.6、函数的递归调用,例:用递归法求n!,main() double jx(int m) int n; double t; printf(“input n :”); scanf(“%d”, ,double jx(int m) double f; if(m=1) f=1; else f=jx(m-1)*m; return f; ,数组作参数的时候,函数可以使用数组元素的“原件”。 数组的存储原理决定了这一效果。 例: int ilistlength;,7.7 数组作为函数参数,数组的存储原理,1000 1002 1004 1006 1008,10 20 30 40 50,ilist0 ilist1 ilist2 ilist3 ilist4,数组元素的地址,如果数组ilist存储在1000开始的内存空间,那么 1000是ilist0的地址, 1002是ilist1的地址, 1004是ilist2的地址。 请问,ilisti的地址? 1000+i*2,计算机访问数组元素的原理,计算机根据数组的首地址、元素的下标和数据元素在内存的长度,计算元素的地址,然后根据地址访问数组元素。 元素的下标由程序员指定。 元素的类型是预先声明的。 数组的首地址保存在数组名中。 数组名就是数组的首地址。,计算机访问数组元素的原理,访问ilisti,就是访问地址为ilist+i*sizeof(int) 其中, ilist是首地址, i是元素的下标, sizeof(int) 是元素在内存的长度(字节为单位)。,问题,如果iarray也是数组名,而且iarray中存储的地址与ilist相同,那么iarrayi与ilisti有什么关系? 答: 它们是同一数据元素。,一、数组元素做函数实参,例题:有两个数组a,b各有10个元素,将它们逐个对应相比,如果a数组中的元素大于b数组中相应的元素数目多于b数组中的元素大于a数组中相应的元素数目,则认为a数组大于b数组,并分别统计出两个数组相应元素大于,小于和等于的个数。,int larger(int x,int y) int flag; if(xy) flag=1; else if(xy) flag=-1; else flag=0; return(flag);,main ( ) int a10, b10, i, n=0, m=0, k=0; for ( i=0; ik) printf(“abn”); else if (nk) printf(“abn”); else printf(“a=bn”); ,例1:编写函数,求一维数组中存放学生成绩的平均值。,float aver( float a , int n ) int i; float pj,sum=0; for(i=0;in;i+) sum=sum+ai; pj=sum/n; return(pj); main() float xs10,pjf; int i; for(i=0;i10;i+) scanf(“%f”, ,例2:对数组中10个整数按由小到大排序。,void sort (int array , int n) int v, j, t; for (i=0; in-1; i+) for (j=i+1; jn; j+) if (arrayjarrayk) t=arrayk; arrayk=arrayi; arrayi=t; main ( ) int a10, i; for (i=0; i10; i+) scanf (“ %d ”, ,由于地址传递,实参数组 a 改变,例3:写一函数,使给定的一个二维整形数组(3*3)转置,即行列互换。,void xx(int a33 ) int i,j; for(i=0;i3;i+) for(j=0;j3;j+) printf(“%d”,aji;) printf(“n”); main() int a33,i,j; for(i=0;i3;i+) for(j=0;j3;j+) scanf(“%d”,总结,当数组的名字作为形式参数时,被复制的是数组的首地址 函数根据首地址处理的是数组元素的“原件”,而不是“复印件”。,7.8 局部变量和全局变量,主函数 main 定义的变量只在主函数中有效,主函数不能使用其它函数定义的变量。 不同函数中的同名变量互不影响。 形参也是局部变量。,从定义变量的位置开始到本文件结束,这段程序中的函数可直接使用外部变量。 如果在定义点之前的函数想使用外部 变量,则应该在该函数中用关键字 extern 作“外部变量”说明。 如果在同一源文件中,外部变量和局部变量同名,则在局部变量的作用范围内,外部变量不起作用。,变量的存储类别,1.静态存储方式和动态存储方式,静态存储方式:程序运行期间分配固定存储 空间的方式。,动态存储方式:程序运行期间根据需要进行 动态的分配存储空间的方式。,程序区,静态存储区,动态存储区,全局变量,局部静态变量,形式参数 局部变量(自动) 函数调用的现场 保护和返回地址,7.9 变量的存储方式和生存期,2.静态存储变量和动态存储变量,静态存储变量:用静态存储方式存储的变量。,动态存储变量:用动态存储方式存储的变量。,特点:在 静态存储区分配存储单元,整个程序 运行期间都不释放。,特点:函数开始调用时为变量分配存储空间, 函数结束时释放这些空间。一个程序两 次调用同一函数,其中同一个局部变量 的内存地址可能不同。,存储类型:数据在内存中的存储方式。 即静态存储方式和动态存储方式。,3.变量的属性及其定义,数据类型:整型,实型,字符型,存储分类符:,auto (自动的)、register(寄存器的) static (静态的)、 extern(外部的),定义变量的一般形式:,存储分类符 类型标识符 变量名;,如:auto int a; static int b; register int d;,auto(自动的),例如:auto int a;,4.变量的存储类型,auto说明局部变量,该局部变量是自动变量;,自动变量存放在动态存储区,属于动态存储变量;,变量作用域是其所在的函数内部。,说明:,在一个函数内如果局部变量不作存储类 型说明,均为自动变量;,形式参数缺省存储类型是auto,但不能 将auto加在形参说明之前。,如:int b, c=3 等价于 auto int b, c=3;,如:int max(auto int x, auto int y) ,static(静态的),static可用于说明,局部变量局部静态变量,全局变量外部静态变量,局部静态变量,作用域仅限于定义它的函数内部 。,存放在静态存储区,整个程序运行期间都不释放。,编译时赋初值,每次调用不再赋初值,只保留调用结束时变量的值。 自动变量调用一次,重新赋值一次。,局部静态变量不赋初值,编译时自动赋0。 自动变量不赋初值,其值不确定。,例如:打印1!5! 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);,外部静态变量,只能在本源程序文件中被使用。,不论是否加static说明,编译时分配在静态存储区。,register(寄存器的),寄存器:cpu中运算器的组成部分,暂时存放数据。,寄存器变量:直接放置在运算器的寄存器中的变量。引入寄 存器变量是为了提高“存取”速度。,属于动态存储变量,但不放在动态存储区中,放在寄存器中。,说明:,寄存器变量的作用域与自动变量相同。,regiser只适用于说明局部变量;,例如:regis

温馨提示

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

最新文档

评论

0/150

提交评论