




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章 构造数据类型一 目的和要求1、掌握结构体类型说明和结构体类型变量、数组、指针的定义方法及使用。2、学会引用结构体中的成员。3、掌握利用指向结构体的指针成员构成链表的基本算法。4、了解联合体类型和枚举类型的说明、其变量的定义及赋初值的方法。5、了解联合类型变量中各成员的存储结构,学会引用各成员中的数据。6、学习正确引用枚举类型常量,了解如何对枚举类型变量进行操作。二 相关知识1、结构型变量的定义和引用构造类型是由相同或不同的数据类型组合而成。用户自己定义的一种用来存放类型不同的数据的数据类型,称为结构型。 结构型的定义 struct 类型1 成员名1; 类型2 成员名2; 类型n 成员名n; ;结构型是一种数据类型,其中的成员不是变量,系统不会给成员分配内存。已经定义的某种结构型可以作为一种数据类型,用来定义变量、数组、指针,这时才会给定义的变量、数组、指针分配内存。 结构型变量的定义有三种方法:先定义结构型,然后定义变量、数组;同时定义结构型和变量、数组;定义无名称的结构型同时定义变量、数组。 结构型变量的引用当某种结构型的变量、数组被定义后,对其只能使用其中的成员,常见的引用方法如下: 结构型变量、数组元素成员的引用结构型变量名成员名 或 结构型数组名下标 成员名 结构型变量、数组元素成员地址的引用&结构型变量名成员名 或 &结构型数组名下标 成员名 结构型变量、数组元素地址的引用&结构型变量名 或&结构型数组名下标 结构型数组首地址的引用: 结构型数组名2、共用型共用型数据中所有成员占用相同的内存单元,设置这种数据类型的主要目的就是节省内存。 共用型的定义 union 类型1 成员名1; 类型2 成员名2; 类型n 成员名n; ;共用型中每个成员所占用的内存单元都是连续的,而且都是从分配的连续内存单元中第一个内存单元开始存放,共用体所占的内存长度等于最长的成员的长度。所以,对共用型数据来说,所有成员的首地址都是相同的。 共用型变量的定义有三种方法:先定义共用型,然后定义变量、数组;同时定义共用型和变量、数组;定义无名称的共用型同时定义变量、数组。特别注意的是:由于共用型数据的成员不能同时起作用,每一瞬时只能存放其中的某一个成员的数据。因此,对共用型变量、数组定义不能赋初值,只能在程序中对其成员赋值。 共用型变量的引用对共用型变量、数组的引用和对结构型变量、数组的引用方法和要求基本相同。关于共用型,C语言还有一个重要的规定,共用型数据不能作为函数的参数在函数间传递,也不可以定义某函数返回共用型数据值。但是,允许使用指向共用型数据的指针变量在函数间传递共用型数据。3、枚举型将一个有限的变量值一一列举出来称为枚举。 枚举型的定义 enum ,,;说明:在定义时若无特别指定,“枚举常量1”的值为0,其余依次序加1递增。C语言规定,在定义枚举类型时,可以给枚举常量赋初值,方法是在枚举常量的后面写上“=整型常量”,如果给某一个枚举常量赋初值,则其后的枚举常量将按自然数的规则依次赋初值。 枚举型变量、数组的定义有三种方法:先定义枚举类型,然后定义变量、数组;同时定义枚举类型和变量、数组;定义无名称的枚举类型同时定义变量、数组。 枚举型变量的引用 给变量或数组元素赋值,格式为:枚举型变量或数组元素=同一枚举常量名 用比较运算符对两个枚举型变量或数组元素进行“大小”比较,可以按照变量或数组元素的枚举常量值(整数)的大小进行。 枚举型变量或数组元素可以进行“自增+”和“自减-”运算。 可以在循环中用枚举型变量或数组元素控制循环。4、用户自定义类型定义新的类型名来代替已有的类型称为用户自定义类型。其格式为: typedef 原类型名 新类型名用typedef可以为已存在的各种类型增加一个类型名。三 实验练习实验练习 1:试利用结构体类型编写程序,有5个职工的姓名、基本工资和补贴,计算每个职工的实发工资并输出。本练习要求在封闭式实验课中在助教或者讲师的指导下完成。本练习分成6个部分:1 实验目的2 问题描述3 事例输出4 程序模板5 问题解答提示6 后续问题和任务程序模板是完整的、可实际运行的C程序,其中关键的一行或者多行代码已经替换为注释。请先阅读问题描述,分析事例输出;然后研究模板的代码。参考问题解答提示,用C代码替换/* */注释。编译并执行程序,并将输出结果与提供的事例输出进行比较。然后回答强化练习。实验目的:本实验旨在巩固学生对结构体这种数据结构概念的理解,增强程序设计能力。在这个实验中,学生将练习: 定义结构体类型struct worker,它含有四个成员:姓名、基本工资、补贴和实发工资。 定义struct worker类型的数组,它有五个数组元素并赋予了初值。 利用循环语句,计算每个人的实发工资。 利用循环语句,输出每个人的姓名和实发工资。在强化练习中,学生将练习: 不给struct worker类型的数组赋初值,利用循环语句从键盘逐个输入数据。 增加几个变量,将所有人的基本工资、补贴和实发工资累加起来,并输出。问题描述编写程序,定义一个结构体类型的数组,存有5个职工的姓名、基本工资和补贴,计算每个职工的实发工资并输出。示例输出:li 2120.0ma 2065.0lin 3445.0wang 5467.0deng 7328.0程序模板#include stdio.hvoid main( ) int i;/*结构体类型struct worker的定义,其成员有姓名、基本工资、补贴和实发工资*/struct worker s5=li, 2000, 120,ma, 2020,45, lin, 3211, 234,wang,4567, 900, deng,6467, 861;/for(i=0;i5;i+) /*计算每个人的实发工资*/for(i=0;i”。如在设置日期getdate()函数中输入”年”可写成scanf(“%d”,&d-year);,假设形参是struct date *d。5用gets()输入患者的姓名,这时空格也可作为患者姓名的一部分。6在输出患者的初诊日期时,如输出年份时,应写成:a.first.year。即变量a的first成员的yaer成员。7结构体的嵌套,可以完成表(1)这样的数据结构。8如果在实验中碰到任何问题,请向实验老师寻求帮助。强化练习1根据程序模板,将设置日期函数getdate()的类型设为struct date类型,重新编写程序。2重新编写程序,定义struct patient类型的数组,对一组病人的信息进行处理实验练习 3:若将教师和学生的数据放在同一表格中。教师的数据包括:编号、姓名、职业和职务,学生的数据包括:编号、姓名、职业和班级。试编写程序填写表格。如下表:编号姓名职业 职务班级10011limings20120001wanglit讲师本练习要求在封闭式实验课中在助教或者讲师的指导下完成。本练习分成6个部分:1 实验目的2 问题描述3 事例输出4 程序模板5 问题解答提示6 后续问题和任务程序模板是完整的、可实际运行的C程序,其中关键的一行或者多行代码已经替换为注释。请先阅读问题描述,分析事例输出;然后研究模板的代码。参考问题解答提示,用C代码替换/* */注释。编译并执行程序,并将输出结果与提供的事例输出进行比较。然后回答强化练习。实验目的:本实验旨在巩固学生对结构体这种数据结构概念的理解,增强程序设计能力。在这个实验中,学生将练习: 定义结构体类型,其成员有:编号、姓名、职业和班级(或职务)。 定义该结构体类型的数组,可有若干个数组元素。 利用循环语句输入每条记录的数据,若该记录的职业为s,则该记录是学生的,输入该学生的班级;若该记录的职业为t,则该记录是教师的,输入该教师的职务。 根据记录的职业来判断,使用哪个printf()语句输出记录。在强化练习中,学生将练习: 将编号定义为字符型,若规定编号的第一个字符为0则表示学生,为1则表示教师。 将输入部分和输出部分独立出来,编成函数。问题描述编写程序填写表格。从键盘输入学生和教师的信息,若是学生则班级/职称栏填入班级,若是教师则班级/职称栏填入职称。示例输出10011 liming s 20120001 wangli t 讲师编号 姓名 职业 班级/职务10011 liming s 20120001 wangli t 讲师程序模板 #include stdio.h/*包含头文件stdlib.h*/struct int number; char *name; char job; union int classes; char position10; category;person2;void main() int i; for(i=0;i2;i+) /*输入某人的编号、姓名、职业*/ if(personi.job=s) scanf(%d,&personi.category.classes); else if(personi.job=t) /*输入教师的职称*/ else printf(input error!); /*若输入错误,则退出程序*/ printf(n); printf(编号 姓名 职业 班级/职务n); for(i=0;i2;i+) if(personi.job=s) /*输出学生的记录*/ else printf(%d %s %c %sn, personi.number, ,personi.job,personi.category.position);问题解答提示1定义结构体时没有给出结构体名,所以要同时定义结构体变量和数组。2共用体变量在这作为结构体的成员出现,如person0是结构体类型的数组元素,它的category成员是共用体类型的变量。3category成员可以取两种值:整型值和字符型值,当person0.job是s时,category成员取数值型数据,表示为person0. category.classes,当person0.job是t时,category成员取字符型数据,表示为person0. category.position。4结构体和共用体的组合,可以完成表(2)这样的数据结构。5若输入错误,则调用abort()函数退出程序。这时要包含头文件stdlib.h。6如果在实验中碰到任何问题,请向实验老师寻求帮助。强化练习1重新定义结构体,去掉成员job(职业),将numbre(编号)定义为字符型,若规定编号的第一个字符为0则表示学生,为1则表示教师。试编写程序。2将输入部分和输出部分独立出来编成函数,重新编写程序。9.4 综合练习1定义一个结构体类型,包含用户的姓名(含6个字符的字符串)和电话号码(含8个字符的字符串)。编写函数用于读入N位用户的数据到结构数组中;编写函数用于将数组中的用户按姓名的字母顺序重新排列;编写函数用于输出数据。分析:需说明包含姓名及电话号码两个成员的用户类型struct USER,由于字符串总以0为结束标志,因而应定义合适的数组长度。main()函数中定义一个结构体数组user,用于存放N位用户的数据。函数getUser用于读取N位用户的数据并存入user数组中;函数sortUser用于将user数组中的N位用户按其姓名的字母顺序重新排列;函数outUser用于将重新排序后user数组输出。#include stdio.h#include string.h#define N 5struct USER char name7,tel9; ;void getUser(USER *p,int n) int i; printf(请输入所有用户的姓名和电话号码:n);for(i=0;in;i+)scanf(%s%s,,pi.tel);void sortUser(USER *p,int n) int i,j,k; USER temp;for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(strcmp(,)0) k=j;if(k!=i) temp=pk; pk=pi; pi=temp;void outUser(USER *p,int n) int i; for(i=0;in;i+)printf(printf(%s %sn,,pi.tel);void main() USER userN; getUser(user,N);sortUser(user,N);outUser(user,N);2设单链表结点类型node定义如下: struct node int data; struct node *next; ;编写程序,将单链表A和单链表B合并成一个单链表C。 /*sy9_4.c*/#include stdio.h#include stdlib.hstruct node int data; struct node *next;*head,*head1,*head2;void main( ) int i; struct node *p,*q,*p1,*q1; head1=NULL; for(i=2;idata=i; p-next=head1; head1=p; head2=NULL; for(i=1;idata=i; p-next=head2; head2=p; p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版广东土地估价师协会职业培训服务合同
- 2025版数字媒体广告资源包租赁合同模板
- 二零二五年度信息技术培训与咨询服务协议
- 二零二五版房产收购项目合作续约合同样本
- 二零二五年度商业地产项目场地转租及投资回报协议
- 二零二五版建筑信息模型(BIM)技术应用合同意向书
- 2025版环保材料消费贷款担保合同
- 2025版城市综合体房地产评估报告合同
- 二零二五版德汉翻译及国际文化交流项目合同
- 二零二五家政洗衣店市场拓展合作协议
- GB/T 748-2005抗硫酸盐硅酸盐水泥
- GB 15763.1-2001建筑用安全玻璃防火玻璃
- 走好群众路线-做好群众工作(黄相怀)课件
- 民间文学(全套课件)
- 专升本00465心理卫生与心理辅导历年试题题库(考试必备)
- 既有重载铁路无缝线路改造及运维技术探索
- 2022年教师副高职称评答辩范文(七篇)
- 高压罗茨风机选型参数表
- 金融控股公司协同模式与实务分析
- 2021-2022年湖南省长沙市第一中学高一(上)入学考试物理试题(解析版)
- 轴类零件的设计ppt课件
评论
0/150
提交评论