C语言程序设计教程第7章

更新时间:2023-08-14 18:08:01 阅读量: 人文社科 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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月

czhuyaoneiruo

⑵ 函数的返回值函数的返回值是通过return语句带回到主调函数的 return 语句格式: return (表达式); 或 return 表达式 ; 或 return; 功能:终止函数的运行,返回主调函数,若有返 回值,将返回值带回主调函数。

说明: ① 若函数没有返回值,return语句可以省略。 ② return语句中的表达式类型一般应和函数的类 型一致,如果不一致,系统自动将表达式类型转 换为函数类型。2005年3月

czhuyaoneiruo

【例7.8】计算并输出圆的面积。s(int r) { return 3.14*r*r;} 自动转换 main( ) 为int型 { int r; 程序运行情况如下: scanf("%d",&r); 2 printf("%d\n",s(r)); 12 }思考: 若要得到单精度实型的圆面积,程序应如何修改2005年3月

czhuyaoneiruo

7.2.4 对被调函数的声明和函数原型变量要先定义后使用, 函数也如此。即被调函数的 定义要出现在主调函数的定 义之前。如swap函数: 允许整型函数(且参数 也是整型)的定义出现在主 调函数之后。如max函数: 如果非整型函数在主调 函数之后定义,则应在主调 函数中或主调函数之前对被 调函数进行声明。 void swap(int x, int y) { …} main( ) {… swap(a,b); } main( ) {… c=max(a,b); } max(int x,int y) { …}2005年3月

czhuyaoneiruo

对被调函数进行声明的一般形式函数类型 函数名(参数类型1 参数名1,…); 或 函数类型 函数名(参数类型1,参数类型2,…); 第二种形式省略了参数名,此种形式也称为函数的原型。

19

思考: 以下哪种情况需要在主调函数中对被调函数声明

被调函数定义在前,主调函数定义在后。 主调函数定义在前,被调函数定义在后,且被调 函数的类型不是整型的。 被调函数定义在后,但被调函数的类型是整型。2005年3月

czhuyaoneiruo

20 【例7.9】计算并输出两个数的和、差、积、商。

main( ) { void calc(float x,float y,char opr); float a,b; char opr; 对被调函 printf("\nInput expression:"); scanf("%f%c%f",&a,&opr,&b); 数的声明 calc(a,b,opr); } void calc(float x,float y,char opr) { switch(opr) { case '+':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x+y);return; case '-':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x-y);return; case '*':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x*y);return; case '/':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x/y);return; default :printf("Operator err! \n"); } }2005年3月

czhuyaoneiruo

【例7.10】 哥德巴赫猜想之一是任何一个大于5的偶 数都可以表示为两个素数之和。验证这一论断。输入n的值 for (a=6; a<=n; a+=2) for(b=3;b<=a/2;b+=2) b是素数 ? T c=a-b c是素数? T F 输出: a、b、c的值 break;图 7.2 验证哥德巴赫猜想2005年3月

21

F

本文来源:https://www.bwwdw.com/article/lwtj.html

Top