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
正在阅读:
C语言程序设计教程第7章08-14
莪术联合紫外线治疗压疮的效果观察04-28
因为有你作文800字06-16
浅谈初中生语文学习的自主性-最新教育资料03-16
学校生活饮用水卫生管理制度06-04
关于历史故事02-19
2011年检修部工作总结01-08
佛学经典爱情语录02-10
PE管安装技术交底04-03
遵义动物医院财务管理制度03-13
- 粮油储藏基础知识
- 论文范文(包括统一封面和内容的格式)
- 经典解题方法
- 综合部后勤办公用品管理办法+领用表
- 学生宿舍突发事件应急预案
- 16秋浙大《生理学及病理生理学》在线作业
- 四分比丘尼戒本(诵戒专用)
- 浙江财经大学高财题库第一章习题
- 九大员岗位职责(项目经理、技术负责人、施工员、安全员、质检员、资料员、材料员、造价员、机管员)
- 旅游财务管理习题(学生版)
- 德阳外国语高二秋期入学考试题
- 投资学 精要版 第九版 第11章 期权市场
- 控制性详细规划城市设计认识
- bl03海运提单3国际贸易答案
- 2010-2011学年湖北省武汉市武珞路中学七年级(上)期中数学试卷
- VB程序填空改错设计题库全
- 教师心理健康案例分析 - 年轻班主任的心理困惑
- 民间借贷司法解释溯及力是否适用?
- 三联书店推荐的100本好书
- 《化工原理》(第三版)复习思考题及解答
- 程序设计
- 语言
- 教程