第9章c语言谭浩强版顶级讲义PPT优秀课件

合集下载

最的c语言教程谭浩强c语言PPT课件

最的c语言教程谭浩强c语言PPT课件
整数轮流作为除数,如果都不能被整除,则n为素数。 算法可以表示如下: S1:输入n的值
S2:2=>i (i作为除数) S3:n被i除,得余数r
第19页/共92页
S4:如果r=0,表示n能被i整除,则打印n“不是素数”,算法结束;否则执行S5 S5:i+1=>i
S6:如果i≤n-1,返回S3;否则打印 n “是素数”,然后结束。 实际上n不必被2到(n-1)的整数除,只需被2到n的开方间整数除即可,甚至只需被 2到n之间的整数除即可。例如,判断13是否素数,只需将13被2、3除即可,如都
算机科学家沃思(Nikiklaus Wirth)提出一个公式 数据结构 + 算法 = 程序
第1页/共92页
实际上,一个程序除了以上两个主要要素之外,还应当采用结构化程序设计方法进 行程序设计,并且用某一种计算机语言表示。因此,可以这样表示: 程序 = 算法 + 数据结构 + 程序设计方法 + 语言工具和环境
程序形式),或者将这些程序存放在磁盘或磁带上,供用户调用。
第5页/共92页
而非数值运算的种类繁多,要求各异,难以规范化,因此只对一些典型的非数值运 算算法(例如排序算法)作比较深入的研究。其他的非数值运算问题,往往需要使用
者参考已有的类似算法重新设计解决特定问题的专门算法。 本书不可能罗列所有算法,只是想通过一些典型算法的介绍,帮助读者了解如何设 计一个算法,推动读者举一反三。希望读者通过本章介绍的例子了解怎样提出问题,
5. 有效性 算法中的每一个步骤都应当能有效地执行,并得到确定的结果。
第22页/共92页
对于不熟悉计算机程序设计的人来说,他们可以只使用别人已设计好的现成算法, 只需根据算法的要求给以必要的输入,就能得到输出的结果。对他们来说,算法如 同一个“黑箱子”一样 ,他们可以不了解“黑箱子”中的结构,只是从外部特性上 了解算法的作用,即可方便地使用算法。例如,对一个“输入3个数,求其中最大 值”的算法,可以用图2.2表示,只要输入a,b,c3个数,执行算法后就能得到其 中最大的数。但对于程序设计人员来说,必须会设计算法,并且根据算法编写程序。

谭浩强C程序设计第三版清华第9章预处理 1 ppt课件

谭浩强C程序设计第三版清华第9章预处理 1 ppt课件
17
例9.3 使用带参的宏 运行情况如下:
#include <stdio.h> #define PI 3.1415926
#define S(r) PI*r*r
r=3.600000 area=40.715038
void main()
{float a,area;
a=3.6;
area=S(a);
printf("r=%f\narea=%f\n",a,area);
7
9.1 宏定义
9.1.1 不带参数的宏定义 宏定义一般 #define 标识符 字符串 形式为: 例如:# define PI 3.1415926
• 宏定义的作用是在本程序文件中用指定的标识符PI 来代替“3.1415926”这个字符串,在编译预处理时 ,将程序中在该命令以后出现的所有的PI都用 “3.1415926”代替。这种方法使用户能以一个简单 的名字代替一个长的字符串。
14
说明:
(8) 对程序中用双撇号括起来的字符串内的字符,即 使与宏名相同,也不进行置换。
(9) 宏定义是专门用于预处理命令的一个专用名词, 它与定义变量的含义不同,只作字符替换,不分 配内存空间。
15
9.1.2 带参数的宏定义
作用:不是进行简单的字符串替换,还要 进行参数替换。 带参数的宏定义一般形式为:
运行情况如下:
L=18.849556 S=28.274333
13
经过宏展开后,printf函数中的输出项L被展开为: 2*3.1415926*3.0
S展开为 3.1415926*3.0*3.0
printf函数调用语句展开为:
printf(“L=%F\NS=%f\n”, 2*3.1415926*3.0,3.1415926*3.0*3.0);

c程序设计 谭浩强 第9章

c程序设计 谭浩强 第9章
9
几点使用说明
第九章 9. 1预处理功能 9. 2文 件 包 含 9. 3条 件 编 译 9. 4库函数使 用方式
① 使用宏定义时所带的实参可以是常量、已被赋值 的变量名或者表达式。 例:将前面的示例程序改写为交互式输入半径值的方 式。 #define PI 3.1415926536 #define area(r) (PI*r*r) void main( ) { float r; printf("Input:r=?\n"); scanf("%f",&r); printf("Area=%f\n",area(r)); }
6
有关宏的定义和使用要注意以下几点:
第九章 9. 1预处理功能 9. 2文 件 包 含 9. 3条 件 编 译 9. 4库函数使 用方式
⑥ 如果宏定义中的字符序列过长,在一行中放不 下,可在该行末尾加续行符“\”,后随一个换 行符。 #define LONG_STRING this is a very long \ ↙ string that is used as an example ⑦ 可以用宏定义来表示数据类型。 #define MAX 100 #define ENTRY struct entrytype 在程序中可用ENTRY定义变量: ENTRY table[MAX],* p;
4
有关宏的定义和使用要注意以下几点:
第九章 9. 1预处理功能 9. 2文 件 包 含 9. 3条 件 编 译 9. 4库函数使 用方式
④ 宏定义可以嵌套。例如: #define PI 3.1415926 #define TWOPI ( 2*PI ) 在预处理后,语句 c1=TWOPI * r; 便替换成 c1=( 2 * 3.1415926 ) * r; ⑤ 宏替换只是按原来的定义“机械地”进行替 换,不管替换后的结果是对还是错。例如: #define A 3+2 那么 5/A 被替换成 5/3+2

谭浩强 c语言程序设计(第九章)

谭浩强 c语言程序设计(第九章)
形式1: #ifdef 标识符 程序段1 #else 程序段2 #endif 意义:若该标识 符已被#define 命令定义,则编 译程序段1,否 则编译程序段2 形式2: #ifndef 标识符 程序段1 #else 程序段2 #endif 意义:若该标识
符没有被#define 命令定义,则编 译程序段1,否则 编译程序段2
4
第九章 预处理命令
例:下列程序宏替换。
例 #include <stdio.h> #define N 2 #define M N+1 # define NUM (M+3)*M/2 void main() { int i; for (i=0; i<=NUM; i++); printf(“%d\n”,i); }
第九章 预处理命令
第九章 预处理命令
内容提要: ★宏定义
★文件包含
★条件编译
1
第九章 预处理命令 – 作用:对源程序编译之前做一些处理,生成扩展C 源程序 种类
• 宏定义 • 文件包含 • 条件编译 #define #include #if--#else--#endif等
– 格式:
• “#”开头 • 占单独书写行 • 语句尾不加分号
#ifdef DEBUG printf(“x=%d,y=%d,z=%d\n”,x,y,z); #endif
#define DEBUG
字符串(可为空)
调试时:加上此命令 调试完成后:删去此命令
15
第九章 预处理命令 例5: (选择性地编译不同功能) 。根据需要,有时要把 字母全改为大写输出,另一些时候则要把字母全改为 小写输出。如何适应这两种不同要求。
11
第九章 预处理命令

C语言程序设计第五版谭浩强 ppt课件

C语言程序设计第五版谭浩强 ppt课件

运行结果: sum=34
C语言程序设计
第一章 C语言概述
例1.3 从键盘输入两个整数,输出其中较大的数
#include <stdio.h> void main() 声明部分,定义变量 { int max(int x,int y)
输入:10,20 输出:max = 20
int a,b,c;
scanf(“%d,%d”,&a,&b);
第6章 循环控制
第8章 函数
第7章 数组
第9章 预处理命令
第10章 指针
第11章 结构体与共用体
第12章 位运算
第13章 文件
C语言程序设计
第1章 C语言概述
C语言发展历史 C语言的特点 简单的C程序介绍 C程序的上机步骤
第一章 C语言概述
C语言程序设计
§1.1 C语言发展历史
程序设计语言的发展
<
第一章 C语言概述
9种控制语句: if( )~else~ for( )~ while( )~ do~while( ) continue break switch goto return
C语言程序设计
第一章 C语言概述
表1.1 C语言与Pascal语言比较
C语言 {} if(e) S; int i; int a[10];
不产生编译代码
❖编译预处理命令
非法
<>
例: /*This is the main /* of example1.1*/ */
C语言程序设计
§1.4 C程序的上机步骤
C程序开发步骤
编辑
开始
第一章 C语言概述
程序代码的录入, 生成源程序*.c

C程序设计 谭浩强著 精品课件 第9章 编译预处理

C程序设计 谭浩强著 精品课件  第9章  编译预处理
C 程序设计 第九章 编译预处理
19
例:求3×4矩阵最大元素及位置,程序的两个函数分别 编制在MYPRG.C和EXA96.C两个源文件中。 MYPRG.C—— int fun1(int x[][4]) { int i, j, max; max=x[0][0]; line=col=0; /*不必对外部变量声明*/ for(i=0; i<3; i++) for(j=0; j<4; j++) if(x[i][j]>max) { max=x[i][j]; line=i; col=j; } return(max); }
宏名G有效; main、fun1可引用。 /*宏终止*/
C 程序设计
第九章 编译预处理
9
4) 宏定义时不进行错误性检查; #define PI 3.14l592 5) 宏串中可出现已定义的宏名,这种现象称为宏的 嵌套定义; 如:#define R 3.0 /*宏按书写顺序逐一展开*/ #define PI 3.141592 #define C 2.0*PI*R #define S PI*R*R void main() { printf("C=%f\nS=%f\n", C, S); } 最终输出项C替换为:2.0*3.141592*3.0 S替换为:3.141592*3.0*3.0
C 程序设计 第九章 编译预处理
14
3) 宏定义中宏名与参数的括号间不能有空格;
如:#define S(r)3.141592*(r)*(r) 宏串 由于出现了空格,则认为S是宏名而且无参。 4) VC对宏串中双引号范围内的内容不予替换; 如:#define PR(V) printf("V=%d\t", V); void main() { int a=1, b=2; PR(a); /*printf("V=%d\t", a);*/ PR(b); /*printf("V=%d\t", b);*/ }

C语言谭浩强完整课件

C语言谭浩强完整课件

着广泛的应用。
计算机系统基本概念
计算机系统的组成
计算机系统由硬件系统和软件系统两大部分组成,硬件系统包括运算器、控制器、存储器 、输入设备和输出设备等五大部分;软件系统包括系统软件和应用软件两大类。
计算机的工作原理
计算机的工作原理可以概括为存储程序控制和程序控制流,即计算机通过执行存储在内存 中的程序来控制各部件协调工作。
在定义数组时,可以直接 对数组进行初始化,也可 以定义后再进行赋值。
一维数组的使用
通过下标访问数组元素, 下标从0开始,最大下标为 数组长度减1。
二维数组与多维数组
二维数组的定义
二维数组可以看作是一个 表格,由行和列组成,每 个元素都有两个下标。
二维数组的初始化
在定义二维数组时,可以 直接对数组进行初始化, 也可以定义后再进行赋值 。
scanf和printf函数都支持 格式化输入输出,可以通 过格式控制符指定输入输 出数据的类型和格式。
格式化输入
格式控制符
C语言提供了一组格式控制符,用于 指定输入输出数据的类型和格式,如 %d表示输入输出整数,%f表示输入 输出浮点数等。
格式化输入
格式化输出
使用printf函数进行格式化输出时, 可以指定输出数据的格式和显示方式 ,如控制小数位数、显示宽度等。
类型。
枚举常量的说明
在枚举类型定义中,可以列 出多个枚举常量,每个常量 对应一个整数值。默认情况 下,第一个枚举常量的值为0 ,后续常量的值依次递增1。
枚举变量的使用
声明枚举类型的变量后,可 以为其赋值。枚举变量的值 只能是枚举常量中定义的值 。使用枚举类型可以提高代 码的可读性和可维护性。
08
文件操作与数据处理

C语言程序设计_课件_第九章(适于清华谭浩强版)

C语言程序设计_课件_第九章(适于清华谭浩强版)

注意, 注意,对嵌套结构体的引用必须引用
到最末一级。 到最末一级。
struct OBJECT { struct TASK { long plan; long start; long finish; } ti,tj; int count; } ob;
可以使用scanf(“%d”,&ob.ti.plan) 输 可以使用 入数据。但是不能引用ob.ti 。 入数据。但是不能引用
9.2 结构体与数组 9.2.1结构体包含数组 结构体包含数组 由于结构体的成员可以是任何基 本数据类型和另外一个构造类型, 本数据类型和另外一个构造类型,所 以结构体的成员当然可以是数组。 以结构体的成员当然可以是数组。 下面我们说明一个可以描述一个股票 信息的结构体: 信息的结构体:
struct STOCK { char stockname[8]; /*股票名称 */ 股票名称 char stockcode[6]; /*股票代码 */ 股票代码 float price[3]; /*买 入价、卖出价、成交价 */ 买 入价、卖出价、 }; ;
不能混淆结构体名和结构体变量这两 个概念。 个概念。结构体名实际上标识了程序员定 义的一种新的数据类型, 义的一种新的数据类型,编译系统不可能 为结构体名分配内存空间。 为结构体名分配内存空间。只有当变量被 说明为这种由程序员自己定义的数据类型 的结构体时, 的结构体时,编译系统才会为结构体变量 分配存储空间。在不引起混淆的情况下, 分配存储空间。在不引起混淆的情况下, 结构体变量可以简称为结构体。 结构体变量可以简称为结构体。
*/
Struct STOCK sfz={"ShenFaZhan","000001",8.77,8.78,8.78 }; /*用深发展的数据初始化结构体变量 用深发展的数据初始化结构体变量sfz*/ 用深发展的数据初始化结构体变量 printf("\n %s %s ", sfz.stockname, sfz .stockcode); /*输出股票名称和股票代码 */ 输出股票名称和股票代码 for (i=0;i<3;i++) /*输出股票的买入价、卖出价和成交价 输出股票的买入价、 输出股票的买入价 卖出价和成交价*/ printf("%6.2f ", sfz.price[i]); }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第9章 预处理命令
9.1 宏定义 9.2 “文件包含”处理 9.3 条件编译 习题
ANSI C标准规定可以在C源程序中加入一些“预处 理命令”(preprocessor DireCtiveS) ,以改进程序
设计环境,提高编程效率。这些预处理命令是由 ANSI C统一规定的,但是它不是C语言本身的组 成部分,不能直接对它们进行编译(因为编译程序 不能识别它们)。必须在对程序进行通常的编译(包 括词法和语法分析、代码生成、优化等)之前,先 对程序中这些特殊的命令进行“预处理”, 即根
为1000,如果需要改变数组大小,只需改 #define 行:
#define array-size 500 使用宏定义,可以提高程序的通用性。
(3) 宏定义是用宏名代替一个字符串,也就是作简单 的置换,不作正确性检查。如果写成
#define PI 3.l4l59 即把数字1写成小写字母l,预处理时也照样代入,
(8) 对程序中用双括号括起来的字符串内的字符,即 使与宏名相同,也不进行置换。如例9.2中的 printf函数内有两个l字符,一个在双引号内,它 不被宏置换,另一个在双引号外,被宏置换展开。
不管含义是否正确。也就是说预编译时不作任何 语法检查。只有在编译已被宏展开后的源程序时 才会发现错误并报错。
(4) 宏定义不是C语句,不必在行末加分号。如果加 了分号则会连分号一起进行置换。如:
#define PI 3.1415926;
area=PI*r*r;
经过宏展开后,该语句为
area=3.1415926;*r*r; 显然出现语法错误。
据预处理命令对程序作相应的处理(例如,若程序 中用#define命令定义了一个符号常量A,则在预 处理时将程序中所有的A都置换为指定的字符串。 若程序中用#inClude命令包含一个文件“StDio.h”,
则在预处理时将StDio.h文件中的实际内容代替该命 令)。经过预处理后程序不再包括预处理命令了,最 后再由编译程序对预处理后的源程序进行通常的编
C提供的预处理功能主要有以下三种: 1. 宏定义 2. 文件包含 3. 条件编译
分别用宏定义命令、文件包含命令、条件编译命令 来实现。为了与一般C语句相区别,这些命令以符 号“#”开头。
9.1 宏定义
9.1.1 不带参数的宏定义
用一个指定的标识符(即名字)来代表一个字符串, 它的一般形式为#define 标识符字符串。这就是已 经介绍过的定义符号常量。 如:#definePI3.1415926它的作用是指定用标识符 PI来代替“3.1415926”这个字符串,在编译预处 理时,将程序中在该命令以后出现的所有的PI都 用“3.1415926”代替。这种方法使用户能以一个 简单的名字代替一个长的字符串,因此把这个标 识符(名字)称为“宏名”,在预编译时将宏名替 换成字符串的过程称为“宏展开”。#define是宏 定义命令。

运行情况如下:
input radius:4
l=25.1328
s=50.2655
v=150.7966 说明:
(1) 宏名一般习惯用大写字母表示,以便与变量使用宏名代替一个字符串,可以减少程序中重复 书写某些字符串的工作量。例如,如果不定义PI代 表3.1415926,则在程序中要多处出现3.1415926,不 仅麻烦,而且容易写错(或敲错),用宏名代替,
简单不易出错,因为记住一个宏名(它的名字往往 用容易理解的单词表示)要比记住一个无规律的字 符串容易,而且在读程序时能立即知道它的含义, 当需要改变某一个常量时,可以只改变#define命令 行,一改全改。例如,定义数组大小,可以用
#define array- size 1000
int array[array-size]; 先指定array-size代表常量1000,因此数组array大小
译处理,得到可供执行的目标代码。现在使用的许 多C编译系统都包括了预处理、编译和连接等部分, 在进行编译时一气呵成。因此不少用户误认为预处 理命令是C语言的一部分,甚至以为它们是C语句, 这是不对的。必须正确区别预处理命令和C语句、 区别预处理和编译,才能正确使用预处理命令。C 语言与其他高级语言的一个重要区别是可以使用预 处理命令和具有预处理的功能。
#undef g
f1()
{

}
由于#undef的作用,使G的作用范围在#undef行处终止,因 此在f1函数中,g不再代表8.8。这样可以灵活控制宏定义 的作用范围。
(7) 在进行宏定义时,可以引用已定义的宏名,可以 层层置换。 例9.2
#define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R main() { printf("L=%f\ns=%f\n",L,S); }
例9.1
#define PI 3.1415926
main() {float l,s,r,v; printf("input raDiuS∶"); scanf("%f",&r);
l=2.0*PI*r;
s=PI*r*r;
v=3.0/4*PI*r*r*r; printf("l=%10.4f\nS=%10.4f\nv=%10.4f\n",l,s, v);
(5) #define命令出现在程序中函数的外面,宏名的有 效范围为定义命令之后到本源文件结束。通常, #define命令写在文件开头,函数之前,作为文件 一部分,在此文件范围内有效。
(6) 可以用#undef命令终止宏定义的作用域。例如:
#define g 8.8
main()
{
|
G的有效范围

}
运行情况如下:
L=18.849556
s=28.274333
经过宏展开后,printf函数中的输出项L被展开为 2*3.1415926*3.0,S展开为 3.1415926*3.0*3.0, printf函数调用语句展开为 printf("L=%f\ns=%f\n",2*3.1415926*3.0, 3.1415926*3.0*3.0);
相关文档
最新文档