资源预览内容
第1页 / 共72页
第2页 / 共72页
第3页 / 共72页
第4页 / 共72页
第5页 / 共72页
第6页 / 共72页
第7页 / 共72页
第8页 / 共72页
第9页 / 共72页
第10页 / 共72页
亲,该文档总共72页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
(完整版)C 语言程序设计教案(清华谭浩强)第一章第一章语言及程序设计概述本章要求:了解 C 语言的特点、C 语言与其它高级语言相比有什么异同;了解 C 程序在 PC 机上的建立、编译和运行过程;了解 C 语言程序设计思想的基本篇;重点重点: :C 语言的主要特点;C 语言在 PC 机上的运行过程及上机操作过程;常用算法的应用难点:难点:无一、一、C C 语言概述语言概述 C C 语言语言是目前国际上在各种计算机运行较为广泛流行的一种高级语言.主要表现为:C 语言:适合于作为系统描述语言-可用来写系统软件。具有高级语言的特点,又有低级语言(汇编语言)的特点。 C 语言:是 ATT 贝尔实验室的 Dennis Ritchie 在 1972 年发明的。 C 语言:是在 B 语言的基础上发展起来的.(ALGOL 60) C 语言:最早开始是用于 UNIX 操作系统。 (C 语言和 UNIX 是相辅相成的) DBASE 、Microsoft Exel 、 Microsoft Word、PCDOS 等,则是用 C 语言加上若干汇编子程序编写的。 1983 年:制定的新标准,称为(美国国家标准化协会)ANSI C 1987 年:-Turbo C1.0 (Borland) 1988 年:TC 1.5(图形和文本窗口) 1989 年:Turbo C2。0 (DOS 操作系统、查错、Tiny 模式生成 com 文件) 1991 年:-Turbo C+(3.0) 支持 windows 3.X说明:Turbo C 语言可以在程序的任何地方嵌入汇编代码,提高速度,可以直接使用存储器和寄存器。二二C C 语言的特点语言的特点1 1语言简洁、紧凑、使用方便、灵活 C 语言:共有 32 个关键字,9 种控制语句;程序书写自由,主要用小写字母表示;2 2运算符丰富 C 语言的运算符包含的范围很广泛,共有 34 种运算符;即:把括号、赋值、强制类型转换都作为运算符处理3 3有丰富的数据类型整型、实型、字符型、数据类型、指针类型、结构体类型、共用体(联合)类型等。实现复杂的数据结构(链表、树、栈、图)的运算。4 4具有结构化的功能,用函数作为程序模块,实现程序的模块化5 5语法限制不太严格,程序设计自由度大.(放宽了语法检查)例:1)对数组下标越界不作检查,由程序编写者自己保证程序的正确; 2)整型数据、字符型数据、逻辑型数据可以通用。6 6能直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬1(完整版)C 语言程序设计教案(清华谭浩强)件进行操作。7 7生成目标代码质量高,程序执行效率高。8 8用 C 语言编写的程序,移植性较好。说明: C 语言比其它高级语言难掌握,对编程人员要求较高程序员使用 C 语言编写程序会感到限制少、灵活性大,功能强,可以编写出任何类型的程序.三三C C 程序的构成程序的构成例: main( ) /主函数/ int a,b,sum; /定义变量*/ a=123;b=456; sum=a+b; printf(“sum is dn,sum); /输出变量/说明: 1)程序一般用小写字母书写; 2)每个程序必须要有一个 main ( ) (只能一个) ,称主函数;注:C 程序是由函数构成的,函数是 C 程序的基本单位。函数:系统提供的库函数;用户设计的函数。 3)程序体必须在 之间; 4)每个语句的结尾,必须要有“; ”作为终止符。 5)用/*。. */ 作注释2(完整版)C 语言程序设计教案(清华谭浩强)四、四、C C 程序的上机过程程序的上机过程1 1演示书:P5 程序2上机步骤书:P7注:C 语言是一种编译语言,编译语言的特点:编源 程序目标程序*.OBJ连执 行 程序 C 编译程序 Link 程序 3DOS 下 C 语言的运行目前 DOS 下运行 C 语言软件为:Turbo C 2.0 (1) Turbo C 2.0的特点:是一个把 编辑 编译 连接 运行 等全部操作集中在一个界面上。 (2) Turbo C 2.0 的操作及运行书:P8五、算法的概念五、算法的概念 1算法的概念书:P13算法:程序的操作步骤。程序中的数据在程序设计中:操作步骤有: 程序 = 数据结构 + 算法沃思 Nikiklaus Wirth程序=算法+数据结构+程序设计方法+语言工具和环境2 计算机算法分为两大类:计算机算法分为两大类: 数值运算算法数值运算算法非数值运算算法非数值运算算法(1)数值运算算法:求数值解;通过运算得出一个具体值,如求方程的根等注:数值运算一般有现成的模型,算法较成熟。(2)非数值运算算法:用于事务管理,如图书检索、人事管理等。 3、常用简单算法(1)累乘即:12345100 12 S(结果) S3 S(结果) S4 S(结果) S100 S(结果)(2)累加即:1+2+3+4+5+100 1+2 S(结果) S+3 S(结果) S+4 S(结果) S+100 S(结果) (3)找最大值 5,2,4,12,93(完整版)C 语言程序设计教案(清华谭浩强) 5 max(max 放最大值,后面的数都和它比较) 2 max不成立 4 max不成立 12 max成立:12 max 9 max不成立注:该算法可扩展为在一批数据中,找某一个数 (4)其它算法 P15 例 2。2例 2。3例 2。4例 2。5课余自学(必须) 4、算法的表示常用的有:自然语言传统流程图结构化流程图伪代码PAD 图(1)传统流程图起止框输入输出框判断框处理框流程线连接点表示方法:P19 例注:注:传统流程图对流程线的使用没有严格限制,难以实现结构化程序设计为了限制流程线的滥用,提出三种基本结构:顺序结构选择结构循环结构顺序结构顺序结构选择结构选择结构 f t。 f语句表达式表达式 t语句语句语 句 1语 句 24(完整版)C 语言程序设计教案(清华谭浩强)循环结构循环结构表达式语句语句表达式a) “当型当型”结构 b) “直到型直到型结构(2)NS 流程图特点:去掉了带箭头的流程线,全部算法写在一个矩形框内.称 N-S 结构化流程图 P A成立不成立当 P1 成立A B A B A直到 P1 成立顺序结构选择结构循环结构作业:作业:p37 2p37 2。4 4上机上机: :熟悉熟悉Turbo C 2。0 的操作及运行5(完整版)C 语言程序设计教案(清华谭浩强)第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式本章要求:本章是 C 语言的基本概念开篇,所介绍的概念是学习 C 语言的基础;要求熟练掌握数据类型、运算符与表达式。重点:重点:C 语言数据类型定义的方法和分类。C 语言运算符、表达式的使用以及它们的主要特点。难点:难点:自增、自减运算符、赋值运算符、逗号运算符及它们的混合使用一数据类型一数据类型概念:算法处理的对象-是数据,而数据是以某种特定的形式出现。在 C 语言中,数据有:常量、变量;一般它们都有一定的数据类型。 (C 语言的数据结构是以数据类型形式出现的)1数据类型分类:整型 int基本类型基本类型字符型单精度型 float实型(浮点型)枚举类型双精度型 double数据类型数据类型数组类型构造类型构造类型结构体类型 struct共用体(联合)类型 union指针类型指针类型空类型空类型 void void说明:在程序中对用到的所有数据都必须指定其数据类型说明:在程序中对用到的所有数据都必须指定其数据类型. . 2C 语言中的常量和变量常量常量:在程序运行过程中,其值不能被改变的量。变量变量:在程序运行过程中,其值可以改变的量。说明:1)常量和变量,都要有一个名字表示它;习惯上,符号常量(别名)名用大写,变量用小写。符号常量的定义为: #define P 30其它常量:直接用数据表示例: 23 45。5 e 3e+2 2)在 C 语言中,对变量要先定义,后使用。 3)如果一个变量被指定为一确定类型后,在 C 语言编译时,就能为其分配相应的存储单元. a变量名存储地址)2000 3变量值存储单元地址的概念 3常用的基本数据类型(1)整型6(完整版)C 语言程序设计教案(清华谭浩强) 1)整型常量:十进制整数 123,11,0非 0 开头八进制整型 0123,011 0 开头十六进制整型 0x11 0x20 0x0D 0XFF 0x4e 0x/0X 开头说明:在一个整常量后面加一个字母:l 或 L,是长整型常量。22L 0733L 0xae4l 2)整型变量:定义存储字节数的范围基本型 int x(2 字节) -3276832767短整型 short int x(2 字节)3276832767长整型 long int x(4 字节) -2,147,483,6482,147,483,647无符号型 unsigned int x (2 字节) 065535 unsigned short x(2 字节) 065535 unsigned long x (4 字节) 04,294,967,295注:注: 数据在内存中是以:二进制形式存放如:9为 00001001例: x=13; x=015 ; x=0xD存储结构 见 P44 图 3。5注:数据超过数据范围,会发生数据溢出注:数据超过数据范围,会发生数据溢出例例 3 3。2 2、3.33.3 (2)实型(浮点数) 1)实型常量:十进制整数 1.23。0123指数形式 1。23e3,1。00e3 2)实型变量:数的表示范围 P46 表 3.2单精度 float x(4 字节)3.4x10-383。4x1038 TC 默认双精度 double x(8 字节)1.7x10-3081.7x10308说明:实型常量实型常量不分 float 和 double,只有十进制表达方式有的 C 编译系统 64 位存储方式,如尾加 f 或 F 可表示 32 位:324。567f例:x=1。23; x=123e3 P47 例 3。4(存储精度) (3)字符型 1)字符常量: a) 用单引号括起来的一个字符a A b) 转义字符(由“专用字母” )书 P48 表 3。3 例 3.5 0 字符串结束符 n 换行 t 水平制表 ddd 八进制数 xdd 十六进制数 2)字符变量: char c(1 字节)说明: 一个字符变量, 只能放一个字符常量。 实际是把该常量的 ASCII 值, 送入字符变量中。即: B(66) c (字符变量)书 P374ASCII 表 p50 例 3.6-7 c=B c 的内容为 66故:字符数据可以进行算术运算;即:c=B+2为 68字符数据在内存中的存储方式书 P50 unsigned char 0255 char -128-127 有符号数在 TC 中是用补码表示的 127(0x7f) 0111 1111 128(0x80) 1000 0000复习:补码的规定:复习:补码的规定:正数:其原码、反码、补码相同负数:最高位为 1,其余各位为原码的反码(原码的相应位取反),然后对整个数加 1。7(完整版)C 语言程序设计教案(清华谭浩强) 140(0x8c) 1000 11001111 0011 + 1(取反加 1)1111 01000x74 -0x74 1000 1011 + 1(取反加 1) 1000 1100 0x8c (0x80 为负数74 高位为 1) 3)字符串常量用双引号括起来的字符“a” ,“ABFD” “a =“a0” A说明:说明:C 规定,在每一个字符串的结尾应加一个“字符串结束标志” (0),以便系统判断字符串是否结束. 4各类数值间的混合运算 1)整型、字符型、单精度型、双精度型数据-可以混合运算 2)字符型、整型可以通用规则:高 double float long unsigned低 int char,short例如 10+a+1。58765。1234*b -858873.593200(TC 默认 6 位小数) 10+97+1 10+97+1。5-8765.1234*985-8765.1234*98二运算符和表达式二运算符和表达式 C 表达式:由变量、常量、函数等运算对象和运算符组成的式子 C 运算符作用: 1)能把一些基本运算模块用单一的运算符处理 2)使用丰富的运算符,构成多种表达式 C 运算符有优先级,优先级高的先执行,同级的由结合规则决定其处理规则 C 运算符有两种结合规则: 1)从左到右的结合运算顺序;即:a=5+x10;运算对象与左边运算符结合 2)从右到左的结合运算顺序;即:x=y=7;运算对象与右边运算符结合 C 运算符分类书 P551基本运算符(算术运算符) C 语言有 7 个基本运算符1)单目运算符:(表示符号) 正号“+”负号“”2)双目运算符:+、 、*、/、%(模运算,求余运算,两侧为整数)说明: a)运算顺序的结合方向从左到右 b)求余(取模)运算符是对两个整数相除的余数,计算结果的符号与第一个数的符号相同。即:-5%3值为-2、 -5%3值为2、 5%3值为 2 2自增、自减运算符(优先级高于算术,右结合)作用:作用:使变量的值增 1 或减 1 +i(i)在使用 i 之前,先使 i 的值加 1(减 1),然后再使用 i. i+(i)-先使用 i 的值,然后再使 i 加 1(减 1) 。例:i =4; j=+i; i 值为 5,值为 5; j=i+; i 值为 5,j 值为 4说明:1)自增、自减运算符+(-),只能用于变量,不能用于常量或表达式即:5+、(a+b)+ 不合法 2)运算顺序的结合方向从右到左8(完整版)C 语言程序设计教案(清华谭浩强)例例: main() int i=3 z,x,y; z=(i+)+(i+)+(i+)x=y=3;/结果:z z 值为值为 9 i9 i 值为值为 6 6z=x+y;/变量 x 右结合运算符+(不是 3+4+5=12) printf(z=d,x=%d,y=d,z,x,y);输出结果:z=6 x=4 y=3如果:z= -x+y;输出结果:z=0 x=4 y=3 x 先为-4,然后+y,最后 x+ 3赋值运算符和赋值表达式(优先级低于算术,右结合)(1) “=” 赋值运算符作用:将一个数据赋给一个变量 即:x=21注意注意: 如果赋值运算符两侧的类型不一致,在赋值时,要进行类型转换要进行类型转换。P61 例 3。9即:float f ; f=23 f 值为 23.0000符号位扩展(2)复合的赋值运算符“+=、-=、*=、/=、=” - 在赋值符“=”之前加上其它运算符称复合运算符(也称为自反运算符)例:a+=3等价于 a=a+3 x=y+8等价于 x=x*(y+8) y/=4等价于 y=y/4 m=3等价于 m=m3说明: C 语言采用这种复合运算符:为了简化程序,使程序精练;提高编译效率。(3)赋值表达式格式:变量=表达式表达式:可以是 1)常量、变量、算术表达式; 2)赋值表达式即:a=(b=5)或 a=b=5(运算顺序的结合方向从右到左)例: a=b=c=6 ; a=5+(c=6)(结果 a=11 c=6)如果: a=3;求:a+=a-=a*a; 有:1 aa; 9 2)a= a-(aa) ; -6 3) a+=-6 -6+-6 a 为:-12结果值为:-12 4逗号运算符和逗号表达式(优先级最低,左结合)用“, ”将两个表达式连接起来。格式格式:表达式 1,表达式 2即: 3+5,69;例: 3+5,69;值为 54 (先求解表达式 1,再求解表达式 2,最后逗号表达式的值为表达式 2 的值) a=25,a*3; a 值为 10结果值为:30(先求:a=2*5,后求:a*3) x=(a=2*5,a*3),a+4 a 值为 10 x 值为 30结果值为:149(完整版)C 语言程序设计教案(清华谭浩强)说明:使用逗号表达式的目的,只是为了得到各个表达式的值(常用于循环语句)解表达式 1 的结果可能影响解表达式 2 的值 5强制类型转换运算符(优先级高于算术,右结合)在要转换的数据前在要转换的数据前,用小括号括上要转换的数据类型即: (int)x;(int) (a+b) (int)x+y格式: (类型名)表达式 C 一般会自动进行数据类型转换 P56 例 3。8,用于不能自动转换的地方 x%3(float f) 6关系运算符和关系表达式(书 P87) (优先级低于算术,左结合,高于赋值) (1)6 种关系运算符 =(优先级高) = =!= (优先级低) (2)关系表达式表达式 关系运算符 表达式即:ab a+b=b+c (a=4)(b=8) x= = y说明:关系表达式值:关系表达式值:是一个逻辑值,即: “真”或“假” C 语言:1 - 代表“真” 0 代表“假” 7逻辑运算符和逻辑表达式(书 P88) (优先级低于关系,左结合)(1)3 种逻辑运算符 p89 表 5.1 & (与) | | (或) ! (非)(2)逻辑表达式表达式 逻辑运算符 表达式 p89即: (ab) | (a+b=b+c) (a=4)(b=8) 1 | (1)x& y 值为 1 1说明:说明:逻辑表达式值:逻辑表达式值:是一个逻辑值,即: “真或“假 p90优先次序(由高到低) :! (非)算术运算符关系运算符&和 |赋值运算符求值短路:53&2|84-!0 1| (结果 1) 0&(结果 0)如:a&b&c ab ) ? a : b;说明:a)条件运算符要求有三个操作对象(称三目元运算符) b)条件运算符优先于赋值运算符 y= ( ab ) ? a : b;先求( ab ) ? a : b后赋值 c)条件运算符的结合方向为“自右至左” ( ab ) ? a : b可写为: ab ? a : b ab ? a : b+5相当于: ab ? a :(b+5) ab? a : c d ? c : d相当于: ab ? a : ( c d ? c : d )* 9位运算符 (书 P298) (一般掌握)10(完整版)C 语言程序设计教案(清华谭浩强)位运算:- 是对字节或字中的实际位进行检测、设置、屏蔽、移位.位运算符: 位逻辑与 位逻辑或 - 位逻辑异或 - 位逻辑反 右移 左移三、运算符小结运算符小结1左结合方向的运算符主要有:算术运算符、关系运算符、逻辑运算符、逗号运算符2右结合方向的运算符主要有:自增、自减运算符、赋值运算符(复合的赋值运算符) 、条件运算符例:1) i=3; printf(d,%d”,i,i+);输出:4, 3 2) a=1;b=1;c=2; 求:a=b + = c* = 5;输出:a 为 11 b 为 11 c 为 103) ab ? a c?a:c:bc ? b:c相当于:ab ? (a c?a:c):(bc ? b:c)(求最大值(求最大值, ,如如 a=2a=2, b=8, c=5 b=8, c=5结果为结果为:8):8)3运算符的优先次序(书 P375附录)()、 !+/转移、算术、关系(=)、关系(= = !=) 、&、|、条件(?)、赋值、逗号例:1) a+相当于(a+) 2) x=4,y=7求:y+=+x-3 x 的值 5 y 的值 9 3) x=4,y=7求:y=y+x-3 x 的值 4 y 的值 9 4) a=7,x=2。5,y=4。7求:s=x+a%3(int) (x+y)*2/4 s 的值 2。500000 a%3*(int)(x+y)2 = 1(整型) / 4 (整型) = 0.25 =0(整型) 5) a%3 & a5 | a+b如:a=7, b=5 a 的值 8 b 的值 6结果值 1 1|1如:a=15, b=15 a 的值 16 b 的值 16结果值 0 1|0如:a=15, b=14 a 的值 16 b 的值 15结果值 0 0|0如:a=15, b=13 a 的值 16 b 的值 14结果值 1 0|1四、该章的主要例题四、该章的主要例题数: P39 例 3。1 P44 例 3。2 P44 例 3。3字符: P49 例 3。5 P50 例 3.6 P51 例 3.7五、该章的主要习题五、该章的主要习题P65 3.5 3.6 3。8 3.9 3.10 3。12六、该章的主要上机内容六、该章的主要上机内容 P39 例 3。1 P44 例 3。2 P44 例 3。3 P51 例 3。7 P65 3.6 3。8 3。1011(完整版)C 语言程序设计教案(清华谭浩强)第四章第四章 简单的简单的 C C 程序设计(顺序程序设计程序设计(顺序程序设计) )知识点:知识点:1、赋值语句; 2、字符数据的输入/输出;3、格式输入/输出语句 printf 和 scanf 及其格式控制符;c、f、%d(输出宽度、对齐方式、其它格式控制符只作了解)4、程序的结构框架。重点:重点:1 1赋值语句;2基本输入/输出语句 printf 和 scanf 及其格式控制符%c、f、d 等的意义.难点:难点:无一、C C 程序结构程序结构 C 程序源程序文件 1源程序文件 2源程序文件 n预编译命令函数 1函数 n说明部分执行部分 (语句)语句的分类语句的分类 P67 P68P67 P681、控制语句条件:if else循环:for()循环:while()循环:do while()循环结束:continue终止循环或 switch:break多分支:switch转向:goto函数返回:return2、函数调用语句 printf(“a=%d,a);3、表达式语句 i=i+1表达式 i=I+1;表达式语句函数调用也可以认为是表达式语句4、空语句:一个“;”5、复合语句(用 :分程序)12(完整版)C 语言程序设计教案(清华谭浩强) x=3 x=3; x=x+1; x=x+1; print print(“(“x=x=x”,x”,x x)二赋值语句二赋值语句变量名=表达式注:是组成顺序结构的主要语句。 a=b; if ( max= x ) max =x ;三基本输入三基本输入/ /输出语句输出语句C 语言本身不提供输入输出语句,输入输出操作是由函数来实现。即:printf putchar scanf getchar注: (1)这些函数构成一个标准的 I/O 函数库(放在“stdio。h”中)(2)如果要使用 C 语言库函数,要用预编译命令“include”将有关“头文件”包括到用户源文件中。 #include stdio。h #include “stdio。h”当前目录当前定义的目录中寻找 1printf 函数 格式输出函数格式:printf(格式控制,输出表列)格式控制: 用双引号括起来的字符串,也称为“转换控制字符串” printf 的格式字符书 P77 表 41输出表列: 需要输出的数据、表达式即:printf( “x=%5.1f, y=%d, z=%c” , x, y, z ) d,i带符号十进制形式 u无符号十进制形式例 33 c字符形式 s字符串形式 f实数(小数)形式默认 6 位小数说明:1)printf( “ y=-4d” , y ) 输出数据左对齐(默认为右对齐) 2)数据输出长度的修正; l 输出长整型或双精度数据即:printf( “ld, %lf ” , i, y ) h 输出短型数据即:printf( “%hu ” , a )m。n m 最小宽度 n 小数(实数)左对齐2putchar 函数 字符输出函数向终端输出一个字符格式:putchar(变量) putchar(x) putchar( “n )输出一个换行符 3scanf 函数 - 格式输入函数格式:scanf(格式控制,地址表列)格式控制: 用双引号括起来的字符串,也称为“转换控制字符串” scanf 的格式字符书 P80 表 43地址表列: 由若干个地址组成的表列,有:变量地址x字符串的首地址13(完整版)C 语言程序设计教案(清华谭浩强) 地址运算符功能:求变量的地址(只能用于变量)x 表示 x 变量值的内存单元的地址即:scanf( “d, 4d”, &a, b )说明:1)不带分隔字符的方式,系统将自动按格式说明截取数据例: scanf( “ 4d3df , &I , p );输入:12345678.93 时得 I=1234 , p=8.93“作用是“虚读” ,跳过相应的数据 2)带分隔字符的方式(分隔字符:空格、tab、回车、逗号)即:scanf( “%d, %d”, a, b ) 4getchar 函数 字符输入函数从终端输入一个字符格式:getchar ( )即:c=getchar ( )函数值是从输入设备得到的字符四、该章的主要例题四、该章的主要例题1 已知矩形的两边长,求矩形的面积、周长2 大小写字母互相转化3 教材 P83 的例子五、该章的主要习题五、该章的主要习题P84 4。54.914(完整版)C 语言程序设计教案(清华谭浩强)第五章第五章选择结构程序设计选择结构程序设计知识点:知识点:1、关系、逻辑运算符、逻辑真/假;2、关系表达式、逻辑表达式;3、分支的概念及其算法描述;4、三种 IF 分支语句;5、条件运算符;6、SWITCH 语句。(了解)重点重点: :1、关系、逻辑运算符、逻辑真/假;2、关系表达式、逻辑表达式;3、三种 IF 分支语句.难点:难点:1、逻辑真/假;2、关系、逻辑运算优先级.一、关系表达式及逻辑表达式在分支选择结构的作用一、关系表达式及逻辑表达式在分支选择结构的作用在程序设计中,表示一些复杂的条件1 1、关系运算符及关系表达式(第三章)、关系运算符及关系表达式(第三章)2 2、逻辑运算符及逻辑表达式(第三章)、逻辑运算符及逻辑表达式(第三章)3 3、条件运算符、条件运算符( (第三章)第三章)二分支语句二分支语句(书 P91)从一个条件表达式中,选择语句的执行(用 if 语句或 switch 语句来实现) f。 t。 f表达式表达式 t语句语句 1语 句 21If 语句(1)C 语言提供三种形式的 if 语句 1)if(表达式表达式)语句语句例: if(xy ) printf ( “d” , x );注意“;”位置 2) if (表达式表达式)语句语句1 1 else语句语句2 2例: if (xy ) printf ( “%d” , x ); elseprintf ( “%d” , y );注意分号“;” 3) if (表达式表达式 1 1)语句语句1 115(完整版)C 语言程序设计教案(清华谭浩强) else if(表达式表达式 2 2)语句语句2 2 else if (表达式表达式 3 3)语句语句3 3 else if (表达式表达式 n n)语句语句n n else语句语句n+1n+1例:p92 图 5。6(2)if ()和 else 后的执行语句可以使用复合语句 例 5.1、5.2 p93 if 结构将输入的三个数从大到小排列输出例 5.3 p95 if 嵌套结构计算函数值(3)用条件运算符代替 if 语句例: if( ab ) y=a;条件运算符 else可以用: y= ( ab ) ? a : b; y=b;例 5.4 p98条件运算符代替 if 结构将输入字符中的大写转换成小写输出 2switch 语句(了解) switch 语句是多分支选择语句表达式语句 1语句 2语句 3语句 4格式: switch (表达式)表达式=常量表达式 n 执行语句 n case常量表达式 1 :语句 1; break; case常量表达式 2 :语句 2; break; case常量表达式 3 :语句 3; break; case常量表达式 n :语句 n; break; default :语句 n+1;例:四级(ABCD)转化成百分制 #include stdio。h main() char grade;scanf(”c”,grade); switch(grade) case A:printf(”85100n);break;16(完整版)C 语言程序设计教案(清华谭浩强) case B:printf(”7584n);break;case C:printf(”6074n”);break;case D:printf(”60n”);break; default:printf(”errorn”); 例:百分制成绩转化成五级(ABCDE)五级记分 54-1三、程序举例三、程序举例例 5.7 p103运费计算(自学)p101例 5。6求一元二次方程根(自学)p100例 5。5判断某一年是否是闰年(自学)五、该章的主要习题五、该章的主要习题P104 5。35.10该章的主要上机内容该章的主要上机内容P91例 5。2、P100 例 5。5,P101 例 5.6P104习题习题 5。5、5.6、5。9其他:上机实验指导书中内容17(完整版)C 语言程序设计教案(清华谭浩强)第六章第六章循环结构程序设计循环结构程序设计知识点知识点: :1、循环的概念及其算法描述; 2、goto 循环;3、while 循环;重点重点4、dowhile 循环;重点重点6、for 循环;重点重点 难点难点7、break、continue 语句;8、各种循环结构中的执行循环体、判断循环条件的顺序;重点重点9、各种循环结构在一定条件下的转化。重点重点难点难点一、循环结构的概念一、循环结构的概念循环语句主要用于:重复执行的操作1C 语言在实现循环过程-可使用以下语句: a) 用 goto 语句和 if 语句构成循环 b) 用 while 语句 c) 用 dowhile 语句 d) 用 for 语句2循环可分为二种类型结构: a) “当型当型结构 b) “直到型直到型”结构语句语句二循环语句二循环语句 1用用 gotogoto 语句和语句和 ifif 语句构成的循环语句构成的循环(1)goto 语句无条件转向语句格式:goto语句标号语句标号:用标识符表示例:goto next;如: goto 123 ;(不合法)(2)goto 和 if 语句构成循环一般较少使用(不符合结构化原则)50例:求2n main( )i int i , sum=0 ; i=1 ; loop: if ( i=50 ) sum=sum+2*i ; i+ ; goto loop ; 18(完整版)C 语言程序设计教案(清华谭浩强) printf ( “%dn , sum ) ; 2while 语句 -实现“当型当型循环结构格式:while ( 表达式 )语句例:求2n main( )i50 int i , sum=0 ; i=1 ; while (i=50 )说明说明: : sum=sum+2 sum=sum+2i i ; i+ i+ ; printf ( “dn” , sum ) ;语句可为复合语句(用构成) 3dowhile 语句-实现“直到型”循环结构格式: do语句语句 while (表达式表达式) ;例:求2n main( )i50 int i , sum=0 ; i=1 ; do sum=sum+2*i ; i+ ; while(i=50 ) ; printf ( “dn” , sum ) ; do while 和 while 比较 p109例 6.44for 语句可以用于循环次数已知循环次数已知和循环次数不确定循环次数不确定 (可以代替 while 语句)(应用广泛,而且使用较活)格式:for (表达式表达式1 1 ; ;表达式表达式2 ;2 ; 表达式表达式3 3 )语句过程:表达式 1 F表达式 2 T说明:语句表达式 1-循环变量赋初值表达式 2-循环结束条件表达式 3表达式 3循环变量增值19(完整版)C 语言程序设计教案(清华谭浩强)即:for (循环变量赋初值 , 循环结束条件 , 循环变量增值 )语句例:求2n for( i=1 ; i=50 ; i+ ) sum=sum+2i;i50forfor 语句的其它表示语句的其它表示 (1)用用whilewhile 来表示来表示表达式 1 while ( 表达式 2 ) 语句表达式 3;(2) 表达式可以省略,但分号不能省略 a) 省略表达式 1 i=1 for ( ;i=50 ;i+ ) sum=sum+2*i b) 省略表达式 2产生死循环 for ( i=1; ;i+ ) sum=sum+2*i c) 省略表达式 3 for ( i=1;i=50 ;) sum=sum+2*i; i+; d) 省略表达式 1 , 省略表达式 3 i=1 i=1 for ( ;i=50 ;) while ( i=50 ) sum=sum+2i;相当于 sum=sum+2i; i+; i+; (3) 表达式 1,表达式 3 可以是: a) 简单的表达式 b)逗号表达式表达式 2:一般是关系表达式或逻辑表达式即: for ( sum=0 , i=1 ; i=50 ; i+,i+ ) sum=sum+2i;或: for ( sum=0 , i=1 ; i=50 ; i=i+2 ) sum=sum+2*i(4) 循环体语句可使用 breakbreak 和 continuecontinue 语句breakbreak:可以用来从循环体内跳出循环体(提前结束循环) continue continue:用于跳过循环体中下面尚未执行的语句,接着重新执行循环的判断 .p115例 6。5 将 100-200 间不能被 3 整除的数输出三、程序举例、程序举例用多种循环方法实现1 由泰勒展式计算 sin(x)的近似值2 。p115例 6。6求的近似值 1-1/3+1/5-1/7+3。p115例 6。7 求 Fibonacci(斐波纳契)数列 40 个数 F1=1 (n=1) F2=1 (n=2) Fn=Fn1+Fn-2 (n=3)4。p115例 6。8 判断 m 是否是素数5.p115例 6.9 求 100200 间的所有素数20(完整版)C 语言程序设计教案(清华谭浩强)6.例 求任意输入 10 个数中的最大数 6-max四、该章的主要习题四、该章的主要习题P120 6.16.15五、该章的主要上机内容五、该章的主要上机内容P115例 6.5、例 6。6、例 6.7、例 6.9P120习题习题 6。4、6.7、6。9、6。11、6。14其他:上机实验指导书中内容作业解答:5-8 利润提成:类似所得税21(完整版)C 语言程序设计教案(清华谭浩强)第七章第七章 数组数组 1、数组的概念及数组的定义; 2、在程序设计中的如何使用数组; 3、字符数组是 C 语言存放字符串的主要方法,并注意字符串结束标志的规定。重点:重点:数组的组成和特点.一维数组和二维的定义、赋值。字符串与字符数组的关系以及数组在程序中的使用。难点难点: :数组元素存储格式对程序设计的使用.字符串在数组中的组成以及字符串操作语句的使用。基本类型数组类型 C 语言:数据类型构造类型结构体类型共用体类型指针类型构造类型:是由基本类型按一定规则组成的类型一数组的概念一数组的概念数组:- 1)是一组有序数据有序数据的集合 2)这个集合用一个数组名数组名来表示 3)数组的元素序号用一个下标值下标值来表示如:a0 , a1 , a2 , a3 b11 , b12 , b21 , b22注意:注意:a)数组名后,用方括号;下标从 0 开始。 b)下标值下标值可以是常量表达式常量表达式常量表达式:包括常量和符号常量(用#define 定义的),但不能包含变量。 C 语言:不允许数组进行动态定义。即: int n ; scarf(“%d”,&n); int xn; /定义数组 / c)数组分为:一维、二维等,主要由下标值的多少来确定.二一维数组二一维数组 1定义格式:类型说明符数组名常量表达式类型说明符:表示数组的类型 int , short , long , unsigned , float , double , char 等数组名:表示各数组元素的统一名字,定义方法和变量名相同22(完整版)C 语言程序设计教案(清华谭浩强)常量表达式:表示数组的长度即:int a10注意:C C 语言不提供数组下标越界的保护,设计时要注意。语言不提供数组下标越界的保护,设计时要注意。 2数组元素的初始化数组在定义的时候,同时,可对数组元素进行初始化格式: static int a10=0,0,0,0,0,0,0,0,0,0静态定义 a10=0,1,2,3,4,5,6,7,8,9说明: 1)static 数组不赋初值,系统会对所有数组元素自动赋以 0 值。即:int a10=0,0,0,0,0,0,0,0,0,0;等价于:等价于: static int a10 ; 2)对全部数组元素赋初值,可以不指定数组长度。即: static int a =0,1,2,3,4,5;等价于: static int a6=0,1,2,3,4,5 ; 3)可以部分赋初值即: int a5=1,3; 3数组元素的引用 C 语言规定:只能逐个引用数组元素,而不能一次引用整个数组。 4程序举例书 P124例 7。2例 7。3三二维数组和多维数组三二维数组和多维数组 1定义格式:类型说明符数组名常量表达式 常量表达式类型说明符:表示数组的类型 int , short , long , unsigned , float , double , char 等数组名:表示各数组元素的统一名字常量表达式:表示数组的长度即:int a5 6说明: a)每一维的下标从 0 开始,整个数组元素为:56=30 个 b)C 语言中,二维数组中元素排列的顺序是按行存放。即:先存放第一行的元素,再存放第二行的元素 3 4 5存储单元 3 a0 a= 6 7 8对应表:0 4a 1 2 9 5 a01 02 6 a1 70a 8 a11 12 1a2 20 a2 91 a2 c)可以计算数组元素在数组中的序号223(完整版)C 语言程序设计教案(清华谭浩强)假设 mn 的数组 a,计算 aij序号的公式: in+j如:a01 03+1=1(第二个)如 33 a1 2 的序号是: 13+2=5 a22 23+2=8 d)多维数组的定义格式: 类型说明符数组名常量表达式 常量表达式 常量表达式即: 类型说明符数组名长度 1 长度 2 长度 3 int a2 3 4 2二维数组初始化 1)两种基本方法:(a)分行给二维数组赋初值 static int a2 3=1,2,3,5,6,7 (b)所有数据写在一个化括弧内 static int a23=1,2,3,5,6,7 2)可以对部分元素赋初值 static int a2 3=1,3即: 1 0 0 3 0 0 static int a34=1,3,1,0,0,9 即: 1 0 0 0 3 1 0 0 0 0 9 0 3)定义数组时,第一维的长度可以不指定,但第二维的长度要指定(编译系统自动计算). static int a 3=1,2,3,4,5,6,7,8,9等价于: static int a33=1,2,3,4,5,6,7,8,9 static int a 4=1,3,1,0,0,9等价于: static int a34=1,3,1,0,0,9 4程序举例书 P128例 7。4 二维数组行列转换例 7.5 34 矩阵求最大元素及行列号四字符数组四字符数组存放字符数据的数组;每一个元素存放一个字符. 1定义 char数组名常量表达式即:char c10 ;说明:由于字符与整型是互相通用的,可使用 int c10 ; 定义。 2字符数组的初始化24(完整版)C 语言程序设计教案(清华谭浩强) 1)static char c5=a, b, c, d, e ;注意:static char c5=a, b, c, d, e, f ;( 错误,多一个元素)static char c5=a, b, c ; (正确) 后面元素自动定为空格 2)static char c =a, b, c, d, e;系统自动根据初值个数确定数组长度 3字符数组的引用一个字符数组元素,代表一个字符.即:x=c2 x 的值为“c 4字符串的使用 C 语言中,将字符串作为字符串来处理。规定:一个“字符串结束标志” ,以字符0,在遇到字符0时,表示字符串结束。 1)使用字符串常量进行数组初始化 static char c =“I am happy ;或static char c =“I am happy”;等价于 static char c =I, , a, m, h, a, p, p,y,0;注:(a)系统对字符串常量自动加一个0(b)字符数组并不要求它的最后一个字符为0 2)数组长度始终保证大于字符串实际长度 static char c10=“ABCDE”; (第 5 个元素0,第 6 个开始为空字符 ASC为 0) static char c10=A, B, C, D, E; (后面 5 个元素为空字符 ASC为 0)例 76 P131:字符数组引用例子 打印图形 (J5_1.C)define NL printf(n) main() char a10= , ,*,*,*,, ,, ; int i,j;图案层数 for (i=0;i=4;i+) NL;图案前空格 for (j=1;j=i;j+) printf( ” ) ; for (j=1;j=str2 b ) str1 必须是数组名数组名,str2 可以是数组名或字符串常量数组名或字符串常量 c )可以解决字符串常量不能赋值给字符数组即:str1=“abcde ;str1=str2;str1=str2; (不合法) 可用 strcpy(str1,str2)注:注:strcpy(str1,str2,2) ; 是将 str2 中前面 2 个字符拷贝到 str1 中去,然后再加一个0 。(6)strcmp 函数strcmp( str1strcmp( str1 , str2 ); str2 );功能:把 str1 与 str2 的内容进行比较(按 ASCII 码的大小进行比较)如果:str1=str2,则函数返回 0如果:str1str2,则函数返回正整数如果:str11)子函数定义求:4!long fac( int n ) sum=fac(4);个函数自己调用自己方式与递归终止条件归的问题可以分为:“递推递推”32 long fa; if (n= =0) fa=1 else fa=nfac(n-1); return(fa) ;结束条件(完整版)C 语言程序设计教案(清华谭浩强)第一步 fac(4) fa=4fac(41)=4*fac(3) fa=4*3*211第二步 fac(3) fa=3fac(3-1)=3fac(2) fa=3*2*11第三步 fac(2) fa=2*fac(21)=2*fac(1) fa=21*1第四步 fac(1) fa=1*fac(11)=1*fac(0) fa=11第五步 fac(0) fa=1回推递推六、函数参数的使用六、函数参数的使用( (实参或形参实参或形参) )实参:在调用函数中;形参:在函数定义中函数参数:1)数值 2)变量 3)数组元素 4)数组名 5)指针1函数间的参数传递(1)数值传递方式实参地址实参地址形参地址形参地址调用函数的实参:给出具体数据具体数据主要是:1)数值 2)变量 3)数组元素(2)地址传递方式实参地址实参地址形参地址形参地址主要是:调用函数实参:一般是数组名数组名或指针变量指针变量2数组有两种参数:a)数组元素:一个数组元素相当于一个变量,所以,数组元素可以用于函数参数,用法与变量相同。是传递数据方式是传递数据方式b)数组名:数组名作为一个变量用于函数实参和形参,传递的是整个数组元素或部分数据元素。是传递地址方式是传递地址方式(1)数组元素作实参的传值调用把数组元素当作变量来作为实参使用传值调用最多返回一个值例: main ( ) int a5;调用函数 a0=mul( a1 , a4 ) ;函数定义 int mul(int x , int y ) int s ; return( s );33(完整版)C 语言程序设计教案(清华谭浩强) (2)数组名作函数参数(实参与形参都用数组名)具有:存贮地址作实参的传址调用例: (J5_3.C)main () void swap(float x2 ) ; float a2=10.5,2。7; printf(%4。1ft,%4。1fn” ,a0 ,a1); swap(a) ; printf(”4.1ft,%4。1fn”,a0 ,a1 ) ;void swap(float x2)相当于: void swap( x ) float t; float x2; t=x0;x0=x1;x1=t;说明说明: :a)数组名在主调函数和被调函数中,分别进行定义,并且类型一致类型一致。 b)调用的实质:数组数组 a a 和数组和数组 x x数组 a 独享存贮区共享存贮区共享存贮区数组 a 独享存贮区 105 27 27 27 105 105 c)实参数组和形参数组大小可以不一致实参数组和形参数组大小可以不一致 (C 语言编译时,对形参数组大小不作检查,只是将实参数组的首地址传给形参数组 ,这样两个数组共同占用同一段内存单元同一段内存单元)例 (J5_4.C)main () void fun(float x4); float a4=3.5,6.1,0。2,7.9 ; int i; a0 a1 a2 a3 fun(a1);第 2 个的开始连续 3 个地址 for (i=0;i=3;i+) 3.5 6.1 0。2 7.9 printf(”5。1ft,ai); x0 x1 x2void fun(float x4)共用内存单元 x0=x0+1;x1=x1+1;x2=x2+1; 结果:3.5 7。1 1.2 8.9数组数组 a a 和数组和数组 x x数组 a 独享存贮区共享存贮区共享存贮区数组 a 独享存贮区a0 35 a1 71 a0 35a1 61 a2 12 a1 71a2 02 a3 89 a2 12a3 79 a3 8934(完整版)C 语言程序设计教案(清华谭浩强)注意:注意: 不要使用 x3 , 即:x2是子程序最后一个可用元素。(3)例子书 P164例 8。10例 8。11例 8.12书 P166例例 8.138.13(4)二维数组作函数参数二维数组的传值调用与一维数组相似。例: main ( ) int a35;调用函数 mul( n , a12 , a04 ) ;函数定义 int mul(int x , int y , int z ) int s ;例(j5_8。c)main () int tran(int n,int x); int total,a44=3,8,9,10, 2,5,-3,5 , 7,0,1,4,2,4,6,0; tran(2,a);第一行的第 0 列 地址 9 个 tran(2,a0);第一行的第 0 列 地址 9 个 tran(0,a2);第二行的第 0 列 地址 4 个计算数组元素在数组中的序号tran(int n,int arr) int i; for (i=0;i #include “文件名” :可包含文件路径include 文件名 :只按指定的标准方式检索文件目录(常用第一种(常用第一种, ,即:即: “文件名”“文件名” ,可包含文件路径),可包含文件路径) c)文件包含可以嵌套(1)用户定义的头部文件的使用用户定义的头部文件(p_format.h)#define PR printf#define NL ”n”define D”d”define D1 D NLdefine D2 D D NLdefine D3 D D D NLdefine D4 D D D D NLdefine S s程序调用中包含用户定义的头部文件(j4_31。c)#include ”p_format。hmain() int a,b,c,d; char string=CHINA” ; a=1;b=2;c=3;d=4; PR(D1,a); PR(D2,a,b); PR(D3,a,b,c); PR(D4,a,b,c,d) ; PR(S,string);(2)标准库函数的头部文件的使用C 语言提供的 400 多个常用函数是以库的方式提供给用户。400 多个函数组成标准函数库,标准函数库一般进行分类,如:输入输出函数、数学函数、图形功能函数等。每一类函数用一个头部文件来表示,用#include“函数库头部文件”就可以找到程序所需要的函数如:include“math。h”-表示主程序同 26 个数学函数通信的连通,当主程序调用其中一个数学函数时,连接程序就把被调用的数学模块嵌入到程序中来。40(完整版)C 语言程序设计教案(清华谭浩强)书 P381附录C C 库函数库函数 3条件编译对满足一定条件的语句行进行编译称条件编译条件编译(一般情况下,源程序中所有的行都参加编译)几种表示方法:(1)#ifdef 标识符程序段 1 #else程序段 2 #endif作用:如果标识符被定义过(用define 定义) ,编译程序段 1;否则,编译程序段 2(2)ifndef 标识符程序段 1 #else程序段 2 #endif作用:如果标识符未定义过(没有用#define 定义) ,编译程序段 1;否则,编译程序段 2(3)#if 表达式程序段 1else程序段 2作用:如果表达式的值为真,编译程序段 1;否则,编译程序段 2十、该章的主要例题十、该章的主要例题P146例 8。2 P148 例 8.3 P150 例 8。4 P152 例 8.5P164例 8.10 P165 例 8.11 P166 例 8。13例 8.14 例 8。15P175例 8。18 P188例 9.1 P190例 9.3十一、该章的主要习题:十一、该章的主要习题:P186 8。1 8.3 8。4 8.5 8。11十二、该章的主要上机内容十二、该章的主要上机内容P146例 8。2 P164 例 8.10 P165 例 8。11P166 例 8。13例 8.14例 8。15例 8.16P175例 8。18 P188例 9。1 P190例 9.3其他:上机实验指导书中内容例 8.168。1541(完整版)C 语言程序设计教案(清华谭浩强)第十章第十章 指指 针针重点:重点:指针的概念及 C 语言指针使用的特点。指针变量的定义、引用。数组的指针、字符串的指针、函数的指针、指向指针的指针的使用。难点:难点:指针的运算和使用.指针在数组中的使用及使用特点。指针:是指针:是 C C 语言中最有特色的数据结构。语言中最有特色的数据结构。 1)可以有效地表示复杂的数据结构; 2)能动态分配内存;即可以处理一批长度不确定的数据或一批动态变化的数据; 3)在调用函数时能得到多个值; 4)能直接处理内存地址。一指针的概念一指针的概念整型分配 2 个字节定义的变量,一般在内存中分配存储空间实型分配 4 个字节字符型 为 1 个字节等。一个内存单元一个内存单元:可用内存单元地址内存单元地址与内存单元内容内存单元内容表示例: int iint i,j j,k k; 2000 3变量 i i 2002 4变量 j j 2004 12变量 k k 3000 2000指针变量 p p内存说明说明: :1)变量的“直接访问直接访问”方式在内存中已没有 i i,j j,k k 变量名,对变量值的存取是通过地址进行的。如:如:printfprintf( “%d , i )“%d , i ) 的执行:的执行:根据变量名与地址的对应关系,找到变量 i 的地址 2000然后从由 2000 开始的地址中取出数据,把它输出(值为 3)如:scanf( “d” ,如:scanf( “d” ,& i )& i ) 的执行:的执行:根据键盘输入的值,找到变量 i 的地址 2000送到由 2000 开始的地址存储单元中。如:如:k= i+jk= i+j的执行:的执行:根据变量名与地址的对应关系先找到变量 i 的地址 2000 和 j 的地址 200242(完整版)C 语言程序设计教案(清华谭浩强)然后从由 2000 开始的地址中取出数据值(3)从由 2002 开始的地址中取出数据值(4)把它相加后和值(值为 7)送到变量 k 的地址 2006 存储单元中。这种按变量地址存取变量值的方式称为“直接访问直接访问方式。 2)变量的“间接访问间接访问”方式将变量 i i 的地址地址存放在另一个内存单元中.存取变量存取变量 i i 的值:的值:先找到存放 i 的地址的单元(3000),从中取出 i 的地址(2000)然后再到该地址中取出 i 的值( 3 ) 。(P202 比方)结论结论: :如果一个变量专门用来存放另一变量的地址称“指针变量指针变量”如:p p 为指针变量 3000 2000 是指针(地址)p p 3000 2000 2000 3有:p p 2000 *p p=3(&2000=3)注注: :a) “星号运算符(单目运算符)功能是返回指针所指变量的数值 b)p为指针变量,*p*p 为指针变量所指的值 c)运算符与运算符的特点: * -指针运算符 & -取地址运算符优先级别相同,并且都是“右结合”当 p=&i 时,可有:p=3或 *&i=3二指针的定义二指针的定义 1格式:类型标识符 *变量名类型标识符表示该变量所指向的变量类型例:intp; charpc; float *pf;注注:指针 p , pc , pf 放的是地址值,为整型数;而上面类型标识符,说明的是地址值所指向的数据类型。即:*p=20 *pc= s *pf=12.3 2指针变量的引用指针变量中:只能存放地址(指针)不能将一个整型量直接赋给指针变量。 p=2000 p 2000使用有关的两个运算符: “” 、 “”有: &a 为变量 a 的地址,p 为指针变量 p 所指向的变量例: main ( ) int a , b ; intp1 , *p2 ;43(完整版)C 语言程序设计教案(清华谭浩强) a=5 ; b=20 ; p1=a ; p2=&b ; printf( “%d,dn”,a,b) ; printf( “%d,dn”,*p1,;地址相同p1*p2)地址与 p2 p1=p2;printf( “d,%dn”,*p1,*p2);p1=2; printf( “d,dn, a , b); p1输出: 5 ,20 5 5 ,20 20,20 p2 5 ,2 20说明说明: :* *与与& &的组合使用的组合使用*p1:有*p1 为 a , 那么,&p1 与a 相同&a :-有&a 为 a 的地址 , 那么,*a 与&p1 相同 3指针变量的运算 1)算术运算只有:加、减只有:加、减每加(减)一,就指向它基本类型的下一个(上一个)元素的位置。例例 1 1:int a,b,c,d,p1;变量内容指针地址 p1=b; a 1998 p1+; b 2000有:p 指向 c 变量,即 p1=c c 2002如果 p+改为 p d 2004有:p1=a , p1 指向 a 变量例例 2 2:int a,b,c,d,*p1; x 3000 p1=&a; y 3004 p1=p1+2 z 3008有:p 指向 c 变量,即 p1=&c p1 2000 5000例例 3 3:float x,y,z,*p2; p2 3000 6000 p2=&x; p2=p2+2;有:p 指向 z 变量,即 p2=z 2)逻辑运算 C 语言允许指针变量进行逻辑运算例 (j6_11.c)main ()44(完整版)C 语言程序设计教案(清华谭浩强) int p,q,*r,x; int a=1,b=2,c=3; printf(”nx,%x,xtn” ,p,q,r) ; p=&a;q=b;r=&c; printf(x,%x,x,%xtn”,p,q,r,p&qp&q&r&r); printf(”%xt”,(!p)?q:r);输出: d6 , 55f , 57e ffd8 , ffda , ffdc , 1 ffdc( P206例 10。2 P207例 10。3)三指针与数组三指针与数组 P210 P210一个变量可以有一个地址相对应,而一个数组包含若干个元素。每个数组元素都在内存中占用存储单元,同样有一个地址相对应。指针变量可以指向变量,所以也可以指向数组和数组元素即把数组起始地址或某一元素的地址放到一个指针变量中。数组的指针数组的指针:是指数组的起始地址(指第一个元素的地址) ;数组元素的指针数组元素的指针:是指数组元素的地址。说明:说明:引用数组元素 1)用下标法(即 a2对应相应的地址) 2)用指针法(通过指向数组元素的指针找到所需元素) 1 1指向数组元素的指针变量的定义与赋值指向数组元素的指针变量的定义与赋值与定义指针变量的方法基本相同定义定义: : int a5 ; /*定义 5 个数组元素/ int *p ; /*定义一个整型的指针变量/指针变量的赋值:指针变量的赋值: p=a0;或 p=a; /*数组名 a 代表数组的首地址/在定义指针变量时可以赋给初值在定义指针变量时可以赋给初值:即: int *p=&a0 ;或 int *p=a ; 2 2通过指针引用数组元素通过指针引用数组元素假如: int a5 ; p 2000a0 intp=a ; 2002a1如果: p=2表示对 a0 赋值为 2 即 a0=2 2004如果:p=p+2 ; p=2表示对 a2 赋值为 2 即 a2=2a 245(完整版)C 语言程序设计教案(清华谭浩强)说明:(1)如果 p 的初值为&a0则:a)p+i 和 a+i 就是 ai的地址 b)(p+i)或(a+i)是 p+i 或 a+i 所指向的数组元素,即 ai(2)指向数组的指针变量也可以带下标如:pipi与与* *(p+i)p+i)等价等价所以,引用一个数组元素,可用:下标法,即:ai形式指针法,即:( a+i )或*( p+i )P212P212例:用各种方法输出数组全部元素例:用各种方法输出数组全部元素 P212 P212 例例 10.510.5设有一个数组 a,输入、输出数组各元素的值有三种方法:1)下标法 2)通过数组名计算数组元素地址 main ( ) main ( ) int a10 ; int a10 ; int i; int i; for (i=0; i10; i+) for (i=0; i10; i+) scarf(“d”,&ai ); scarf(“d,&ai );printf(“n” );printf(“n” ); for (i=0; i10; i+) for (i=0; i10; i+) printf(“d”, ai ); printf(“d, *(a+i) 。 3)用指针变量指向数组元素 main ( ) int a10; intp, i; for (i=0; i10; i+) scarf(“%d,ai ) ; printf(“n” ) ;for (p=afor (p=a; p p(a+10); p+(a+10); p+)printf(“d”,printf(“d”, *p ) *p ); 不能用下列语句代替上面加红的语句: for (p=a; p(a+10); a+) /*a 是数组名,是数组首地址,值不变/printf(“%d, *a );例:main () int ary3 3=10,11,12,20,21,22,30,31,32; /*设数组 ary 的起始地址为 2000*/ int *p1,p2; p1=&ary00;46;)(完整版)C 语言程序设计教案(清华谭浩强) p2=ary0 0 ; printf(”d, %dn,*p2, *(p1+0); printf(%d, dn, *(+p2) , ary22); printf(”%d, %dn, (p2+1) , (p1+1)+1);结果: 10 ,10 11 ,32 12 ,12P214P214 例例 1010。6 6例:一个指针变量当前值的程序 (jt9_6.c)main () int *p,i,a5; p=a; for (i=0;i5;i+) scanf(d,p+); printf(”n”); /p=a*/ for (i=0;i5;i+,p+) printf(”%dt,*p);结果:输入:1 2 3 4 5输出:指针指向第五个元素之后的数据指针的几种运算:指针的几种运算:如果 p 指向数组 a(即 p=a) a)p+(p+=1) , p 指向下一元素,即 a1 b)p+为:先得到指针变量 p 所指向的变量的值(即p) ,然后再使 p+1p等价于*(p+)例 printf(“d”,*p+)先输出p,然后使 p 值加 1 c)(p+)与(+p)的区别: *(p+) :先取p 值,然后使 p 加 1;(+p):先 p 加 1,再取*p 值如 p=a0; *(p+)值为:a0的值,p 指向 a1 *(+p)值为:a1的值,p 指向 a1 d) (*p)+为:p 所指向的元素值加 1,即:(a0)+,元素值加 1,不是指针值加 1P215 3 3一维数组与二维数组使用指针一维数组与二维数组使用指针(1)一维数组(p=a) a+i是 ai的地址 p+i 和 a+i 都表示 ai的地址;指向数组的第 i 号元素 *(p+i)和(a+i)都表示 a+i 所指对象的内容;即*(p+i)=*(a+i)=ai指向数组元素的指针,可以表示成数组的形式;方法:pi=(p+i)47(完整版)C 语言程序设计教案(清华谭浩强)例: p=a+3那么:p2=*(a+3+2)=a5 p2=(a+3-2)=a1(2)二维数组(p=a)书 P224地址:100。 a0 106. a1 112。 a2 118。 a3a 00 A0 1A 0 2a1A 1 1A 120a 2 0A2A 2 21a3A3A3 201P225表 10.1 inta43 =1,2 , 3 ,4,5,6,7,8,9,10,11,12 a0,a1,a2,a3可表示二维数组 a43每行的首地址;即有:a ai i= =ai0ai0 ai+j 代表第 i 行第 j 个元素的地址即有:aiai+j=&a+j=&aijij例 (j6_8。c)define NL printf(”n” ) ;main () int i,j,p,a43=1,2,3,4,5,6 , 7,8,9,10,11,12; printf(”n%dt%dt%dt%dn”,a0,a1,a2 ,a3); for (p=a0+2,i=0;i10;i+) printf(5d” ,p+) ; NL; for (i=0;i4;i+) printf(”%d” ,(a+i)) ; *(a+i) I 行首地址 for (j=0,p=(a+i)+j;jy) z=x; int a,b,c; else z=y; p=max; return (z) ;scarf(“d, %d,a, &b) ; c=(p) (a, b); printf (“a=d, b=d, max=%d”, a,通过函数名 max 找到通过一个指针变量指向一个函数(max 的地址)50 b, c);(完整版)C 语言程序设计教案(清华谭浩强)函数子程序的地址,达到即通过指针变量来访问它指向的函数(max) 。访问函数的目的. int (p)( ) 说明 p 是一个指向函数的指针变量 1函数指针变量的一般形式类型标识符类型标识符 (* (*指针变量名)指针变量名) ( ); ;如:int( *p) ( );说明:说明:a)类型标识符(int):指函数返回值的类型(返回值为整型) b) (p)( )表示定义一个指向函数的指针变量,专门用来存放函数的入口地址的.在程序中,把哪一个函数的地址赋给它,它就指向哪一个函数。故:在一个程序中,一个指针变量可以先后指向不同的函数。故:在一个程序中,一个指针变量可以先后指向不同的函数。 2函数指针变量的使用 a)函数指针变量赋值:由函数名赋值;p=max(没有参数) b)用函数指针变量调用函数时,要给出参数 c=(p)(a, b) ;注:注:函数的返回值,是整型(由:int ( p) ( ) 定义的) c)对指向函数的指针变量,如下运算: p+n、 p+、 p-;(是无意义) 3函数指针变量作函数参数函数参数:函数参数:变量、数组名、指向变量的指针变量、指向数组的指针变量、 (增加)函数指针变量函数指针变量作函数参数:实现函数地址的传递,即:将函数名传给形参函数指针变量作函数参数:实现函数地址的传递,即:将函数名传给形参例:输入 a 和 b 两个数,分别找出最大者,最小者,两数之和 /*主程序/ P243例 10.24main ( ) int max( ), min( ), add( ); /函数说明*/ int a, b;scarf(“%d, d”,&a, &b); printf(“max=”) ; process(a, b, max) ; /*求最大值*/printf(“min=”); process(a, b, min); /*求最大值/ printf(“sum=”); process(a, b, add); /求两数之和*/ /函数子程序/procee (x, y, fun) ;int x, y;int(*fun)( ); int s; s=(*fun)( x, y ); printf(“%dn”, s) ;51(完整版)C 语言程序设计教案(清华谭浩强)/求最大值*/ /求最小值*/ /求最大值/ max (x, y) min (x, y) add (x, y) int x, y; int x, y; int x, y; int z; int z; int z; if (xy) z=x; if (xy) z=x; z=x+y; else z=y; else z=y; return (z); return (z); return (z);.五返回指针值的函数五返回指针值的函数一个函数可以带回一个:整型值、字符值、实型值;也可带回指针型的数据,即地址。定义形式: 类型说明符类型说明符 * *函数名(参数表)函数名(参数表); ;例: intfun(x, y) ;fun:-被调用的函数名,调用它后,能得到一个指向整型数据的指针(地址)x, y:函数 fun 的形参 P246例 10。26例(jt9_26.c)在多个学生成绩中,输入学生序号,输出该学生的全部成绩main () static float score4= 60,70,80,90,56,88,87,90,38,90,78,47; float *search(); /*函数说明/ float *p; int i,m; printf(enter the number of student:); scanf(d” ,m); printf(The score of No.d are:n,m); p=search(score,m); for (i=0;ip2 、 p2p156(完整版)C 语言程序设计教案(清华谭浩强)第十一章第十一章 结构体和链表结构体和链表重点:重点:结构体和共用体的定义、引用。用指针和结构体构成链表,简单链表的建立、输出、删除和插入难点:难点:结构体数组的应用与数据库管理的联系,链表的使用.整型基本类型基本类型字符型单精度型实型(浮点型)枚举类型双精度型数据类型数据类型数组类型构造类型构造类型结构体类型联合类型指针类型指针类型空类型空类型前面介绍的变量只能处理同一类型同一类型的信息,但是,只有这些数据类型是不能满足程序设计的要求,有时需要将不同类型的数据组合成一个有机的整体,以便于程序的引用。这些组合在一个整体中的数据是互相联系的。例例:一个学生的学号、姓名、性别、年龄、成绩等,都与学生相联系即:这些数据类型不同,但共同描述出一个学生的属性。故:在 C 语言中,有两种构造类型的数据可以用来处理上述问题; -结构体和共用体(联合)一结构体一结构体 1定义结构体类型变量struct结构体名 类型变量名;类型变量名; 结构变量表;例如:多个数据项的简要居民登记表:数据项类型姓名字符数组年龄整型工作证号码长整型具体有三种方法: (1)先定义结构体类型,再定义结构变量名 struct person char name10; int age; long certificate; ;struct personstruct person worker, teacher ;57(完整版)C 语言程序设计教案(清华谭浩强)struct personstruct person women, mem ;为了使用方便,通常可用一个符号常量代表一个结构体类型,即:define STUDENT struct person STUDENT char name10; int age; long certificate; ; STUDENT worker, teacher; STUDENT women, mem;(2)在定义结构类型的同时,定义结构变量 struct person char name10 ; int age; long certificate; worker,teacher,women,mem;(3)直接定义结构类型变量 struct char name10; int age; long certificate; worker, teacher, women, mem;说明: 1)结构名是自定义的标识符,只代表结构体的数据结构,程序中只能使用结构体变量传递信息,不能用结构名。 2) 在定义一个结构体类型时, 可以用另一个结构类型来定义其中的成员,即可以嵌套定义嵌套定义。例: struct date int month; int day; int year;; struct person char name10 ;struct datestruct date birthday; long certificate; struct person worker, teacher; struct person women, mem;注:结构体中定义的变量(成员名)与程序中的变量名可以相同,二者不代表同一对象。 2结构体类型变量的引用58(完整版)C 语言程序设计教案(清华谭浩强) 1)使用圆点运算符“圆点运算符“-称为成员运算符,用于连接结构变量与其中的成员.引用方式:结构体变量成员名结构体变量成员名对成员变量可以像普通变量一样使用,进行各种运算.即:workername、 workerage、 workercertificate 2)结构体变量的初始化结构变量的初始化与数组相似,在定义结构变量同时,进行初始化。 struct person char name10; struct date birthday; long certificate;worker=“王 芳” ,20,2104156311; 3)结构变量的引用 C 语言不允许对结构变量作整体的输入、输出,即各输入、输出函数中的参数只能是结构中的成员。 C 语言允许将一个结构变量赋给另一个具有相同类型的结构变量。P264例 11.1 3结构体数组一个结构变量可以把不同类型的数据集中处理,如:一个学生的学号、姓名、成绩等不同类型的数据;但如果要处理如果要处理 1010 个学生的数据个学生的数据,就要设置 10 个结构变量;也可使用结构数组来实现,数组中每一个元素都是结构变量。定义: struct person stu10 ;P265说明: 1)结构数组的元素作实参时,被调函数的形参必须是同一类型的结构变量,其调用过程与一般传值调用相同。 2)结构数组可以初始化 struct person stu10= , ;P266 例 11。2 3)在读入结构成员时,通常情况下都把各种数据按字符串读入,然后用以下转换函数: atoi( )将字符串转换成整型数在”stdlib.h中 atof( )将字符串转换成实型数 atol( )将字符串转换成长整型数 P141例 7。4 (j7_4。c)include stdio.h#include ”stdlib.hstruct person char name10 ; int age; float wage;;59(完整版)C 语言程序设计教案(清华谭浩强)main() struct person worker3; int i; char ch,str10; for (i=0;i3;i+) gets(workeri 。name) ; gets(str) ; workeri 。age=atoi(str); gets(str); workeri 。wage=atof(str); for (i=0;inum 来代替即以下三种形式是等价的: a)结构体变量成员名 b)(p) 成员名 c)p成员名 2)指向结构体数组的指针对结构体数组及其元素可以用指针或指针变量来指向例 struct student int num; char name20; char sex; int age;struct;struct student stu3= 10001,”LiLin,M,20,10002,”WangLi”,M21 ,10003,”Zheng Qing,F,19;main ( ) struct student *p; printf( No。 name sex scoren); for (p=stu;pstr+3;p+) printf(%5d%20s%2c%4dn” , p-num,pname,p-sex,p-age);运行结果: No。 Name sex age 10001 Li Lin M 20 10002 Wang Li M 21 10003 Zheng Qing F 19说明:p 是指向 struct student 结构体类型数据的指针变量。它只能指向一个结构体型数据 3)指向结构体的指针作函数参数用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参.例子 P270例 11。55用指针处理链表(1)链表的基本概念链表是一种重要的数据结构,主要用以实现对数据的动态存储,链表中包含若干个结点( 又可称为元素) ,61(完整版)C 语言程序设计教案(清华谭浩强)每个结点包含的数据有两部分:一是用户的实际数据, 二是下个结点的地址信息, 这样,结点都按这个原则 “连接”起来,在这种链式结构中,每个结点只有一个“前驱”和一个“后继” ,所以,只要知道链中第一个结点的地址,就可以遍访链中的其他结点。头指针:存储第一个结点的指针变量 (*head)表头: 由头指针指向的结点,有后继而无前驱表尾:表的最后一个结点,有前驱而无后继,其下一个的地址信息为空(NULL)结点的表述:以结构体变量描述: struct student int num; int score; struct student *next; ;如下所示为典型的单链表结构:地址 40 10 20 1540 1 10 2 20 3 15 4NULL头指针数据指针(2) 静态链表的建立和输出静态链表一般建立在已定义好的结构体数组的基础上,数组中每个元素的 *next 指针成员都记载着下一个元素的存储地址,从而形成一个简单的链式结构,在内存中,该结构中各元素是连续存储的。define NULL 0struct student long num; float score; struct student next; ;main()int i; float t; struct student stu10,p; p=stu; t=&stu0。score; *t=0; for(i=0;i=8;i+)printf(enter No。%d:,i+1); scanf(%ld,%f” ,stui.num,stui.score); stui.next=stui+1 ; scanf(ld,f”,stui.num,stui.score); stui.next=NULL; do printf(”%ldtfn” ,p-num,pscore);62(完整版)C 语言程序设计教案(清华谭浩强) p=pnext; while(p!=NULL); (3)动态地开辟和释放存储单元的函数 malloc( size ) 在内存的动态存储区中分配一个长度为 size 的连续空间。此函数值是一个指向分配域起始地址的指针。 calloc( n, size ) 在内存的动态存储区中分配 n 个长度为 size 的连续空间此函数值是一个指向分配域起始地址的指针. free( ptr ) 释放由 ptr 指向的内存区。 ptr 是最近一次调用 calloc 或 malloc 函数时返回的值(指针)例: a)p=(float *)malloc(4) ;开辟 4 个字节的存储空间,并把此地址赋给指针 p注注: :函数的返回值为指向 void 型的指针(地址),它未确定指向任何具体的类型.如果要想将这个指针赋给其他类型的指针变量,就应当进行强制类型转换。 b)new=(struct work *)malloc(struct work);开辟一个能容纳结构变量的空间,并把这个空间的首地址赋给结构指针 c)float *pt; pf=(float *)calloc(50, sizeof(float));指向动态地址分配的 50 个实型的数组的指针。 d)free(new) ; free(pf) ;释放所占的内存空间(4 4)动态链表的建立、显示输出、插入和删除动态链表的建立相对复杂一些,其原则是:由地址动态分配函数每开辟一段存储空间,就产生一个相应的结点,每个结点的地址都会被记载到上一个结点的 *next 指针成员中,从而形成一个动态的链式结构,在内存中,该结构各元素是离散存储的。/ 预处理和结构体定义/ define NULL 0# define LEN sizeof(struct student) includestring.h# includestdio.h includestruct student /定义一个结构体*/long num; int score; struct student *next; ;/自定义动态链表建立函数 CREATE()/struct student *create(void)struct student head,p1,*p2;63(完整版)C 语言程序设计教案(清华谭浩强) printf(enter link table:(if 0,0 is end)n”); p1=p2=(struct student *)malloc(LEN) ; scanf(”ld,d”,p1-num,p1-score); if(p1-num=0&p1-score=0) head=NULL; else head=p1; while(p1-num!=0p1-score!=0) p1=(struct student )malloc(LEN);scanf(%ld,d” ,p1num,&p1score); if(p1num=0&p1-score=0) break;else p2-next=p1;p2=p1; p2next=NULL; return(head);/*自定义链表输出操作函数*/ void print(struct student head) struct student *p; printf(”n print link table is:n) ; p=head; if(head!=NULL) do printf(%ldt %dn”,p-num,p-score); p=pnext;while(p!=NULL); /自定义链表删除操作函数*/struct student del(struct student head,long n)struct student *p1,p2; p1=head; if(head=NULL) printf(”link table is void!);return(head); if(p1num=n) return(p1next); while(p1-num!=n&p1-next!=NULL) p2=p1;p1=p1next; if(p1-num=n)p2next=p1next; printf(%ld is found! already deleted itn” ,n) ; else printf(ld is not found!,n) ; return(head);64(完整版)C 语言程序设计教案(清华谭浩强)/*自定义链表插入操作函数/struct student insert(struct student head,struct student stu)struct student p0,*p1,p2; p1=head; p0=stu; if(head=NULL) head=p0;p0-next=NULL;return(head); if(p0-numnump1-num&p1next!=NULL) p2=p1;p1=p1next; if(p0numnum) p2next=p0;p0-next=p1; else p1next=p0;p0next=NULL; return(head);/*主函数/ main()struct student *p,*stu; long num=1; p=create(); print(p) ; do printf(”enter delete num (enter 0 exit):);scanf(ld” ,num) ; if(num=0|p=NULL) break; p=del(p,num); print(p);while(1) ; printf(enter New link:n); scanf(%ld,%d,stu-num,&stu-score); p=insert(p,stu); print(p) ; 二共用体二共用体有时需要使几种不同类型的变量存放到同一段内存同一段内存单元中, 这种使几个不同的变量共占一段内存的结构,称为共用体共用体( (联合联合) )类型类型的结构例如:一个整型变量,一个字符型变量,一个实型变量,可以把它放在同一个地址开始的单元中。 1000整型、字符型、实型变量(2 个 1 个 4 个 字节)65(完整版)C 语言程序设计教案(清华谭浩强) 1定义union共用体名 成员表列变量表列 union data union data union int i; int i; int i; char ch; char ch; char ch; float f; float f; float f;a, b, c;a, b, c union data a, b, c;说明:1)“共用体与“结构体”的区别 a)结构体变量所占的内存长度是各成员占的内存长度之和长度之和.每个成员分别占有其自己的内存单元。 b)共用体变量所占的内存长度等于最长的成员的长度最长的成员的长度。(结构)(共用体) struct union data char ch; int i; int k; char ch; float f; float f; a, b, c; x, y; 1000 . ch 1000 ch 1001 k 。 1001 。 k 1002 . 1002。 f 1003。 。 1003 1004 1005 f 1006 2)同一内存段,可以存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种.即:在任何时刻,共用体变量只有一个成员驻留在只有一个成员驻留在内存中,比结构体节省存储空间,而且增加了处理数据的灵活性. 3)使用 sizeof(变量)返回变量或括号中类型标识符的字节长度例: sizeof ( a )值为 7 sizeof ( x )值为 4 2共用体的引用共用体变量的引用与结构变量相似,即:y。ch= w注意:注意:在引用中,只能引用联合变量中的成员,不能引用联合变量;即:无法区分是哪一个变量66(完整版)C 语言程序设计教案(清华谭浩强)C 语言允许在两个同类型同类型的共用体变量之间相互赋值。即:y2=y1;例:P290 例 11。12 (j7_8.c)main () union int a; char ch3; x;x.ch0=14; x。ch1=4; printf(”a=x,ch=xn,x。a,x.ch1);x.ch0=34; printf(xn”,x。a) ;x。a=0x2d2f; printf(%xtxn”,x。ch0,x。ch1 ) ;程序输出: a=40e,ch=4 422 2f 2d 3共用体与结构体可以嵌套使用在数据处理的应用领域中,常常可把共用体与结构嵌套使用,增加处理的灵活性。使用共用体类型注意地方: 1)共用体变量的地址和它的各成员的地址都是同一地址。即:&xx.a &x。ch 2)不能对共用体变量名赋值,也不能在定义共用体变量时,对它初始化即: union int a; char ch3 ; x=1,A, 2, B, 3, C ;或 a=2; 3)不能把共用体变量作为函数参数,也不能使函数带回共用体变量。但可以使用指向共用体变量的指针(与结构体变量用法相仿)三枚举类型三枚举类型( (简单介绍)简单介绍)如果一个变量只有几种可能的值,可以把它定义为一个枚举类型。“枚举”“枚举”-指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内.定义形式: enum枚举名枚举标识符表列 a)先定义枚举类型,后定义枚举变量 enum weekday sun, mon, tue, wed, thu, fri, sat ; (定义了一个枚举类型 enum weekday,可以用此类型来定义变量) enum weekday w1, w2, w3 ;(w1, w2, w3 就是枚举变量) b)在定义枚举类型的同时,定义枚举变量 enum weekday sun, mon, tue, wed, thu, fri, sat w1, w2, w3; c)省去枚举名而直接定义枚举变量 enum sun, mon, tue, wed, thu, fri, sat w1, w2, w3;注:sun, mon, tue, wed, thu, fri, sat 称为枚举元素或枚举常量67(完整版)C 语言程序设计教案(清华谭浩强)说明:1)在 C 编译中,对枚举元素按常量处理。它们不是变量,不能对它们赋值;即:sum=0; mon=1; 2)枚举元素作为常量它们是有值的,它们的值按定义顺序来给出;即:sum 的值为 0、mon 的值为 1、tue 的值为 2、sat 的值为 6如果有: w1=mon; w2=fri; w3=tue;则: w1 的值为 1、w2 的值为 5、w3 的值为 2 3)由于枚举元素是有顺序的,所以枚举元素可以进行比较;即:w1sun w2=mon montueP293 例 11.13 main ( ) enum color_nameblack, blue, red, greencol; enum day_name1mon, wed, thu=4,friday; for ( col=black; col=green; col+ ) printf(“%dt, col);printf(“n); for (day=mon; day=fri; day+) printf(“dt”, day);程序输出: 0 1 2 3 0 1 2 3 4 5注:thu 初始化为 4四用四用 typedeftypedef 定义类型定义类型C 语言允许使用 typedef 关键字为已有的类型定义一个新的名字。即:对标准类型名: int、char、float、double、long自己定义的类型:结构体、联合、指针、枚举类型-定义一个新的名字例: 1) typedef int INTEGER;用 INTEGER 代替 int即:INTEGER x, y ;与 int x, y ; 等价2) typedef struct char name10 ; int age; STUDENT;即:STUDENT x, stu10, p ;说明:用 typedef 定义类型,只是给变量起了一个新的类型名字,并未建立新的数据类型,被定义的变量的性质与原有类型是相同的。68(完整版)C 语言程序设计教案(清华谭浩强)第十三章第十三章 文文 件件重点重点: :文件类型及文件指针文件的打开、关闭文件的读写操作难点:难点:文件的读写一概述一概述 1)文件:一般指存储在外部介质上数据的集合。即:一批数据是以文件的形式放在外部介质(磁盘)上。 2)操作过程操作系统是以文件为单位对数据进行管理的; a)如果寻找在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。b)如果向外部介质存储数据,必须先建立一个文件,再向该文件输出数据。 3)C 语言把文件看作是一个字符(字节)的序列.即:由一个一个字符(字节)的数据顺序组成数据的组织形式:有:ASCII 码文件、二进制文件ASCIIASCII 文件:文件:称为文本文件(text) ;每一个字节代表一个字符 (用 ASCII 表示)二进制文件:二进制文件:数据直接按二进制表示(即把内存中的数据按其在内存中的存储形式原样输出到磁盘上) 4)一个数据文件的内容,在 C 语言中,是一个数据流,即:文字、字符、汉字、数据;简称一个流(任何源程序也是一个流)C 语言对流可以直接操作;对流中的内容(数据)的具体操作是用一个文件指针进行;在打开一个文件时,文件指针总是指向文件流的开头。二顺序文件的操作二顺序文件的操作当数据文件是一个文本数据文件或顺序数据文件时,文件指针总是按数据顺序指向数据。当对某一个数据进行读、写操作时,文件指针总是指向当前的位置。文件指针的定义: FILE *name ;即: FILEfp ;注:注:C 语言中,没有输入输出语句,对文件的读写都是用库函数来实现的. 1用 fopen( )函数来实现文件的打开。即:fp=fopen(“文件名,“文件类型说明符”) ;例:fp=fopen( “A1, “r” ) ;文件名:用户定义的文件名文件类型说明符:表示文件类型和读/写操作特性符号其含义: P162表 8。1 2一个文件被打开后,可以进行文件的读写(1)fscanf(文件指针, “格式描述符” ,变量表)69(完整版)C 语言程序设计教案(清华谭浩强)从文件中读出数据例:fscanf(fp, “%d%d”, &m1,&m2)指文件指针在当前位置读两个类型数存入变量 m1、m2 中。 (2)fprint(文件指针, “格式描述符” ,变量表)从文件中写入数据例:fprint(fp, “ff”, m1,m2)指文件指针在当前位置写入两个浮点数据 m1、m2。 (3)fclose(文件指针)关闭文件例:fclose( fp )关闭文件指针 fp 指向的文件。(4)exit 函数是关闭所有文件,终止正调用的过程。 P163例 8。1例 8.2例例 13.1 13.1include stdio。hinclude math.hmain () int i; float a10,s,t; FILE *fp; if ((fp=fopen(s1.dat”,”r”))=NULL) printf(”canot open filen); exit(0); s=0; for (i=0;i10;i=i+1) fscanf(fp,f”,&ai); s=s+ai ; printf(s=%fn,t); fclose(fp);运行结果: s=1052。603027 t=-21.052061例例 13 13。2 2#include ”stdio.h”#include math.hmain () int i,j; int a5,s,t; FILE fp; if ((fp=fopen(a:s2.dat”,”a+”)=NULL) printf(canot open filen); exit(0);例 8。370(完整版)C 语言程序设计教案(清华谭浩强) s=0; for (i=1;i=5;i=i+1) fscanf(fp, ”%d,d,%d,%d,d”,a0 ,&a1,a2,a3,a4); printf(”d,%d,d,%d,%dn,a0,a1,a2,a3,a4); for (j=0;j5;j=j+1) s=s+aj; printf(”s=dn,s); t=s/25.; printf(t=dn”,t); fclose(fp);例例 13.3 13.3#include ”stdio.h”include math.h”main () int i,j; int a5,s,t; FILE fp; if (fp=fopen(”s2.dat, ”a)=NULL) printf(canot open filen”); exit(0) ; for (i=1;i=10;i=i+1) printf(”x, ”,fp) ; fprintf(fp,d,%d,%d,d,dn,i+10,i+2,i+3,i+4,i+5) ; fclose(fp);三随机文件(选三随机文件(选) )为了解决文件中数据任意读取的实际问题,一般使用随机文件;即:直接存取文件如:x11, x12, x13, x14, x15 x21, x22, x23, x24, x25 x31, x32, x33, x34, x35. x91, x92, x93, x94, x95每一行(小组)称为一个子记录,而每个子记录是一个小小的顺序文件;在随机文件的操作中,可以对任意的子记录进行直接操作(存或取)C 语言中,有对单个数据的随机存取函数,但没有专门的随机子记录读取专业函数,因此,使用文件指针重定位的方法来实现随机存取。1)rewind(文件指针)该函数把文件指针定位于文件头(文件最前面)2)fseek(指针、偏段量、位置参数)该函数把文件指针作“绝对“移动71(完整版)C 语言程序设计教案(清华谭浩强)位置参数: SEEK_SET偏移从文件头开始 SEEK_CUR偏移从当前位置开始 SEEK_END-偏移从文件尾反向开始 P172 例 8.10四无格式文件(选)四无格式文件(选)能用 DOS 编辑的文件(编辑软件)-称带格式文件。在 DOS 下不能用编辑软件的文件-称无格式文件.无格式文件中的数据是非格式写入,是按数据本身定义的字节写入,因此,具有非可读性与非编辑性。无格式文件用到的函数:1)open()函数open( “文件名” ,参数)打开指定的文件参数: O_RDONLY -打开文件或只读 O_WRONLY 打开文件或只写 O_RDWR打开文件或读/写 O_APPEND -打开文件或增添 O_CREAT创建文件 O_TRUNC -消除文件内容,重新开始 O_BINARY -原始数据方式(二进制) O_TEXT文本方式注:以上参数在 open()函数中,可以连用,用“|”隔开。2)close()函数 close(文件指针) -关闭一个文件3)read()函数 read(文件指针,变量缓冲区,字节数) -从一个文件中读文件中的字节4)write()函数 write(文件指针,变量缓冲区,字节数)从一个文件中写入从变量缓冲区开始的字节72
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号