




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章结构体、共用体与枚举教学目的:经过本章学习,要求学生能熟练运用构造体这一新的数据构造编制较复杂的运用程序,并掌握链表的建立、插入、删除、查找等操作的算法。 本讲重点:构造体变量的定义、援用、初始化;用指针处置链表;typedef自定义构造体类型的方法。 本讲难点:用指针处置链表。教学方法:实际教学与实际教学相结合。第7章结构体、共用体与枚举第七章第七章 构造体、共用体与枚举构造体、共用体与枚举7.1 7.1 构造体类型与变量构造体类型与变量 7.2 7.2 构造体数组构造体数组 7.3 7.3 构造体类型数据的指针构造体类型数据的指针 7.4 7.4 构造体位段构造体位段 7.5 7.5
2、 共用体类型与变量共用体类型与变量7.6 7.6 枚举类型与变量枚举类型与变量 7.77.7程序设计举例程序设计举例 第7章结构体、共用体与枚举7.1 7.1 构造体类型与变量构造体类型与变量 7.1.1 7.1.1 构造体类型定义构造体类型定义构造体类型定义的普通方式为:构造体类型定义的普通方式为: struct struct 构造体类型名构造体类型名 类型类型1 1 成员成员1 1; 类型类型2 2 成员成员2 2; 类型类型n n 成员成员n n; ;例如:struct student int num; char name20; char sex; int age; float scor
3、e; char addr30; ;第7章结构体、共用体与枚举阐明:1. 构造体类型由“struct 构造体类型名一致阐明和援用。2. 只需变量才分配地址,类型定义并不分配内存空间。3. 构造体中阐明的各个成员类似于以前的变量,但在类型定义时不分配地址。4. 一样类型的成员可以合在一个类型下阐明。如 struct student int num,age; char name20,sex,addr30; float score; ;5. 最后一定要以分号终了。第7章结构体、共用体与枚举6. 可以嵌套定义,即在构造体类型定义中又有构造体类型的成员。如 struct student int num,a
4、ge; char name20,sex,addr30; struct float Chinese,Math,Physics,English; score;/* 无名构造体类型定义的成员score */ ;7. 构造体类型有作用范围的。即,它与变量一样,有全局和部分之分。在一个函数中定义的构造体类型是部分的,只能用于在该函数中定义构造体变量;在函数之外定义的构造体类型是全局的,可定义在其后用到的构造体类型的全局和部分变量。 第7章结构体、共用体与枚举7.1.2 构造体变量的定义和援用 定义构造体类型变量有如下三种方式(以上面的构造体类型 student为例):1. 定义构造体类型之后再定义构造体
5、类型变量,如 struct student a,b,c; 定义了三个构造体类型变量a、b和c。2. 定义构造体类型同时定义构造体类型变量,如 struct student int num; char name20; char sex; int age; float score; char addr30; a,b,c; 也定义了三个构造体类型变量a、b和c。第7章结构体、共用体与枚举3. 定义无名构造体类型同时定义构造体类型变量,如 struct int num; char name20; char sex; int age; float score; char addr30; a,b,c;也定
6、义了三个构造体类型变量a、b和c。但这种方法只能在此定义变量,由于没有类型称号,所以这种构造体类型无法反复运用。第7章结构体、共用体与枚举无论哪种定义变量的方式,系统都将给已定义的变量分配地址。分配内存空间的大小为各个成员所占地址空间的总和,并且各个成员变量是按类型定义的顺序分配地址空间的。那么如何运用各个成员变量呢?成员的援用方式:普通地,要援用到最底层的成员。 构造体类型变量名.成员变量名.成员变量名. 第7章结构体、共用体与枚举【例7.1】构造体成员援用举例。main() struct student int num,age; char name20,sex,addr30; struct
7、 float Chinese,Math,Physics,English; score; a=4102,21,Li Ping,F, Road 11#,87,63,54,72; printf(No.:%dnName:%snSex:%cnAddress:%sn,a.num,, a.sex,a.addr); printf(Chinese:%5.1fnMath:%5.1fnPhisics:%5.1fnEnglish:%5.1fn, a.score.Chinese,a.score.Math,a.score.Physics,a.score.English);第7章结构体、共用体与枚举运转结果:N
8、o.:4102Name:Li PingSex:FAddress: Road 11#Chinese:87.0Math:63.0Physics:54.0English:72.0第7章结构体、共用体与枚举在从键盘读入数据给变量赋值时,也要按地址方式进展。如 scanf(%d,&a.num); scanf(%s,); scanf(%c,&a.sex); scanf(%f,&a.score.Chinese);构造体变量还可以整体赋值,将上面程序修正如下,运转结果是一样的。main() struct student int num,age; char name20,se
9、x,addr30; struct float Chinese,Math,Physics,English; score; a=4102,21,Li Ping,F, Road 11#,87,63,54,72,b; 第7章结构体、共用体与枚举b=a; /* 构造体变量的整体赋值 */printf(No.:%dnName:%snSex:%cnAddress:%sn, b.num,,b.sex,b.addr);printf(Chinese:%5.1fnMath:%5.1fnPhysics:%5.1fn English:%5.1fn,b.score.Chinese, b.score.Math,
10、b.score.Physics,b.score.English);第7章结构体、共用体与枚举7.2 7.2 构造体数组构造体数组 和普通数组一样,我们也可以定义构造和普通数组一样,我们也可以定义构造体数组。那么,构造体数组中的每个分量就体数组。那么,构造体数组中的每个分量就相当于一个构造体变量了,用法自然与普通相当于一个构造体变量了,用法自然与普通构造体变量一样。通常地,构造体数组都是构造体变量一样。通常地,构造体数组都是一维的,当然,也可以定义多维的。构造体一维的,当然,也可以定义多维的。构造体数组相当于一张二维数据表,表的横向相当数组相当于一张二维数据表,表的横向相当于记录,而列向可以称为
11、属性,用于描画每于记录,而列向可以称为属性,用于描画每条记录的一切信息。比如,下面的表格就可条记录的一切信息。比如,下面的表格就可以用构造体数组处置。以用构造体数组处置。第7章结构体、共用体与枚举【例7.2】输出上述表格信息。#define N 3struct student char num7,name7; int com,eng,total;main() int i; struct student stuN=202149,王学海, 83,77,0, 203120,刘玉芳,89,72,0, 202134,邱玲,76,68,0; printf(学号t姓名t计算机成果t英语成果t总成果n); 第
12、7章结构体、共用体与枚举for(i=0;iN;i+) stui.total=stui+stui.eng; printf(%st%st%dtt%dtt%dn, stui.num,,stui, stui.eng,stui.total); 运转结果:学号姓名计算机成果英语成果总成果202149王学海8377160203120刘玉芳8972161202134邱玲7668144第7章结构体、共用体与枚举【例5.3】统计候选人得票数。假设有三个候选人,由10个选民参与投票选出一个代表。#include string.hstruct person char name20; int coun
13、t;leader3=li,0,zhang,0,xue,0;main() int i,j; char select20; for(i=0;i10;i+) printf(%dtPlease input your result:,i+1); scanf(%s,select); for(j=0;j3;j+) if(strcmp(,select)=0) leaderj.count+; 第7章结构体、共用体与枚举printf(-=The result=-n); for(j=0;j-。 援用方法如下:援用方法如下: ( (* *构造体指针变量名构造体指针变量名).).成员名成员名 /
14、 /* *圆括号不能圆括号不能省略省略* */ /。 构造体指针变量名构造体指针变量名-成员名成员名 第7章结构体、共用体与枚举【例7.4】指向构造体变量的指针的运用。#include string.hmain() struct student long num; char name20,sex; float score; ; struct student stu,*p; p=&stu; stu.num=89101; strcpy(,Li Lin); stu.sex=M; 第7章结构体、共用体与枚举stu.score=89.5; printf(No.:%ldnname:
15、%snsex:%cnscore:%fn, (*p).num,(*p).name,(*p).sex,(*p).score); printf(No.:%ldnname:%snsex:%cnscore:%fn, p-num,p-name,p-sex,p-score);运转结果:No.:89101 name:Li Lin sex:M score:89.500000 No.:89101 name:Li Lin sex:M score:89.500000第7章结构体、共用体与枚举在存取构造体变量中的成员值时,有如下三种方式:1. 构造体变量名.成员名2. (*构造体指针变量名).成员名3. 构造体指针变量
16、名-成员名第7章结构体、共用体与枚举7.3.2 构造体数组的指针与指针变量 【例7.5】构造体数组指针举例。struct student int num; char name20,sex; int age;struct student stu3=10101,Li Lin,M,18, 10102,Wan Fen,M,19, 10104,Liu Min,F,20;第7章结构体、共用体与枚举main() struct student *p; printf( No.tNametSextAgen); for(p=stu;pnum,p-name, p-sex,p-age);运转结果:No.NameSexA
17、ge10101 Li LinM1810102 Wan FenM1910104 Liu MinF20由于p是指向构造体数组的指针变量,所以p+是按数组元素的长度挪动的,即它每次挪动都是挪动到数组中各个构造体分量的首地址。 第7章结构体、共用体与枚举7.3.3 构造体指针与变量作函数参数与普通变量一样,构造体指针和变量也可以作为函数的参数进展值的传送,略有不同的是构造体变量的成员也可以作为函数的参数。函数的前往值也可以是构造体类型的数据。【例7.6】找出例7.5中的第一个女生的记录。#include stdio.hstruct student int num; char name20,sex; i
18、nt age;struct student stu3=10101,Li Lin,M,18, 10102,Wan Fen,M,19, 10104,Liu Min,F,20;第7章结构体、共用体与枚举main() struct student *p,*search(); p=search(stu,3); printf(%dt%st%ct%dn,p-num,p-name,p-sex,p-age);struct student *search(struct student *s,int n) struct student *q=s; for(;qsex=F) return q; return NULL
19、;运转结果:10104 Liu MinF20第7章结构体、共用体与枚举7.3.4 自定义类型 除可直接运用提供的规范类型和自定义的类型构造、共用、枚举外,也可运用typedef定义已有类型的别名。该别名与规范类型名一样,可用来定义相应的变量。 定义已有类型别名的方法如下: 1按定义变量的方法,写出定义体; 2将变量名换成别名; 3在定义体最前面加上typedef。例如: 给实型float定义1个别名REAL。 1按定义实型变量的方法,写出定义体:float f; 2将变量名换成别名: float REAL; 3在定义体最前面加上typedef:typedef float REAL;第7章结构体
20、、共用体与枚举给如下所示的构造类型struct date定义1个别名DATE。struct date int year, month, day; ;1按定义构造变量的方法,写出定义体: struct date d;2将变量名换成别名: struct date DATE;3在定义体最前面加上typedef: typedef struct date int year, month, day; DATE;第7章结构体、共用体与枚举例如,自定义一个数组类型名ARRAY:1.写出定义体: int a100;2.将变量名换成别名: int ARRAY100;3.在定义体最前面加上typedef: type
21、def int ARRAY100;用新类型名定义变量 ARRAY a,b,c;标识符a、b和c都被定义成具有100个分量的整型一维数组。相当于下面定义方式:int a100,b100,c100;阐明: 用typedef只是给已有类型添加个别名,并不能发明个 新的类型。就好像人一样,除学名外,可以再取一个小名或雅号,但并不能发明出另一个人来。第7章结构体、共用体与枚举7.4 7.4 构造体位段构造体位段 以前引见的数据存取都是以字节为单位的。实践上,有时存储一个数据不用用一个或多个字节,只须运用一个或几个二进制位即可。例如,存放真假值,只须运用一个二进制位存放1或0即可。这样,经常在一个字节中可
22、以存放多个数据,从而节省大量的存储空间。运用二进制位来存储信息可以有很多种方法,其中最主要的一种就是位段。 C言语允许在一个构造体上以二进制位为单位来指定其成员所占空间的长度,这种以位为单位的成员就称为“位段或“位域(bit field)。第7章结构体、共用体与枚举例如:struct packed_data unsigned a:2; /* 指定成员a占2位 */ unsigned b:6; /* 指定成员b占6位 */ unsigned c:5; /* 指定成员c占5位 */ unsigned d:3; /* 指定成员d占3位 */ int i; /* 指定成员i为整型,占16位 */dat
23、a; /* 定义构造体类型同时定义了一个变量data */其内存分配为:a、b、c、d分别占2位、6位、5位、3位。i为整型成员,占2个字节。这样,变量data共占4个字节,见图7.1。第7章结构体、共用体与枚举由于位段本身是在一个构造体中,所以其成员的存取方法与构造体数据的存取方法一样。假设,data.a=2,data.b=37,data.c=28,data.d=6,data.i=300,那么内存数据图见图7.2。 在给位段成员赋值时,一定要留意成员的取值范围。比如,a占两位,其取值范围为:0011,即03。假设数据超出了它们的取值范围,将会丧失。运用位段时应留意以下几点:1. 一个位段长度
24、不能超越一个存储单元(通常为2字节)。2. 一个位段不能跨越两个存储单元。本单元剩余二进制位假设存放不下一个位段时,那么省略不用,这个位段自动放到下一存储单元开头位置。第7章结构体、共用体与枚举3. 用户不想用的二进制位可以定义成无名位段。如,struct packed_data unsigned a:2; unsigned :6; /* 指定无名位段,占6位,不用 */ unsigned c:5; unsigned d:3; int i; data;4. 设置长度为0的位段,使得下一个位段从下一字节开场存放。struct packed_data unsigned a:2; unsigned
25、:0;/* 指定长度为0位段,使得位段c从下一字节开场 */ unsigned c:5; unsigned d:3; int i; data;第7章结构体、共用体与枚举5. 位段数据可以按整型数据援用和输出。6. 不能定义位段数组。 7. 位段成员的类型必需指定为unsigned int。 【例7.7】位段操作举例。typedef struct unsigned int f1:1; unsigned int f2:2; unsigned int :0; unsigned int data:4; bitfield;main() bitfield btf; btf.f1=1; btf.f2=2;
26、btf.data=9; 第7章结构体、共用体与枚举printf(sizeof(btf)=%dn,sizeof(bitfield); printf(btf.f1=%dn,btf.f1); printf(btf.f2=%dn,btf.f2); printf(btf.data=%dn,btf.data); printf(btf=%xHn,btf); printf(nPlease input 16 bit hexidecimal number:); scanf(%4x,&btf); printf(btf.f1=%dn,btf.f1); printf(btf.f2=%dn,btf.f2); pr
27、intf(btf.data=%dn,btf.data); printf(btf=%dn,btf);第7章结构体、共用体与枚举运转结果:sizeof(btf)=2btf.f1=1btf.f2=2btf.data=9btf=9d5HPlease input 16 bit hexidecimal number:9ae4btf.f1=0btf.f2=2btf.data=10btf=-25884第7章结构体、共用体与枚举7.5 7.5 共用体类型与变量共用体类型与变量 有时需求将不同类型的数据存放到同一段有时需求将不同类型的数据存放到同一段内存单元中。需求什么类型的数据这里就存放内存单元中。需求什么类型
28、的数据这里就存放什么类型的数据。这些数据的起始地址都是一什么类型的数据。这些数据的起始地址都是一样的,数据之间相互覆盖,只需最后一次存入样的,数据之间相互覆盖,只需最后一次存入的数据才是有效的。这种几个不同的变量占用的数据才是有效的。这种几个不同的变量占用同一段内存的构造称为同一段内存的构造称为“共用体类型的构造。共用体类型的构造。7.5.1 7.5.1 共用体类型定义共用体类型定义共用体类型定义的普通方式为:共用体类型定义的普通方式为: union union 共用体类型名共用体类型名 类型类型1 1 成员成员1 1; 类型类型2 2 成员成员2 2; 类型类型n n 成员成员n n; ;
29、第7章结构体、共用体与枚举例如:union data int i; char ch; float f; ; 从定义方式上来看,它同构造体极为类似。所不同的是它阐明的几个成员不像构造体那样顺序存储,而是叠放在同一个地址开场的空间上,见图7.3。共用体类型的长度为最大成员所占空间的长度。比如,上面的union data类型的长度为4个字节,也就是float类型所占的空间长度。图7.3第7章结构体、共用体与枚举7.5.2 共用体变量的定义和援用 同构造体变量类似,定义共用体类型变量也有如下三种方式(以上面的共用体类型union data为例):1. 定义共用体类型之后再定义共用体类型变量,如 uni
30、on data a,b,c; 定义了三个共用体类型变量a、b和c。2. 定义共用体类型同时定义共用体类型变量,如 union data int i; char ch; float f; a,b,c; 也定义了三个共用体类型变量a、b和c。第7章结构体、共用体与枚举3. 定义无名共用体类型同时定义共用体类型变量,如 union int i; char ch; float f; a,b,c; 也定义了三个共用体类型变量a、b和c。但这种方法只能在此定义变量,由于没有类型称号,所以这种方式的类型无法反复运用。共用体成员的援用方式与构造体成员的援用方式没有差别,普通地,也要援用到最底层的成员。成员援用
31、方式为: 共用体类型变量名.成员变量名.成员变量名. 第7章结构体、共用体与枚举【例7.8】共用体类型举例。union data int i; char ch; float f;main() union data ua; ua.i=10; ua.ch=A; ua.f=3.14; printf(i=%dtch=%ctf=%ftua=%fn,ua.i,ua.ch,ua.f,ua);运转结果为:i=-2621ch= f=3.140000ua=49.920021只需最后一次赋值的成员f是有效的值。 第7章结构体、共用体与枚举留意: 共用体变量不能整体赋值,也不可以对共用体变量进展初始化处置;共用体变量
32、不能作函数参数传送,也不能使函数前往一个共用体类型的数据;但可以运用共用体类型的指针和变量进展参数传送和成员援用等,其用法同构造体类型。 第7章结构体、共用体与枚举7.6 7.6 枚举类型与变量枚举类型与变量7.6.1 7.6.1 枚举类型定义枚举类型定义 枚举类型定义也根本上同构造体和共用枚举类型定义也根本上同构造体和共用体类型定义,它的普通格式为:体类型定义,它的普通格式为: enum enum 枚举类型名枚举类型名 枚举常量枚举常量1=1=序号序号1 1, 枚举常量枚举常量2=2=序号序号2 2, 枚举常量枚举常量n=n=序号序号n n ; ;其中,枚举常量是一种符号常量,也称为枚其中,
33、枚举常量是一种符号常量,也称为枚举元素,要符合标识符的起名规那么。序号举元素,要符合标识符的起名规那么。序号是枚举常量对应的整数值,可以省略,省略是枚举常量对应的整数值,可以省略,省略序号那么按系统规定处置。序号那么按系统规定处置。第7章结构体、共用体与枚举留意类型定义中各个枚举常量之间要由逗号间隔,而不是分号,最后一个枚举元素的后面无逗号。例如,有如下类型定义:enum weekday sun,mon,tue,wed,thu,fri,sat;这里,列出了枚举类型enum weekday一切能够的7个值。省略序号,系统默许从0开场延续陈列。如上面的枚举类型中,sun对应0、mon对应1、sat
34、对应6。假设遇到有改动的序号,那么序号从被改动位置开场延续递增。例如,假设把上面的枚举类型改为下面的方式:enum weekday sun,mon=6,tue,wed,thu=20,fri,sat;那么7个枚举元素的序号依次为:0、6、7、8、20、21、22。 第7章结构体、共用体与枚举7.6.2 枚举变量与枚举元素 同构造体与共用体变量类似,定义枚举类型变量也有如下三种方式(以上面的枚举类型enum weekday为例):1. 定义枚举类型之后再定义枚举类型变量,如 enum weekday yesterday,today,tomorrow;2. 定义枚举类型同时定义枚举类型变量,如enu
35、m weekday sun,mon,tue,wed,thu,fri,sat yesterday,today,tomorrow; 3. 定义无名枚举类型同时定义变量,如 enum sun,mon,tue,wed,thu,fri,sat yesterday,today,tomorrow;这种类型无法反复运用 第7章结构体、共用体与枚举阐明1枚举型仅顺应于取值有限的数据。例如,根据现行的历法规定,周天,年个月。2取值表中的值称为枚举元素,其含义由程序解释。例如,不是由于写成“Sun就自动代表“星期天。现实上, 枚举元素用什么表示都可以。3枚举元素可以进展比较。4不允许直接把一个整数赋值给一个枚举变量
36、 如,today=5是非法的, 应该进展强迫类型转换, 写成:today=(enum weekday)5; 5枚举元素的值是不能直接输出的 ,通常要用到switch语句与字符串输出语句结合起来才行。6枚举型变量的取值仅限于值表中的值。第7章结构体、共用体与枚举【例7.9】口袋中有红、黄、蓝、白、黑5种颜色的球假设干个。每次从口袋中取出3个球,问得到3种不同颜色的球的一切能够取法,并打印出每种组合的3种颜色。main() enum colorred,yellow,blue,white,black; enum color i,j,k,pri; int n,loop; n=0; for(i=red;i=black;i+) for(j=red;j=black;j+) 第7章结构体、共用体与枚举if(i!=j) for(k=red;k=black;k+) if(k!=i)&(k!=j) printf(%-4d,+n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳动代理协议书范围
- 劝退退租协议书范本
- 校园欺凌协议书范文
- 机电维修回收协议书
- 艺术培训家长协议书
- 提前休养待岗协议书
- 骑车风险自负协议书
- 资产买卖居间协议书
- 县城店面转租协议书
- 员工春节回家协议书
- 4-6岁幼儿同伴交往能力量表
- 人教版 数学一年级下册 第三单元 100以内数的认识综合素养评价(含答案)
- 无锡诺宇医药科技有限公司放射性药物开发及核药装备研制项目报告表
- 2025年中考道德与法治仿真模拟测试卷(含答案)
- 2025年河南艺术职业学院单招职业技能测试题库及参考答案
- 2024辽宁能源集团所属能源投资集团招聘3人笔试参考题库附带答案详解
- 2025年度马铃薯种薯产业扶贫与乡村振兴合作合同4篇
- 《退役锂电池清洁循环利用技术规范》编制说明
- 交通法律法规知识培训
- 夜间安全施工培训
- 零售药店医疗保障定点管理暂行办法
评论
0/150
提交评论