- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2011年9月 By zzj
【例5.11】 哥德巴赫猜想之一是任何一个大于5的偶数 21 都可以表示为两个素数之和。验证这一论断。
输入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;
2011年9月 By zzj
11
5.2.3 函数参数与函数的返回值
1.函数的形式参数与实际参数
【例5.5】编一程序,将主函数中的两个变量的值传 递给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 }
类型省略时 默认为int 类型
8
例如:求两个数的最大值。 int max(int x,int y) { int z; 没有形式参数 z = x > y ? x : y; 为无参函数 return( z ); }
2011年9月 By zzj
9
形参也可以这样定义 int max(x,y) int x,y; { int z; z = x > y ? x : y; return( z ); }
程序的输出结果如下: ********************************* Welcome to China *********************************
2011年9月 By zzj
7
5.2.1 函数的定义
函数定义的一般形式 函数类型 函数名(类型名 形式参数1,… ) { 说明语句 执行语句 }
2011年9月 By zzj
17
5.2.4 对被调函数的声明和函数原型
变量要先定义后使用, 函数也如此。即被调函数的 定义要出现在主调函数的定 义之前。如swap函数: 允许整型函数(且参数 也是整型)的定义出现在主 调函数之后。如max函数: 如果非整型函数在主调 函数之后定义,则应在主调 函数中或主调函数之前对被 调函数进行声明。 void swap(int x, int y) { …} main( ) {… swap(a,b); } main( ) {… c=max(a,b); } max(int x,int y) { …}
2011年9月 By zzj
【例5.4】求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); 同 } 程序输出结果: 5050
2011年9月 By zzj
5.2.2 函数的调用
函数调用的一般形式:
10
函数名(实参表列)
在C语言中,把函数调用也作为一个表达式。 因此凡是表达式可以出现的地方都可以出现函数 调用。例如:
① welcome( ); ② if (iabs (a)>max) max=iabs(a); ③ m=max(c,max(a,b));
2011年9月 By zzj
4
说明
⑴ 一个C源程序可以由一个或多个源程序文件组 成。C编译系统在对C源程序进行编译时是以文件 为单位进行的。 ⑵ 一个C源程序文件可以由一个或多个函数组成。 所有函数都是独立的。主函数可以调用其它函数, 其它函数可以相互调用。 ⑶ 在一个C程序中,有且仅有一个主函数main。 C程序的执行总是从main函数开始,调用其它函数 后最终回到main函数,在main函数中结束整个程 序的运行。
图 5.2 验证哥德巴赫猜想
2011年9月 By zzj
F
程序如下:
22
可以在main函数的前面对prime #include "math.h" 函数进行声明。实际上,该声 int prime(int n); 明可以省略,为什么? main( ) { int a,b,c,n; /* 穷举法判断素数 */ scanf("%d",&n); int prime(int n) for (a=6; a<=n; a+=2) { int i; for (i=2; i<=sqrt(n); i++) for (b=3; b<=a/2; b+=2) if (n%i==0) return 0; if (prime(b)) return 1; { c=a-b; } if (prime(c)) { printf("%d=%d+%d\n",a,b,c); break; } } } 2011年9月 By zzj
如下定义都是错误的 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 ); }
√
花括号中也可以为空,这种函数叫空函数 。 不能在函数体内定义其他函数,即函数不能嵌套定义。
2011年9月 By zzj
18
对被调函数进行声明的一般形式
函数类型 函数名(参数类型1 参数名1,…); 或 函数类型 函数名(参数类型1,参数类型2,…); 第二种形式省略了参数名,此种形式也称为函数的原型。
19
思考: 以下哪种情况需要在主调函数中对被调函数声明
被调函数定义在前,主调函数定义在后。
5
2011年9月 By zzj
⑷ 函数的种类
从使用的角度看: ① 标准函数(库函数) 库函数是由系统提供的。 如:getchar( )、sin(x)等。 在程序中可以直接调用 它们。《C语言库函数大 全》 ② 用户自定义函数。 如:例5.1中的cube函数。
6
从函数定义形式分:
① 有参函数: 在主调(用)函数和被调 (用)函数之间通过参数 进行数据传递, 如: int cube (int x) { … } ② 无参函数: 如:getchar( ) 在调用无参函数时,主调 函数不需要将数据传递给 无参函数。
2011年9月 By zzj
5.1 概述 -模块化程序设计
C程序
3
源程序文件1
……
源程序文件n
函数1 使用 函数 的 好处
…
函数n
函数1
…
函数m
① 程序结构清晰,可读性好。 ② 减少重复编码的工作量。 ③ 可多人共同编制一个大程序,缩短程序 设计周期,提高程序设计和调试的效率。
2011年9月 By zzj
1
C 语言程序设计
第5 讲 函数
2011年9月 By zzj
2
5.1 概述 5.2 函数的定义与调用 5.3 数组作函数参数 5.4 函数的嵌套调用和递归调用 5.5 局部变量和全局变量及其作用域 5.6 变量的存储类别及变量的生存期 5.7 函数的存储分类 5.8 编译预处理
5.9 多文件程序的调试方法
2011年9月 By zzj
⑵ 函数的返回值
函数的返回值是通过return语句带回到主调函数的 return 语句格式: return (表达式); 或 return 表达式 ; 或 return; 功能:终止函数的运行,返回主调函数,若有返 回值,将返回值带回主调函数。 说明: ① 若函数没有返回值,return语句可以省略。 ② return语句中的表达式类型一般应和函数的类 型一致,如果不一致,系统自动将表达式类型转 换为函数类型。
2011年9月 By zzj
16
【例5.9】计算并输出圆的面积。
s(int r) { return 3.14*r*r;} 自动转换 main( ) 为int型 { int r,area; 程序运行情况如下: scanf("%d",&r); 2 printf("%d\n",s(r)); 12 }
思考: 若要得到单精度实型的圆面积,程序应如何修改
2011年9月 By zzj
【例5.3】பைடு நூலகம்参函数的定义与调用。
void welcome ( ) { printf("*********************************\n"); printf(" Welcome to China \n"); printf("*********************************\n"); } main( ) { welcome( );}
13
注意:在TC中,实参的求值顺序是从右到左。
2011年9月 By zzj
【例5.7】函数调用中实参的求值顺序。 void fun(int a,int b) { printf("a=%d,b=%d\n",a,b); } main( ) { int m=5; fun(3+m, m++); }