北京科技大学 《C语言》 第9章

合集下载

c语言教材第9章文件PPT教学课件

c语言教材第9章文件PPT教学课件

“w” ( 只 写 ) 为 输 出 打 开 一 文 本 文 件
“a” ( 追 加 ) 向 文 本 文 件 尾 加 数 据
“rb’ ( 只 读 ) 为 输 入 打 开 一 二 进 制 文 件
“wb” ( 只 写 ) 为 输 出 打 开 一 二 进 制 文 件
“ab” ( 追 加 ) 向 二 进 制 文 件 尾 加 数 据
运行结果:
test.txt 的内容是
3,4.50
} 2020/12/10
14
14
5. 文件定位
文件中有一个位置指针,指向当前读写的位置。 我们可以使用有关函数来改变其位置。
• 二进制文件:把内存中的数据按其在内存中的存 储形式原样输出到磁盘文件上。
4. 输入和输出方式
• 缓冲文件系统:系统自动在内存区为每一个正在
使用的文件名开辟一个缓冲区。从内存向磁盘输
出数据必须先送到内存的缓冲区中,装满缓冲区
后在一起送到磁盘中去。如果从磁盘向内存读入
数据,则一次从磁盘文件将一批数据
/* 文件操作模式 */ /* 下一个字符位置 */ /* 文件缓冲区位置 */
}FILE;
2020/12/10
7
7
2.文件类型指针
例: 定义一个FILE类型的数组
FILE -efile [-MAXFILE]; -MAXFILE: 数组元素个数,也就是可使用文件的
最大数目。
例:定义一个文件指针变量
“w b+ ’ ( 读 写 ) 为 读 /写 建 立 一 新 二 进 制 文 件
“ab+ ” ( 读 写 ) 为 读 /写 打 开 一 二 进 制 文 件
2020/12/10
11
11

c语言课件(第三版) 第九章

c语言课件(第三版) 第九章

经预编译宏替换后的printf语句如下: 语句如下: 经预编译宏替换后的 语句如下
printf("maxi=%dmaxf=%f",n1>n2?n1:n2, f1>f2?f1:f2);
9.2 "文件包含"处理 文件包含" 文件包含
"文件包含":是指一个源文件可以将另外一个 文件包含" 是指一个源文件可以将另外一个 文件包含 源文件的全部内容包含进来. 源文件的全部内容包含进来. C语言提供 语言提供#include命令来实现"文件包 命令来实现" 语言提供 命令来实现 的操作,其一般形式为: 含"的操作,其一般形式为: #include "文件名" 或 #include <文件名>

一,编译预处理的概念

C语言允许在程序中使用几种特殊的命令 语言允许在程序中使用几种特殊的命令 它们不是一般的C语句),在 编译系统对 语句), (它们不是一般的 语句),在C编译系统对 程序进行通常的编译之前, 程序进行通常的编译之前,先对程序中这些 特殊命令进行"预处理" 特殊命令进行"预处理",然后将预处理的 结果和源程序一起再进行通常的编译处理, 结果和源程序一起再进行通常的编译处理, 以得到目标代码. 以得到目标代码.
二,带参数的宏定义及宏替换
一般形式: 一般形式 #define 宏名(宏形参数表) 宏名(宏形参数表) 字符串 作用: 宏替换时以实参数替代形参数. 作用: 宏替换时以实参数替代形参数. #define PI 3.1415926 #define S(r) PI*r*r main() { float r1=3.6, area; area=S(r1); /* S(r1)用PI*r1*r1替换 */ printf("r=%f area=%f\n",r1,area); }

谭浩强C语言第9章

谭浩强C语言第9章

§9.1 宏定义命令 不带参数的宏定义: 不带参数的宏定义:
不带参数的宏定义用指定标识符来代替一个字符串. 不带参数的宏定义用指定标识符来代替一个字符串. 字符串 其格式为:#define 其格式为: 标识符 字符串
如:#define
PI
3.1415926
§9.1 宏定义命令 不带参数的宏定义: 不带参数的宏定义: 例: #define X 5 #define Y X+1 #define Z Y*X/2 main() {int a; a=Y; printf(" printf( Z=%d \n ",Z); ,Z); printf(" printf( %d \n ",--a); ,--a); } Z -> Y *X/2 X+1*X/2 5+1*5/2
§9.1 宏定义命令 注意: 注意: 一般来讲,标识符用大写字母, 一般来讲,标识符用大写字母,以便与程序中的变量 函数名等区别开,看上去也更为醒目. 名,函数名等区别开,看上去也更为醒目. 一个宏的作用域是从定义处一直到本文件的结束. 一个宏的作用域是从定义处一直到本文件的结束.虽 然不是必须, 然不是必须,但多数人习惯把所有的宏定义都写在文 件的前面. 件的前面. 宏定义以换行结束,不要用分号结束. 宏定义以换行结束,不要用分号结束.
§9.2 文件包含命令 "文件包含"是指一个源文件可以将另一个源文 文件包含" 文件包含 件的全部内容包含到自己的文件中. 件的全部内容包含到自己的文件中. 文件包含命令的一般形式是: 文件包含命令的一般形式是: "文件名 文件名" #include "文件名" 或 <文件名 文件名> #include <文件名>

c09

c09

第九章编译预处理【基本要求】通过本单元的学习,使学生了解宏的基本知识,熟悉无参数和有参数的宏的定义和使用,掌握文件包含的应用,掌握条件编译及其应用。

【教学重点】宏定义(无参数的宏;有参数的宏),文件包含,条件编译【本章结构】不带参数的宏定义带参数的宏定义1、宏定义2、“文件包含”处理3、条件编译编译指令(编译预处理指令):C源程序除了包含程序命令(语句)外,还可以使用各种编译指令(编译预处理指令)。

编译指令(编译预处理指令)是给编译器的工作指令。

这些编译指令通知编译器在编译工作开始之前对源程序进行某些处理。

编译指令都是用“#”引导。

编译预处理:编译前根据编译预处理指令对源程序的一些处理工作。

C语言编译预处理主要包括宏定义、文件包含、条件编译。

编译工作实际分为两个阶段:编译预处理、编译。

广义的编译工作还包括连接。

过程如图9.1所示一、宏定义宏定义:用标识符来代表一个字符串(给字符串取个名字)。

C语言用“#define”进行宏定义。

C编译系统在编译前将这些标识符替换成所定义的字符串。

宏定义分为不带参数的宏定义和带参数宏定义。

1、不带参数宏定义(简单替换)(1)不带参数宏定义格式#define 标识符字符串其中:标识符-宏名。

(2)宏调用:在程序中用宏名替代字符串。

(3)宏展开:编译预处理时将字符串替换宏名的过程,称为宏展开。

例9.1:图 9.2 宏的定义及调用【说明】(1)宏名遵循标识符规定,习惯用大写字母表示,以便区别普通的变量。

(2)#define之间不留空格,宏名两侧空格(至少一个)分隔。

(3)宏定义字符串不要以分号结束,否则分号也作为字符串的一部分参加展开。

从这点上看宏展开实际上是简单的替换。

例如:#define PI 3.14; 展开为s=3.14;*r*r;(导致编译错误)(4)宏定义用宏名代替一个字符串,并不管它的数据类型是什么,也不管宏展开后的词法和语法的正确性,只是简单的替换。

是否正确,编译时由编译器判断。

C语言C++第9章_预处理

C语言C++第9章_预处理
C程序设计(第三版)——谭浩强 质量技术监督学院——刘锦江
44
基本概念
• C语言与其他高级语言的一个重要区别是可以使用 预处理命令和具有预处理的功能。 C提供的预处理功能主要有以下三种: 1.宏定义 #define 2.文件包含 #include 3.条件编译 #if--#else--#endif 这些功能分别用宏定义命令、文件包含命令、条 件编译命令来实现。为了与一般C语句相区别,这些 命令以符号“#”开头;占单独书写行;语句尾不加 分号。
赋值语句“area=S(a); ” 经宏展开后为: area=3.1415926*a*a; a a;
C程序设计(第三版)——谭浩强 质量技术监督学院——刘锦江
16 16
说明: 说明:
(1)对带参数的宏展开只是将语句中的宏名后面括 号内的实参字符串代替#define 命令行中的形 参。 (2)在宏定义时,在宏名与带参数的括弧之间不应 加空格,否则将空格以后的字符都作为替代字 符串的一部分。
第九章
本章要点
•预处理的概念 •C语言处理系统的预处理功能 •预处理命令的使用
主要内容
9.1 宏定义 9.2“文件包含” 9.2“文件包含”处理 9.3 条件编译
基本概念
• ANSI C标准规定可以在C源程序中加入一些“预处 理命令” ,以改进程序设计环境,提高编程效率。 • 这些预处理命令是由ANSI C 统一规定的,但是它不 是C语言本身的组成部分,不能直接对它们进行编译 (因为编译程序不能识别它们)。必须在对程序进 行通常的编译之前,先对程序中这些特殊的命令进 行“预处理”。 • 经过预处理后程序可由编译程序对预处理后的源程 序进行通常的编译处理,得到可供执行的目标代 码。
printf(“L=%f\nS=%f\n”, 2*3.1415926*3.0,3.1415926*3.0*3.0);

C语言大学使用教材(第2版)第9章讲稿

C语言大学使用教材(第2版)第9章讲稿
/*文件尾 文件尾*/ 文件尾 /*空指针 空指针*/ 空指针 /* 定义数组的最大大小 */
#define MAXSIZE 100
9.1.2 带参数的宏定义
1 带参宏定义的一般格
#define <宏名 形参表 宏名>(<形参表 符号字符串> 宏名 形参表>) <符号字符串 符号字符串
2 带参宏的调用和宏展开
/* 宏展开后为,area=3.14159*r*r */ 宏展开后为,
printf("radius=%6.2f, area=%10.4f \n", r, area) ;
展开后为: 展开后为:area=3.14159*r+2.0*r+2.0 ; 与原来目的: 与原来目的: area=3.14159*(r+2.0)*(r+2.0) ; 相去甚远
9.2 文件包含
指的是, 文件包含 指的是 , 一个源文件可以将另一个源文 件的全部内容包含进来。 件的全部内容包含进来。
1 文件包含命令的格式
包含文件名" #include "包含文件名 包含文件名 包含文件名> 或 #include <包含文件名 包含文件名
功能: 功能 :将指定名字的文件的全部内容包含到当前文件
预处理过程:先用3,2(实参字符串 实参字符串)依次替换字符串中 预处理过程:先用 实参字符串 依次替换字符串中
和形参相同的子串a, b(不是形参字符保持不变 ,即a*b 和形参相同的子串 不是形参字符保持不变), 不是形参字符保持不变 展开为3*2;然后用 替换S(3,2)。 展开为 ;然后用3*2替换 替换 。
中,然后和本文件一起编译,生成一个目标文件。 然后和本文件一起编译,生成一个目标文件。 两种格式的区别仅在于查找指定名字的文件的途径 (方式 不同。 方式)不同 方式 不同。

c语言 第9章

c语言 第9章

第9章 编译预处理
2. #ifndef 标识符 标识符 程序段1 #else 程序段2 #endif 与第一种形式正好相反,当标识符未被定义过时, 则对程序段1进行编译,否则,对程序段2进行编译。
第9章 编译预处理
3. #if 表达式 表达式 程序段1 #else 程序段2 #endif 当表达式之值为真(非零)时, 编译程序段1, 否则 编译程序段2。 例如: #if DEBUG==1 调试代码 #endif
例如,用PI代表3.1415926,用PR代表printf, 宏 定义如下: (1) #define PI 3.1415926 (2) #definee PR printf 程序中凡是出现3.1415926的地方,都可以以PI出 现, 凡是出现printf的地方,都可以以PR出现。
第9章 编译预处理
第9章 编译预处理
说明: (1) 列出的参数必须在宏体中用到。 (2) 带参数的宏展开只是将实参简单替换形参。当实参 中含有运算,宏展开可能会出问题。 如有宏定义: #define S(n) n*n*n 若 将 形 参 n 用 实 参 a+b 替 换 , S ( a+b ) 会 变 成 a+b*a+b*a+b, 显然与原意不相符。 如将宏定义改成: #define S(n) (n)*(n)*(n)
S(a+b)为(a+b)*(a+b)*(a+b),与原意相符。 因此, 在带参的宏定义中, 参数应加括号来描述。
第9章 编译预处理
(3) 宏定义时,在宏名与带参数的括号之间不应 加空格,否则将空格以后的部分都作为宏体。例如: #define S (n)(n)*(n)*(n) S S被认为是不带参数的宏名,它代表 (n)(n)*(n)*(n)这样的宏体。 (4) 如在宏体中的参数前加上“#”,则在宏展 开后该实参前后会加上双引号,变成字符串。

第9章(189)

第9章(189)

asm cmp al, 'Z'
27
asm ja copy /*不是‘A’到‘Z’之间的字符原样

制*/
asm add al, 20h /*如果是大写字母转换成小
写字母*/
copy: asm
stosb
asm and al, al
/*C语言中,字符串用ASCII
码为0的字符
(NULL)结尾*/
asm jnz next
int a=1,b;
asm mov
word ptr b, 5
asm xor bx, bx
asm add
bx, a
asm add
bx, b
13
asm add
bx,
asm mov
ah,
asm mov
dx,
asm int 21h
asm mov
ah,
asm mov
dl,
asm int 21h
}
0030h
/*转换为ASCII码*/
1.逐行嵌入格式
格式如下: asm 汇编语言语句或伪指令 <; 或换行> 在逐行嵌入格式中,嵌入的各行汇编语句前面加上asm关 键字。每个asm关键字后面可以写一条汇编语句,每行可以写 多条语句,之间用分号间隔,每行以分号或换行符结束。语句 不能跨行书写。
7
例9.1 在主函数中嵌入汇编语句,调用BIOS功能设置光
第9章 汇编语言与C语言的连接
➢9.1 在C语言中嵌入汇编语言语句 ➢9.2 C语言调用汇编语言程序模块 ➢9.3 汇编语言调用C语言程序模块 ➢本章小结
1
本章学习目标
● 掌握在C语言中嵌入汇编语言语句的格式、数据访问规 则和编译方法。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2011-1-14
9.1 结构体
9.1.1 结构体与结构体类型的定义 结构体类型定义的一般形式: 结构体类型定义的一般形式: 定义的一般形式 struct 结构体名 { 数据类型 成员名 数据类型1 成员名1; 数据类型2 成员名2; 数据类型 成员名 …… 数据类型n 成员名n; 数据类型 成员名 }; struct为关键字; struct为关键字; 为关键字
2011-1-14
9.1.2 结构体变量的定义和初始化
2. 结构体变量的初始化
11
【例9.4】结构体变量的初始化。 结构体变量的初始化。 struct date { int year, month, day;}; day; 如果初值个数少于结构体成员个数, 如果初值个数少于结构体成员个数, struct student 则将无初值对应的成员赋以 值。 则将无初值对应的成员赋以0值 如果初值个数多于结构体成员个数, 如果初值个数多于结构体成员个数, { char num[8], name[20], sex; num[8 name[20], sex; 则编译出错。 则编译出错 struct date birthday; 。 birthday; float score; score; }a={"9606011","Li ming",'M',{1977,12, 83}, }a={"9606011","Li ming",'M',{1977,12,9},83}, b={"9608025","Zhang liming",'F',{1978, 10},87},c; b={"9608025","Zhang liming",'F',{1978,5,10},87},c;
14
c = a;
结构体变量之间进行赋值时,系统将按成员一一对应赋值。 结构体变量之间进行赋值时,系统将按成员一一对应赋值。
2011-1-14
9.1.2 结构体变量的定义和初始化
3. 结构体变量的运算 对结构体变量进行取址运算 对结构体变量进行取址运算
struct date { int year, month, day;}; day; struct student { char num[8], name[20], sex; num[8 name[20], sex; struct date birthday; birthday; float score; score; }a; }a;
13
2011-1-14
9.1.2 结构体变量的定义和初始化
3. 结构体变量的运算 同类型结构体变量之间的赋值运算 同类型结构体变量之间的赋值运算
struct date { int year, month, day;}; day; struct student { char num[8], name[20], sex; num[8 name[20], sex; struct date birthday; birthday; float score; score; }a={"9606011","Li ming",'M',{1977,12, },83},b,c; }a={"9606011","Li ming",'M',{1977,12,9},83},b,c;
struct date { int year, month, day;}; day; struct student { char num[8], name[20], sex; num[8 name[20], sex; struct date birthday; birthday; float score; score; }a; }a; 进行何种运算,由该成员 进行何种运算, 的数据类型决定
15
对结构体变量a 对结构体变量 a进行 &a 运算 , 可以得到 a 的 运算,可以得到a 首地址,它是结构体类型指针。 首地址,它是结构体类型指针。
2011-1-14
9.1.2 结构体变量的定义和初始化
4. 结构体变量成员的引用
“.”是分量运 算符, 算符,运算级 别最高。 别最高。
16
结构体变量成员引用的一般形式: 结构体变量成员引用的一般形式: 结构体变量名. 结构体变量名.成员名 结构体变量的各个成员可
元素的个数可以省略, 元素的个数可以省略,根据赋初值时 结构体常量的个数确定数组元素的个数
12
2011-1-14
9.1.2 结构体变量的定义和初始化
3. 结构体变量的运算 用sizeof运算符计算结构体变量所占内存空间 sizeof运算符计算结构体变量所占内存空间 struct date { int year, month, day;}; day; struct student { char num[8], name[20], sex; num[8 name[20], sex; struct date birthday; birthday; float score; score; }a; sizeof(a) 的结果为8+20+1+6+4=39 }a; sizeof(a 的结果为8 20+ sizeof(struct student) 的结果为39 sizeof(struct student) 的结果为39
2011-1-14
9.1 结构体
结构体类型与变量的说明 struct与变量是不同的概念。 类型与变量是不同的概念 类型 date 是不同的概念。 8个字节 { int year,month,day;}; num 应先定义一个结构体类型 而后再定义结构体变量 结构体类型, 结构体变量。 应先定义一个结构体类型,而后再定义结构体变量。 30个字节 struct student不分配空间,仅对变量分配空间。 个字节 系统对类型 类型不分配空间 name 变量分配空间 30 系统对类型不分配空间,仅对变量分配空间。 { char num[8]; 、存取或运算,而不能对一个个字节 只能对变量赋值、 变量赋值 只能对变量赋值 存取或运算,而不能对一个类型 sex 1 类型 赋值、存取或运算。 赋值、存取或运算 char name[30]; 。 year 2个字节 char sex; 成员也可以是结构体变量。 也可以是结构体变量 成员也可以是结构体变量。 birthday month 2个字节 struct date birthday; /* 成员为结构体类型 */ 对结构中的成员 可以单独使用, 成员, 对结构中的成员,可以单独使用,它的作用与 day 2个字节 char addr[60]; 普通变量。 地位相当于普通变量 地位相当于普通变量。 addr 60个字节 60个字节 int score[6]; 成员名可与程序中的变量名相同时 也可与不 可与程序中的变量名相同时, 成员名可与程序中的变量名相同时,也可与不 }; score 12个字节 12个字节 同结构体类型的成员名相同, 同结构体类型的成员名相同,二者代表不同的 对象。 对象。
2011-1-14
9.1 结构体
9.1.1 结构体与结构体类型的定义 例如学生类型的定义: 例如学生类型的定义: 学生类型的定义 struct student { char num[8]; /* 学号是字符数组类型 */ 学号是字符数组类型 字符数组 char name[30]; /* 姓名是字符数组类型 */ 姓名是字符数组 字符数组类型 char sex; /* 性别是字符型 */ 性别是字符型 int age; /* 年龄是整型 */ 年龄是整型 char addr[60]; /* 住址是字符数组类型 */ 住址是字符数组 字符数组类型 int score[6]; /* 成绩是整型数组类型 */ 成绩是整型数组类型 整型数组 };
4
结构体名是用户定义 类型标识。 的类型标识。 { } 中是组成该结构体 的成员。成员的数据 类型可以是 可以是C语言所允 类型可以是 语言所允 许的任何数据类型。 许的任何数据类型。
2011-1-14
9.1 结构体
9.1.1 结构体与结构体类型的定义
5
例如图书类型的定义: 例如图书类型的定义: 图书类型的定义 struct bookcard { char num[10]; /*图书分类编号是字符数组类型 图书分类编号是字符数组类型 图书分类编号是字符数组类型*/ char name[30]; /*书名是字符数组类型*/ /*书名是字符数组类型 书名是字符数组类型*/ char author[30]; /*作者是字符数组类型 作者是字符数组类型*/ 作者是字符数组类型 char publisher[60]; /*出版社是字符数组类型 出版社是字符数组类型*/ 出版社是字符数组类型 float price; /*价格是单精度实型 价格是单精度实型*/ 价格是单精度实型 int n; /*库存量是整型 库存量是整型*/ 库存量是整型 };
9
2011-1-14
9.1.2 结构体变量的定义和初始化
1. 结构体类型变量的定义 直接定义结构体类型变量 struct
{ 成员定义表; 成员定义表; }变量名表; 变量名表;
10
例如:struct 例如: { char num[8],name[20],sex; num[8],name[20],sex; int age; age; float score; score; }st[30], a, b, c; st[30]
8
2011-1-14
9.1.2 结构体变量的定义和初始化
1. 结构体类型变量的定义 在定义结构体类型的同时定义变量 struct 结构体名 { 成员定义表; 成员定义表; }变量名表; 变量名表; 例如: 例如:struct student { char num[8],name[20],sex; num[8],name[20],sex; int age; age; float score; score; }st[30]; st[30]
相关文档
最新文档