高级语言程序设计(一).ppt

上传人:创****公 文档编号:1694654 上传时间:2019-10-22 格式:PPT 页数:114 大小:2.18MB
返回 下载 相关 举报
高级语言程序设计(一).ppt_第1页
第1页 / 共114页
高级语言程序设计(一).ppt_第2页
第2页 / 共114页
点击查看更多>>
资源描述

《高级语言程序设计(一).ppt》由会员分享,可在线阅读,更多相关《高级语言程序设计(一).ppt(114页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第7章 函数,-模块化设计,主要内容,一、概述二、函数定义的一般形式三、函数参数和函数的值四、函数的调用五、函数的嵌套调用六、函数的递归调用七、数组作为函数参数八、变量的存储类别九、内部函数和外部函数十、运行一个多文件的程序,一、概述1、函数的概念:一个子程序段,能完成特定的功能。存在位置:,1.c,2.h,函数1,函数3,函数2,函数4,函数5,(1) 各函数包含在一个文件中#include void main( ) void printstar( ); void print_message( ); printstar( ); print_message( ); printstar( );

2、void printstar( ) printf (“* n” ); void print_message( ) printf (“_ _ _ _ _How_do_you_do!n”) ;,运行结果: * How do you do! * *,一、概述,(2)文件包含的方法 在主函数中使用文件包含预编译命令,将不在本文件而在其它文件中的函数进行预编译处理把各文件中的函数包含到本文件中来,然后一起进行编译、连接、运行。 #include “T7-1-2.c”#include “T7-1-3.c”main( ) p1( ); p2( ) ; p1( ) ; 运行结果同上,T7-1-2.c p1(

3、) printf (“* n”); ,T7-1-3.c p2( ) printf (“ How do you do! n”); ,一、概述,例:在屏幕上输出“How do you do ?”,stdio.h,printf函数,函数3,函数2,#include void main() printf(“How do you do ?”);,3.c,一、概述,2、函数调用方式:,一、概述,几点说明:(1)一个源文件由一个或者多个函数组成。(2)一个C程序由一个或者多个源文件组成。(3)C程序的执行从main 函数开始。(4)所有的子函数都是平行的。(5)从用户的角度看,函数分库函数和自定义函数。(6

4、)函数形式:无参函数:主调函数无数据传送给被调函数,可带或不带返回值。有参函数:主调函数与被调函数间有参数传递,主调函数可将实参传送给被调函数的形参, 被调函数的数据可返回主调函数。,一、概述,二、函数定义的一般形式1、无参函数的定义形式类型标识符:用于指定函数带回的值的类型,不写时为int型。不带回值时可以不写。,类型标识符 函数名() 说明部分 语句,例 无参函数 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); ,合法标识符,函数体,2、有参函数定义的一般形式,函数返回值类型隐含为int型,函数体,例 有参函数(现代风

5、格) 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; return(z); ,二、函数定义的一般形式,3、空函数为扩充功能预留,在主调函数中先占一个位置。,类型标识符 函数名() ,例 空函数 dummy( ) ,函数体为空,二、函数定义的一般形式,三、函数参数和函数的值1、形式参数和实际参数形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式,例 比较两个数并输出大者#include void main() i

6、nt max(int x,int y); int a,b,c; scanf(%d,%d,运行:7,8 Max is 8,几点说明:实参可以是常量、变量或表达式。必须有确定的值。当函数调用时,将实参的值传递给形参,若是数组名,则传送的是数组首地址。 形参必须指定类型,只能是简单变量或数组,不能是常量或表达式形参与实参类型一致,个数相同顺序相同。若形参与实参类型不一致,自动按形参类型转换函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放实参对形参的数据传送是值传送,也是单向传送,当被调函数的形参发生变化时,并不改变主调函数实参的值。形、实参占据的是不同的存储单元,

7、三、函数参数和函数的值,例:形、实参占据的是不同的存储单元#include void main( ) void add(int x,int y); int a=2,b=3; printf (“a=%d, b=%dn”,a, b); printf(“ ,运行结果: a=2,b=3&a=ffd6,&b=ffd8 x=10,y=15 &x=ffd2,&y=ffd4a=2, b=3&a=ffd6,&b=ffd8,2、函数的返回值返回语句形式: return(表达式);或 return 表达式; 功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数,三、函数参数和函数的值,说明:函数的返

8、回值,必须用 return 语句带回。return 语句只能把一个返值传递给调用函数。函数中可有多个return语句,执行哪一个由程序执行情况来定。 if(ab) return(a); else return(b); return 后的值可以是一个表达式,如:return(x y ? x : y);返回值的类型为定义的函数类型,不指定的按整型处理。如: int max(int x, int y) float min(float a,float b) double abc(float d1,float d2),三、函数参数和函数的值,-若 return 语句中表达式类型与函数类型不一致,则转换为

9、函数类型。-若无return语句,遇时,自动返回调用函数。可能返回一个不确定或无用的值 。-无返回值的函数,定义为 void 类型。,printstar() printf(*);void main() int a; a=printstar(); printf(%d,a);,例:无return语句,函数带回不确定值,void printstar() printf(*);void main() int a; a=printstar(); printf(%d,a);,三、函数参数和函数的值,四、 函数的调用主调函数:主动去调用其它函数 被调函数:被其它函数所调用1、函数调用的一般形式函数名(实参表列

10、)说明:实参表列:有确定值的数据或表达式实参与形参个数相等,类型一致,按顺序一一对应,当有多个实参时,实参间用“ ,”分隔实参表求值顺序,因系统而定(Turbo C 自右向左)调用无参函数时,实参表列为空,但( )不能省,#include void main() int f(int a,int b); int i=2,p; p=f(i,+i); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);,例 参数求值顺序,按自右向左求值函数调用等于f(3,3)运行结果:0

11、,按自左向右求值函数调用等于f(2,3)运行结果:- 1,为使程序有通用性:,需自右向左求值时,改为:j=+i; p=f ( j , j ) ;,需自左向右求值时,改为:j = i ; k = + i ; p = f ( j , k ) ;,Printf(“%d,%d”,i,i+); /*同样存在此情况*/,2、函数调用的方式按函数在程序中出现的位置,有三种调用方式:函数语句:以独立的语句去调用函数。不要求有返回值,仅完成一定的操作。 例 printstar(); printf(“Hello,World!n”);函数表达式: 函数返回一个确定值,以参加表达式的运算。不可用于void例 m=ma

12、x(a,b)*2;函数参数:函数调用作为另一个函数的参数。 例 printf(“%d”,max(a,b); /*输出大数*/ m=max(a,max(b,c); /*三数比大小*/,四、 函数的调用,3、函数声明一般形式: 函数类型 函数名(形参类型 形参名,. );或 函数类型 函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数声明不同,声明只与函数定义的第一行相同。声明可以不写形参名,只写形参类型。函数说明位置:程序的数据说明部分(函数内或外),四、 函数的调用,对被调用函数要求:必须是已存在的函数库函数: #include 用户自定义函数:如果被调函数定义在主

13、调函数之后,那么在主调函数中对被调函数作声明。,四、 函数的调用,#include void main() float add(float x,float y ); /*对被调用函数的声明*/ float a,b,c; scanf(%f,%f,float add(float,float);,例 对被调用的函数作声明,输入:3.6 ,6.5输出:sum is 10.100000,说明:旧版本C中函数声明不采用函数原型,只声明函数名和函数类型。如: float add( )函数调用之前,如果未对函数作声明,则编译系统把第一次遇到的函数形式作为函数声明,并默认为int型。即:函数类型是int型可以不

14、作函数声明,最好作声明。被调用函数的定义(程序)在主调函数之前,可以不加函数声明。在所有函数定义前,已在函数外部做了函数声明,则在各主调函数中可以不加函数声明。,四、 函数的调用,回顾:,源程序,Main函数 函数2 函数3,要点一:如何写函数?,确定函数完成功能; 确定函数与外界数据交换方式。,例:请写一个求 n! 的函数。,确定函数完成功能:计算 n!,int s=1,i; for(i=2;i=n;i+) s=s*i;, 确定函数与外界数据交换方式。 I、n由形式参数传入; II、计算的结果n!通过返回一个值出去,nfactorial( int n),int s=1,i;for(i=2;i

15、=n;i+) s=s*i;,int,return(s);,要点二:如何调用函数? 函数名(实参);或 变量名=函数名(实参);,例:在main中调用 n!函数,n由键盘输入。,void main()int a,b; printf(“input n: ”); scanf(“%d”,int nfactorial( int n) int s=1,i; for(i=2;i=n;i+) s=s*i; return(s);,int nfactorial( int n);,4、函数调用的执行过程,四、 函数的调用,五、 函数的嵌套调用,例 输入两个整数,求平方和,输入: 3 4输出: The result

16、is: 25,int fun2(int m) return (m*m); ,int fun1(int x,int y) int fun2(int m); return ( fun2(x)+fun2(y) );,#include int fun1(int x,int y);void main(void) int a,b; scanf(“%d%d”,#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%

17、d%d,例 求三个数中最大数和最小数的差值,int min(int x,int y,int z) int r; r=xy?x:y; return(ry?x:y; return(rz?r:z);,int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); ,例 用弦截法求方程 的根,1. 取x1,x2两点,求得f(x1), f(x2) 。 异号:x1,x2之间必有一根。 同号:改变x1, x2,直到f(x1), f(x2)异号为止。,2. 连f(x1),f(x2)两点(弦)交x轴于x。 X点的坐标求法: 求X点的x坐标 从x值得f(x),3.

18、 若f(x)与f(x1)同号, 则根必在(x,x2)区间,此时将x1=x; 若f(x)与f(x2)同号, 则根必在(x1,x)区间,此时将x2=x;,4. 重复步骤2和3 ,直到| f(x) | 为止, 设 0) y1=y;x1=x; else x2=x; while(fabs(y) =0.0001); return(x); ,void main( ) float x1, x2, f1, f2, x; do printf(“input x1, x2: n”); scanf(“%f%f”,运行情况:Input x1,x2:2,6A root of equation is 5.0000,六、 函数

19、的递归调用递归:在函数调用过程中,直接或间接的调用自身。递归调用方式直接递归调用:在函数体内又调用自身,int f(int x) int y,z; z=f(y); . return(2*z);,间接递归调用:当函数1去调用另一函数2时,而另一函数2反过来又调用函数1自身。,解决无终止递归调用的方法是:确定好结束递归的条件。,六、 函数的递归调用,例 有5个人,第5个人比第4个人大2岁,第4个人比第3个人大2岁,第2个人比第1个人大2岁,第1个人10岁,问第5个人多大?,回推,递推,用函数age(n)来表示第n个人的年龄,程序实现:#include age(intn)intc;if(n=1)c=

20、10;elsec=2+age(n-1);return(c);voidmain()printf(“%dn”,age(5);,运行结果:18,有些问题,可以用递推,也可以用递归的方法解决。递推:从一个已知的事实出发,按一定规律推出下一个事实,再从已知的新的事实,推出下一个新的事实.,例 用递推法求n! ,即从1开始, 乘2, 乘3.一直到n,#include void main( ) int i, s=1; for(i=1;i%cn,x, y); ,#include void main() void hanoi(int n,char one,char two,char three); int m;

21、 printf(Input the number of diskes:); scanf(%d,运行: input number of diskes: 3the step to moving 3 diskes: A C A B C B A C B A B C A C,七、数组作为函数参数,2001H,数组首地址,数组元素,函数,传送,七、数组作为函数参数1、数组元素作函数实参值传递,例 输入10个数,要求输出其中最大的元素和该数是第几个数。,思路:设计一个求两数中较大数的函数,max(int x, int y) 从首元素依次与各元素比较大小,记下大的值及其位置,a,0 1 2 3 4 5 6,m

22、=a0,n=0,i=1,依次比较:max(m,ai),#include void main() int max(int x,int y) int a10,m,n,i; printf(Enter 10 integer numbers:); for(i=0;im) m=max(m,ai); n=i; printf(“The largest number is %dn it is the %d th numbern”,m,n); ,int max(int x,int y) return(xy?x:y);,2、数组名可作函数参数地址传递实参和形参都应用数组名,传送是的数组首地址(1)一维数组名作为函数

23、参数,实参:int score5;形参: abc( int array5) 或 abc( int array ),注: 形参的数组大小可不指定,七、数组作为函数参数,例 求学生的平均成绩,float average(float array10) int i; float aver,sum=array0; for( i=1; i10; i+ ) sum=sum+arrayi; aver=sum/10; return (aver);,float average(float array10) int i; float aver,sum=array0; for( i=1; i10; i+ ) sum=

24、sum+arrayi; aver=sum/10; return (aver);,#include void main() float average(float array10); float score10, aver; int i; printf(Input 10 scores: n); for( i=0; i10; i+ ) scanf(%f, ,实参用数组名,例 求两组学生的平均成绩,形参数组长度缺省,#include void main() float average(float array ,int n); float score_15=98.5,97,91.5,60,55; fl

25、oat score_210=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5; printf(“The average of clase A is %6.2fn”,average(score_1,5); printf(“The average of clase B is %6.2fn”,average(score_2,10);float average(float array ,int n) int i; float aver,sum=array0; for( i=1; in; i+ ) sum=sum+arrayi; aver=sum/n; return (

26、aver);,另设一个参数,传递需要处理的数组元素个数,数组名作函数参数时,实参和形参两个数组共占同一段内存单元,形参数组的元素值改变会使实参数组元素的值同时变化。,七、数组作为函数参数,9,49,i=0,选择法排序思路,例 用选择法对数组中的10个整数按由小到大排序,13,68,i=1,选择法排序思路,i=8,选择法排序思路,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;t=arrayi; arrayi=arrayk;arrayk=t; ,

27、#include void main() void sort(int array ,int n); int a10,i; printf(“enter the arrayn”); for(i=0;i10;i+) scanf(%d,(2)用多维数组名作函数参数形参数组定义时,只能省略第一维的大小说明。实参数组定义:int score510 形参数组定义:int array310 或 int array810 或 int array 10错误的定义:int array ; int array3 ;,七、数组作为函数参数,例 求34矩阵中各元素的最大值,#include void main()int

28、max_value(int array 4); int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(max value is %dn,max_value(a);,多维形参数组第一维维数可省略,第二维必须相同 int array4,int max_value(int array34) int i,j,k,max; max=array00; for(i=0;imax) max=arrayij; return(max); ,例 求二维数组中各行元素之和,18,12,形参,形参,get_sum_row(int x3, int result ,int row, int

29、 col) int i,j; for(i=0;irow;i+) resulti=0; for(j=0;jcol;j+) resulti+=xij;main() int 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);,问题: 变量的逻辑位置? 变量的物理位置?,变量的逻辑位置,变量的物理位置,程序文件,内存,void main() int a; ,2001H,八、局部变量和

30、全局变量,#include int h;float f1(int a) int b,c; .main() int m,n; int i,j; .,局部变量,全局变量,1、局部变量内部变量定义:在函数内定义,只在本函数内有效三类:函数开头就定义的变量形式参数变量复合语句中定义的变量,注:不同函数中同名变量,占不同内存单元,八、局部变量和全局变量,局部变量的作用域,运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4,运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4,2、全局变量外部变量定义:在函数外定义,可为本文件所有函数共用,也叫外部

31、变量。有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件,八、局部变量和全局变量,几点说明:同一文件中的所有函数都能引用、改变全局变量的值。习惯上,全局变量名的第一个字母用大写。不必要时不要使用全局变量全局变量在程序执行的全过程都占用存储单元。不利于程序的移植。程序的可读性变差。全局与局部变量重名时,在函数内部将屏蔽全局变量。,八、局部变量和全局变量,全局变量的作用域,例 全局变量的作用域及其使用情况,int a=1; f1( ) int b; b=a+3; printf(“f1:a=%d, b=%d n”,a, b); f2( ) int a, b; a=5; b

32、=a+3; printf(“f2: a=%d, b=%d n”,a, b); f3( ) int b; a=6; b=a+3; printf(“f3:a=%d, b=%d n”,a, b); void main( ) int b=3; printf(“1.main : a=%d, b=%d n”,a, b); f1( ); printf(“2.main : a=%d, b=%d n”,a, b); f2( ); printf(“3.main : a=%d, b=%d n”,a, b); f3( ); printf(“4.main : a=%d, b=%d n”,a, b); ,运行: 1.ma

33、in:a=1, b=3 f1:a=1, b=4 2.main:a=1, b=3 f2:a=5, b=8 3.main:a=5, b=3 f3:a=6, b=94.main:a=6, b=3,全局变量增加了函数间传送数据的联系,局部变量和全局变量同名,局部变量作用域中外部变量被屏蔽,局部变量,外部变量,例: 一维数组内存放了10个学生成绩,求平均分、最高分和最低分。,#include float Max=0,Min=0;void main() float average(float array ,int n); int i; float ave,score10; for(i=0;iMax) Ma

34、x=arrayi; else if(arrayiMin) Min=arrayi; sum=sum+arrayi; aver=sum/n; return(aver);,运行:input 10 numbers: 99 45 78 97 100 67.5 89 92 66 43max=100.00 min=43.00 average=77.65,九、变量的存储类别程序执行过程:,CPU,控制器,运算器,寄存器,数据区,内存,取指令,取数,九、变量的存储类别动态存储方式与静态存储方式静态存储:程序运行期间分配固定的存储空间。动态存储:程序运行期间根据需要动态分配存储空间。,生存期:静态变量:从程序开始

35、执行到程序结束动态变量: 从包含该变量定义的函数开始执行至函数执行结束,1、auto变量存储类别为自动时,声明符auto可省;自动变量被分配在动态区,未赋初值时,其值未定义,每次调用重新赋值。,例如:int f(int a) /*定义f函数,a为形参*/auto int b,c=3; /*定义b、c为自动变量*/ 又如:auto int b,c=3; int b,c=3; /*两者等价*/,如何区别变量是静态还是动态?,例 auto 变量的作用域,main() int x=1; void prt(void); int x=3; prt(); printf(“2nd x=%dn”,x); pri

36、ntf(“1st x=%dn”,x);void prt(void) int x=5; printf(“3th x=%dn”,x);,运行结果:3th x=52nd x=31st x=1,2、用static声明局部变量 若希望函数调用结束后,局部变量的值保留,则指定该变量为静态局部变量,用static对变量加以声明。,例 局部静态变量值具有可继承性,main() void increment(void); increment(); increment(); increment();void increment(void) int x=0; x+; printf(“%dn”,x);,运行结果:1 1 1,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > pptx模板 > 校园应用

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com