版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n 基本类型 整型、字符型、实型、双精度型和空值型 n 派生型(最简单的构造类型) 指针和数组 n 用户构造类型 用户定义类型:对已有的类型,另外说明一个新的类型标识符。 结构体:把具有相互关系的不同类型的数据组成一个有机的整体。 共用体:又称联合体,使几种不同类型的变量共用一段存储空间。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n用typedef说明一种新类型名 typedef 类型名 标识符
2、; 作用:用“标识符”来代表已存在的“类型名”, 并未产生新的数据类型,原有的类型名依然有效。 例如:typedef int INTEGER; INTEGER m,n; 等价于 int m,n; 如:typedef char * CHARP; CHARP p; 等价于 char *p; 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n结构体类型 定义:不同类型数据的集合 。由若干个称为成员 的成分组成;不同的结构体类型可根据需要由不 同的成员组成,对于某个具体的结构体类型,成 员数量必须固定;各个成员的类型可以不同;若
3、干个成员组成一条记录,即一条信息。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n结构体类型 一条学生记录 (student),包含如下 数据项: 姓名(name):字符串 性别(sex):字符型 出生日期(birthday): date结构体 四门课成绩(sc):一维 实型数组 姓名 (字符串) 性别 (字符) 出生日期 (date) 四门课成绩 (一维数组) 张三M1999.5.550 60 70 80 李四F2000.5.660 70 80 90 一个结构体就是一个表格的标题行! 实实在在学知识 顺顺利利过考试
4、学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n结构体类型说明 struct 结构体标识名 类型名1 结构成员名表1; 类型名2 结构成员名表2; 类型名n 结构成员名表n; ; 关键字关键字用户自定义标识符用户自定义标识符 用户自定义标识符用户自定义标识符 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n结构体类型说明 定义date结构体类型 struct date int year,month,day; 定义student结构体类型 struct student char n
5、ame12; char sex; struct date birthday; float sc4; ; 定义student结构体类型 struct student char name12; char sex; struct int year,month,day; birthday; float sc4; ; 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n结构体类型定义 1、紧跟结构体类型说明之后进行定义 struct student char name12; char sex; struct date birthday
6、; float sc4; std,pers3,*pstd; 定义了一个结构体变量std、具有3个元素的结构体数 组pers和基类型为结构体类型的指针变量pstd; 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n结构体类型定义 2、说明一个无名结构体类型的同时直接定义 struct char name12; char sex; struct date birthday; float sc4; std,pers3,*pstd; 定义了一个结构体变量std、具有3个元素的结构体数 组pers和基类型为结构体类型的指针变量ps
7、td; 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n结构体类型定义 3、先说明结构体类型,再单独进行变量定义 struct student char name12; char sex; struct date birthday; float sc4; ; struct student std,pers3,*pstd; 定义了一个结构体变量std、具有3个元素的结构体数组 pers和基类型为结构体类型的指针变量pstd; 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、
8、共用体和用户定义类型 n结构体类型定义 4、使用typedef说明一个结构体类型名,再用新类型名来 定义变量 typedef struct char name12; char sex; struct date birthday; float sc4; STREC; STREC std,pers3,*pstd; 定义了一个结构体变量std、具有3个元素的结构体数组 pers和基类型为结构体类型的指针变量pstd; 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n给结构体变量、数组赋初值 1、给结构体变量赋初值 struct
9、 student char name12; char sex; struct date birthday; float sc4; std=“LiMing”,M,1962,5,10,88,76,85.5,90; c编译程序按每个成员在结构体中的顺序一一对应赋初值,不允许跳过 前面的成员给后面的成员赋值;但可以只给前面的若干成员赋初值, 后面未赋初值的成员,系统将自动为数值型和字符型数据赋初值0。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n给结构体变量、数组赋初值 2、给结构体数组赋初值 struct bookcard
10、 char num5; float money; bk3=“NO.1”,35.5,“NO.2”,25.0,“NO.3”,66. 7; 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n引用结构体变量中的数据 对结构体类型变量中的数据可以逐个引用成员进 行操作,也可以对结构体类型变量进行整体赋值 操作。 1、对结构体变量成员的引用 若已定义了一个结构体变量和基类型为同一结构体类型的指针变量, 并使该指针指向同类型的变量,则可用以下三种形式引用结构体中的 成员。 n(1)结构体变量名.成员名 (2)指针变量名-成员名 (3)(
11、*指针变量名).成员名 点号.称为成员运算符;箭头-称为结构指向运算符 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n引用结构体变量中 的数据 struct student char name12; char sex; struct date birthday; float sc4; std,arr5,*ps; ps= 引用std中sex成员 std.sex ps-sex (*ps).sex 引用arr的第0个元素arr0中的 sex成员 arr0.sex 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程
12、 和解决问题的能力。 14 结构体、共用体和用户定义类型 n引用结构体变量中 的数据 struct student char name12; char sex; struct date birthday; float sc4; std,arr5,*ps; ps= 引用std中数组成员sc中的元素 sc2 std.sc2 ps-sc2 (*ps).sc2 对arr数组可写成 arr0.sc2 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n引用结构体变量中 的数据 struct student char name12; c
13、har sex; struct date birthday; float sc4; std,arr5,*ps; ps= 若结构体变量中的成员是作为 字符串使用的字符型数组,如 name,由于可以看作是“字符 串变量”,引用形式可以是 ps-name (*ps).name 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n引用结构体变量中 的数据 struct student char name12; char sex; struct date birthday; float sc4; std,arr5,*
14、ps; ps= 结构体变量内嵌结构体变量成 员的引用,要使用若干个成员 运算符,逐级找到最底层的成员。 std.birthday.year ps-birthday.year (*ps).birthday.year 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n引用结构体变量中的数据 结构体变量中的每个成员都属于某个具体的数据 类型,因此结构体变量中的每个成员都可以像普 通变量一样,对它进行同类变量所允许的任何操 作。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用
15、体和用户定义类型 n引用结构体变量中的数据 通过指针变量引用结构体成员的注意事项:当 通过指针变量来引用结构体成员,且与+、- 等运算符组成表达式时,应根据运算符的优先级 来确定表达式的含义。 struct int a; char *s; x,*p= 注意: +p-a 等价于 +(p-a) (+p)-a 等价于 +p;p-a; (p+)-a p+-a 等价与p-a;p+; 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n相同类型结构体变量之间的整体赋值 struct char name10; int num; per1,
16、per2=“YANGGM”,46; 执行赋值语句 per1=per2; 将per2中的每个成员的值都赋给了per1中对应的 同名成员。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n函数之间结构体变量的数据传递 (1)向函数传递结构体变量中单个成员的数据。 (2) 向函数传递整个结构体变量中的数据。 (3)传递结构体变量的地址。 (4) 用指向结构体变量(或数组)的指针作实参,将结 构体变量(或数组)的地址传给形参。 11.6.2 11.6.2 指向结构体数组的指针指向结构体数组的指针 例有一个结构体变量stu,内含学
17、生学号、姓名和3门课 程的成绩。要求在main函数中赋予值,在另一函数print 中将它们输出。现在用结构体变量作函数参数。 #include struct student int num; char name20; float score3; ; void main() void print(struct student); struct student stu; stu.num=12345;strcpy(,LiLi); stu.score0=67.5;stu.score1=89;stu.score2 =78.6); print(stu); void print(struct
18、 student stu) printf(“%dn”,stu.num; printf(“%sn”, printf(“%f,%f,%fn”,stu.score0, stu.score1, stu.score2); 运行结果:运行结果: 67.500000, 89.000000, 78.599998 例#include struct student int num; char name20; float score3; ;stu=12345, LiLi,67.5,89,78.6; void main() void print(struct student *);/*形参类型修改成指
19、向结构体的指针变量*/ print( /*实参改为stu的起始地址*/ void print(struct student *p) /*形参类型修改了*/ printf(“%dn”,p-num); /*用指针变量调用各成员的值*/ printf(“%sn”,p-name); printf(“%f,%f,%fn”,p-score0,p-score1,p-score2); 运行结果:运行结果: 67.500000,89.000000,78.599998 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n利用结构体变量构成链表
20、1、当一个结构体中有一个成员是指向本结构体的指针时, 通过这样的指针可以将若干个相同的结构体存储单元连 接成一个新的数据结构。 struct link char ch; struct link *p; a; 当 a.p= struct node *next; ; typedef struct node NODETYPE; main() NODETYPE a,b,c,*h,*p; a.data=10;b.data=20;c.data=30; h= a.next=b.next=c.next=0; P=h; while(p) printf(“%d”,p-data); p=-next; printf(
21、“n”); 102030 h a b c 静态链表 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 此例中,链接到一起的每个结点都是通过定义,由系统在 内存开辟固定的、不一定连续的存储单元,在程序执行过 程,不可能人为产生新存储单元,也不能人为使已开辟的 存储单元消失,称为静态链表。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n利用结构体变量构成链表 2、动态链表的概念 n批量数据的处理可用数组,但必须指明元素的个数,从 而限定了能在一个数组中存
22、放的数据量。而程序每次运 行要处理的数据数通常并不确定,数组定义的小,没有 足够空间,定义大了又会浪费存储空间。如能在程序执 行中根据需要随时开辟存储单元,不需要时随时释放, 则能合理使用存储空间。动态分配的存储单元,地址不 一定连续,但数据间存在关系,链表这样的存储结构能 反映出数据间的联系。由于链表中的每个存储单元都由 动态存储分配获得,故称这样的链表为动态链表。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n利用结构体变量构成链表 2、动态链表的概念 带有头结点的单向链表 987 head 头指针 头结点 / 头
23、结点的数据域中不存放数据,也可以不设头结点,链表最后 一个结点的指针域置成0,标志链表的结束。由于链表每 个结点只有一个指针域,每个指针域存放下一个结点的地址, 因此这种链表只能从当前结点找到后继结点,故称为单向链表。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n利用结构体变量构成链表 3、单向链表 每个结点应由两个成员组成:一个整型成员,一个指向 自身结构的指针类型成员。结点类型定义如下: nstruct slist int data; struct slist *next; ; typedef struct sl
24、ist SLIST; 主要操作:链表的建立、结点数据域的输出、结点的插 入和删除。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n利用结构体变量构成链表 (1)建立带有头结点的单向链表 所谓建立动态链表是指在程序执行过程中从无到有 地建立起一个链表,即一个一个地开辟结点和输入 各结点数据,并建立起前后相链的关系。 例写一函数建立一个有3名学生数据的单向动态链表。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n算法的实现: n 我们约定学号不会为
25、零,如果输入的学号为 n,则表示建立链表的过程完成,该结点不应连 n接到链表中。 n 如果输入的p1-num不等于,则输入的是第 n一个结点数据(n=1),令headp1,即把p1的值 n赋给head,也就是使head也指向新开辟的结点p1 n所指向的新开辟的结点就成为链表中第一个结点。 n图11-13 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n算法的实现: n 再开辟另一个结点并使p1指向它,接着输入该结点的数据。如 果输入的p1-num,则应链入第个结点(n=2), 将新结点的 地址赋给第一个结点的next成员
26、.接着使,也就是使 指向刚才建立的结点。 n图11-14 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n算法的实现: n再开辟一个结点并使p1指向它,并输入该结点的数据.在第三 次循环中,由于(),又将的值赋给- ,也就是将第个结点连接到第个结点之后,并使 ,使指向最后一个结点。 n图11-15 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n算法的实现: n 再开辟一个新结点,并使p1指向它,输入该结点的数据。 由于p1-num的值为,不再执行
27、循环,此新结点不应被连接 到链表中.将NULL赋给p2-next.建立链表过程至此结束,p1最 后所指的结点未链入链表中,第三个结点的next成员的值 n为NULL,它不指向任何结点。 n图11-16 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n建立链表的函数如下: n#include n#include n#define NULL 0 /令令NULL代表,用它表示代表,用它表示“空地址空地址 n#define LEN sizeof(struct student) /令令LEN代表代表struct /student类
28、型数据的长度类型数据的长度 n struct student n long num; n float score; n struct student *next; n ; nint n; /n/n为全局变量,本文件模块中各函数均可使用它为全局变量,本文件模块中各函数均可使用它 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 nstruct student *creat() n struct student *head; struct student *p1,*p2; n=0; n p1=p2=( struct studen
29、t*) malloc(LEN); n scanf(%ld,%f, n head=NULL; n while(p1-num!=0) n n=n+1; if(n=1)head=p1; else p2-next=p1; n p2=p1; p1=(struct student*)malloc(LEN); n scanf(%ld,%f, n n p2-next=NULL; return(head); 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 1.利用结构体变量构成链表 (2)顺序输出单向链表各结点数据域中的内容 首先要知道链表
30、第一个结点的地址,也就是要知道 head的值。然后设一个指针变量p,先指向第一个结 点,输出所指的结点,然后使后移一个结点, 再输出,直到链表的尾结点。 n图11-17,11-18 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n例编写一个输出链表的函数例编写一个输出链表的函数print.print. n void print(struct student *head) n struct student *p; n printf(Now,These %d records are:n,n); p=head; n if(he
31、ad!=NULL) n do n printf(%ld %5.1fn,p-num,p-score); n p=p-next; n while(p!=NULL); n 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 1.利用结构体变量构成链表 (3)在单向链表中插入结点 对链表的插入是指将一个结点插入到一个已有的链 表中。为了能做到正确插入,必须解决两个问题: 怎样找到插入的位置; 怎样实现插入。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n 先用
32、指针变量p0指向待插入的结点,p1指向第一 个结点。将p0-num与p1-num相比较,如果p0- nump1- num ,则待插入的结点不应插在p1所 指的结点之前。此时将p1后移,并使p2指向刚才p1 所指的结点。 n 再将p1-num与p0-num比,如果仍然是p0-num大, 则应使p1继续后移,直到p0-num num为止。 这时将p0所指的结点插到p1所指结点之前。但是如 果p1所指的已是表尾结点,则p1就不应后移了。如 p0- num比所有结点的num都大,则应将p0所指的 结点插到链表末尾。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 1
33、4 结构体、共用体和用户定义类型 n 如果插入的位置既不在第一个结点之前,又不在表 尾结点之后,则将p0的值赋给p2-next,使p2-next 指向待插入的结点,然后将p1的值赋给p0-next,使 得p0-next指向p1指向的变量。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n图11-22 n 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n例插入结点的函数例插入结点的函数insertinsert如下。如下。 nstruct studen
34、t *insert(struct student *head, struct student *stud) nstruct student *p0,*p1,*p2; n p1=head;p0=stud;if(head=NULL) n head=p0; p0-next=NULL; nelsewhile(p0-nump1-num) p1=p1-next; n if(p0-numnum) n if(head=p1) head=p0; p0-next=p1; n else p2-next=p0; n p0-next=p1; n else p1-next=p0; p0-next=NULL; n n=n+
35、1; return(head); n 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 1.利用结构体变量构成链表 (4)删除单向链表中的结点 从一个动态链表中删去一个结点,并不是真正从内 存中把它抹掉,而是把它从链表中分离开来,只要 撤销原来的链接关系即可。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n例写一函数以删除动态链表中指定的结点例写一函数以删除动态链表中指定的结点 n 解题思路: n 从p指向的第一个结点开始,检查该结点中的 nnum值
36、是否等于输入的要求删除的那个学号。如果 n相等就将该结点删除,如不相等,就将p后移一个 n结点,再如此进行下去,直到遇到表尾为止。 n 可以设两个指针变量p1和p2,先使p1指向第 一个结点。如果要删除的不是第一个结点,则使 p1后移指向下一个结点(将p1-next赋给p1),在 此之前应将p1的值赋给p2 ,使p2指向刚才检查 过的那个结点。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n注意: n 要删的是第一个结点(的值等于的值,如图() 那样),则应将-赋给。这时指向原 来的第二个结点。第一个结点虽然仍存在,但
37、它已与链表脱离,因为 链表中没有一个结点或头指针指向它。虽然还指向它,它仍指向 第二个结点,但仍无济于事,现在链表的第一个结点是原来的第二个 结点,原来第一个结点已“丢失” ,即不再是链表中的一部分了。 n如果要删除的不是第一个结点,则将-赋给- ,见图()。-原来指向指向的结点(图 中第二个结点),现在-改为指向-所指 向的结点(图中第三个结点)。所指向的结点不再是链表的一部 分。 n还需要考虑链表是空表(无结点)和链表中找不到要删除的结点 的情况。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n图11-20 n 实
38、实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n删除结点的函数删除结点的函数del:del: nstruct student *del(struct student *head,long num) n struct student *p1,*p2; n if (head=NULL)printf(list null!n);goto end; n p1=head; n while(num!=p1-num p1=p1-next; nif(num=p1-num) n if(p1=head) head=p1-next; n else
39、 p2-next=p1-next; n printf(delete:%ldn,num); n=n-1; nelse printf(%ld not been found!n,num); nend;return(head); 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 1.共用体 共用体的类型说明和变量的定义方式与结构体的类 型说明和变量定义的方式完全相同,不同的是结构 体变量中的成员各自占有自己的存储空间,而共用 体变量中的所有成员占有一个存储空间。几个不同 变量共同占用同一块内存空间,是一种覆盖技术,所谓 的共同占用是
40、指这几个变量共同拥有内存的同一个 起始地址,共用相同的存储单元。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n共用体类型的说明 union 共用体标识名 类型名1 共用体成员名1; 类型名2 共用体成员名2; 类型名n 共用体成员名n; ; 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 n共用体类型的定义 n和结构体变量的定义 相似,也可以采用四种方式。 union un_1 int i; double x; s1,s2,*p; 1、共用体变量
41、在定义的同时只能 给第一个成员的类型的值进行 初始化,如s1和s2在定义的同 时只能赋予整型值。 2、共用体所有成员共享一段公共 存储区,共用体变量所占内存 字节数与其成员中字节数最多 的那个成员相等。 3、变量中所有成员的首地址相等, 且变量地址就是该变量成员的 地址 double x; s1,s2,*p; 设有s1.i=5; 则执行s2=s1; s2.i的值为5。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 14 结构体、共用体和用户定义类型 1.例:下列程序的运行结果是什么例:下列程序的运行结果是什么? 2. main() 3. union zj
42、4. int a; 5. char ch2; 6. au; 7. au.a298; 8. printf(“d,dn,au.ch0,au.ch1); 9. 10.运行结果为:运行结果为:42,1 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 结构体与共用体小结结构体与共用体小结 一、共同点:都是不同类型数据的集合一、共同点:都是不同类型数据的集合 二、不同点:二、不同点: 1 1、结构体中各个成员均在内存中存在,而共同体中只有一个成员存在于、结构体中各个成员均在内存中存在,而共同体中只有一个成员存在于 内存中。内存中。 2 2、结构体占用的存储空间是所有成员
43、所占空间的和、结构体占用的存储空间是所有成员所占空间的和;=;=sizeofsizeof( (结构体名)结构体名) 而共用体所占内存空间的大小是所有成员中占用存储空间最大的一个而共用体所占内存空间的大小是所有成员中占用存储空间最大的一个 成员的占用空间的值。成员的占用空间的值。 3 3、结构体中各个成员相互独立、互不干扰,共同体中改变一个成员的值,、结构体中各个成员相互独立、互不干扰,共同体中改变一个成员的值, 会影响到其它成员的值。会影响到其它成员的值。 4 4、结构体与共同体可以互为成员。、结构体与共同体可以互为成员。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决
44、问题的能力。 15 位运算 n C语言中,位运算的对象只能是整型或字符型数据, 不能是其他类型的数据。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 15 位运算 运算符含义优先级 按位求反1(高) 右移2 b=a2; a: 00000110 (a=6 ) b=a2; a: 11111111 11111000 b=a2: 11111111 11111110 返回 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 15 位运算 n(4)按位与 运算功能:把参加运算的两个运算数按对应的二进 制位进行“与”运算,当两个位都是1时
45、,该位的结 果为1,否则为0。 12:00001100 如 FILE *fp1,*fp2; 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 16 文件 n打开文件 在对文件进行读、写操作之前,首先要解决的问 题是如何把程序中要读、写的文件与磁盘上实际 的数据文件联系起来。C语言中通过调用库函数 fopen来实现。 fopen(文件名,文件使用方式) 返回一个指向FILE 类型的指针。 FILE *fp; fp=fopen(“file_a”,”r”); 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 16 文件 n打开文件
46、无论使用哪种方式打开,当打开文件出现了错误, fopen函数将返回NULL,建议使用以下程序段,在 打开文件发生错误时程序停止运行。 #include if(fp=fopen(“file_a”,”r”)=NULL) printf(“cannot open this file”); exit(0); /打开文件失败,返回运行环境。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 16 文件 n打开文件 文件打开方式及其含义 (1)r 为读而打开文本文件 (2)rb 为读而打开一个二进制文件 (3)w 为写而打开文本文件,若文件不存在,则 新建一个文件;如已存在
47、,则从文件的起始位置开 始写,文件中原有的内容将全部消失。 (4)Wb 为写而打开二进制文件。可以在指定位置 进行写操作,其余功能与w相似。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 16 文件 n打开文件 (5)a 为在文件后面添加数据而打开文本文件。如 指定文件不存在,系统用指定的文件建立一个新 文件;如果指定文件存在,则文件中原有内容将 保存,新的内容写在原有内容之后。 (6)ab 为在文件后面添加数据而打开一个二进制 文件。其余功能与“a”相同。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 16 文件 n
48、打开文件 (7)r+ 为读和写而打开文本文件,用这种方式,指 定的文件已经存在,既可以对该文件进行读,也 可以对该文件进行写,在读和写操作之间不关闭 文件。只是对于文本文件来说,读和写总是从文 件的起始位置开始。在写新的数据时,只覆盖新 数据所占的空间,其后的老数据并不丢失。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 16 文件 n打开文件 (8)rb+ 为读和写而打开一个二进制文件,功能与 r+相同,只是在读和写时,可以由位置函数设置 读和写的起始位置,也就是说不一定从文件的起 始位置开始读和写。 (9)w+ 首先建立一个新文件,进行写操作,随后 可
49、以从头开始读。如果指定的文件已存在,则原 有的内容将全部消失。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 16 文件 n打开文件 (10)wb+ 功能与w+相同,只是在随后的读和写时, 可以由位置函数设置读和写的起始位置。 (11) a+ 功能与a相同,只是在文件尾部添加新的 数据之后,可以从头开始读。 (12)ab+ 功能与a+相同,只是在文件尾部添加新 的数据之后,可以由位置函数设置开始读的起始 位置。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 16 文件 n关闭文件 当对文件的读(写)操作完成之后,必须将
50、它关 闭。关闭文件可调用库函数fclose来实现。调用形 式为 fclose(文件指针); 若fp指向文件file_a的文件指针,当执行fclose(fp)后, 若file_a为读方式,则文件指针fp与文件file_a脱离关系; 若为写,则将文件缓冲区中的剩余数据全部输出到文 件,然后fp与file_a脱离关系。 当成功地执行关闭操作后,函数返回0,否则返回非0. 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 16 文件 n(1)调用getc(fgetc)和putc(fputc)函数进行输入和 输出 n调用putc(fputc)函数输出一个字符 putc(
51、ch,fp); 将字符ch写到文件指针fp所指文件中 去,如果输出成功,putc函数返回所输出的字符; 如果输出失败,则返回一个EOF值。EOF是在 stdio.h库函数中定义的符号常量,值为-1。 n fputc调用形式与功能与putc函数完全相同。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 16 文件 n 调用getc(fgetc)函数输入一个字符 ch=getc(pf); 从pf指定的文件中读入一个字符, 并把它作为函数值返回。 fgetc函数的调用形式和功能与getc函数完全相同。 实实在在学知识 顺顺利利过考试 学C语言,就是学思考问题的过程 和解决问题的能力。 16 文件 n(2)判断文件结束函数feof 因为文本文件数据都是以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金鼎站高压旋喷桩专项施工方案
- 2026压力焊作业证考试题库及模拟考试答案
- 幼儿园门窗安装施工方案
- 新型梁单元钢混组合梁性能优化方案
- 林地占用调查方案
- 2026学年河南省巩义市三年级语文期末自测模拟知识整合题(详细参考解析)详细答案和解析
- 锂离子电池隔膜生产线项目运营管理方案
- 工程道路施工组织方案
- 2023-2024学年山东省烟台市高三(上)期中数学试卷
- 2023-2024学年青海省西宁市大通县高二(下)期末数学试卷
- 【小升初真题】2025年贵州省铜仁市小升初数学试卷(含答案)
- 电工检修安全培训课件
- 人工智能赋能英语听说教学
- T-CSAC 019-2025 智能网联汽车网络安全检测技术要求
- 2025国家知识产权局知识产权检索咨询中心第二批招聘20人笔试模拟试题及答案解析
- 煤矿安全监控系统(AQ1029-2026)
- 2025胰岛素皮下注射团体标准解读
- QGDW10936-2018物料主数据分类与编码规范
- 跨国公司投资中国40年
- T/CCMA 0048-2017二手工程机械评估师
- 2025+CSCO宫颈癌诊疗指南解读 课件
评论
0/150
提交评论