《C语言程序设计:chapter07 用函数实现模块化程序设计》由会员分享,可在线阅读,更多相关《C语言程序设计:chapter07 用函数实现模块化程序设计(73页珍藏版)》请在金锄头文库上搜索。
1、1第七章第七章 用函数实现模块化程序设计用函数实现模块化程序设计C C 语言程序设计语言程序设计2 2/73/73本章要点本章要点l l函数的定义、说明与调用函数的定义、说明与调用l l函数之间参数传递规则函数之间参数传递规则l l函数递归调用和嵌套调用函数递归调用和嵌套调用l l变量的存储类型与特性变量的存储类型与特性3 3/73/73第七章第七章 用函数实现模块化程序设计用函数实现模块化程序设计4 4/73/73一、一、模块化程序结构模块化程序结构模块模块1主模块主模块模块模块11模块模块2模块模块21模块模块227.1 概述概述一个较大的应用程序应分为若干个程序模块,每一个一个较大的应用
2、程序应分为若干个程序模块,每一个模块用来实现一个特定的功能。模块用来实现一个特定的功能。所有的高级语言都有所有的高级语言都有子程序概念,用子程序实现模块的功能。子程序概念,用子程序实现模块的功能。5 5/73/73 学生成绩学生成绩 管理系统管理系统 成绩成绩 录入录入 成绩成绩 查询查询 成绩成绩 统计统计 成绩单成绩单打印打印在在 C 语言中是利用函数来实现子程序的作用。语言中是利用函数来实现子程序的作用。 6 6/73/73采用模块化程序设计的优越性采用模块化程序设计的优越性采用模块化程序设计的优越性采用模块化程序设计的优越性:l l控制程序设计的控制程序设计的控制程序设计的控制程序设计
3、的复杂性复杂性复杂性复杂性l l提高软件的提高软件的提高软件的提高软件的可靠性可靠性可靠性可靠性l l提高软件开发的提高软件开发的提高软件开发的提高软件开发的效率效率效率效率l l提高软件的提高软件的提高软件的提高软件的可维护性可维护性可维护性可维护性l l提高程序的提高程序的提高程序的提高程序的重用性重用性重用性重用性7 7/73/73l lC C C C程序是函数的集合体,程序是函数的集合体,程序是函数的集合体,程序是函数的集合体,每个函数是一个独立每个函数是一个独立每个函数是一个独立每个函数是一个独立的程序模块;的程序模块;的程序模块;的程序模块;l l有一个主函数,若干有一个主函数,若
4、干有一个主函数,若干有一个主函数,若干个子函数;个子函数;个子函数;个子函数;l l所有子函数地位平等,所有子函数地位平等,所有子函数地位平等,所有子函数地位平等,可相互调用、自我调可相互调用、自我调可相互调用、自我调可相互调用、自我调用用用用; ; ; ;l l函数可集中或分散存函数可集中或分散存函数可集中或分散存函数可集中或分散存放在一个或多个源程放在一个或多个源程放在一个或多个源程放在一个或多个源程序文件中序文件中序文件中序文件中。函数函数F1 ( )main ( )F11 ( )F2 ( )F21 ( )F22 ( )二、二、C C程序的结构程序的结构黑盒子黑盒子8 8/73/73三、
5、三、C函数的分类函数的分类数学函数数学函数 ( (math.hmath.h) )字符和字符串函数字符和字符串函数 ( ctype.hctype.h, ,string.hstring.h)I/OI/O函数函数 ( stdio.hstdio.h)动态存储分配函数动态存储分配函数( (stdlib.hstdlib.h或或malloc.hmalloc.h) )形式形式无参函数无参函数有参函数有参函数空函数空函数库函数库函数用户定义函数用户定义函数详见详见P384附录附录F9 9/73/73四、四、C程序程序的的执行顺序执行顺序l一个源程序文件,由一一个源程序文件,由一个或多个函数以及其他个或多个函数以
6、及其他有关内容组成,是一个有关内容组成,是一个编译单位,编译单位,函数不是一函数不是一个编译单位。个编译单位。lC程序的执行总是从程序的执行总是从main函数开始,调用其函数开始,调用其它函数后回到它函数后回到main函数,函数,在在main函数中结束整个函数中结束整个程序的运行;程序的运行;l所有的子函数都是平行所有的子函数都是平行的,任何子函数都不属的,任何子函数都不属于其他函数;于其他函数;void main()printstar();printmessage();例例7- 1#include void printstar() printf(“*n”);void printmessage
7、()printf(“ Hello,world.n”); printstar();这两个函数能单独执行吗?这两个函数能单独执行吗?不能不能1010/73/73例例7- 2#include int max(int x,int y) int z; z = x y ? x : y; return( z );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c);void printstar() printf(“*”);void function(int a, float y) 7.2 函数
8、的定义函数的定义一、函数定义的一般形式一、函数定义的一般形式一、函数定义的一般形式一、函数定义的一般形式类型说明类型说明 函数名函数名( ( 形式参数说明形式参数说明 ) ) 函数体函数体 形式参数说明方法:形式参数说明方法:类型说明类型说明 变量名变量名1,类型说明,类型说明 变量名变量名2 1.1.无参函数的定义形式无参函数的定义形式类型说明类型说明 函数名函数名( () ) 函数体函数体 2.2.空函数的定义形式空函数的定义形式类型说明类型说明 函数名函数名( ( 形式参数说明形式参数说明 ) ) 1111/73/73一般情况下,函数体由两一般情况下,函数体由两一般情况下,函数体由两一般
9、情况下,函数体由两部分部分部分部分组组成:成:成:成: 局部变量说明局部变量说明局部变量说明局部变量说明 语句语句语句语句 局部局部局部局部变变量:量:量:量: 函数体内定函数体内定函数体内定函数体内定义义的的的的变变量,量,量,量,其有效范其有效范其有效范其有效范围仅围仅在函数内部,在函数内部,在函数内部,在函数内部,离开函数体无意离开函数体无意离开函数体无意离开函数体无意义义。7.2 函数的定义函数的定义二、函数体组成二、函数体组成二、函数体组成二、函数体组成1212/73/73c=max (a,b);7.3 函数参数和函数的值函数参数和函数的值一个一个一个一个C C程序由若干个函数程序由
10、若干个函数程序由若干个函数程序由若干个函数组组成,成,成,成,各函数各函数各函数各函数调调用用用用时经时经常要常要常要常要传递传递一些数一些数一些数一些数据,据,据,据,调调用函数把数据用函数把数据用函数把数据用函数把数据传递给传递给被被被被调调用函数,用函数,用函数,用函数,经经被被被被调调用函数使用后,用函数使用后,用函数使用后,用函数使用后,一般会返回一个确定一般会返回一个确定一般会返回一个确定一般会返回一个确定结结果,在返果,在返果,在返果,在返回回回回调调用函数用函数用函数用函数时时,把,把,把,把这这些些些些结结果果果果带带回回回回调调用函数。用函数。用函数。用函数。例例7- 2#
11、include int max(int x,int y) int z; z = x y ? x : y; return( z );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, );主调函数主调函数int max(int x,int y) return( z );被调用函数被调用函数a, bz各函数的信息往来主要是由各函数的信息往来主要是由参数传递参数传递和和返回语句返回语句实现的实现的1313/73/73一、形式参数和一、形式参数和实际参数参数7.3 函数参数和函数的值函数参数
12、和函数的值例例7- 2#include int max(int x,int y) int z; z = x y ? x : y; return( z );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c);函数参数用于函数间数据的传递函数参数用于函数间数据的传递形式参数:形式参数:定义定义函数时使用的参数函数时使用的参数实际参数:实际参数:调用调用函数时使用的参数函数时使用的参数函数函数max有两个形式参数有两个形式参数x和和y形参形参x和和y只在只在max函数中使用函数中使用
13、a和和b是主函数中定义的变量是主函数中定义的变量main函数调用函数调用max函数函数a和和b是是max函数的实参函数的实参23,56The max is 561414/73/73说明:说明:1.1.定义函数时,必须说明形参类定义函数时,必须说明形参类型,形参只能是型,形参只能是变量变量和和数组数组;2.2.函数被调用前,形参不占内存,函数被调用前,形参不占内存,函数调用结束后,内存也被释放;函数调用结束后,内存也被释放;3.3.实参可以是实参可以是常量常量、变量变量和和表达表达式式;4.4.实参和形参的类型必须一致,实参和形参的类型必须一致,字符型和整型可以相互匹配;字符型和整型可以相互匹配
14、;5.C5.C语言中实参对形参的数据传语言中实参对形参的数据传递是递是“值传递值传递”,即单向传递,即单向传递,仅由参数的对应位置决定,与名仅由参数的对应位置决定,与名字无关。字无关。一、形式参数和实际参数一、形式参数和实际参数7.3 函数参数和函数的值函数参数和函数的值例例8- 2#include int max(int x,int y) int z; z = x y ? x : y; return( z );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c);23,56Th
15、e max is 56例例8- 2#include int max(int x,int y) x = x y ? x : y; return( x );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c);例例7- 2#include int max(int b,int a) int c; c = b a ? b: a; return( c );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“Th
16、e max is %d”, c);1515/73/73一、形式参数和实际参数一、形式参数和实际参数7.3 函数参数和函数的值函数参数和函数的值例例例例7-3 7-3 读程序,写程序结果读程序,写程序结果读程序,写程序结果读程序,写程序结果#include int sum(int a,int b) int c; a=a+b; b=a+b; c=a+b; printf(“sum:%d+%d = %dn”, a,b,c); return a; void main() int a=1,b=3,c ; c=sum(a,b); printf(“main:%d+%d = %dn”, a,b,c);1616/
17、73/737.3 函数参数和函数的值函数参数和函数的值二、函数的返回值二、函数的返回值1.1.返回函数值的方法返回函数值的方法返回函数值的方法返回函数值的方法(1)(1)函数的返回值也就是函数的函数的返回值也就是函数的函数的返回值也就是函数的函数的返回值也就是函数的值,如果一个函数有返回值,值,如果一个函数有返回值,值,如果一个函数有返回值,值,如果一个函数有返回值,就必须用就必须用就必须用就必须用returnreturn语句;语句;语句;语句;(2)(2)一个函数中可以有多个一个函数中可以有多个一个函数中可以有多个一个函数中可以有多个returnreturn语句,无论执行到哪语句,无论执行到
18、哪语句,无论执行到哪语句,无论执行到哪个个个个returnreturn语句,都将结束函语句,都将结束函语句,都将结束函语句,都将结束函数调用,返回主调函数。数调用,返回主调函数。数调用,返回主调函数。数调用,返回主调函数。例例8- 2#include int max(int x,int y) int z; z = x y ? x : y; return( z );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c);例例8- 2#include int max(int x,int
19、 y) if(xy) return (x) ; return ( z );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c);例例7- 2#include int max(int x,int y) return(x y ? x : y );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c);(3) return(3) return语句中的括号可以语句中的括号可以
20、语句中的括号可以语句中的括号可以省略,省略,省略,省略,returnreturn后面可以是一后面可以是一后面可以是一后面可以是一个表达式个表达式个表达式个表达式, ,返回的是表达式返回的是表达式返回的是表达式返回的是表达式的值。的值。的值。的值。1717/73/732. 2. 函数值的类型函数值的类型函数值的类型函数值的类型(1)(1)函数的类型也就是函数值函数的类型也就是函数值函数的类型也就是函数值函数的类型也就是函数值的类型,函数的类型,函数的类型,函数的类型,函数maxmax是是是是intint型型型型的,函数的,函数的,函数的,函数maxmax的值也是的值也是的值也是的值也是intin
21、t型的;型的;型的;型的;(2)(2)省略了类型说明的函数是省略了类型说明的函数是省略了类型说明的函数是省略了类型说明的函数是intint型;型;型;型;(3)return(3)return语句中的表达式一语句中的表达式一语句中的表达式一语句中的表达式一般应与函数类型一致。如般应与函数类型一致。如般应与函数类型一致。如般应与函数类型一致。如果不一致,需要进行类型果不一致,需要进行类型果不一致,需要进行类型果不一致,需要进行类型转换,只有数值型数据可转换,只有数值型数据可转换,只有数值型数据可转换,只有数值型数据可以进行自动类型转换,以以进行自动类型转换,以以进行自动类型转换,以以进行自动类型转
22、换,以函数类型为准。函数类型为准。函数类型为准。函数类型为准。例例7- 2#include int max(int x,int y) int z; z = x y ? x : y; return( z );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c);7.3 函数参数和函数的值函数参数和函数的值1818/73/733.3.不需要返回值的函数不需要返回值的函数不需要返回值的函数不需要返回值的函数(1)(1)如果函数中没有使用如果函数中没有使用如果函数中没有使用如果函数中没有
23、使用returnreturn语句,函数返回的语句,函数返回的语句,函数返回的语句,函数返回的是一个不确定的值;是一个不确定的值;是一个不确定的值;是一个不确定的值;(2)(2)如果一个函数不需要返回如果一个函数不需要返回如果一个函数不需要返回如果一个函数不需要返回值,可以用值,可以用值,可以用值,可以用voidvoid做类型说做类型说做类型说做类型说明;明;明;明;(3)(3)如果一个函数被声明为如果一个函数被声明为如果一个函数被声明为如果一个函数被声明为voidvoid型的,就不允许再引型的,就不允许再引型的,就不允许再引型的,就不允许再引用他的返回值,只能用函用他的返回值,只能用函用他的返
24、回值,只能用函用他的返回值,只能用函数语句形式调用;数语句形式调用;数语句形式调用;数语句形式调用;7.3 函数参数和函数的值函数参数和函数的值例例7- 1#include void printstar() printf(“*”);void printmessage()printf(“ Hello,world.n”); printstar();void main()printstar();printmessage();1919/73/737.4 函数的调用函数的调用一一. 函数调用的一般形式函数调用的一般形式 函数名函数名(实参表列实参表列)说明:说明:1.1.如果调用无参函数,实如果调用无参
25、函数,实参表列部分没有,但括号参表列部分没有,但括号不能省略不能省略; ;2.2.实参的个数和形参个数实参的个数和形参个数一般相等;一般相等;3.3.实参和形参的类型一一实参和形参的类型一一对应,必要时使用类型转对应,必要时使用类型转换;换;4.4.实参变量定义在调用函实参变量定义在调用函数之前完成。数之前完成。例例7- 2#include int max(int x,int y) int z; z = x y ? x : y; return( z );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The m
26、ax is %d”, c);2020/73/73二二. 函数调用的方式函数调用的方式1.1.函数语句函数语句形式为形式为:函数名函数名( (实参表列实参表列););例如:例如: printmessage(); printf(“%d”,a);说明:说明:这种方式不要求这种方式不要求函数带返回值,函数仅函数带返回值,函数仅完成一定的操作。完成一定的操作。2.2.函数表达式函数表达式函数的值参与运算函数的值参与运算例如:例如:m=max(a,b);m=3*max(a,b);printf(“The max is %d”, max(a,b);说明:说明:这种方式不能这种方式不能用于用于voidvoid类
27、型。类型。7.4 函数的调用函数的调用2121/73/737.4 函数的调用函数的调用三三. 函数调用的执行过程函数调用的执行过程1.1.按从右到左的顺序,按从右到左的顺序,计算实参各表达式的计算实参各表达式的值;值;2.2.按照位置,将实参按照位置,将实参的值一一传给形参;的值一一传给形参;3.3.执行被调用函数;执行被调用函数;4.4.当遇到当遇到return(return(表达表达式式) )语句时,计算表达语句时,计算表达式的值,并返回主调式的值,并返回主调函数。函数。2222/73/73#include #include int sum ( int x )int sum ( int x
28、 ) int i,t=0; int i,t=0; for (i=1; i=x; i+) for (i=1; i=x; i+) t+=i; t+=i; return (t); return (t); void main( )void main( ) int s; int s; s=sum (100); s=sum (100); printf(%dn, s); printf(%dn, s); 在程序中调用函数要在程序中调用函数要在程序中调用函数要在程序中调用函数要满足以下条件:满足以下条件:满足以下条件:满足以下条件:1.1.1.1.被调函数必须存在,被调函数必须存在,被调函数必须存在,被调函数必
29、须存在,且遵循先定义,后使且遵循先定义,后使且遵循先定义,后使且遵循先定义,后使用的原则;用的原则;用的原则;用的原则;2.2.2.2.如果函数在主调函如果函数在主调函如果函数在主调函如果函数在主调函数之后定义,则应在数之后定义,则应在数之后定义,则应在数之后定义,则应在主调函数中或主调函主调函数中或主调函主调函数中或主调函主调函数中或主调函数之前对被调函数进数之前对被调函数进数之前对被调函数进数之前对被调函数进行行行行声明声明声明声明。7.4 函数的调用函数的调用四四. 函数的声明函数的声明#include #include void main( )void main( ) int sum
30、( int x )int sum ( int x );int s;int s; s=sum (100); s=sum (100); printf(%dn, s); printf(%dn, s); int sum ( int x )int sum ( int x ) int i,t=0; int i,t=0; for (i=1; i=x; i+) for (i=1; i=x; i+) t+=i; t+=i; return (t); return (t);2323/73/73函数声明的一般形式函数声明的一般形式函数声明与函数定义的格式区别:函数声明与函数定义的格式区别:函数声明语句的函数声明语句的
31、( )后必须有分号,而函数定义后必须有分号,而函数定义( )后后没有分号。没有分号。函数声明只有一条语句,没有函数体,而函数定义函数声明只有一条语句,没有函数体,而函数定义有多条语句,有函数体。有多条语句,有函数体。int max(int xint max(int x,int y)int y);int max(int int max(int ,int)int);2424/73/73l l例例例例7-57-5 已知汽车以速度已知汽车以速度已知汽车以速度已知汽车以速度u ua a等速行驶的阻等速行驶的阻等速行驶的阻等速行驶的阻力功率为力功率为力功率为力功率为P P,燃油消耗率为,燃油消耗率为,燃油
32、消耗率为,燃油消耗率为b b,求汽车以,求汽车以,求汽车以,求汽车以速度速度速度速度u ua a等速行驶百公里燃油消耗量。等速行驶百公里燃油消耗量。等速行驶百公里燃油消耗量。等速行驶百公里燃油消耗量。 百公里燃油消耗量计算公式为:百公里燃油消耗量计算公式为:百公里燃油消耗量计算公式为:百公里燃油消耗量计算公式为:2525/73/73例例7- 5#include #define g 9.8void main() float qsf(float,float, float,float); float qresult,p, b, ua, rou; printf(p, b, ua, rou =n); s
33、canf(%f,%f, %f,%f,%f,&p,&b, &ua, &rou); qresult =qsf(p, b, ua, rou); printf(“qresult=%dn,qresult);float qsf(float p,float b, float ua,float rou ) float qs; qs=p*b/(1.02*ua*rou*g); return qs;/百公里燃油消耗量函数声明百公里燃油消耗量函数声明/实参变量定义实参变量定义 /实参变量赋值实参变量赋值/百公里燃油消耗量函数调用百公里燃油消耗量函数调用/*/*百公里燃油消耗量函数定义百公里燃油消耗量函数定义* */
34、/函数返回值函数返回值 2626/73/73例例例例7-6 7-6 设计一个程序完成下面表达式的计算,其中设计一个程序完成下面表达式的计算,其中设计一个程序完成下面表达式的计算,其中设计一个程序完成下面表达式的计算,其中mm,n n为正整数且为正整数且为正整数且为正整数且mn.mn.例例8- 6#include int factor(int k ) int i, kfactor=1; for(i=k;i1;i-) kfactor*=i; return kfactor;void main() int m,n,result; printf(m,n= n); scanf(%d,%d,&m,&n);
35、result =factor(m)*factor(n)/factor(m-n) ; printf(result=%dn,result);/求阶乘函数定义求阶乘函数定义/阶乘函数返回值阶乘函数返回值/三次调用阶乘函数三次调用阶乘函数2727/73/737.5 函数的嵌套调用和递归调用函数的嵌套调用和递归调用一、函数的嵌套调用一、函数的嵌套调用一、函数的嵌套调用一、函数的嵌套调用mainmainmainmain函数函数函数函数 调用函调用函调用函调用函数数数数 A;A;A;A; 函数函数函数函数 A A A A 调用函数调用函数调用函数调用函数 B B; 函数函数函数函数 B B B B 调用调用
36、调用调用返回返回返回返回2828/73/73函数定义不可嵌套函数定义不可嵌套void main( ) int n=3; printf (“%dn”, sub1(n);sub1(int n) int i,a=0; for (i=n; i0; i-) a+=sub2(i); return a;sub2(int n) return n+1;程序输出结果:程序输出结果:9 函数调用可以嵌套函数调用可以嵌套2929/73/737.5.2 函数的递归调用函数的递归调用1递归的基本概念递归的基本概念递归调用递归调用:一个函数直接或间接地调用了它本身,:一个函数直接或间接地调用了它本身,就称为函数的递归调用。
37、就称为函数的递归调用。递归函数递归函数:在函数体内调用该函数本身。:在函数体内调用该函数本身。int sub(int x) int y,z; if( ) z=sub(y); else return ;例如:例如:直接直接调用用sub函数本身函数本身3030/73/732递归函数的执行过程递归函数的执行过程【例例7.16】编一一递归函数求函数求n!。思路思路:以求:以求4的阶乘为例的阶乘为例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。递归结束条件递归结束条件:当:当n=1或或n=0时,时,n!=1。递归公式:递归公式:n! =1 (n=0, 1)n(n-1)! (n1)
38、3131/73/73#include void main ( ) int n, p;printf (n=?);scanf (%d, &n);p = fact (n);printf (%d!=%dn, n, p);int fact ( int n ) int r; if ( n = 1 ) r = 1; else r=n*fact(n-1); /* 递归调用递归调用 */ return (r);l l用用用用递归递归函数求函数求函数求函数求n! n! n! = n! = 1 1 当当当当 n = 1 n = 1 时时时时 n! = n * (n-1)! n! = n * (n-1)! 当当当当
39、n 1 n 1 时时时时3232/73/73void main( ) p=fact(4); fact( 4 ) r=4*fact(3); return 24 fact( 3 ) r=3*fact(2); return 6 fact(2 ) r=2*fact(1); return 2fact(1 ) r=1; return 1递归调用执行过程递归调用执行过程递递 推推回回 推推3333/73/733编制递归函数的方法编制递归函数的方法 数值型问题递归函数的编程方法数值型问题递归函数的编程方法对于数值型问题,首先要找出解题的数学公式,对于数值型问题,首先要找出解题的数学公式,对于数值型问题,首先要
40、找出解题的数学公式,对于数值型问题,首先要找出解题的数学公式,这个公式必须是这个公式必须是这个公式必须是这个公式必须是递归定义递归定义递归定义递归定义的,且所处理的的,且所处理的的,且所处理的的,且所处理的对象要对象要对象要对象要有规律地递增或递减有规律地递增或递减有规律地递增或递减有规律地递增或递减,然后确定,然后确定,然后确定,然后确定递归结束条件递归结束条件递归结束条件递归结束条件。【例例例例8.178.178.178.17】编一递归函数求编一递归函数求编一递归函数求编一递归函数求x x x xn n n n 。思路:首先把思路:首先把思路:首先把思路:首先把x x x xn n n n
41、转化成递归定义的公式转化成递归定义的公式转化成递归定义的公式转化成递归定义的公式xn n n n =1 (n=0)x xn - 1 (n0)再找出递归结束条件:当再找出递归结束条件:当再找出递归结束条件:当再找出递归结束条件:当n=0n=0n=0n=0时,时,时,时,x x x xn=1=1=1=1。3434/73/73程序如下:程序如下:#include #include long xn(int x,int n)long xn(int x,int n) long f=0; long f=0; if (n0) printf(n0,data error!n); if (n0) printf(n0
42、,data error!n); else if (n=0) f=1; else if (n=0) f=1; else f=x*xn(x,n-1); else f=x*xn(x,n-1); return (f); return (f); void main( )void main( ) int n,x; long y; int n,x; long y; scanf(%d,%d,&x,&n); scanf(%d,%d,&x,&n); y=xn(x,n); y=xn(x,n); printf(%ldn,y); printf(%ldn,y); 程序运行情况如下:程序运行情况如下:2,10 102435
43、35/73/73Hanoi(汉诺塔问题)汉诺塔问题)ABC(2) (2) 非数值型问题递归函数的编程方法非数值型问题递归函数的编程方法3636/73/733737/73/733838/73/733939/73/73#include void move(char getone, char putone) printf(移动%c针最上面一个盘到%c针n,getone,putone); void hanoi(int n,char one,char two,char three) /借助two针,把one针上n个盘子移到three针上if(n=1) move(one,three); else hano
44、i(n-1,one,three,two); /借助three针把one上n1个盘子移到twomove(one,three); /把A上1个盘子移到Chanoi(n-1,two,one,three); /借助one针把two上n1个盘子移到three 4040/73/73#includevoid 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);4141/73/737.6 数组作函数参数数组作函数参数7.
45、6.1 一维数组元素作函数参数一维数组元素作函数参数( (值传递值传递) )例例 两个数组大小比较两个数组大小比较a和和b为有为有6个元素的整型数组;个元素的整型数组;比较两数组对应元素;比较两数组对应元素;变量变量n,m,k记录记录aibi, ai=bi,aik,认为数组认为数组ab; 若若nk,认为数组认为数组abi元素个数元素个数 m:ai=bi元素个数元素个数 k:aibi元素个数元素个数 4343/73/73#include void main() int a10,b10,i,n=0,m=0,k=0; printf(Enter array a:n); for(i=0;i10;i+)s
46、canf(%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);4444/73/737.6 数组作函数参数数组作函数参数数组名数组名数组名数组名表示数组在内存中的表示数组在内存中的表示数组在内存中的表示数组在内存中的起始地址起始地址起始地址起始地址。 例如例如例如例如: : : :数组数组a在内存中从在内存中从2000200020002000地址开始存放地址开始存放,则则a的的值为值为20
47、00。2000是地址值。是地址值。如实参是数组名如实参是数组名如实参是数组名如实参是数组名,形参应定义为,形参应定义为数组形式数组形式数组形式数组形式,形参,形参数组的长度可以省略,但数组的长度可以省略,但 不能省,否则就不是不能省,否则就不是数组形式了。数组形式了。 【例例例例8.128.12】用冒泡法将用冒泡法将用冒泡法将用冒泡法将1010个存放在一维数组中的个存放在一维数组中的个存放在一维数组中的个存放在一维数组中的整数排序。整数排序。整数排序。整数排序。7.6.2 一维数组名作函数参数一维数组名作函数参数4545/73/73void sort(int b ,int n); void s
48、ort(int b ,int n); void printarr(int b ); void printarr(int b ); void main( )void main( ) int a10 = int a10 = 11,22,63,97,58,80,45, 11,22,63,97,58,80,45, 32,73,36;32,73,36; printf(Before printf(Before sort:n);sort:n); printarr(a);printarr(a); sort(a,10);sort(a,10); printf(After printf(After sort:n);
49、sort:n); printarr(a);printarr(a); void printarr(int void printarr(int b10b10) ) int i; int i; for (i=0; i10; i+) for (i=0; i10; i+) printf(%5d,bi); printf(%5d,bi); printf(n); printf(n);void sort(void sort(int b , int nint b , int n) ) int i,j,t; int i,j,t; for (i=1; in; i+) for (i=1; in; i+) for (j=
50、0; jn-i; j+ ) for (j=0; jbj+1) if (bjbj+1) t=bj;bj=bj+1;bj+1=t; t=bj;bj=bj+1;bj+1=t; 4646/73/73 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 63 97 58 80 45 32 73 36(a) 排序前排序前a0 a1 a2 a3 a4 a5 a6 a7 a8 a9b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 32 36 45 58 63 73 80 97(b) 排序后排序后图图8.3 调用调
51、用sort函数函数2000b形参形参形参形参 b b 实际是一个实际是一个实际是一个实际是一个可以存放地址的变量可以存放地址的变量可以存放地址的变量可以存放地址的变量a:2000实参赋给形参实参赋给形参首地址:首地址: 2000首地址:首地址: 20004747/73/73#include stdio.hvoid main( ) void scat(char str1 ,char str2 ); char s150,s250; int i,k;printf(Input s1:);gets(s1);printf(Input s2:);gets(s2);scat(s1,s2);printf(Out
52、put s1:%sn,s1);printf(Output s2:%sn,s2);void scat(char str1 , char str2 ) int i=0,k=0; while (str1i!=0) i+; while (str2k!=0) str1i=str2k; i+; k+; str1i=0;4848/73/73以二维数组为例。以二维数组为例。以二维数组为例。以二维数组为例。二维数组名作实参时,对应的形参也应该定义为一个二二维数组名作实参时,对应的形参也应该定义为一个二二维数组名作实参时,对应的形参也应该定义为一个二二维数组名作实参时,对应的形参也应该定义为一个二维数组形式。维数
53、组形式。维数组形式。维数组形式。对形参数组定义时可以指定每一维的大小,也可以省略对形参数组定义时可以指定每一维的大小,也可以省略对形参数组定义时可以指定每一维的大小,也可以省略对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。第一维的大小说明。第一维的大小说明。第一维的大小说明。a=a=1 2 3 4 1 2 3 4 5 6 7 85 6 7 89 10 11 129 10 11 121 1 5 5 9 92 2 6 6 10103 3 7 7 11114 4 8 8 1212b=b=思路:将思路:将思路:将思路:将a00a00b00b00,a01a01 b10 b10,a02
54、a02b20b20,a10a10b01b01,aijaijbjibji,。8.6.2 多维数组作函数参数多维数组作函数参数【例例例例8.148.14】编程序,将矩阵转置。设转置前为编程序,将矩阵转置。设转置前为编程序,将矩阵转置。设转置前为编程序,将矩阵转置。设转置前为a a矩阵,矩阵,矩阵,矩阵,转置后为转置后为转置后为转置后为b b矩阵,如下所示:矩阵,如下所示:矩阵,如下所示:矩阵,如下所示: 4949/73/73#include void turn(int arra 4,int arrb 3) ;void main( ) int a34=1,2,3,4,5,6,7,8,9,10,11,
55、12; int i,j,b43; turn(a,b); printf(array b:n); for (i=0; i4;i+) for (j=0; j3;j+) printf(%5d,bij); printf(n); /* 矩阵转置函数矩阵转置函数*/void turn(int arra 4,int arrb 3) int r, c; for (r=0; r3;r+) for (c=0; c4;c+) arrbcr=arrarc;5050/73/737.7 局部变量和全局变量局部变量和全局变量1. 变量的作用域变量的作用域2. 局部变量及其作用域局部变量及其作用域变量的作用域:变量的作用域:变
56、量在程序中可以被使用的范围。变量在程序中可以被使用的范围。根据变量的作用域可以将变量分为根据变量的作用域可以将变量分为局部变量局部变量和和全局全局变量变量。局部变量局部变量(内部变量):在函数内或复合语句内定(内部变量):在函数内或复合语句内定义的变量以及函数的义的变量以及函数的形参形参。作用域:作用域:函数内或复合语句内函数内或复合语句内【例例7.19】分析下面程序的运行结果及变量的作用域。分析下面程序的运行结果及变量的作用域。5151/73/73#includevoid sub(int a,int b) int c; a=a+b; b=b+a; c=b-a; printf(sub:ta=%
57、d b= %d c= %dn,a,b,c);void main( ) int a=1,b=1,c=1; printf(main:ta=%d b= %d c= %dn,a,b,c); sub(a,b); printf(main:ta=%d b= %d c= %dn,a,b,c); int a=2,b=2; printf(comp:ta=%d b= %d c= %dn,a,b,c); printf(main:ta=%d b= %d c= %dn,a,b,c); main函数局部变量函数局部变量复合语句局部变量复合语句局部变量sub函数局部变量函数局部变量程序输出结果:程序输出结果:main: a=
58、1 b= 1 c= 1 sub: a=2 b= 3 c= 1main: a=1 b= 1 c= 1comp: a=2 b= 2 c= 1main: a=1 b= 1 c= 15252/73/73全局变量全局变量(外部变量外部变量):在):在函数外部函数外部定义的定义的变量。变量。作用域作用域:从定义变量的位置开始到本源文件从定义变量的位置开始到本源文件结束结束。如在其作用域内的函数或分程序中定如在其作用域内的函数或分程序中定义了同名局部变量,则在局部变量的作用域义了同名局部变量,则在局部变量的作用域内,同名全局变量暂时不起作用。内,同名全局变量暂时不起作用。【例例7.20】全局变量和局部变量的
59、作用域。全局变量和局部变量的作用域。3 全局变量及其作用域全局变量及其作用域5353/73/73#includeint a= 5;void f(int x, int y) int b,c; b=a+x; c=a-y; printf(%d %d %dn,a,b,c);全局变量全局变量f函数局部变量函数局部变量void main( ) int b=6,c=7; f(b,c); printf(%d %d %dn,a,b,c); int a=9,b=8; printf(%d %d %dn,a,b,c); c=10; printf(%d %d %dn, a,b,c); printf(%d %d %dn,
60、a,b,c); printf(%d %d %dn,a,b,c); main函数局部变量函数局部变量复合语句局部变量复合语句局部变量程序输出结果:程序输出结果: 5 11 -2 5 6 7 9 8 7 9 8 10 9 8 10 5 6 105454/73/737.8 变量的存储类别变量的存储类别局部变量局部变量和和全局变量全局变量是从变量的作用域是从变量的作用域(空间空间)来划分的。)来划分的。从变量存在的从变量存在的时间时间(即生存期)来分,又可以分为即生存期)来分,又可以分为静态存储方式和动态存储方式。静态存储方式和动态存储方式。静态存储方式:静态存储方式:程序运行期间分配程序运行期间分配
61、程序运行期间分配程序运行期间分配固定存储空间固定存储空间固定存储空间固定存储空间;动态存储方式:动态存储方式:程序运行期间程序运行期间程序运行期间程序运行期间根据需要动态分根据需要动态分根据需要动态分根据需要动态分配存储空间配存储空间配存储空间配存储空间。5555/73/73变量的属性数据类型:数据类型:数据类型:数据类型:决定为变量分配内存单元的长度,决定为变量分配内存单元的长度,决定为变量分配内存单元的长度,决定为变量分配内存单元的长度,数据的存放形式,数的范围。数据的存放形式,数的范围。数据的存放形式,数的范围。数据的存放形式,数的范围。存储类别:存储类别:存储类别:存储类别:决定了变量
62、的生存期,决定了变量的生存期,决定了变量的生存期,决定了变量的生存期,给它分配在哪个存储区。给它分配在哪个存储区。给它分配在哪个存储区。给它分配在哪个存储区。变量定义语句的完整形式变量定义语句的完整形式:存储类别存储类别存储类别存储类别 数据类型数据类型数据类型数据类型 变量名变量名变量名变量名1, , 1, , 变量名变量名变量名变量名n ;n ;autoauto(自动的)(自动的)(自动的)(自动的) registerregister(寄存器的)(寄存器的)(寄存器的)(寄存器的)staticstatic(静态的)(静态的)(静态的)(静态的) externextern(外部的)(外部的)
63、(外部的)(外部的)5656/73/73l 内存用户区内存用户区程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(auto register)函数调用返回地址等5757/73/731自动变量(自动变量(auto类别)类别) 局部变量可以定义为自动变量。局部变量可以定义为自动变量。main()int x,y; main()auto int x,y; 自动变量自动变量自动变量自动变量等价等价可省5858/73/73 内存分配内存分配内存分配内存分配调调用函数或用函数或用函数或用函数或执执行分程序行分程序行分程序行分程序时时在在在在动态动态存存存存储储区区区区为为其分配存其分配存
64、其分配存其分配存储单储单元,函数或分程序元,函数或分程序元,函数或分程序元,函数或分程序执执行行行行结结束,束,束,束,所占内存空所占内存空所占内存空所占内存空间间即刻即刻即刻即刻释释放。放。放。放。 变变量的初量的初量的初量的初值值定定定定义变义变量量量量时时若没若没若没若没赋赋初初初初值值,变变量的量的量的量的初初初初值值不确定不确定不确定不确定;如果;如果;如果;如果赋赋初初初初值则值则每次函数被每次函数被每次函数被每次函数被调调用用用用时执时执行行行行一次一次一次一次赋值赋值操作。操作。操作。操作。 生存期生存期生存期生存期 在函数或分程序在函数或分程序在函数或分程序在函数或分程序执执
65、行期行期行期行期间间。 作用域作用域作用域作用域自自自自动变动变量所在的函数内或分量所在的函数内或分量所在的函数内或分量所在的函数内或分程序内。程序内。程序内。程序内。自动变量自动变量例例8- 2#include int max(int x,int y) int z; z = x y ? x : y; return( z );void main() int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c);int a=5;void main( ) int b=6,c=7;printf(%d %d %dn,a
66、,b,c); int a=9,b=8; printf(%d %d %dn,a,b,c); c=10; printf(%d %d %dn, a,b,c); printf(%d %d %dn,a,b,c); printf(%d %d %dn,a,b,c); 5959/73/732静态变量(静态变量(static类别)类别)除形参外,局部变量和全局变量都可以定义为静除形参外,局部变量和全局变量都可以定义为静除形参外,局部变量和全局变量都可以定义为静除形参外,局部变量和全局变量都可以定义为静态变量。态变量。态变量。态变量。静态局部变量(或称静态内部变量)静态局部变量(或称静态内部变量)静态局部变量(或
67、称静态内部变量)静态局部变量(或称静态内部变量)静态全局变量(或称静态外部变量)静态全局变量(或称静态外部变量)静态变量静态变量静态变量静态变量静态变量静态变量静态变量静态变量static int a; void main( ) float x,y; f( ) static int b=1; 静态全局变量静态全局变量静态局部变量静态局部变量静态局部变量静态局部变量自动变量自动变量自动变量自动变量不能省6060/73/73 内存分配内存分配内存分配内存分配编译时,将其分配在内存的静,将其分配在内存的静态存存储区中,程序运行区中,程序运行结束束释放放该单元。元。 静静静静态变态变量的初量的初量的初
68、量的初值值若定若定义时未未赋初初值,在,在编译时,系,系统自自动赋初初值为0 0;若定;若定义时赋初初值,则仅在在编译时赋初初值一次,程序运行一次,程序运行后不再后不再给变量量赋初初值。 生存期生存期生存期生存期整个程序的整个程序的执行期行期间。 作用域作用域作用域作用域静静态局部局部变量的作用域是它所在的函量的作用域是它所在的函数或分程序。静数或分程序。静态全局全局变量的作用域量的作用域是从定是从定义处开始到本源文件开始到本源文件结束。束。静态变量静态变量static int a; int f( ) static int b=1; void main( ) float x,y; static
69、 int b=1; static c=10; 6161/73/73int c;static int a; void main( ) float x,yx,y; char s;f( ) static int b=1; 3.外部变量(外部变量(extern类别)类别)在函数外定义的变量若没有用在函数外定义的变量若没有用在函数外定义的变量若没有用在函数外定义的变量若没有用 staticstatic说明,则是外说明,则是外说明,则是外说明,则是外部变量。外部变量只能隐式定义。部变量。外部变量只能隐式定义。部变量。外部变量只能隐式定义。部变量。外部变量只能隐式定义。静态外部变量静态外部变量自动变量自动变
70、量自动变量自动变量局部静态变量局部静态变量局部静态变量局部静态变量外部变量外部变量6262/73/73 内存分配内存分配内存分配内存分配编译时编译时,将其分配在静,将其分配在静,将其分配在静,将其分配在静态态存存存存储储区,区,区,区,程序运行程序运行程序运行程序运行结结束束束束释释放放放放该单该单元。元。元。元。 变变量的初量的初量的初量的初值值若定若定若定若定义变义变量量量量时时未未未未赋赋初初初初值值,在,在,在,在编译编译时时,系,系,系,系统统自自自自动赋动赋初初初初值为值为0 0 0 0。 生存期生存期生存期生存期整个程序的整个程序的整个程序的整个程序的执执行期行期行期行期间间。
71、作用域作用域作用域作用域从定从定从定从定义处义处开始到本源文件开始到本源文件开始到本源文件开始到本源文件结结束。束。束。束。外部变量外部变量int c;static int a; void main( ) float x,yx,y; char s;f( ) static int b=1; 6363/73/73#includestdio.hint p=1,q=5;int f1(int a)extern char c1,c2; c1=a; c2=2*a; return a*a;char c1,c2;void main()int a;a=f1(10);printf(a,c1,c2=%d,%d,%dn
72、,a,c1,c2);定义外部变量定义外部变量声明外部变量声明外部变量定义外部变量定义外部变量外部变量的声明外部变量的声明思考:在思考:在f1f1函数中声函数中声明明c1,c2c1,c2的作用是什的作用是什么?如何修改使所有么?如何修改使所有函数可以使用外部变函数可以使用外部变量而不需要声明。量而不需要声明。用用用用externextern进行声明,进行声明,进行声明,进行声明,以使其作用域扩大以使其作用域扩大以使其作用域扩大以使其作用域扩大6464/73/73外部变量声明的一般格式外部变量声明的一般格式externextern 数据类型数据类型数据类型数据类型 变量名变量名变量名变量名1 1,
73、变量名,变量名,变量名,变量名n n;或或或或 externextern 变量名变量名变量名变量名1 1,变量名,变量名,变量名,变量名n n;注意:注意:外部变量声明用关键字外部变量声明用关键字externextern,而外部变量的定义不能用,而外部变量的定义不能用externextern,只能隐式定义。,只能隐式定义。定义外部变量时,系统要给变定义外部变量时,系统要给变量分配存储空间,而外部变量量分配存储空间,而外部变量声明时,系统不分配存储空间,声明时,系统不分配存储空间,只是让编译系统知道该变量是只是让编译系统知道该变量是一个有定义的外部变量,与函一个有定义的外部变量,与函数声明的作用
74、类似。数声明的作用类似。#includestdio.hint p=1,q=5;int f1(int a)extern char c1,c2; c1=a; c2=2*a; return a*a;char c1,c2;void main()int a;a=f1(10);6565/73/73/ file1.cpp文件程序如下:文件程序如下:#includeint i;void main() void f1(),f2(),f3(); i=1; f1(); printf(tmain:i=%d,i); f2(); printf(tmain:i=%d,i); f3(); printf(tmain:i=%dn
75、,i);void f1() i+; printf(nf1:i=%d,i);定义外部变量定义外部变量/file2.cpp 文件程序如下:文件程序如下:#includeextern int i;void f2()int i=3;printf(nf2:i=%d,i);void f3()i=3;printf(nf3:i=%d,i);声明外部变量声明外部变量6666/73/734.寄存器变量(寄存器变量(register类别)类别)只有只有只有只有函数内定义的变量或形参函数内定义的变量或形参函数内定义的变量或形参函数内定义的变量或形参可以定义为寄存器可以定义为寄存器可以定义为寄存器可以定义为寄存器变量。
76、寄存器变量的值保存在变量。寄存器变量的值保存在变量。寄存器变量的值保存在变量。寄存器变量的值保存在CPUCPUCPUCPU的寄存器中。的寄存器中。的寄存器中。的寄存器中。受寄存器长度的限制,受寄存器长度的限制,受寄存器长度的限制,受寄存器长度的限制,寄存器变量只能是寄存器变量只能是寄存器变量只能是寄存器变量只能是charcharcharchar、intintintint和指针类型的变量。和指针类型的变量。和指针类型的变量。和指针类型的变量。【例例8.26】寄存器变量的使用。寄存器变量的使用。void main( ) long int sum=0; register int i; for (i=
77、1; i=1000; i+) sum+=i; printf(sum=%ldn,sum);程序输出结果:程序输出结果:sum=5005006767/73/73 变量存储类型变量存储类型静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件u局部变量默认为auto型uregister型变量个数受限,且不能为long, double, float型u局部static变量具有全局寿命和局部可见性extern不是变量定义,可扩展外部变量作
78、用域register局部staticauto外部static外部存储类别6868/73/737.7 函数的存储分类函数的存储分类 外部函数:外部函数:外部函数:外部函数:extern int fan(char a,char b) 内部函数:内部函数:内部函数:内部函数:static int func( ) 外部函数外部函数外部函数外部函数和和和和静态函数静态函数静态函数静态函数区别:区别:区别:区别:外部函数允许本程序其他文件中的函数调用外部函数允许本程序其他文件中的函数调用外部函数允许本程序其他文件中的函数调用外部函数允许本程序其他文件中的函数调用(与外部变量类似与外部变量类似)。内部函数内
79、部函数内部函数内部函数禁止禁止禁止禁止本程序其他文件中的函数调用本程序其他文件中的函数调用本程序其他文件中的函数调用本程序其他文件中的函数调用(与静态外部变量类似与静态外部变量类似)。 extern可以省略可以省略6969/73/73外部函数调用例子外部函数调用例子l l从从键盘输入一行字符放在入一行字符放在str数数组中,然后中,然后从从键盘输入一个字符入一个字符c,从,从str 中把字符中把字符c删除,然后除,然后输出出str字符。字符。l l要求要求 1.1.在在在在file1file1文件中定义主函数文件中定义主函数文件中定义主函数文件中定义主函数 2.2.在在在在file2file2
80、文件中定义字符串输入函数文件中定义字符串输入函数文件中定义字符串输入函数文件中定义字符串输入函数 3.3.在在在在file3file3文件中定义删除字符函数文件中定义删除字符函数文件中定义删除字符函数文件中定义删除字符函数 4.4.在在在在file4file4文件中定义字符串输出函数文件中定义字符串输出函数文件中定义字符串输出函数文件中定义字符串输出函数7070/73/73/file1.cpp:#includevoid main() extern void enter_string(char str80); extern void delete_string(char str,char ch)
81、; extern void print_string(char str); char c; char str80; printf(请输入字符串请输入字符串:n); enter_string(str); printf(请输入需要删除的字符请输入需要删除的字符:n); scanf(%c,&c); delete_string(str,c); print_string(str); printf(n);/file4.cpp:#includevoid print_string(char str) printf(%s,str);/file2.cpp:#includevoid enter_string(cha
82、r str80) gets(str);/file3.cpp:void delete_string(char str,char ch) int i,j; for(i=j=0;stri!=0;i+) if(stri!=ch) strj+=stri; strj=0;7171/73/73在在VC6.0中实现外部函数调用方法中实现外部函数调用方法l l1. File-New-Files-C+ Source File,编辑完后保存文件,如完后保存文件,如file1.cpp;l l3.点点击菜菜单栏Project-Add to Project-New -Files-C+ Source File,在右在右侧f
83、ile中中输入入file2,可在,可在项目中新生成目中新生成file2.cpp;(如果(如果file2.cpp已已经存在,存在,选择Project-Add to Project-File2 - file2.cpp)l l4. 依照第依照第3步,可以把步,可以把file3.cpp,file4.cpp加入加入项目中。目中。一一.由系统自动建立项目工作区由系统自动建立项目工作区(workspace) (用户只建立项目文件)(用户只建立项目文件)(用户只建立项目文件)(用户只建立项目文件)7272/73/73l l1. 建工作区(建工作区(Workspace)l l2.建建项目文件目文件(Project)l l3.在在项目文件中建新文件或加入目文件中建新文件或加入现有文件;有文件;l l4.编译和和链接接项目文件目文件l l5.执行。行。l l详见C程序程序设计(第四版)学(第四版)学习辅导P233页。二二. 用户建立项目工作区和项目文件用户建立项目工作区和项目文件7373/73/73作业作业l lP218 2 5 9 13 14