C语言程序设计:第7章 结构体_第1页
C语言程序设计:第7章 结构体_第2页
C语言程序设计:第7章 结构体_第3页
C语言程序设计:第7章 结构体_第4页
C语言程序设计:第7章 结构体_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、思考思考:在程序里表示一个人(姓名、年龄、性别、在程序里表示一个人(姓名、年龄、性别、),怎),怎么表示?么表示?想表示多个人呢?想表示多个人呢?如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理? 某学校学生成绩管理表某学校学生成绩管理表学号学号姓名姓名性别性别入学时间入学时间计算机计算机原理原理英英 语语数数 学学音音 乐乐1 1令狐冲令狐冲男男1999199990908383727282822 2林平之林平之男男1999199978789292888878783 3岳灵珊岳灵珊女女1999199989897272989866664 4任莹莹任莹莹女女199919997

2、8789595878790905 5 6 6 数组的解决方法数组的解决方法int studentId30; /* 最多可以管理最多可以管理30个学生个学生, 每个学每个学 生的学号用数组的下标表示生的学号用数组的下标表示*/char studentName3010;char studentSex303;int timeOfEnter30; /*入学时间用入学时间用int表示表示*/int scoreComputer30;/*计算机原理课的成绩计算机原理课的成绩*/int scoreEnglish30; /*英语课的成绩英语课的成绩*/int scoreMath30; /*数学课的成绩数学课的成

3、绩*/int scoreMusic30; /*音乐课的成绩音乐课的成绩*/数组的解决方法数组的解决方法int studentId30 = 1,2,3,4,5,6;charstudentName3010=令狐冲令狐冲,林平之林平之, 岳灵珊岳灵珊,任莹莹任莹莹;charstudentSex303=男男,男男,女女,女女;int timeOfEnter30 = 1999,1999,1999,1999;int scoreComputer30 = 90,78,89,78;int scoreEnglish30 = 83,92,72,95;int scoreMath30 = 72,88,98,87;int

4、 scoreMusic30 = 82,78,66,90; 数组的解决方法数组的解决方法数据的内存管理方式数据的内存管理方式 90907878898978788383929272729595727288889898878782827878666690901 12 23 34 4令狐冲令狐冲林平之林平之岳灵珊岳灵珊任莹莹任莹莹男男男男女女女女19991999199919991999199919991999数组的解决方法数组的解决方法分配内存不集中,寻址效率不高分配内存不集中,寻址效率不高 对数组进行赋初值时,容易发生对数组进行赋初值时,容易发生错位错位 结构显得比较零散,不容易管理结构显得比较零散

5、,不容易管理 希望希望的内存分配图的内存分配图 1 1令狐冲令狐冲男男1999199990908383727282822 2林平之林平之男男1999199978789292888878783 3岳灵珊岳灵珊女女1999199989897272989866664 4任莹莹任莹莹女女199919997878959587879090结构体的解决方法结构体的解决方法struct STUDENTstruct STUDENT int studentID; /int studentID; /* *每个学生的序号每个学生的序号* */ / char studentName10;/char studentNam

6、e10;/* *每个学生的姓名每个学生的姓名* */ / char studentSex3; /char studentSex3; /* *每个学生的性别每个学生的性别* */ / intinttimeOfEnter; /timeOfEnter; /* *每个学生的入学时间每个学生的入学时间* */ / intintscoreComputer; /scoreComputer; /* *每个学生的计算机原理成绩每个学生的计算机原理成绩* */ / intintscoreEnglish; /scoreEnglish; /* *每个学生的英语成绩每个学生的英语成绩* */ / intintscore

7、Math;scoreMath; / /* *每个学生的数学成绩每个学生的数学成绩* */ / intintscoreMusic; /scoreMusic; /* *每个学生的音乐成绩每个学生的音乐成绩* */ / ;struct STUDENTstruct STUDENT是一个类型是一个类型结构体:结构体:1. 把把关系紧密且逻辑相关关系紧密且逻辑相关的多种的多种不同类型不同类型的变量组织到统的变量组织到统一的名字之下,也称复合数据类型一的名字之下,也称复合数据类型2. 这种类型的变量占用这种类型的变量占用相邻相邻的一段内存单元的一段内存单元第7章 结构体 结构体类型的定义结构体类型的定义 结

8、构体是一种构造数据类型,它由若干成员组成。每一个成员既可以是一个基本数据类型也可以是一个构造数据类型 struct 结构体名结构体名类型类型1 成员成员1;类型类型2 成员成员2;.类型类型n 成员成员n;结构体类型的定义结构体类型的定义struct studentchar cNum8;char cName20;int nAge;char cSex;结构体关键字结构体关键字结构体名结构体名分号是结束标分号是结束标志,不能省略志,不能省略结构体的结构体的4 4个个成员成员结构体嵌套定义struct dateint nYear;int nMonth;int nDay;struct studentc

9、har cNum8;char cName20;struct date dBirthday;struct studentchar cNum8;char cName20;struct dateint nYear, nMonth, nDay; dBirthday;等价7.1.2 结构体变量结构体变量 (1) 结构体变量的定义 先定义结构体类型,再声明结构体变量。其一般形式为:struct 结构体名结构体名 结构体变量名结构体变量名; 例:struct studentchar cNum8;char cName20;int nAge;char cSex;struct student sStu;struc

10、t 结构体名结构体名 结构体变量名结构体变量名;定义结构体类型的同时定义结构体变量。其一般形式为: 例:struct studentchar cNum8;char cName20;int nAge;char cSex; sStu; struct 结构体名结构体名 成员列表成员列表变量列表变量列表;直接定义无结构名的结构体类型变量 例: struct char cNum8; char cName20; int nAge; char cSex; sStu; struct 成员列表成员列表变量列表变量列表;(2) 结构体变量的初始化以上三种方式声明结构体变量的同时都可以进行初始化。初始化方式为:将所

11、赋初值按顺序放在一对大括号内,下面以第一种定义结构体变量的方式为例来说明初始化问题。例:struct studentchar cNum8;char cName20;int nAge;char cSex;struct student sStu =0804101,Zhanghua,20,M; 注意:注意:(1) 如下初始化形式是非法的。如下初始化形式是非法的。 struct student sStu; sStu=0501,Zhao lin,20,M;(2) 所赋初值与各成员数据类型要匹配或兼容所赋初值与各成员数据类型要匹配或兼容。(3) 结构体变量成员的引用结构体变量成员的引用形式如下: 结构体变

12、量名结构体变量名. .成员名成员名 实心点“.”称为成员运算符。例:sStu.cNum sStu.cName 例7-1 定 义 并 初 始化学生结构体变量,然后输出变量的各成员值。 #includestruct studentchar *pcNum;char *pcName;char cSex;struct dateint nYear,nMonth,nDay;dBirth;float fScore;sStu1=0804101,Mr.Zhang,M,1979,9,1,80,sStu2;void main()sStu2=sStu1;/*同类型结构体变量之间进行赋值运算*/printf (Numbe

13、r=%sn,sStu2.pcNum);printf (Name=%sn,sStu2.pcName);printf (Born=%d年年,sStu2.dBirth.nYear);printf (%d月月,sStu2.dBirth.nMonth);printf (%d日日n,sStu2.dBirth.nDay);printf (Sex=%cn,sStu2.cSex);printf (Score=%.1fn,sStu2.fScore); .3结构体数组在实际应用中,经常用结构体数组来表示具有相同数据结构的一个群体。 例:struct studentchar *pcNum;char *

14、pcName;char cSex;struct dateint nYear,nMonth,nDay;dBirth;float fScore;结构体数组sStu,共有5个元素:sStu0sStu4。在声明的时候还完成了对数组的初始化工作。 struct student sStu5= 0804101,Mr.Zhang,M,1979,9,1,80, 0804102,Mr.Wang,W,1980,8,1,70, 0804103,Mr.Li,M,1978,7,1,55, 0804104,Mr.Zhao,W,1977,6,1,65, 0804105,Mr.Zhou,M,1981,5,1,45;struct

15、 student char *pcNum; char *pcName; char cSex; struct date int nYear,nMonth,nDay; dBirth; float fScore;struct student sStu5=0804101,Mr.Zhang,M,1979,9,1,80,0804102,Mr.Wang,W,1980,8,1,70,0804103,Mr.Li,M,1978,7,1,55,0804104,Mr.Zhao,W,1977,6,1,65,0804105,Mr.Zhou,M,1981,5,1,45;void main() int nCount,nE=0

16、; float fAvg,fSum=0; for(nCount=0;nCount5;nCount+) fSum+=sStunCount.fScore; if(sStunCount.fScorex = 0; /*指向运算符指向运算符*/第二种更常用第二种更常用xypptpt对比 (3) 指向结构体数组 struct telephonechar cName20;char cPhone10;struct telephone tTel3,*ptTel;ptTel=tTel;由于指针 ptTel 指向了数组 tTel 的首地址,则通过 ptTel 可以实现操作数组 tTel 元素的目的。 231tTel

17、0tTel1tTel2ptTelptTel+例7-5运用结构体指针变量实现例7-3的功能。 #include #define NUM 3struct telephone char cName20; char cPhone10;void main() struct telephone tTelNUM,*ptTel; for(ptTel=tTel;ptTelcName);printf(input phone:);gets(ptTel-cPhone); printf(namettphonen); for(ptTel=tTel;ptTelcName,ptTel-cPhone); 7.1.5结构体与函数

18、结构体与函数 结构体变量既可以做函数的参数也可以做函数的返回值。结构体变量作函数参数传递的是所有成员,因此,实参与形参必须是相同类型的结构体变量。结构体变量做函数的返回值,返回给主调函数的是所有成员,因此,接受此返回值的变量类型必须是结构体类型。结构体成员也可以做函数的参数和返回值,这与普通变量做函数的参数和返回值是一样的。 例7-6编写程序求解某一点在平面坐标中关于原点的对称点。 流程如图所示: #include struct dot int nX;int nY;struct dot SymmetricalDot(struct dot sDot)/*求对称点函数*/ struct dot d

19、SDot;/*定义对称点结构体变量*/dSDot.nX = -sDot.nX;dSDot.nY = -sDot.nY;return dSDot;/*将对称点返回给主调函数*/void main() struct dot dPoint;struct dot dSPoint;/*点dPoint的对称点*/printf(Please enter two members of a Point:n);scanf(%d,%d,&dPoint.nX,&dPoint.nY);dSPoint = SymmetricalDot(dPoint);/*调用求对称点函数*/printf(symmetri

20、cal dot:%d,%dn,dSPoint.nX,dSPoint.nY);/*输出对称点*/7.1.6 7.1.6 位段在定义结构体时以位为单位来声明成员所占的内存长度,这样的成员就称为位段或位域。C语言允许声明位段为从1 - 8范围内的任意位数。例: struct bitdata unsigned a:2;unsigned b:5;unsigned c:3;unsigned d:2;bX; 现在大家要特别注意,位段a和b共7位,不满一个字节,还剩1位,但紧接其后的位段c却需要3位,这时系统会另外起一个存储单元来存放位段c,依据同样的规律第二个存储单元也会出现3位空闲,如下图所示。 2bit

21、5bit1bit3bit2bit3bit1B1B7.2 7.2 共用体共用体共用体又称联合体,是将不同数据类型组合在一起,这些不同类型的成员在内存中所占用的起始单元是相同的。 7.2.1共用体类型定义共用体类型定义 union 共用体名共用体名类型类型 成员成员1;类型类型 成员成员2;.类型类型n 成员成员n;例如:union unit int nClass;char cOffice10; ; .2共用体变量定义共用体变量的声明和结构变量的定义方式一样,也有三种。共用体变量的赋值和引用union unit int nClass; char cOffice10; ;union

22、unit uDepartment;union unit int nClass; char cOffice10; uDepartment;union int nClass; char cOffice10; uDepartment;共用体变量名共用体变量名.成员名成员名7-7有一张教师与学生通用的表格,数据项有姓名、有一张教师与学生通用的表格,数据项有姓名、年龄、职业、教研室年龄、职业、教研室/ /班级。输入人员数据,再以班级。输入人员数据,再以表格输出。表格输出。 #include #define NUM 2struct info/*结构体*/char cName10;int nAge;char

23、 cJob;union unit/*共用体*/int nClass;char cOffice10; uDepa;iPersonInfoNUM;void main() int nCount; for(nCount=0;nCountNUM;nCount+) printf(input Name,Age,Job and Class/Officen); scanf(%s%d %c,iPersonInfonCount.cName,&iPersonInfonCount.nAge,&iPersonInfonCount.cJob); if(iPersonInfonCount.cJob=s) sc

24、anf(%d,&iPersonInfonCount.uDepa.nClass); else scanf(%s,iPersonInfonCount.uDepa.cOffice); printf(NametAgetJobtClass/Officen); for(nCount=0;nCountNUM;nCount+) printf(%st,iPersonInfonCount.cName);printf(%dt,iPersonInfonCount.nAge);printf(%ct,iPersonInfonCount.cJob); if(iPersonInfonCount.cJob=s) printf(%dn,iPersonInfonCount.uDepa.nClass); else printf(%sn,iPersonInfonCount.uDepa.cOffice); 7.3 7.3 枚举枚举“枚举”就是一一列举的意思,枚举类型就是一一列举出来所有可能用到的数据值,然后据此定义的变量就只能使用列举出来的值,相当于常量。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论