czhuyaoneiruo
1
C 语言程序设计第7章 函数与预处理命令北京科技大学 计算机系
czhuyaoneiruo
第7章 函数与预处理命令7.1 概述 7.2 函数的定义与调用 7.3 数组作函数参数 7.4 函数的嵌套调用和递归调用 7.5 局部变量和全局变量及其作用域 7.6 变量的存储类别及变量的生存期 7.7 函数的存储分类 7.8 编译预处理
2
7.9 多文件程序的调试方法
2005年3月
czhuyaoneiruo
7.1 概述C程序
3
源程序文件1
……
源程序文件n
函数1 使用 函数 的 好处
…
函数n
函数1
…
函数m
① 程序结构清晰,可读性好。 ② 减少重复编码的工作量。 ③ 可多人共同编制一个大程序,缩短程序 设计周期,提高程序设计和调试的效率。2005年3月
czhuyaoneiruo
【例7.1】求一个整数的立方。int cube (int x) /* 函数定义 */ { return (x * x * x); } main( ) 程序的执行总是 { int f, a; 从main函数开始 printf("\nEnter an integer number:"); scanf("%d", &a); 函数调用 f = cube (a); printf("%d * %d * %d = %d\n", a, a, a, f); 程序运行情况如下: } Enter an integer number:2 2*2*2=82005年3月
czhuyaoneiruo
说明⑴ 一个C源程序可以由一个或多个源程序文件组 成。C编译系统在对C源程序进行编译时是以文件 为单位进行的。 ⑵ 一个C源程序文件可以由一个或多个函数组成。 所有函数都是独立的。主函数可以调用其它函数, 其它函数可以相互调用。 ⑶ 在一个C程序中,有且仅有一个主函数main。 C程序的执行总是从main函数开始,调用其它函数 后最终回到main函数,在main函数中结束整个程 序的运行。
5
2005年3月
czhuyaoneiruo
⑷ 函数的种类从使用的角度看: ① 标准函数(库函数) 库函数是由系统提供的。 如:getchar( )、sin(x)等。 在程序中可以直接调用 它们。附录A列出了C的 部分库函数。 ② 用户自定义函数。 如:例7.1中的cube函数。
6
从函数定义形式分:① 有参函数: 在主调(用)函数和被调 (用)函数之间通过参数 进行数据传递, 如: int cube (int x) { … } ② 无参函数: 如:getchar( ) 在调用无参函数时,主调 函数不需要将数据传递给 无参函数。2005年3月
czhuyaoneiruo
【例7.2】无参函数的定义与调用。void welcome ( ) { printf("*********************************\n"); printf(" Welcome to China \n"); printf("*********************************\n"); } main( ) { welcome( );}程序的输出结果如下: ********************************* Welcome to China *********************************2005年3月
czhuyaoneiruo
7.2.1 函数的定义函数定义的一般形式 函数类型 函数名(类型名 形式参数1,… ) { 说明语句 执行语句 }类型省略时 默认为int 类型
8
例如:求两个数的最大值。 int max(int x,int y) { int z; 没有形式参数 z = x > y ? x : y; 为无参函数 return( z ); }2005年3月
czhuyaoneiruo
9
形参也可以这样定义 int max(x,y) int x,y;
{ int z; z = x > y ? x : y; return( z ); }
如下定义都是错误的 int max(x,y) { int x,y; …… } 或 int max(int x,y) { …… } 或 int max(x,y) int x,y,z; { z = x > y ? x : y; return( z ); }
√
花括号中也可以为空,这种函数叫空函数 。 不能在函数体内定义其他函数,即函数不能嵌套定义。2005年3月
czhuyaoneiruo
7.2.2 函数的调用函数调用的一般形式:
10
函数名(实参表列)在C语言中,把函数调用也作为一个表达式。 因此凡是表达式可以出现的地方都可以出现函数 调用。例如:
① welcome( ); ② if (iabs (a)>max) max=iabs(a); ③ m=max(c,max(a,b));
2005年3月
czhuyaoneiruo
【例7.3】求1~100的累加和。int sum100( ) { int i,t=0; for (i=1; i<=100; i++) t+=i; return (t);} main( ) { int s; s=sum100( ); printf("%d\n", s); } 程序输出结果: 5050 int sum ( int x ) 思 { int i,t=0; 考: for (i=1; i<=x; i++) 两 t+=i; 个 return (t); 程 } 序 main( ) 有 { int s; 何 s=sum (100); 不 printf("%d\n", s); 同 } 程序输出结果: 50502005年3月
czhuyaoneiruo
7.2.3 函数参数与函数的返回值1.函数的形式参数与实际参数【例7.4】编一程序,将主函数中的两个变量的值传 递给swap函数中的两个形参,交换两个形参的值。void swap(int x, int y) 形式参数(形参) { int z; z=x; x=y; y=z; printf("\nx=%d,y=%d",x ,y); } 实际参数(实参) main( ) 单向值传递 { int a= 10,b=20; 程序输出结果: swap(a,b); x=20,y=10 printf("\na=%d,b=%d\n",a,b); a=10,b=20 }2005年3月
czhuyaoneiruo
有关形参和实参的说明:① 当函数被调用时才给形参分配内存单元。调用结 束,所占内存被释放。 ② 实参可以是常量、变量或表达式,但要求它们有 确定的值。 ③ 实参与形参类型要一致,字符型与整型可以兼容 。 ④ 实参与形参的个数必须相等。在函数调用时,实 参的值赋给与之相对应的形参。“单向值传递” 。
13
注意:在TC中,实参的求值顺序是从右到左。
2005年3月
czhuyaoneiruo
【例7.5】函数调用中实参的求值顺序。 void fun(int a,int b) { printf("a=%d,b=%d\n",a,b); } main( ) { int m=5; fun(3+m, m++); }程序输出结果: a=9,b=5
14
2005年3月
czhuyaoneiruo
2.函数的类型与函数的返回值
15
【例7.6】输出两个数中的大数。 ⑴ 函数的类型 max(int x,int y) 说明: { int z; ①函数的类型 z=x>y?x:y; 决定了函数返 return (z); /* 返回z的值 */ 回值的类型。 } 若省略函数的 main( ) 类型,系统默 { int a,b,c; 认其为int型。 scanf("%d,%d",&a,&b); ②无返回值的 c=max(a,b); 函数应将其类 printf("max is %d\n",c); 型定义为void } (空)类型。2005年3月
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新人文社科C语言程序设计教程第7章全文阅读和word下载服务。
相关推荐: