C语言程序设计函数实用教案

上传人:莉**** 文档编号:84324459 上传时间:2022-05-03 格式:PPT 页数:111 大小:3.35MB
收藏 版权申诉 举报 下载
C语言程序设计函数实用教案_第1页
第1页 / 共111页
C语言程序设计函数实用教案_第2页
第2页 / 共111页
C语言程序设计函数实用教案_第3页
第3页 / 共111页
资源描述:

《C语言程序设计函数实用教案》由会员分享,可在线阅读,更多相关《C语言程序设计函数实用教案(111页珍藏版)》请在装配图网上搜索。

1、6.1 概概 述述 函数是一段程序,它完成特定的任务,使用它时可用简单的方法为其提供必要的数据,然后自动(zdng)执行这段程序,计算完毕后能保存计算结果回到程序原来的位置继续计算。第1页/共110页第一页,共111页。如果把编程比做制造一台机器,函数就好比其零部件可将这些“零部件”单独设计、调试、测试好,用时拿出来装配,再总体(zngt)调试这些“零部件”可以是自己设计制造/别人设计制造/现在的标准产品而且,许多“零部件”我们可以只知道需向它提供什么,它能产生什么,并不需要了解它是如何工作、如何设计制造的所谓“黑盒子”。黑箱(函数)结果(输出参数)输入参数第2页/共110页第二页,共111页

2、。 函数用于把较大的计算任务分解成若干个较小的任务 使程序人员可以在其他函数的基础上构造程序,而不需要从头做起 一个设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚,减轻了因修改程序所带来的麻烦。 C语言在设计函数时考虑了效率与易于使用这两个方面。一个C程序一般都由许多较小的函数组成,而不是只由几个比较大的函数组成。 一个程序可以驻留在一个文件中,也可以存放(cnfng)在多个文件中。各个文件可以单独编译并与库中已经编译过的函数装配在一起。第3页/共110页第三页,共111页。编写(binxi)一个测试软件显示软件封面检查密码产生题目接受回答评判计

3、分显示结果如果要继续练习告别词第4页/共110页第四页,共111页。main() char ans = y;clrscr();cover(); /*调用软件封面显示函数*/password(); /*调用密码检查函数*/while (ans =y| ans =Y) question(); /*调用产生题目函数*/ answers(); /*调用接受回答函数*/ marks(); /*调用评分(png fn)函数*/ results(); /*调用结果显示函数*/ printf(“是否继续练习?(Y/N)n”); ans=getchar (); printf(“谢谢使用,再见!”);第5页/共1

4、10页第五页,共111页。/*定义所用函数*/cover() /*软件封面(fngmin)显示函数*/password() /*密码检查函数*/question() /*产生题目函数*/answers() /*接受回答函数*/marks() /*评分函数*/results() /*结果显示函数*/第6页/共110页第六页,共111页。在C程序设计中,通常:将一个大程序分成几个子程序模块(自定义函数)将常用功能做成标准模块(标准函数)放在函数库中供其他程序调用将程序中反复使用的程序段写成函数的形式,某些只用一次的程序段往往也写成函数形式 引入函数的优点:减少(jinsho)重复编写程序的工作量使

5、程序便于调试和阅读第7页/共110页第七页,共111页。例6.1 main( )/* 主函数 */ printstar( ); /*调用(dioyng)printstar函数画*/ print_message(); /*调用(dioyng)print _message函数写字*/ printstar( ); /*调用(dioyng)printstar函数画*/ printstar( ); /*printstar函数(hnsh)*/ printf(“n*”);print_message( ); /* print_message函数(hnsh)*/ printf(“n Hello! ”);运行结果

6、:* Hello!*第8页/共110页第八页,共111页。第9页/共110页第九页,共111页。 一个(主调)函数可以(ky)多次调用多个(被调)函数。同一个函数也可以(ky)被一个或多个(主调)函数调用任意多次。下图说明一种调用关系:mainabcfdefghid第10页/共110页第十页,共111页。函数(hnsh)分类使用(shyng)情况库函数(标准(biozhn)函数):由系统提供,用户可以直接使用用户自定义函数:解决用户的专门需要函数形式无参函数:主调函数与被调函数之间没有数据传递有参函数:主调函数与被调函数之间有数据传递任务情况带返回值不带返回值第11页/共110页第十一页,共1

7、11页。第12页/共110页第十二页,共111页。函数函数(hnsh)的定义的定义 函数名:标识符,用于标识函数,并用其来调用函数。 函数名字有值,它代表函数的入口地址。形式参数表:说明参数的个数和类型(lixng),简称形参表。一般来说,计算函数需要多少原始数据,函数的形参表中就有多少个形参,每个形参存放一个数据。变量说明:说明函数中用到的除形参以外的其它变量。函数体:为了完成特定的功能而设计的一个或多个语句。第13页/共110页第十三页,共111页。第14页/共110页第十四页,共111页。第15页/共110页第十五页,共111页。int max(x,y)int x,y;int z;z=x

8、y?x:y;return(z)数据类型 函数名(形参表)形参类型说明(shumng);说明(shumng)部分语句int max(int x,int y)int z;z=xy?x:y;return(z)/*现代风格是:函数(hnsh)名(带类型形参表)*/第16页/共110页第十六页,共111页。第17页/共110页第十七页,共111页。第18页/共110页第十八页,共111页。第19页/共110页第十九页,共111页。第20页/共110页第二十页,共111页。第21页/共110页第二十一页,共111页。为什么?第22页/共110页第二十二页,共111页。6.3 函数函数(hnsh)的调用的调

9、用 函数定义制造函数函数使用声明(shngmng)(准备使用) 调用(使用函数)通过函数(hnsh)调用,两个函数(hnsh)中的数据发生联系。第23页/共110页第二十三页,共111页。6.3.1 形式参数和实际形式参数和实际(shj)参数参数形式参数:定义函数时函数名后括号内的变量名称(mngchng)实际参数:主调函数中调用函数时,函数名后括号内的参数(变量,表达式等)第24页/共110页第二十四页,共111页。第25页/共110页第二十五页,共111页。说明说明(shumng) 形参在函数调用前不占用存储单元,在调用时被分配,调用后释放所占用的存储单元; 形参只能(zh nn)是变量,

10、而实参可以是常量、变量或表达式,但要求它们有确定的值。调用时将实参的值赋给形参。 在函数中必须指定形参的类型; 实参和形参个数相等,按顺序对应,一一传递,实参和形参的类型应相同或赋值兼容;第26页/共110页第二十六页,共111页。 语言规定,实参对形参的数据(shj)传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。void fun() int x=7; printf(i=%d, j=%d, x=%dn, i, j, x);main( ) int i=2, x=5, j=7; fun( ); printf(i=%d, j=%d

11、, x=%dn, i, j, x);i=7, j=6, x=7i=2, j=7, x=5第27页/共110页第二十七页,共111页。#include void sum(int x, int y, int z) z=x+y;main( ) int a=1, b=2, c=0; sum( a, b, c ); printf(c=%dn, c);c=?0第28页/共110页第二十八页,共111页。6.3.2 函数函数(hnsh)的返回的返回值值函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个确定值带回主调(zh dio)函数中去。return语句一般形式: re

12、turn(表达式); 或:return 表达式; 或:return;第29页/共110页第二十九页,共111页。若return后面带表达式,首先计算(j sun)表达式的值,表达式的值就是所求的函数值。表达式的类型与函数首部说明的类型一致。 max(int x, int y) int z; z=(xy)?x:y; return( );return();一个(y )函数可以含有多个return语句,但当执行到其中一个(y )return语句就返回主调函数。一个函数可以没有return语句,此时当函数执行到最后一个界限(jixin)符“”时返回主调函数。说明第30页/共110页第三十页,共111页

13、。 函数值的类型:应当(yngdng)在定义函数时指定函数的类型。 max(int x, int y) min(int x, int y) letter(char c1, char c2)max(int x, int y)int max(int x, int y)第31页/共110页第三十一页,共111页。 在定义函数时,对函数值声明的类型一般应该和return语句中的表达式类型一致;若不一致,则以函数类型为准(自动转换(zhunhun))。 对于有返回值的函数,若return语句后面没有表达式,或没有return语句,此时带回一个不确定的返回值。 为了明确表示“不带回值”,可以用void定义

14、“无类型”(或称“空类型”)。void stars(int n)第32页/共110页第三十二页,共111页。printstar()printf(*);main() int a; a=printstar(); printf(%d,a);例 函数(hnsh)带回不确定值输出(shch):10void printstar() printf(*);main() int a; a=printstar(); printf(%d,a);编译(biny)错误!第33页/共110页第三十三页,共111页。第34页/共110页第三十四页,共111页。6.3.3 函数调用的一般函数调用的一般(ybn)形式形式 函数

15、(hnsh)名(实参1,实参2,实参n)执行过程:计算各个表达式,得到值v1,vn,把v1,vn赋给对应的形参。然后转去执行函数(hnsh)体,函数(hnsh)体执行结束后,即遇到return语句或执行完函数(hnsh)的最后一个语句,返回到函数(hnsh)调用处。第35页/共110页第三十五页,共111页。说明说明(shumng) 实参与形参 多个实参间用逗号(duho)隔开 实参与形参间个数相等,类型应一致 实参与形参按顺序对应,一一传递数据 实参表求值的顺序与系统有关第36页/共110页第三十六页,共111页。调用方式:函数语句:由函数调用加上分号构成,在主调函数中可作为一个独立的语句

16、stars(20); print_message( );函数表达式:函数调用作为一个运算对象出现(chxin)在表达式中,此时要求函数带回一个确定的值以参加表达式的运算 c=max(a, b);函数参数:函数调用作为另一个函数的实参,其值作为一个实际参数传给被调函数的形参进行处理;此时也要求函数带回一个确定值 m=max(a, max(b, c);第37页/共110页第三十七页,共111页。 调用(dioyng)位置 首先被调用(dioyng)函数必须是已存在的函数,如用户自定义函数或库函数。 如果使用库函数,需要在文件的开头用#include 命令将需要的库函数包含到文件中。 #includ

17、e 调用(dioyng)同一源文件中的非标准函数时,必须在主调函数中对所调函数进行声明: 函数声明语句(函数原型)第38页/共110页第三十八页,共111页。6.4 函数函数(hnsh)原型原型一般形式: 类型标识符 被调函数名(形参类型 形参名 );功能(gngnng):通知编译程序函数值是什么类型,有多少参数及它们各自的类型,为编译程序进行类型检查提供依据例如: double power( int x, int n); 或 double power(x , n); 或 double power( );第39页/共110页第三十九页,共111页。例6.5main() float add();

18、 float a, b, c; scanf(“ %f, %f”, &a, &b); c=printf(“ sum is %f ”, add(a, b) ); float add (x, y) float x, y; float z; z=x+y; return (z); /*对被调用函数的说明(shumng)*/作为(zuwi)表达式被调用/*定义(dngy)add函数*/运行结果:3.6, 5.5sum is 9.100000第40页/共110页第四十页,共111页。函数函数(hnsh)(hnsh)定义和函数定义和函数(hnsh)(hnsh)声明的区别声明的区别 函数的定义是确定函数的功能,

19、包括函数名,函数值类型,形参及类型和函数体全部内容。 函数的声明只是(zhsh)对要被调用的函数的返回值的类型进行说明,它只包括函数名、函数类型或形参类型,不包括函数体。第41页/共110页第四十一页,共111页。三种情况下可以省略声明:函数值是整型(int)或字符型(char)时系统自动按整型说明;所调函数的定义出现在主调(zh dio)函数之前时;文件一开头,在所有函数之前,对所用函数作了声明 第42页/共110页第四十二页,共111页。无函数(hnsh)说明整型函数(hnsh)main( ) int a,b,c; scanf (“%d,%d”,&a,&b); c=max(a,b); pr

20、intf(“Max is %d”,c); max( x,y) int x,y; int z; z=xy? x:y; return(z); 函数(hnsh)值是整型(int)或字符型(char)时系统自动按整型说明第43页/共110页第四十三页,共111页。被调函数在主调(zh dio)函数之前主调(zh dio)函数在被调函数之后被调用函数出现(chxin)在主调用函数之前。 float add (float x, float y) float z; z=x+y; return (z); main( ) float a, b; scanf( %f, %f,&a, &b); printf( su

21、m is %f , add(a, b) ); 第44页/共110页第四十四页,共111页。在所有函数(hnsh)之前说明函数(hnsh)类型此处不必(bb)说明定义(dngy)letter函数文件一开头,对所用函数作了声明 char letter( ); main( ) . char letter (c1, c2) char c1,c2; . 第45页/共110页第四十五页,共111页。第46页/共110页第四十六页,共111页。第47页/共110页第四十七页,共111页。附:调用外部(wib)函数(其他源文件中定义的函数)时 函数说明语句 extern 函数名(); 例 文件file1.c中

22、 main() int x=80,y=90,c; extern max(); /*函数说明*/ c=max(x,y)+20;/*调用max函数*/ printf(“Max is %dn”,c);文件files2.c中(与file1.c同目录)extern max(int a,int b) /*extern可省略*/float c; c=ab?a:b; return c;第48页/共110页第四十八页,共111页。6.5 函数函数(hnsh)的嵌套调的嵌套调用用 C语言允许嵌套调用函数(hnsh),即在调用一个函数(hnsh)的过程中,又调用另一个函数(hnsh)主函数(hnsh)() 声 明

23、a 函 数(hnsh) 调 用 a 函 数(hnsh) a函数()声明b函数 调用b函数 b函数() 第49页/共110页第四十九页,共111页。6.6 函数函数(hnsh)的递归调的递归调用用 C语言允许递归调用函数,即在调用一个函数的过程(guchng)中,又直接或间接的调用该函数本身直接递归调用 调用函数的过程(guchng)中又调用该函数本身int f(int x)int y; y=f (x); return y;第50页/共110页第五十页,共111页。间接递归调用 调用f1函数(hnsh)的过程中调用f2函数(hnsh),而f2中又需要调用f1。显然,以上均为无终止递归调用。为此,

24、一般要用if语句来控制使递归过程到某一条件满足(mnz)时结束。int f1(int x)int y; y=f2(x); return y;int f2(int x)int y; y=f1(x); return y;第51页/共110页第五十一页,共111页。递归法:类似(li s)于数学证明中的反推法,从后一结果与前一结果的关系中寻找其规律性。归纳法可以分为:递推法 从初值出发,归纳出新值与旧值间直到最后值为止存在(cnzi)的关系要求通过分析得到: 初值+递推公式编程:通过循环控制结构实现(循环的终值是最后值)递归法 从结果出发,归纳出后一结果与前一结果直到初值为止存在(cnzi)的关系要

25、求通过分析得到: 初值+递归函数第52页/共110页第五十二页,共111页。编程:设计一个函数(递归函数),这个函数不断使用下一级值调用自身,直到结果已知处选择控制结构其一般形式是:在主函数中用终值n调用递归函数,而在递归函数中:递归函数名f (参数(cnsh)x) if (n=初值) 结果=; else 结果=含f(x-1)的表达式; 返回结果(return);第53页/共110页第五十三页,共111页。第54页/共110页第五十四页,共111页。实际上,递归程序分两个阶段(jidun)执行回推(调用):欲求n! 先求 (n-1)! (n-2)! 1! 若1!已知,回推结束。递推(回代):知

26、道1! 2! 可求出3! n ! main() int n; float s; float fac(); printf(Input n=); scanf(%d,&n); s=fac(n); printf(%d!=%.0f,n,s);float fac(int x)int f; if (x=0|x=1) f=1; else f=fac(x-1)*x; return f; 运行(ynxng):Input n=55!=120第55页/共110页第五十五页,共111页。第56页/共110页第五十六页,共111页。图示第57页/共110页第五十七页,共111页。程序(chngx):main()clrsc

27、r(); printf(%d,age(5); age(int n) int c; if (n=1) c=10; else c=age(n-1)+2; return c;运行(ynxng):18第58页/共110页第五十八页,共111页。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 11 5 10 10 5 1 分析: 第x行有x个值 对第x行第y列,其值(不计左侧空格时) 1 (y=1 或 y=x)c(x,y)= c(x-1,y-1)+c(x-1,y)例例6.8在屏幕在屏幕(pngm)上显示杨辉三上显示杨辉三角形角形第59页/共110页第五十九页,共111页。程序(chngx)如下

28、:main()int i,j,n;clrscr();printf(Input n=);scanf(%d,&n);for (i=1;i=n;i+) for (j=0;j=n-i;j+) printf( ); for (j=1;j=i;j+) printf(%3d ,c(i,j); printf(n); int c(int x,int y)int z;if (y=1|y=x) return 1;else z=c(x-1,y-1)+c(x-1,y); return z; 第60页/共110页第六十页,共111页。#include rev() char c; c=getchar(); if (c=$)

29、 printf(%c,c); else rev(); printf(%c,c); main()rev();例例6.9运行下列程序,当输入字符序列运行下列程序,当输入字符序列AB$CDE并回车时,程序的输出结果并回车时,程序的输出结果(ji gu)是什么?是什么?运行(ynxng):$BA第61页/共110页第六十一页,共111页。例例6.10反向反向(fn xin)输出一个整数输出一个整数(非数值问题)(非数值问题)非数值问题的分析(fnx)无法象数值问题那样能得出一个初值和递归函数式,但思路是相同的。分析(fnx)方法:简化问题:设要输出的正整数只有一位,则“反向输出”问题可简化为输出一位整

30、数。对大于10的正整数,逻辑上可分为两部分:个位上的数字和个位以前的全部数字。将个位以前的全部数字看成一个整体,则为了反向输出这个大于10的正整数,可按以下步骤: a、输出个位上的数字; b、将个位除外的其他数字作为一个新的整数,重复a步骤的操作。第62页/共110页第六十二页,共111页。其中b问题只是对原问题在规模上进行了缩小递归。所以(suy),可将反向输出一个正整数的算法归纳为: if (n为一位整数) 输出n; else 输出n的个位数字; 对剩余数字组成的新整数重复“反向输出”操作; 第63页/共110页第六十三页,共111页。程序(chngx)如下:#include void m

31、ain() void printn(int x); int n; printf(Input n=); scanf(%d,&n); if (n=0&x%cn,getone,putone); void hanoi(int n,char one,char two,char three) if(n=1) move(one,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)

32、; printf(The steps to moving %3d disks:n,m); hanoi(m,A,B,C); Input the number of disks: 3The steps to moving 3 disks:A-CA-BC-BA-CB-AB-CA-C第67页/共110页第六十七页,共111页。递归的条件(tiojin):1、须有完成函数(hnsh)任务的语句;long f(int n) long y; if (n=1) y=1; else y=n*f(n-1); return(y);2、一个确定(qudng)是否能避免递归调用的测试;3、一个递归调用语句; 该语句的参

33、数应该逐渐逼近结束条件,以至最后断绝递归。4、先测试,后递归调用。在递归函数定义中,必须先测试,后递归调用。也就是说,递归调用是有条件的,满足了条件后,才可以递归。long f(int n) long y; y=n*f(n-1); if (n=1) y=1; return(y);第68页/共110页第六十八页,共111页。递归的特点(tdin):1、递归调用不是重新复制该函数,每次调用它时,新的局部变量和形参会在内存中重新分配内存单元,并以新的变量重新开始执行(zhxng);每次递归返回时,当前调用层的局部变量和形参被释放,并返回上次调用自身的地方继续执行(zhxng);2、递归调用一般并不节

34、省内存空间,因为每次调用都要产生一组新的局部变量,从而(cng r)不破坏上层的局部变量;3、递归调用一般并不能加快程序的执行速度,因为每次调用都要保护上层局部量(现场),而返回时又要恢复上层局部量,占用执行时间;4、递归函数中,必须有结束递归的条件;5、递归调用的优点是能实现一些迭代算法难以解决的问题。第69页/共110页第六十九页,共111页。6.7 数组作为数组作为(zuwi)函数函数参数参数 数组元素可以作函数的实参 数组名可以作函数的实参和形参 多维数组可以作函数参数 6.7.1 数组元素作函数的实参 由于表达式可以做实参,数组元素可以作为表达式的组成部分,因此,数组元素可以做函数的

35、实参,并且(bngqi)可以单向传递给形参。第70页/共110页第七十页,共111页。例 两个(lin )数组大小比较432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2a和b为有10个元素的整型数组比较两数组对应元素变量n,m,k记录(jl)aibi, ai=bi, aik,认为数组ab 若nk,认为数组ab 若n=k,认为数组a=b#include main() printf(Enter array a:n); for(i=0;i

36、10;i+)scanf(%d,&ai); printf(Enter array b:n); for(i=0;i10;i+)scanf(%d,&bi); for(i=0;iy) flag=1; else if(xy) flag=-1; else flag=0; return(flag);第71页/共110页第七十一页,共111页。6.7.2数组名作函数参数地址传递在主调函数与被调函数分别定义数组,且类型应一致形参数组大小(多维数组第一维)可不(k b)指定形参数组名是地址变量第72页/共110页第七十二页,共111页。例 求学生的平均(pngjn)成绩 #include float averag

37、e(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 average(int stu10, int n) int i; float av,total=0; for( i=0; in; i+ ) total += stui; av = total/n; return av; 实参用数组名形

38、参用数组定义(dngy), int stu .2109score562312.88stu第73页/共110页第七十三页,共111页。说明(shumng):1、用数组名作函数参数,应在主调函数和被调函数中分别定义数组,而不能只在一方(y fn)定义,被调函数是在形参表中进行定义;float score10;aver=average(score);float average(float array10)2、形参数组和实参数组的大小可一致可不一致;语言(yyn)编译时对形参数组大小不作检查,只将实参数组的首地址传给形参数组;3、float average(float array , int n) a

39、ver=average(score, 10);第74页/共110页第七十四页,共111页。第75页/共110页第七十五页,共111页。例 数组元素(yun s)与 数组名 作函数参数比较12a调用前a0a112a调用a0a112xy21xy交换12a返回#include void swap2(int 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);值传递(chund)第76页/共110页第七十六页,共111页。12a调用前12ax调用21ax交换21a返回#inc

40、lude 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);地址(dzh)传递例 数组元素(yun s)与 数组名 作函数参数比较第77页/共110页第七十七页,共111页。例例6.12用选择法对数组中用选择法对数组中10个整数个整数(zhngsh)按由小到大排序按由小到大排序所谓选择法就是:先将10个整数中最小的数与a0对换,再将a1到a9中最小的数与a1对换;.每比较一轮(y ln),找出未经排序的数中最小的一个,共应比较 9 轮。程序设计函数

41、sort(array, n) 对数组元素按由小到大排序(pi x)主程序 :输入array数组,调用 sort 函数比较,输出排序(pi x)后的array数组第78页/共110页第七十八页,共111页。排序函数:无返回值,数组名为形参形参数(cnsh)组说明可以不指定大小交换(jiohun)arrayj和 arrayi; void sort (int array , int n ) int v, j, t; for (i=0; in-1; i+) for (j=i+1; jn; j+) if (arrayjarrayi) t=arrayi; arrayi=arrayj; arrayj=t;

42、第79页/共110页第七十九页,共111页。main ( ) int a10, i;printf(“enter array: n”);for (i=1; i10; i+) scanf (“ %d ”,&ai);sort(a, 10);printf(“the sorted array: n”);for (i=1; i10; i+) printf (“ %4d ”, ai);printf(“n”);实参数组说明(shumng)数组 a 赋值调用(dioyng)排序函数由于地址(dzh)传递,实参数组 a 改变第80页/共110页第八十页,共111页。6.7.3多维数组作函数参数多维数组作函数参数形

43、参数(cnsh)组定义时可以指定每一维的大小,也可省略第一维的大小说明(但不能省略第二维及其它高维的大小说明)例如 : int array 310; 或 int array 10; 但不能写成 int array 3 ; 和 int array ;实参数(cnsh)组可以大于形参数(cnsh)组例如:实参数(cnsh)组定义为:int array 510; 形参数(cnsh)组定义为:int array 310;形参数(cnsh)组只取实参数(cnsh)组的一部分,其余部分不起作用第81页/共110页第八十一页,共111页。例 写函数打印n行10列二维数组,其中n是任意整数(zhngsh) v

44、oid print_array(int a 10, int n) int i, j; for(i=0;in; i+) for(j=0;j10;j+) printf(“%3d”, aij); printf(“n”); 例 写函数交换任意一个n*10的二维数组的i,j两行 void exchange(int a 10, int i,int j) int k, t; for(k=0;k10;k+) t=aik; aik=ajk; ajk=t; 第82页/共110页第八十二页,共111页。例8.12 n行10列int型数组的每一行(yxng)都有一个最大值,写一函数,求这n个最大值的最小值. max_

45、element(int a ,int m) int max, i; max= a0; for(i=1;imax) max=ai; return max; max_min( int a , int n) int i,min, max; min=max_element(a0, 10); for(i=1;imax) min=max; return min; 第83页/共110页第八十三页,共111页。例 求二维数组中最大元素(yun s)值1 3 5 72 4 6 815 17 34 12ijmax=11 3 5 72 4 6 815 17 34 12ijmax=31 3 5 72 4 6 815

46、17 34 12ijmax=5j1 3 5 72 4 6 815 17 34 12imax=7j1 3 5 72 4 6 815 17 34 12imax=7j1 3 5 72 4 6 815 17 34 12imax=34int max_value(int array34) int i,j,k,max; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return(max);main() int a34=1,3,5,7, 2,4,6,8,15,17,34,12; printf(max value is %dn,max_value(

47、a);多维形参数组第一维维数可省略,第二维必须相同 int array4第84页/共110页第八十四页,共111页。例 求二维数组中各行元素(yun s)之和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 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+)

48、 printf(The sum of row%d=%dn,i+1,sum_rowi);314679asum_rowxresult1812第85页/共110页第八十五页,共111页。6.8 变量的作用域与存储变量的作用域与存储(cn ch)类别类别作用域生存期变量在整个程序的运行时间都存在变量只在某个函数的执行过程中才存在第86页/共110页第八十六页,共111页。6.8.1 局部变量与全局变量局部变量与全局变量局部变量函数(hnsh)内部或复合语句内定义的变量称为局部变量例:a、v1、x的有效(yuxio)范围v2、x、y的有效(yuxio)范围m、y的有效范围第87页/共110页第八十七页,

49、共111页。说明(shumng):main( ) int a, b; int c; c=a+b; c在此范围(fnwi)内有效a、b在此范围内有效第88页/共110页第八十八页,共111页。void main( ) int i, a=0; for (i=1; i=2; i+) int a=1; a+; printf(i=%d, a=%dn, i, a); printf(i=%d, a=%dn, i, a);i=1, a=2i=2, a=2i=3, a=0全局变量定义:在函数外部定义的变量,又称为外部变量。全局变量可以为本文件中其它函数所共用其有效范围为从定义变量的位置开始(kish)到本源文件

50、结束第89页/共110页第八十九页,共111页。例:#include int p=1, q=5;float f1(int a) int b, c; char c1, c2;char f2(int x, int y) int i, j; .main( ) int m,n; 全局变量p、q的作用域全局变量c1、c2的作用域第90页/共110页第九十页,共111页。说明(shumng):、全局变量增加了函数间的数据联系;、尽量少使用(shyng)全局变量(除非在必要时);各模块间的相互联系(linx)、相互影响太多,降低了模块的独立性;会降低程序的清晰性,因为各个函数都有可能改变全局变量的值,需要时

51、刻记住变量的当前值,编程时候容易出错。#include int k;void show( ) for (k=1; k=10; k+) putchar(*); putchar(n);第91页/共110页第九十一页,共111页。、若全局变量与局部变量同名(tngmng),则在局部变量的作用范围内,全局变量不起作用;#include int a=3, b=5;int max(int a, int b) int c; c=ab ? a : b; return(c);void main( ) int a=8; printf(%d, max(a, b) );形参a、b的作用域全局变量a、b不起作用局部变量

52、a的作用域全局变量b的作用域全局变量a不起作用讨论:如果主函数(hnsh)中没有int a=8,结果?第92页/共110页第九十二页,共111页。、若全局变量在文件开头定义,则在整个程序中都可以使用;若不在开头定义,其作用域只限于说明处到文件结束。如果想在定义之前的函数中引用该全局变量,则在函数中用关键字“extern”作“外部变量声明”,在函数内部(nib),从声明之处起,可以使用它们。#include int max(int x, int y) int z; z=xy ? x : y; return(z);void main( ) extern int a, b; printf(%d, m

53、ax(a, b) );int a=13, b=-8;第93页/共110页第九十三页,共111页。6.8.2 变量变量(binling)的存的存储类型储类型 结构化设计(shj)要求研究不同模块(函数、源文件)间变量的关系。变量两大属性: 数据类型 存储类别1、数据类型(复习)通过(tnggu)变量声明(定义)来规定其数据类型: 格式 数据类型关键字 变量名 如 char a; int b,c ; float x,y;第94页/共110页第九十四页,共111页。预留存储空间(如char型为1个字节,int型为2个字节)确定存储方式(fngsh)(如char型存放ASCII值,int型存放补码值)

54、char型 01100001 (用一个字节存放该字符的ASCII值)int 型 0110000111100110(用两个字节存放该数值的补码)float型 0110101010 011000011(四个字节)一个变量的数据类型定义后,就规定了该变量只能存储相应类型的数据 第95页/共110页第九十五页,共111页。2、存储空间的划分(hu fn) 程序区静态存储区动态存储区程序区:用于存放程序编译后形成的可执行(zhxng)代码(执行(zhxng)时装入)静态(jngti)存储区:用于存放程序中的静态(jngti)数据,如全局变量等动态存储区:用于存放程序中的动态数据,如函数形参、局部变量、函

55、数调用时的现场保护和返回地址等静态数据说明时在静态存储区中分配存储单元并在程序执行过程中始终占用该单元,直到程序结束才释放;动态数据在函数开始执行时分配动态存储空间,函数结束时释放这些空间。第96页/共110页第九十六页,共111页。3、存储类别 规定了变量(binling)在计算机内部的存放位置决定变量(binling)的“寿命”(何时“生”,何时“灭”) 一个完整的变量(binling)说明格式如下: 存储类别 数据类型 变量(binling)名 如 static int x, y;的存储类别有四种:auto、static、register和extern。 register型(寄存器型)

56、变量值存放在运算器的寄存器中存取速度快,一般只允许(ynx)23个,且限于char型和int型,通常用于循环变量第97页/共110页第九十七页,共111页。 auto型(自动变量型)变量值存放在主存储器的动态存储区(堆栈方式(fngsh))优点同一内存区可被不同变量反复使用 static型(静态变量型)变量值存放在主存储器的静态存储区程序执行开始至结束,始终占用(zhn yn)该存储空间 extern型(外部变量型)同上,其值可供其他源文件使用以上两种均属于“动态存储”性质,即调用函数时才为这些变量分配单元,函数调用结束(jish)其值自动消失。以上两种均属于“静态存储”性质,即从变量定义处开

57、始,在整个程序执行期间其值都存在。第98页/共110页第九十八页,共111页。4、局部变量的存储(cn ch)方式函数中的局部变量,如不做专门的声明,都是动态(dngti)分配存储空间的,存储在动态(dngti)存储区中;用关键字auto作存储类型的声明。auto int b, c=3;auto float f;通常auto被省略(shngl),auto不写则隐含确定为“自动存储类别”int b, c=3;float f;局部静态变量用static声明变量为“局部静态变量”。如 static int s; static char ch;第99页/共110页第九十九页,共111页。void f(

58、int c) int a=0; static int b=0; a+; b+; printf(%d: a=%d, b=%dn, c, a, b);void main( ) int i; for (i=1; i=3; i+) f( i );1: a=1, b=12: a=1, b=23: a=1, b=3说明(shumng):、静态局部变量采用静态存储方式,而自动(zdng)变量采用动态存储方式;第100页/共110页第一百页,共111页。、若对变量赋初值,对于静态变量,只执行一次,再次调用函数时不再赋初值而保留上次函数调用结束(jish)时的值;而对于自动变量,每次调用都要重新分配内存单元并赋

59、初值;、若不对变量(binling)赋初值,对于静态变量(binling)系统自动赋缺省值;而对于自动变量(binling),只分配存储单元,其值不确定。、虽然(surn)静态局部变量在函数调用结束后仍占存储单元,但由于是局部变量,其它函数不能引用它。适用范围:、需要保留函数上一次调用结束时的值;(占用永久性的存储空间)、对于数组进行初始化,通常定义为静态存储类别。第101页/共110页第一百零一页,共111页。寄存器(register)变量(binling)为了减少从内存中存取变量值的时间(shjin),语言允许将局部变量的值放在寄存器中;用关键字register声明。int fac(int

60、 n) register int i, f; for (i=1; i=n; i+) f=f * i; return( f );说明(shumng): 只有局部自动变量和形参可以定义为寄存器变量,关键字register不能省略; 不能定义太多的寄存器变量,因为寄存器数量有限,太多无效(将自动按自动变量处理)。第102页/共110页第一百零二页,共111页。5、全局变量的存储(cn ch)方式全局变量是在函数外部定义(dngy)的,存放在静态存储区,在程序的整个运行过程中占用存储单元,生存期为整个程序的运行期间。全局变量有两种存储类别:static和extern,用来对其作用域进行限制(xinzh

61、)或扩充。如果想在定义之前的函数中引用全局变量,则在函数中用关键字“extern”作“外部变量声明”,在函数内部,从声明之处起,可以使用它们。void main( ) extern int a, b; printf(%d, max(a, b) );int a=13, b=-8;第103页/共110页第一百零三页,共111页。如果一个程序由多个源程序文件组成,那么一个某文件中的函数能否引用(ynyng)另一个文件中的全局变量,有两种情况:、在一个文件中要引用另一文件中定义的全局变量,要在引用它的文件中用(zhngyng)extern作声明。int a;void main( ) file1.cex

62、tern int a;int power( ) file2.c在文件(wnjin)file1.c中定义的变量a,在文件(wnjin)file2.c中引用,引用前加上extern进行声明。第104页/共110页第一百零四页,共111页。、全局变量仅限于被本文件中的函数引用,其它文件不能使用(shyng)。定义全局变量时用static进行声明。static int a;void main( ) file1.cextern int a;int power( ) file2.c加上static,限制了a的作用域,在file2.c中引用失败;但不管是否加上static,a都按静态存储(cn ch)方式存

63、放。第105页/共110页第一百零五页,共111页。6.9 函数的作用域和存储函数的作用域和存储(cn ch)类别类别一、内部(nib)函数定义:如果一个函数只能被本文件中其它函数调用,称为内部函数。定义格式: static 类型标识符 函数名(形参表)函数体 例如(lr):static int fun(a, b) 作用:函数的作用域限于所在文件,不同文件中同名函数互不干扰,便于程序的格式化。第106页/共110页第一百零六页,共111页。二、外部(wib)函数定义:如果一个函数允许被其它文件调用(dioyng),称为外部函数。定义格式: extern 类型标识符 函数名(形参表)函数体 例如

64、:extern int fun(int a, int b) 或 int fun(int a, int b) 通常不加 static 标识符的函数都是外部函数。第107页/共110页第一百零七页,共111页。6.10 存储存储(cn ch)类别小类别小结结1、数据(shj)的两种属性:数据类型存储(cn ch)类别auto float a;static int b;register char c;extern int d;2、从作用域分:局部变量全局变量自动变量静态局部变量寄存器变量形参静态全局变量非静态全局变量第108页/共110页第一百零八页,共111页。3、从生存期分:动态(dngti)存

65、储静态(jngti)存储自动(zdng)变量寄存器变量形参静态局部变量静态全局变量非静态全局变量4、从存放位置分:内存的静态存储区:内存的动态存储区:CPU中的寄存器:静态局部变量静态全局变量外部变量自动变量形参寄存器变量第109页/共110页第一百零九页,共111页。感谢您的观看(gunkn)!第110页/共110页第一百一十页,共111页。NoImage内容(nirng)总结6.1 概 述。各个文件可以单独编译并与库中已经编译过的函数(hnsh)装配在一起。将常用功能做成标准模块(标准函数(hnsh))放在函数(hnsh)库中供其他程序调用。main函数(hnsh)是系统定义的,只能由系统调用。用户自定义函数(hnsh):解决用户的专门需要。编程:通过循环控制结构实现(循环的终值是最后值)。简化问题:设盘子只有一个,则本问题可简化为ac。将a座上n-1个盘子移到b座。将a座上第n个盘子移到c座。将b座上n-1个盘子移到c座。感谢您的观看第一百一十一页,共111页。

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

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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