第6章 函数与编译预处理PPT课件

合集下载

C++函数省公开课一等奖全国示范课微课金奖PPT课件

C++函数省公开课一等奖全国示范课微课金奖PPT课件
第12页
6.2 函数定义与调用
➢ 按函数调用在程序中出现位置来分,函数调用大致可分 为以下几个形式:
➢ (1)函数语句 ➢ (2)函数表示式 ➢ (3)函数实参
第13页
6.2函数定义与调用
2.被调函数申明 ➢ 函数申明普通形式为: ➢ 函数类型 函数名(参数类型1, 参数类型2,…); ➢ 或 函数类型 函数名(参数类型1 参数名1, 参数类
第23页
6.4 变量作用域与存放类型
➢1.auto变量 ➢auto说明符经常省略,系统默认为没有存放类型说明符变量为自动存放 类型变量,前面各章中全部程序中所用到各个变量,都未说明存放方式, 都是自动变量。 ➢在函数体内定义变量时,下面两种写法是等价。 ➢int x,y,z; ➢ auto int x,y,z; ➢2.register变量 ➢普通情况下,变量值都是存放在内存中。对于一些频繁使用变量,能够 放在CPU内部存放器中,以提升访问这些变量速度。这种变量就称为存放 器变量。存放器变量也属于局部变量范围。
序运行过程中不释放,直到程序运行结束才释放它所占存 放空间,所以静态变量生存期是整个程序。因为变量分为 局部变量和全局变量,所以静态变量也分为静态局部变量 和静态全局变量。 ➢ (1)静态局部变量 ➢ 静态局部变量依然是定义在函数内部局部变量,它作用域 依然局限于函数内部。 ➢ 比如:static int m=10,n;
– 降低重复编写工作量,如
Cmn
m! n!(m n)!

第3页
➢ #include <stdio.h>
➢ long factorial(int x) /*定义函数factorial计算n阶乘*/
➢{
➢ int i;
➢ long result=1;

C语言编译预处理PPT课件

C语言编译预处理PPT课件

知识点精讲
知识点2 不带参数的宏定义
知识点分析 用一个指定的标识符(即名字)来代表一个字符串,其一般形式如下: #define 标识符 字符串 例如: #define PI 3.1415926 1.宏定义的作用是在本程序文件中用指定的标识符PI来代替3.141 592 6这个字符串。在编译 预处理时,将程序中在该命令后出现的所有PI都用3.141 592 6代替。这种方法使用户能够以一个 简单的名字代替一个长的字符串。 2.这个标识符(名字)称为“宏名”。 3.在预处理时,将宏名替换成字符串的过程称为“宏展开”。“#define”是宏定义命令。 例如: #include "stdio.h" #define PI 3.1415926 /*定义了一个不带参数的宏*/
知识点精讲
int sum=ADD ( m+n)*k; printf("sum=%d", sum); } 2.下列程序的运行结果是____s_u_m_=_1_2_______ #define ADD(x)(x)+(x) void main( ) { int m=1,n=2,k=3; int sum=ADD(m+n)*k; printf("sum=%d", sum); } 3.下列程序的运行结果是______2_8________ #include <stdio.h> #define f(x) x*x main( )
void main( )
{
printf("L=%f\nS=%f\n",L,S);
getch( );
}
知识点精讲
知识点3 带参数的宏定义
真题回顾 (2021年真题)计算圆的面积s(公式为s=3.14r2)。请补全下列代码。 #include<stdio.h>

2019年第6章函数与编译预处理.ppt

2019年第6章函数与编译预处理.ppt

p2
b
printf(“swapped:\n”);
&b
5
swap(&a,&b);
printf(”a=%d,b=%d\n",a,b); 返回: }
a 9
b 5
上一页
下一页
例:参数传递的区别举例 (等级考试考题) #include <stdio.h> sub(int x,int y,int *z) { *z=y-x; }
第六章 函数与编译预处理
6.1 模块化程序设计与函数 6.2 函数的定义与调用 6.3 函数的递归调用 6.4 变量作用域与存储方式 6.5 编译预处理 6.6 函数设计举例
上一页
下一页
教学目的和基本要求:
要求学生了解模块化程序设计的思想,掌握 函数的定义及调用,理解变量的作用域与存 储方式的概念,理解编译预处理的概念。
3、开发方法: 自上向下,逐步分解,分而治之
上一页
下一页
C程序
源程序文件1 源程序文件i 源程序文件n
预编译命令
函数1
函数n
说明部分 执行部分
C程序结构
C是函数式语言 必须有且只能有一个名为main的主函数 C程序的执行总是从main函数开始,在main中结束 函数不能嵌套定义,可以嵌套调用

调用函数b


b函数


上一页
下一页
long fac(int k) {long f=1; int i; for(i=1;i<=n;i++)
f=f*i; retrun f; }
long combination(int n ,int m) {long c; int i; c=fac(m)/(fac(n)*fac(m-n) ); retrun c; }

C语言程序设计ppt-第6章 编译预处理

C语言程序设计ppt-第6章 编译预处理
_Generic对第一个参数进行类型判断,然后根据从第二参数 开始的类型-表达式关联表来进行编译期替换。如果x为long double类型,那么_Generic((x), …)的结果为sinl,如果x 为double类型,那么_Generic((x),…)的结果为sinf,否则 结果为sin。可见,根据x的类型,宏sin(x)转换为sinl(x), sinf(x)或sin(x)。
程序段A
1#0e/6n/2d02i0f
华中科技大学计算机学院C语言课程组
20
6.4.3 条件编译的应用
【例6.5】 采用条件编译,避免多次包含同一个头文件。
为了避免一个头文件被多次包含,可以在头文件的最前面两 行和最后一行加上预编译指令,让头文件在被多个源文件引 用时不会多次编译。
#ifndef _NAME_H
如何方便地处理这些用于输出调试信息的语句?用C99的可 变参数宏,可方便地输出调试信息。
源程序\ex6_2.c 调试阶段定义DEBUG宏,在需要输出调试信息的地方用宏
msg,调试成功后,软件正式发行时,只需将第2行的 #define指令删除或注释掉即可,非常方便。
10/6/2020
华中科技大学计算机学院C语言课程组
16
6.5 条件编译
预处理程序提供了条件编译指令,用于在预处 理中进行条件控制,根据所求条件的值有选择 地包含不同的程序部分,因而产生不同的目标 代码。 这对于程序的移植和调试是很有用的。 对源程序的各部分有选择地进行编译称为条件 编译。
条件编译指令三种形式,控制流与if-else语 句类似。如表6.1所示 .
10/6/2020
华中科技大学计算机学院C语言课程组
14
【例6.3】 用_Generic,编写求和的 通用类型宏sum。

编译预处理ppt课件

编译预处理ppt课件

第6章 在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么
编译预处理
【例6.1】求三角形的周长、面积和体积。
#define PI 3.14159 main( ) { float l,s,r,v; printf("input redius:\n" ); scanf("%f",&r);
#define D "%d"
#define D1 D NL
#define D2 D D NL
#define D3 D D D NL
#define D4 D D D D NL
#define S "%s"
第6章 在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么
第6章 在日常生活中,随处都可以看到浪费粮食的现象。也许你并未意识到自己在浪费,也许你认为浪费这一点点算不了什么
编译预处理
【例6.2】嵌套宏定义。
#define R 3.0 #define PI 3.14159 #define L 2*PI*R
运行结果为: L=18.849540 S=28.274310
编译预处理
(5) 宏定义也有定义域,它的定义域是从开始定义处到本程序 文件的结尾。所以一般都将宏定义放在源程序开头。如果终 止使用宏,可以使用编译预处理命令“#undef”来终止宏的 定义域,即宏的定义域应该是从定义处到文件尾或命令“# undef”出现处。
#define PI 3.14159
/ * 定义宏PI为 3.14159 */

s=PI *r *r;

C语言程序设计_06函数与编译预处理

C语言程序设计_06函数与编译预处理

注意:所有的递归问题都一定可以用非递归的算法实现,并 且已经有了固定的算法。如何将递归程序转化为非递归程序 的算法已经超出了本书的范围,感兴趣的读者可以参看有关 数据结构的文献资料。
6.5 变量的作用域与存储类别 6.5.1 变量的作用域 在程序中能对变量进行存取操作的范围称为变量的作用域。 根据变量的作用域不同,变量分为局部变量和全局变量。 1.局部变量 在一个函数体内或复合语句内定义的变量称为局部变量。局 部变量只在定义它的函数体或复合语句内有效,即只能在定 义它的函数体或复合语句内部使用它,而在定义它的函数体 或复合语句之外不能使用它。
(3)将分解后的每个小问题作为一个整体,描述用这 些较小的问题来解决原来大问题的算法。 由第(3)步得到的算法就是一个解决原来问题的递归 算法。由第(1)步将问题的规模缩到最小时的条件就 是该递归算法的递归结束条件。 【例6.7】利用递归函数打印如图6-7所示的数字金字塔 图形。
图6-7 数字金字塔
2.函数体 在函数定义的最外层花括号括起来的部分称作函数体。在函 数体的前面部分可以包含函数体中程序对象的声明和变量定 义,声明和定义之后是描述函数功能的语句部分。 函数体中的RETURN语句用于传递函数的返回值。一般格式 为: RETURN 表达式;
说明: (1)一个函数中可以有多个RETURN语句,当执行到某个 RETURN语句时,程序的控制流程返回调用函数,并将 RETURN语句中表达式的值作为函数值带回。 (2)若函数体内没有RETURN语句,就一直执行到函数体 的末尾,然后返回调用函数。这时也有一个不确定的函数值 被带回。 (3)若不需要带回函数值,一般将函数定义为VOID类型。 (4)RETURN语句中表达式的类型应与函数返回值的类型 一致。不一致时,以函数返回值的类型为准。 3.空函数 C语言还允许函数体为空的函数,其形式为: 函数名() {} 调用此函数时,什么工作也不做。

c语言 第六章 函数与编译预处理1

c语言 第六章 函数与编译预处理1
使用库函数: 使用库函数: 包含相应头文件; ① 包含相应头文件; 明确函数功能; ② 明确函数功能; 明确参数的数目、顺序、意义和类型; ③ 明确参数的数目、顺序、意义和类型; 明确函数返回值意义和类型。 ④ 明确函数返回值意义和类型。
自定义函数—先定义, 自定义函数 先定义,再调用 先定义 定义格式
表明无参 数,可省
注:C语言规定,对函数调用之前必须对 语言规定, 其加以声明或定义,否则会出现编译错! 其加以声明或定义,否则会出现编译错!
1、无参数无返回值的函数
函数的调用 调用格式 执行过程
语句1 语句 函数名( ; 函数名 ); 语句2 语句
例如: 例如: scanf("%d",&x); fun( ); printf(("%d",x); 注: 调用时( 中不能有void ① 调用时( )中不能有 宏观上顺序执行; ② 宏观上顺序执行
学习要求
理解函数在C语言程序设计中的作用和地位; 理解函数在C语言程序设计中的作用和地位; 理解函数、形参、实参的概念; 理解函数、形参、实参的概念; 理解作用域、生存期的概念; 理解作用域、生存期的概念; 掌握函数的定义、声明和调用方法; 掌握函数的定义、声明和调用方法; 理解全局变量、局部变量、静态变量、 理解全局变量、局部变量、静态变量、静态函数的 作用域和生存期; 作用域和生存期; 了解递归函数的编写规则。 了解递归函数的编写规则。
2、无参数有返回值的函数
函数的调用 调用格式 语句1 语句 函数名( ); 函数名 ; 语句2 语句 执行过程 语句1 赋值] 语句2 语句1 函数体语句 返回值 [赋值] 语句2 主要用途 此类函数用于完成某项固定的处理任务,执行 此类函数用于完成某项固定的处理任务, 固定的处理任务 完成后向调用者返回一个值 返回一个值。 完成后向调用者返回一个值。

函数与编译预处理

函数与编译预处理
(2) 间接递归 void a() { … b(); … } void b() { … a(); …}
例6.3 用递归方法计算n!。
long fact(int n) { if(n==0||n==1) return 1; else return n*fact(n-1); } main() { int n; long m; scanf("%d",&n); m=fact(n); printf("%d!=%ld\n",n,m); }
程序举例
1.以下程序的输出结果是 #define M(x,y,z) x*y+z main() {int a=1,b=2,c=3; printf(“%d\n”,M(a+b,b+c,c+a)); }
计算过程: 1+2*2+3+3+1=12
4+4*4+4/2+2*2+2=28
有以下程序执行后输出结果是 #define f(x) x*x main() {int i; i=f(4+4)/f(2+2); printf(“%d\n”,i); }
2.带参数的宏定义
带参数的宏定义的一般形式为: #define 宏名(形参表) 字符串 对带参数的宏,在调用时,不仅要宏展开,而且要用实参去代换形参。 带参数宏调用的一般形式为:宏名(实参表); #define MAX(x,y) x>y?x:y main() { int a,b,m; scanf("%d%d",&a,&b); m=MAX(a,b); printf("max=%d\n",m);
全局变量和局部变量的使用特点 变量存储类别

第6章函数与预处理-PPT精选文档

第6章函数与预处理-PPT精选文档

2019/2/28
6.1.3 函数的引入实例
void menu() { printf("***********************************************\n"); printf("\t1登记学生成绩\t \t\t2删除学生信息\n"); printf("\t3查询学生信息\t \t\t4修改学生资料\n"); printf("\t5保存学生信息\t \t\t6学生成绩排序\n"); printf("\t7统计学生成绩\t \t\t8输出学生信息\n"); printf("\t0退出系统\n"); printf("**********************************************\n"); } void printstart() { printf("-----------------------------------------------------------------------\n"); }
2019/2/28
6.1.2 函数的基本概念
在第1章中已经介绍过,C源程序是由函数组成的。 虽 然在前面各章的程序中都只有一个主函数main(), 但实 用程序往往由多个函数组成。函数是C源程序的基本模 块, 通过对函数模块的调用实现特定的功能。C语言中 的函数相当于其它高级语言的子程序。 C语言不仅提供 了极为丰富的库函数(如Turbo C,MS C 都提供了三百多 个库函数),还允许用户建立自己定义的函数。用户可把 自己的算法编成一个个相对独立的函数模块,然后用调 用的方法来使用函数。 可以说C程序的全部工作都是由各式各样的函数完成 的, 所以也把C语言称为函数式语言。 由于采用了函数 模块式的结构, C语言易于实现结构化程序设计。使程 序的层次结构清晰,便于程序的编写、阅读、调试。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

上一页
下一页
模块与函数
C语言程序由基本语句和函数组成,每个函数可完成相 对独立的任务,依一定的规则调用这些函数,就组成了解决 某个特定问题的程序。任务、模块与函数的关系:
任务
模块
模块
模块
函数 函数 函数 函数
函数
函数
上一页
下一页
看这样一个问题:求[200,1000]的双胞胎数的对数。双胞胎数:两素数差 为2称为双胞胎数。
这是我们上一章结束的一道练习题,下面的左边是我们当时编的程序。
main( ) { int a,b,n=0,I;
for(a=200;a<=998;a++) { for(I=2;I<a;I++)
if(a%I==0) break; if(a==I)
我们注意到,程序中用 筐住的部分 是完成了相同的功能,即判断一个数(a 或b)是否是素数。我们可以考虑用一个 独立的函数来完成判断素数的功能,在 主函数中调用此函数即可。如下:
教学重点:
函数的定义及调用、递归调用、 变量的作用域。
上一页
下一页
6.1模块化程序设计与函数
在设计较复杂的程序时,我们一般采用的方 法是:把问题分成几个部分,每部分又可分成更 细的若干小部分,逐步细化,直至分解成很容易 求解的小问题。这样的话,原来问题的解就可以 用这些小问题来表示。
把复杂任务细分成多个问题的过程,就叫程 序的模块化。模块化程序设计是靠设计函数和调 用函数实现的。
上一页
下一页
标准库函数
C语言有丰富的库函数,这些函数的说明在 不同的头文件(*.h)中。想要调用标准的库函数, 就必须“include”包含相应头文件。
例如:
#include<stdio.h> main() {printf(“%d”,1024*768); }
调用printf函数时, 必须include<stdio.h>
} printf(“\n%d”,n);
int f(int x)
{ int I;
for(I=2;I<x;I++) if(x%I==0) break;
if(x==I) return 1;
else re用的格式和语法规定。
上一页
下一页
6.2 函数的定义与调用
上一页
下一页
自定义函数
可以把完成一个任务的过程写成函数。
int A_to_a(int capital) {int small;
if (capital>=‘A’ && capital<=‘Z’) small= capital – (‘A’-’a’); return small; }
返回值类型 函数名
{ b=a+2; for(I=2;I<b;I++) if(b%I==0) break; if(b==I) n++;
} } printf(“\n%d”,n); }
main( ) { int a,b,n=0;
int f(int x); for(a=200;a<=998;a++)
{if(f(a)==1) { b=a+2; if(f(b)==1) n++; }
/*调用自定义函数max*/
printf("max=%d\n",m)); /*调用库函数printf*/
getch();
/*调用库函数getch*/
}
int max(int a,int b) { int y; y=(a>b)? a:b; return y; }
/*定义函数max*/ /*说明局部变量*/ /*条件表达式 */ /*返回函数值 */
float power( float x, int n) { int i; float t=1; for(i=1; i<=n; i++)
第六章 函数与编译预处理
6.1 模块化程序设计与函数 6.2 函数的定义与调用 6.3 函数的递归调用 6.4 变量作用域与存储方式 6.5 编译预处理 6.6 函数设计举例
教学目的和基本要求:
要求学生了解模块化程序设计的思 想,掌握函数的定义及调用,理解 变量的作用域与存储方式的概念, 理解编译预处理的概念。
上一页
下一页
函数定义一般形式:
类型名 函数名(参数类型说明及列表) { 局部变量说明 语句序列 }
上一页
下一页
例如,自定义函数power(x,n),其功能是计 算xn。
float power( float x, int n) {
int i; float t=1; for(i=1; i<=n; i++)
变量的作用域: 局部变量和全局变量
上一页
下一页
函数举例
• #include <conio.h>
main()
{ int a,b,m;
/*说明局部变量*/
int max(int a,int b);
/*函数声明*/
scanf(“%d,%d”,&a,&b); /*调用库函数scanf*/
m=max(a,b);
在C语言中,函数(Function)是一个处理过程, 可以进行数值运算、信息处理、控制决策,即一段 程序的工作放在函数中进行,函数结束时可以携带 或不带处理结果。
从用户角度看,函数有两类: •库函数(标准函数):编译系统提供 •自定义函数:用户自己写
上一页
下一页
C语言程序处理过程全部都是以函数 形式出现,最简单的程序至少也有一个 main函数。函数必须先定义和声明后才 能调用。
t = t * x; return t;
}
上一页
下一页
自定义函数的声明
自定义函数在调用前应先声明。使系统知道将要用到某个 函数及它的类型,以便处理。函数声明应与该函数定义时给出 的函数类型与名字、形参的个数、类型、次序相一致。
#include “stdio.h” void main() {float x,y; int n; float power (float x, int n); scanf("%f,%d", &x, &n); y = power(x, n); printf(“%8.2f”,y ); }
参数说明和参数列表 定义局部变量
返回值
另 的最注如调外好意果用请只不不函注使要需数意用与返时这局已回输样部有则入的变库可参判量函r数断e,数tu的,这r重n格如样0名;式写将要成方与‘便之A调’<相试ca同。pital<‘Z’是不行
上一页
下一页
“函数”的主要知识点
函数的定义: 函数的参数和返回值
函数的调用: 嵌套和递归
相关文档
最新文档