版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十一章 结构体结构体结构体与函数本章小结作业第十一章 结构体结构体考虑这样一类数据:一个数据项由多个子数据项组成,而且每个子数据项的类型可能不一样。在人事档案管理中,每个人的自然情况表可能包含:名字(字符串型)年龄(整型)出生时间(三个整型)性别(枚举)等等。研究人造卫星,每个人造卫星的信息可能包括:名字(字符型)发射时间(三个整数)重量(实型)直径(实型)轨道半径(实型)赤道夹角(实型)等等。考虑这样一类数据:一个数据项由多个子数据项组成,而且每个子数数组可描述由同类型子数据项组成的数据。结构体可描述由不同类型子数据项组成的数据名字年龄出生时间 年 月 日性别名字发射时间 年 月 日重量直
2、径轨道半径与赤道夹角数组可描述由同类型子数据项组成的数据。名字年龄出生时间 结构体结构体类型结构体类型是分量的集合分量也称成员、成分、域结构体类型定义形式A结构体类型定义形式Bstruct t id,. ,id ; . t id,. ,id ;struct sid t id,. ,id ; . t id,. ,id ;结构体结构体类型结构体类型定义形式A结构体类型定义形式Bst 例11-1 一个人的自然情况表 卫星数据类型enum sext male , female ;struct date int year ,month ,day ;struct preson char name10 ;
3、int age ; enum sext sex ; struct date birthdate ; struct mansatellite char name10 ; struct date lounchdate ; float weight, diameter, orbitrad, angle ; ; 例11-1 一个人的自然情况表 year:month:day:date是一个结构体类型,包含三个成分成分year为int类型成分month为int类型成分day为int类型year:month:day:date是一个结构体类型,包含preson是一个结构体类型,包含四个成分成分name为数组类
4、型成分age为int类型成分sex为枚举类型成分birthdate仍为一个结构体类型name:age:sex:year:birthdate:month:day:preson是一个结构体类型,包含四个成分name:age:mansatellite是一个结构体类型,包含六个成分name:year:lounchdate:month:day:weight:diameter:orbitrad:angle:mansatellite是一个结构体类型,包含六个成分nam结构体类型引用 在struct后跟以结构体标签,称为“结构体类型引用”。在例11-1的结构体类型定义的意义下: struct date str
5、uct preson struct mansatellite 都是结构体类型引用,使用它们将分别标记相应结构体定义。结构体类型引用结构体类型说明符:结构体类型定义和结构体类型引用统称“结构体类型说明符”使用结构体类型说明符可以定义结构体类型的类型名声明结构体类型变量结构体类型说明符:结构体类型定义和结构体类型引用统称“结构结构体类型名使用 typedef 可以定义结构体 类型名typedef 结构体类型说明符 标识符例子typedef struct int y,m,d datetype;struct date int y,m,d ;typedef struct date datetype;结构
6、体类型名使用 typedef 可以定义结构体 类型名t例11-2 定义结构体类型名typedef struct date int year,month,day ; datetype ;typedef char tstring1010;typedef struct tstring10 name ; int age ; enum sext sex ; struct date birthdate ; presontype ; typedef struct mansatellite mansatellitetype datetype birthdate; 例11-2 定义结构体类型名typedef s
7、truct结构体变量结构体类型变量声明可以采取如下三种形式之一使用结构体类型引用直接使用结构体类型定义使用typedef定义的结构体类型名结构体变量结构体类型变量声明可以采取如下三种形式之一例11-3 结构体变量声明struct preson zhang ;struct date int year,month,day ; dateofbirth;struct char author10 ;datetype publish_date ;int page_number ; programming ;mansatellitetype first_east ;变量zhang用结构体类型引用声明是str
8、uct preson类型,具有如图结构name:age:sex:year:birthdate:month:day:例11-3 结构体变量声明struct preson 例11-3 结构体变量声明struct preson zhang ;struct date int year,month,day ; dateofbirth;struct char author10 ;datetype publish_date ;int page_number ; programming ;mansatellitetype first_east ;变量programming使用不带结构体标签的结构体类型定义声明
9、,包含3个成分,分别为字符数组类型的author、datetype类型的publish_date、int类型的page_number,结构如图所示;author:year:publish_date:month:day:page_number:例11-3 结构体变量声明struct preson 例11-3 结构体变量声明struct preson zhang ;struct date int year,month,day ; dateofbirth;struct char author10 ;datetype publish_date ;int page_number ; programmin
10、g ;mansatellitetype first_east ;变量first_east使用typedef定义的类型标识符mansatellitetype声明,具有如图结构name:year:lounchdate:month:day:weight:diameter:orbitrad:angle:例11-3 结构体变量声明struct preson 类型定义不分配存储空间,只说明一个数据类型的框架结构。变量声明时才给变量分配存储空间,并且使得被声明的变量具有相应类型的结构。到目前为止声明的四个变量zhang、dateofbirth、programming、first_east具有实体,被分配存储
11、空间。类型标识符datetype、 mansatellitetype只是定义了一个数据类型的框架,不占用存储空间,只给相应类型起一个名字。类型定义不分配存储空间,只说明一个数据类型的框架结构。指向结构体变量的指针C可以定义指向任何类型的指针类型,并声明相应指针类型的变量,结构体类型当然不例外。指向结构体变量的指针C可以定义指向任何类型的指针类型,并声明struct preson *pointer_preson ; struct date int year,month,day ; *dateofpointer ; struct char author10 ; datetype publish_d
12、ate ; int page_number ; *p ; mansatellitetype *p_east例11-4 指向结构体类型变量的指针变量变量pointer_preson为指向标签为preson的结构体类型变量的指针变量。 pointer_preson可以指向相应结构体类型的变量。比如 pointer_preson = &zhang ;变量p为指向无标签结构体类型变量的指针变量。 P 可以指向相应结构体类型的变量。比如 p = &programming ;变量p_east为指向结构体类型mansatellitetype变量的指针变量。 p_east 可以指向相应结构体类型的变量。比如
13、p_east = &first_east ;struct preson *pointer_preso结构体变量的成分访问结构体变量的一个成分,使用成员选择表达式成员选择表达式 直接成员选择 间接成员选择直接成员选择 后缀表达式 . 标识符间接成员选择 后缀表达式 - 标识符 结构体变量的成分访问结构体变量的一个成分,使用成员选择表达式直接成员选择直接成员选择表达式针对一般的结构体变量。 形式是: r . w r 是后缀表达式,最终计算出一个结构体变量;w是 r 所属结构体类型中的一个成员名字下述成员选择表达式是合法的: programming_pascal.author直
14、接成员选择间接成员选择间接成员选择表达式针对指向结构体变量的指针变量形式是 p-w p 是后缀表达式,最终计算出一个指向结构体变量的指针变量;w 是p所指向结构体变量所属类型中的一个成员名字下述成员选择表达式是合法的: pointer_preson - name p_east - weight p_east - lounchdate间接成员选择也可首先对指针变量进行求地址运算然后使用直接成员选择比如上述三个选择表达式还可以写成如下形式。由于优先级的原因,这里的括号是必须的(*pointer_preson).name(*p_east).weight (*p_east).lounchdate也可首
15、先对指针变量进行求地址运算由于成员选择表达式本身也是一个变量访问,它是相应成分类型的一个变量,它与成分类型的其它变量一样凡是可以使用那些变量的地方都可以使用成员选择表达式。对于嵌套结构体,可以认为“成员选择表达式”仍然是一个“后缀表达式”,所以可以继续应用“成员选择表达式”的规则访问里层的成分。zhang.birthdate.monthp_east - lounchdate.year由于成员选择表达式本身也是一个变量访问,它是相应成分类型的一例11-5 设计表示复数的结构体类型, 给出复数加法和乘法函数解: /* 复数类型 */ typedef struct complex float rea
16、l_part,imaginary_part ; complex_type例11-5 设计表示复数的结构体类型, /* 复数加法 */complex_type complex_add(complex_type x, complex_type y) complex_type add; add.real_part=x.real_part+y.real_part; add.imaginary_part=x.imaginary_part+y.imaginary_part; return add;/* 复数加法 */* 复数乘法 */ complex_type complex_mul ( complex_
17、type x, complex_type y ) complex_type product ; product.real_part = x.real_part * y.real_part + x.imaginary_part * y.imaginaty_part ; product.imaginary_part = x.real_part * y.imaginary_part + x.imaginaty_part * y.real_part ; return product ; /* 复数乘法 */【例11-6】已知图书检索卡的结构如图所示,建立该卡片的数据结构,并编出根据书号检索相应书名、作
18、者名、语种、摘要的函数。书名:作者:语种 出版日期: 年 月 日书号:类号序号摘要:解: 显然应该用结构体类型来描述该卡片。设每个结构体变量为一张卡片, 全部卡片存放在文件 card.dat 中。函数先读入书号;对欲检索的书号采用顺序检索方式检索; 检索到后输出书名、作者名、语种、摘要;最后输出提示信息“search end!”。【例11-6】已知图书检索卡的结构如图所示,建立该卡片的数据假设主程序中有下述一系列声明FILE * cardpointer ; /* 文件指针 */struct bookno / 书号结构体 char catalogue ; char order8 ; ;struc
19、t date / 日期结构体 int year,month,day ; ;struct bookcard / 检索卡结构体 char name32,author16,languge16 ; struct date publishingdate ; struct bookno no ; char abstract256; ;假设主程序中有下述一系列声明并且在主函数中已经用cardpointer=fopen(card.dat,r );打开了文件card.dat ,则 检索函数 searchbook 输出检索结果的函数out_anser如下:并且在主函数中已经用/* 输出检索结果函数 */void
20、out_anser(struct bookcard card ) int i , j , k ; printf( “NAME:%sn”, ); printf( “AUTHOR:%sn”, card.author); printf( “LANGUGE:%sn”, card.languge ); printf(Publish date:%d-%d-%d ,card.publishdate.year ,card.publishdate.month ,card.publishdate.day); printf( “ABSTRACT:n” ) ; for ( i=0; i3; i+
21、) printf( “ ” ) ; for ( k=1; k=64; k+ ) printf( “%c”,card.abstract64*i+j) ; printf(“n”); /* 输出检索结果函数 */ /* 检索函数 */ void searchbook( void ) char catalogue0 ; char order08 ; struct bookcard card; /* 输入欲检索的类别, 书号 */ printf ( pleace input catalogue , order : ) ; scanf( “%c” , &catalogue0 ) ; scanf( “%s”
22、 , order0 ); /* 检索*/ rewind(cardpointer); while ( !feof(cardpointer) ) fread( &card , sizeof(struct bookcard) ,1, cardpointer); if ( ( card.no.catalogue = catalogue0 ) & ( card.no.order = order0 ) ) out_anser(card) ; printf(“search end!n”); /* 检索函数 */结构体与函数结构体与函数的关系返回结构体值的函数函数的结构体参数在C中允许函数类型为结构体类型,即
23、函数可以返回一个结构体值;还允许结构体作为函数的参数,用参数的方式向函数传递结构体类型的值。结构体与函数结构体与函数的关系返回结构体值的函数函数的计算结果可能是一个结构体值。在C中,有两种途径能够把该结构体值通过函数调用带回调用函数的主程序。使用指针函数的结果类型是指向结构体类型变量的指针类型直接使用结构体类型函数的结果类型是结构体类型,直接把一个结构体值带回调用函数的主程序返回结构体值的函数函数的计算结果可能是一个结构体值。在C中,第一种方式就是返回指针的函数,只不过相应指针是指向结构体类型变量的指针。与其它类型返回指针的函数没有任何区别,本书在第八章8.2节已经介绍过,此处不再赘述。本章的
24、例11-5已经使用了第二种方式,下边再举例介绍这种方式。第一种方式就是返回指针的函数,只不过相应指针是指向结构体类型例11-9一个人事档案管理系统中,职工登记卡包含姓名、性别、出生时间等信息。为该人事档案管理系统编写输入一个职工卡片的函数,供主管理系统使用。例11-9一个人事档案管理系统中,职工登记卡包含姓名、性别、解:职工登记卡的类型定义如下。 typedef enum male , female sextype ; typedef struct int year,month,day ; datetype; typedef struct cardperson char name8 ; /*
25、姓名 */ datetype birthdate ; /* 出生时间 */ sextype sex; /* 性别 */ typecardperson ; 解:职工登记卡的类型定义如下。typecardperson readcard(void)typecardperson card; / 说明一个卡片类型变量int sex_tag;printf( pleace input name:);/ 以下开始输入scanf(%s,); / 姓名printf( please input birthdate:year、month、day);scanf(“%d %d %d”, &(card.b
26、irthdate.year), &(card.birthdate.month), &(card.birthdate.day) );/出生时间 printf( pleace input sex(0:male , 1:female);scanf(%d, &sex_tag);/ 性别if ( sex_tag=0 ) card.sex = male ;else card.sex = female ;return card; / 带着一张卡片card值返回typecardperson readcard(void)在主程序中,将使用函数readcard带回的card值。比如主程序中具有功能:输入所有职工卡
27、片、填加一张职工卡片等,这些功能的实现都将调用该函数。如果用数组保存所有卡片并且设不超过100个职工,并有声明: #define n 100 int v,flag; typecardperson card_arrn;在主程序中,将使用函数readcard带回的card值。比如可以设计实现输入功能的程序片段如下: v=0; flag=1; while (flag) card_arrv = read_card();v+;printf( please choose 0_end 1_continue :); scanf(%d, &flag); 其中语句“card_arrv = read_card();”调用函数read_card 函数带回的值是结构体值,直接送入数组成分变量card_arrv中可以设计实现输入功能的程序片段如下:结构体作函数参数在函数之间,通过参数传送结构体值也有两种方法用指向结构体变量的指针作函数参数直接用结构体变量作函数参数第一种方式就是指针作函数参数,只不过相应指针是指向结构体类型变量的指针。与指向其它类型变量的指针没有任何区别。本章的例11-6已经使用了第二种方式,下边再举例介绍这种方式。结构体作函数参数在函数之间,通过参数传送结构体值也有两种方法例11-10人事档案管理问题。为该人事档案管理系统编一个查询函数,供主管理系统使用。该函数带入被检索人员的全部信息,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 年度硬面堆、药芯焊线战略市场规划报告
- 年度钟表与计时仪器竞争策略分析报告
- 二零二五年度特种吊车租赁与运输服务合同3篇
- 二零二五版高管劳动合同样本:股权激励与竞业禁止条款3篇
- 二零二五年空调销售与节能产品认证合同3篇
- 2025年度城市绿地养护及植物配置优化合同4篇
- 2025年度私人诊所与患者之间的远程医疗服务合同
- 2024版简易协议管理软件解决方案一
- 二零二五年度新能源材料采购代理协议3篇
- 二零二四年太阳能光伏发电项目合同
- 《向心力》参考课件4
- 2024至2030年中国膨润土行业投资战略分析及发展前景研究报告
- 【地理】地图的选择和应用(分层练) 2024-2025学年七年级地理上册同步备课系列(人教版)
- 2024年深圳中考数学真题及答案
- 土方转运合同协议书
- Module 3 Unit 1 Point to the door(教学设计)-2024-2025学年外研版(三起)英语三年级上册
- 智能交通信号灯安装合同样本
- 安全生产法律法规清单(2024年5月版)
- 江苏省连云港市2023-2024学年八年级下学期期末道德与法治试卷(含答案解析)
- 2024年大学试题(宗教学)-佛教文化笔试考试历年高频考点试题摘选含答案
- JBT 14588-2023 激光加工镜头 (正式版)
评论
0/150
提交评论