版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 程序设计技术基础第九章 结构体与共用体2022/7/2329.1.1 结构体类型的定义9.1.2 结构体变量的定义9.1.3 结构体变量的初始化和引用9.1 结构体类型9.1.1 结构体类型的定义结构体是一种自定义的数据类型,需要先定义才能使用。定义一个结构体类型的一般形式为:struct 结构体名 成员说明表列 ;2022/7/233其中,成员说明表列是组成该结构体类型的所有数据的说明,若有n个成员,则每个成员均需作数据类型说明,可表示为: 数据类型 成员标识符1; 数据类型 成员标识符2; 数据类型 成员标识符n;2022/7/234【例9-1】 有一个学生成绩表,如表9-1所示,定义一
2、个结构体类型表示此结构。2022/7/235 numbernamesexmathcomputer10001Lifunm788810002 Lilinf8789 学生成绩表第九章 结构体与共用体2022/7/236struct student long number; char name20; char sex; float math; float computer; ;定义如下:说明:(1) 结构体名和结构体成员名遵循C语言标识符的命名规则,建议用具有一定意义的单词来命名。如【例9-1】中的student。(2) 结构体成员的类型定义形式与简单变量的定义形式相同。2022/7/237(3) s
3、truct是关键字,不能省略。(4)“struct student”作为一个整体表示类型名,和普通数据类型一样都可用来定义变量的类型。(5) 一对外面最后的分号是结构体定义的结束标志,不能省略。2022/7/2389.1.2 结构体变量的定义1. 先定义结构体类型,再定义其变量 一般形式为: struct 结构体名 成员说明表列 ; struct 结构体名 结构体变量列表;2022/7/239例如,前面已经定义了一个结构体类型struct student,可以用它来定义具有该类型的结构体变量stu1,如下: struct student stu1;2022/7/23102. 定义结构体类型的同
4、时定义结构体变量一般形式为: struct 结构体名 成员说明表列 变量名表列;例如,在定义struct student的同时,定义与它具有相同结构的结构体变量stu2。2022/7/2311第九章 结构体与共用体2022/7/2312struct student long number; char name20; char sex; float math; float computer; stu2;3. 不出现结构体名,直接定义结构体变量一般形式为:struct 成员说明表列 变量名表列;例如, 2022/7/2313第九章 结构体与共用体2022/7/2314struct student
5、long number; char name20; char sex; float math; float computer; stu3;第三种方法只定义了结构体变量stu3,没有出现结构体名,因此,该方法不能再用来定义其他同类型的结构体变量。说明:在一个结构体中也可以包含另一个结构体。如:2022/7/2315第九章 结构体与共用体2022/7/2316struct date /*定义结构体date */ int month; int day; int year;struct student long number; char name20; struct date birthday; /*
6、birthday是struct date类型*/ char sex; float math; float computer;这里定义了一个结构体类型struct date,代表“日期”,包含3个成员:month、day、year。在定义struct student类型时,成员birthday的类型定义为struct date类型。struct student的结构如表9-2所示。2022/7/2317numbernamebirthdaysexmathcomputer struct student结构9.1.3 结构体变量的初始化和引用1. 结构体变量的初始化对结构体变量进行初始化,也就是给结构
7、体变量的各个成员赋初值。(1)对已经定义的结构体变量初始化例如,在【例9-1】中已经定义了结构体类型struct student,再定义一个结构体变量stu1并进行初始化。struct student stu1=10001, Lifun , m,78, 88;。2022/7/2318(2)同时完成结构体类型定义、结构体变量定义和初始化 struct student long number; char name20; char sex; float math; float computer; stu2=10002, Lilin ,f, 87, 89;2022/7/23192. 结构体变量的引用(
8、1)引用结构体变量的成员访问结构体变量的成员必须用成员运算符。其一般形式为:结构体变量名.成员名例如,、stu2. math等。2022/7/2320如果成员本身又是一个结构体类型的变量(结构体嵌套),则在访问该结构体变量的成员时,应采取逐级访问的方法,通过成员运算符逐级找到最底层的成员再引用。如想要得到学生的出生日期,则可以这样引用:stu2.birthday.month、stu2.birthday.day、stu2.birthday.year2022/7/2321(2)整体引用结构体变量同类型的结构体变量,可以将一个结构体变量整体赋值给另一个结构体变量。例如:struct
9、 student stu1=10001, Lifun , m, 78, 88;struct student stu3;stu3 =stu1;通过赋值,结构体变量stu3中每个成员的值和结构体变量stu1每个成员的值相同。2022/7/2322第九章 结构体与共用体2022/7/2323#include struct salary /*定义结构体类型,描述工资信息*/ float base; /*基础工资*/ float allowances; /*津贴*/ float taxes; /*税金*/;【例9-2】 阅读下面程序,了解结构体成员的引用方法。第九章 结构体与共用体2022/7/2324
10、struct worker /*定义结构体类型,描述职工基本信息*/ long number; /*工号*/ char name12; /*姓名*/ struct salary sal; /*工资*/ ;第九章 结构体与共用体2022/7/2325int main() struct worker wk1=120101, Liyue, 2780.5, 1356.5, 124.11; struct worker wk2; wk2=wk1; 0=M; 1=a; wk2.number=120102; wk2.sal.allowances=2168.5; wk2.sal.
11、taxes=(wk2.sal.base+wk2.sal.allowances)*0.03; printf(工号 t姓名t基础工资t津贴tt税金n); printf(%ldt%st%.2ftt%.2ftt%.2fn, wk1.number,, wk1.sal.base, wk1.sal.allowances, wk1.sal.taxes); printf(%ldt%st%.2ftt%.2ftt%.2fn, wk2.number, , wk2.sal.base, wk2.sal.allowances, wk2.sal.taxes); return 0;2022/7/
12、23269.2 结构体数组1 结构体数组的定义结构体数组的定义方法如下:struct student xs30;它定义了一个有30个元素的结构体数组xs,数组中每个元素都是struct student类型。也可以直接定义结构体数组,如:2022/7/2327第九章 结构体与共用体2022/7/2328struct student long number; char name20; char sex; float math; float computer;xs30;第九章 结构体与共用体2022/7/2329struct student long number; char name20; cha
13、r sex; float math; float computer;xs30;或者2 结构体数组的初始化结构体数组的初始化是对结构体数组元素成员的初始化,形式和多维数组的初始化类似。其一般形式是在定义结构体数组的后面加上: =初值表列; 例如,struct student xs30 =10001, Lifun ,m, 78, 88,10002, Wangli ,f, 89, 90;2022/7/23303 结构体数组的引用结构体数组的引用也是引用结构体数组元素的成员,与普通数组引用类似,其一般形式为: 数组名下标.成员名 例如, xs0.number /*引用第一个学生的学号*/ xs1.na
14、me /*引用第二个学生的名字*/2022/7/2331第九章 结构体与共用体2022/7/2332int main() int i, num = 0; float sum = 0; struct student class5 = 10001,Li ping, 18, 96,10002,Zhang ping, 19, 88, 10003,He fang, 18,79,10004,Cheng ling, 17,69, 10005,Wang ming, 17, 57; /*定义并初始化结构体数组*/ for(i=0; i5; i+) sum+= classi.math; /*引用结构体数组成员计算
15、总成绩*/ if(classi.math 90) num+; printf(sum=%.2fnaverage=%.2fnnum=%dn, sum, sum/5, num); return 0;第九章 结构体与共用体2022/7/2333#include struct student /*定义结构体类型,描述学生信息*/ long number; /*学号*/ char name20; /*姓名*/ int age; /*年龄*/ float math; /*成绩*/;【例9-3】已知5名学生的信息,包含学号、姓名、年龄、数学成绩,要求利用结构体数组计算5个学生的数学平均分,并统计数学小于90分
16、的学生人数。2022/7/23349.3.1指向结构体变量的指针9.3.2指向结构体数组的指针9.3 指向结构体的指针9.3.1 指向结构体变量的指针结构体指针变量定义一般形式为: struct 结构体名 *结构体指针变量名;例如:2022/7/2335第九章 结构体与共用体2022/7/23信息与计算机学院计算机基础教学部36struct student long number; char name20; char sex; float math; float computer;struct student stu1;struct student *p=&stu1;定义了结构体指针变量后,如
17、何访问该指针变量指向的结构体成员呢?可以使用下面两种运算符:(1)圆点运算符一般形式为:(*结构体指针变量名).成员名。例如,(*p) . name,表示指针变量p指向结构体变量stu1的name成员。(2)指向运算符(也称箭头运算符)一般形式为:结构体指针变量名成员名。例如,p-name,表示指针变量p指向结构体变量stu1的name成员。2022/7/23379.3.2 指向结构体数组成员的指针指针变量可以指向普通数组,同样,指针变量也可以指向结构体类型的数组。例如:2022/7/2338第九章 结构体与共用体2022/7/23信息与计算机学院计算机基础教学部39struct studen
18、t long number; char name20; char sex; float math; float computer;struct student stu20;struct student *p=stu;第九章 结构体与共用体2022/7/2340#include struct student1 long number; char name20; char sex; int age; ; /*定义结构体变量和结构体数组,并初始化*/struct student1 stu4=10101,Lixiao, m, 19;struct student1 stu3= 10102,“Liping
19、”, m,18,10103,Zhangping, m, 20,10104,Hefang, f, 22;【例9-4】熟悉如何用指针访问结构体变量和结构体数组。第九章 结构体与共用体2022/7/2341int main() int i; struct student1 *p,*q; /*定义结构体指针*/ p=&stu4; /*p指向结构体变量*/ printf( number name sex agen); printf( %5d %-10s%2c%5dn,(*p).number, p-name, (*p).sex, p-age); q=stu; /*q指向结构体数组*/ for(i=0; i
20、name, (*q).sex, q-age); q+; return 0;2022/7/23429.4.1结构体作函数参数9.4.2结构体作函数返回值9.4 结构体与函数9.4.1 结构体作函数参数结构体作函数参数,既可以把结构体变量作为函数参数,实现值传递,也可以把指向结构体的指针作为函数参数,实现地址传递。2022/7/2343第九章 结构体与共用体2022/7/2344#include struct date int nian; int yue; int ri;【例9-5】值传递,结构体变量作函数参数。第九章 结构体与共用体2022/7/23信息与计算机学院计算机基础教学部45int r
21、iqi(struct date a) /*结构体变量作函数参数*/ a.nian=2018; a.yue =5; a.ri=22; return 0; int main() struct date b; b.nian=2017; b.yue=4; b.ri=26; printf(调用前:%d %d %dn, b.nian, b.yue, b.ri); riqi(b); printf(调用后:%d %d %dn, b.nian, b.yue, b.ri); return 0;第九章 结构体与共用体2022/7/2346#include struct date int nian; int yue;
22、 int ri;int riqi(struct date *p) /*结构体指针变量作函数参数*/ (*p).nian=2018; (*p).yue =5; (*p).ri=22; return 0; 【例9-6】地址传递,结构体指针变量作函数参数。第九章 结构体与共用体2022/7/2347int main() struct date b; b.nian=2017; b.yue=4; b.ri=26; printf(调用前:%d %d %dn, b.nian, b.yue, b.ri); riqi(&b); printf(调用后:%d %d %dn, b.nian, b.yue, b.ri)
23、; return 0;9.4.2 结构体作函数返回值函数的返回值除了可以是整型、实型、字符型和指向这些数据类型的指针以外,还可以返回结构体类型的值。2022/7/2348【例9-7】 超市清点现有物品情况,有5种商品,要求从键盘输入每种商品的名称、数量、单价,编写程序能实现以下功能:输出库存清单(包括商品名称、数量、单价、合计),以及所有商品的总金额。程序用一个函数实现“输入库存商品信息”功能,其返回值为结构体类型。2022/7/2349分析:(1) 商品信息可用结构体来表示。struct StoreLib char name12; int num; /*商品数量*/ float price;
24、 /*商品单价*/ float SumMoney; /*商品小计*/;(2) 每次输入的数据都是结构体变量的各成员值,因此可以设计函数:struct StoreLib InputInfo();用于将商品信息输入到结构体数组Goods中。(3) 使用函数int list(struct StoreLib Goods)输出库存信息。2022/7/2350第九章 结构体与共用体2022/7/2351#include struct StoreLib /*描述商品信息*/ char name12; int num; float price; float SumMoney;struct StoreLib G
25、oods;float Total=0;int list(struct StoreLib Goods) /* 通过商品数量和单价,计算出每种商品的金额*/ Goods.SumMoney=Goods.num*Goods.price; Total=Total+Goods.SumMoney; printf(%-24s%dt%.2ft%.2fn,G, Goods.num,Goods.price,Goods.SumMoney); return 0;第九章 结构体与共用体2022/7/23信息与计算机学院计算机基础教学部52struct StoreLib InputInfo() scanf
26、(%s,G); /* 输入商品名称*/ scanf(%d%f,& Goods.num,& Goods.price); /* 输入商品数量和商品单价*/ return Goods;int main() struct StoreLib iGoods5; int i; printf(请输入5种库存商品信息:商品名称 数量 单价n); for(i=0;i5;i+) iGoodsi=InputInfo(); /*函数调用,输入商品信息*/ printf(n-n); printf(库存清单:n); printf(商品名称tt数量t单价t小计n); for(i=0;i5;i+) list(
27、iGoodsi); /* 函数调用,输出库存清单 */ printf(库存商品金额总计:%.2fn,Total); return 0;2022/7/23539.5.1 共用体类型及其变量的定义9.5.2 共用体变量的引用9.5 共用体类型9.5.1 共用体类型及其变量的定义共用体的定义方法和定义结构体类型相似,其一般形式为: union 共用体名 成员表列 ;2022/7/2354union是关键字,是定义共用体类型必不可少的。一对中的内容为共用体成员的类型说明,与结构体类型的成员说明一致。例如:union data double a; int i; char ch; ;2022/7/2355
28、定义共用体变量的方法与结构体类似,有下面三种方法。1先定义共用体类型,再定义变量一般形式为: union 共用体名 成员表列 ; union 共用体名 变量表列;2022/7/2356第九章 结构体与共用体2022/7/2357union data double a; int i; char ch;union data num1,num2;例如:2定义共用体类型的同时定义共用体变量 一般形式为: union 共用体名 成员表列 变量表列; 2022/7/2358第九章 结构体与共用体2022/7/2359union data double a; int i; char ch;num1,num2
29、;例如:3不出现共用体名,直接定义共用体变量一般形式为: union 成员表列 变量表列; 2022/7/2360第九章 结构体与共用体2022/7/2361union double a; int i; char ch;num1,num2;例如:9.5.2 共用体变量的引用共用体变量必须先定义,才能引用,而且不能整体引用,只能引用共用体变量的成员。其一般形式为:共用体变量名.成员名 如,num1.i(引用共用体变量num1中的整型变量i)。【例9-8】 了解共用体变量的引用。2022/7/2362第九章 结构体与共用体2022/7/2363#includeunion student long
30、number; char c; int age;int main() union student s1, s2; s1.number=10001; s1.c=L; s1.age=65; printf(共用体变量s1成员的值为:n); printf( s1.number=%dn s1.c=%cn s1.age=%dn, s1.number, s1.c, s1.age); s1.c=W; s2=s1; printf(共用体变量s2的值为:n); printf( s2 is %cn, s2.c); return 0;2022/7/23649.6 枚举类型定义枚举类型的一般形式为: enum 枚举变量
31、名取值表列;例如, enum responseno,yes,none;上面的语句定义了名为response的枚举类型,取值范围为:no、yes、none。可以用该类型来定义变量,如 enum response answer;2022/7/2365也可以同时定义枚举类型和枚举变量,如: enum responseno,yes,none answer;或者不出现枚举名,直接定义枚举变量,如: enum no,yes,none answer;2022/7/2366也可以同时定义枚举类型和枚举变量,如: enum responseno,yes,none answer;或者不出现枚举名,直接定义枚举变量
32、,如: enum no,yes,none answer;说明:(1) 一对中的取值称为枚举常量,都是整型常量,用户在定义时不指定其值,系统默认第1个枚举常量的值是0,后面的枚举值依次增加1,如:enum responseno,yes,none answer;,其中no=0,yes=1,none=2。(2) 枚举值也可指定,如:enum no=1,yes=3,none=4 answer;2022/7/2367【例9-9】 从键盘输入一个112的整数,在屏幕上显示与该整数对应的月份的英文名称。分析:在输出较多的枚举变量时,可以用switch结构语句。 程序如下:2022/7/2368第九章 结构体
33、与共用体2022/7/2369#include#include int main() enum month Jan =1, Feb =2, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec mon; int k; printf(please input a number(112):); scanf(%d, &k); mon=(enum month) k; /* 强制类型转换*/ switch(mon) case Jan: printf(This month is January.n); break; case Feb: printf(This m
34、onth is February.n); break; case Mar: printf(This month is March.n); break; case Apr: printf(This month is April.n); break; case May: printf(This month is May.n); break; case Jun: printf(This month is June.n); break; case Jul: printf(This month is July.n); break; case Aug: printf(This month is Augus
35、t.n); break; case Sep: printf(This month is September.n); break; case Oct: printf(This month is October.n); break; case Nov: printf(This month is November.n); break; case Dec: printf(This month is December.n); break; default: printf(Input is error!n); return 0;2022/7/23709.7 typedef类型typedef定义的一般形式为
36、: typedef 原类型名 新类型名; 一般情况,新类型名表示为大写字母,只是为了与系统提供的标准类型的标识符相区分。例如: typedef int INTEGER; typedef float REAL;2022/7/2371typedef语句也可以给一些复杂数据类型定义新的名称。例如:typedef struct student STUDENT; 等价于typedef struct student long num; char name10; int age; STUDENT;2022/7/23722022/7/23739.8 程序类型【例9-10】 输入5个同学的姓名、数学成绩、英语成
37、绩和计算机成绩,确定总分最高的同学,并打印其姓名及其3门课程的成绩。分析:(1) 使用长度为5的struct student类型的结构体数组存储所有同学的相关信息。(2) 定义struct student类型指针pmax存储总分最高的同学的地址。(3) 定义struct student类型指针pstu引用结构体数组中的元素及其数组元素成员的值。(4) 通过循环语句为每个数组元素成员赋值。(5) 利用pmax输出成绩最高的同学的相关信息。2022/7/2374第九章 结构体与共用体2022/7/2375#include struct student /*定义结构体类型*/ char name20
38、; int math; int english; int computer;int main() struct student stu5;/*定义struct student类型的结构体数组存储所有同学的相关信息*/ struct student *pmaxstu;/*定义struct student类型指针存储总分最高的同学的地址*/ struct student *pstudent;/*定义struct student类型指针来引用数组*/ int fmaxscore=0,ftotal; /*存储最高分和总分的中间变量*/ int fmath,fenglish,fcomputer; /*存
39、储各科成绩的中间变量*/ char szname20; printf(nplease input 5 students and score: n ); printf(NametMathtEnglisht Computern); pmaxstu=stu; /*给pmaxstu指针变量赋初值*/ /*将数组stu的地址赋给pstudent指针变量,通过pstudent为数组stu各元素赋值*/第九章 结构体与共用体2022/7/2376 for(pstudent=stu;pstudentname,szname); pstudent-math=fmath; pstudent-english=feng
40、lish; pstudent-computer=fcomputer; ftotal= pstudent-math+ pstudent-english+ pstudent-computer; /*获得当前最高分同学所对应数组元素的地址*/ if(fmaxscorename,pmaxstu-math, pmaxstu-english,pmaxstu-computer);return 0;【例9-11】 商品进出库管理,入库商品的数据包括编号、商品名称、数量、状态(入库)、货架号,出库商品的数据包括编号、商品名称、数量、状态(出库)、部门。用同一个表格实现这个管理,如表所示。编写程序输入和输出这些数
41、据。2022/7/2377编 号商 品 名 称数 量状 态货架号或部门101book19I1030102sugar20Ofood-group103cup48I1206104doll46Otoy-group 商品进出库管理信息表第九章 结构体与共用体2022/7/2378#include /*包含atol()函数*/#includestruct goods /*商品信息*/ long number; /*编号*/ char name20; /*商品名称*/ int quantity; /*数量*/ char state; /*商品状态*/ union long part; /*货架号*/ char group20; /*部门*/ depa; ;int main() struct goods items4; /*保存入库商品数据*/ int i; char tmp20; /*中间变量,用来存储键盘输入的货架号或部门*/ printf(please input data: n number name quantity state department n);第九章 结构体与共用体2022/7/2379for(i=0;i4;i+) /*将键盘输入数据保存到结构体数组的每个元素中*/ scanf(%ld
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 柳城县屠宰场环保施工组织设计方案
- D2000顶管施工方案优化策略
- 2024-2025学年高二物理上学期期中考点大串讲(鲁科版2019)专题02 电势能与电势差【考题猜想】(32题16大类型)(含答案及解析)
- 职业学校学生体能训练方案
- 城市车库顶板耐久性评估方案
- 新型给水管道施工安全管理方案
- 体育场馆LED电子显示系统方案
- 平房带小院租赁合同(2篇)
- 岳阳2024年统编版小学5年级上册英语第五单元期末试卷
- 福州2024年01版小学六年级上册英语第三单元期中试卷
- 弹簧压力、拉力计算
- 外研版英语九年级下册全册教案全册
- 敏感节点维稳工作应急预案
- 情景教学法的相关研究
- 基于STEM教育理念的高中生物教学研究
- 2022年普通高中地理课程标(完整哦)
- 《脑出血》PPT课件(完整版)
- 大班科学活动《认识牙齿》ppt课件
- T∕CSCB 0005-2021 人诱导多能干细胞
- 国家级灯具检验报告路灯
- 温室大棚、花卉苗圃采暖项目设计方案
评论
0/150
提交评论