




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第9章 结 构,结构:一种数据类型,数据类型,基本类型 构造类型 指针类型 空类型,整型 实型 字符型,数组 结构 联合 枚举,单精度型 双精度,C语言的数据类型,2,9.1 结构变量,一般一个事物有多个特征,要用几个数据共同描述 例如 学生基本情况: 学号、名字、性别、年龄、地址、成绩 日期: 年、月、日、小时、分,事物的各种特征可以用若干变量和数组描述,但不能反映这些特征数据相互联系。为了将描述一个物体的各分量集合一起,C语言提供结构类型数据来描述。,定义类型 struct student_type int num; char name20; int score; ; 定义变量 struct student_type student;,对某学生定义一个结构变量structent,则可表示为 strudent.num strudent.score,可见结构类型数据是各种数据的集合,例如 每个学生有: 学号num、名字name20、成绩score,变量名,成员名,3,结构类型的定义 格式 struct 结构类型名 成员表列;,其中(1)结构类型名按标识符取名,(2)成员表列: 类型标识符1 成员名1; 类型标识符2 成员名2; 类型标识符n 成员名n;,9.1.1 结构类型的定义,struct student int num; char nane20; int score; ;,例如 定义一个关于学生基本情况的结构,其成员由学号、姓名、成绩组成:,注:结构的定义以分号结束。,定义struct student数据类型,又例 平面上的任意一点的结构,struct point float x; float y; ;,定义struct point数据类型,4,9.1.2 结构变量的定义和引用,1.结构变量的定义,(1)先定义结构类型再定义结构体变量 格式 struct 结构类型名 变量1,变量2,.,例如 struct student int num; char name20; int score; ; struct student student1,student2;,则内存分配,num name score,student1 student2,定义结构类型,定义结构变量,5,(2)定义结构类型时同时定义结构体变量 格式 struct 结构类型名 成员表列变量表列;,例如 struct student int num; char name20; int score; student1,student2;,(3)直接定义结构变量 格式 struct 成员表列变量表列;,例如 struct int num; char name20; int score; student1,student2;,注(1)类型与变量是不同的概念 类型声明变量,(2)成员名可以与程序中的变量名相同,两者不代表同一对象,如 int num; struct student student1,student2; num 与 student1.num、student2.num是不同量,6,2. 结构类型变量的引用,形式 结构变量名.成员名 其中 . 是运算符,优先级为最高1级 表示访问某结构变量中的某成员,与简单变量和数组元素使用相同,stud1.num=201; strcpy(,“Zhang Hong“); stud1.score=92; scanf(“%d %s %d“, ,如 struct int num; char name20; int score; stud1;,201,Zhang Hong,92,7,例9-2 在工资管理系统中,工资项目有编号、姓名、基本工资、奖金、保险、实发工资。输入职工人数n,再输入每个职工的前5项信息,计算并输出实发工资。 其中,实发工资=基本工资+奖金保险,#include struct employee int num; char name20; float jbgz, jj, bx, sfgz; ;,void main(void) int i, n; struct employee e; printf(“请输入职工人数n: “);scanf(“%d“, ,请输入职工人数n: 1 请输入第1个职工的信息:102 Zhong 2200.5 800 85.2 编号:102 姓名:Zhong 实发工资:2915.30,8,3. 结构体类型变量初始化,与变量、数组的初始化相似,注 按顺序将数据依次赋值于成员,数据类型与成员类型要一致,输出:201 Zhang Hong 92,struct student int num; char name20; int score; ; struct student student1=201,“Zhang Hong“,92; main() printf(“%d %s %dn“, stud1.num,, stud1.score); ,例,9,4.整体赋值 结构名1=结构名2; 如 student1=student2; 注 赋值号“=“的左右的结构类型要一致,所有的成员一一对应赋值,例 将结构变量stud1的值赋给结构变量stud2 。,#include main() static struct student int num; char name20; int score; stud1 =201,“Zhang Hong“,92, stud2; stud2= stud1; printf(“%d %s %d“,stud2.num,,stud2.score); ,输出 201 Zhang Hong 92,stud2= stud1; 等价与 stud2.num= stud1.num; strcpy(, ); stud2.score= stud1.score;,10,结构可以嵌套,即结构的分量又是一个结构的变量,9.1.3 结构的嵌套,例如 struct date int month; int day; int year; ; struct student int num; char name20; int score; struct date birthday; student1,student2;,或 struct student int num; char name20; int score; struct int month; int day; int year; birthday; student1,student2;,2.引用时,当结构的分量名又是结构名时,继续使用“.“延伸 如 student1.birthday.year student2.birthday.day,1.结构嵌套定义:用结构类型定义结构的分量,11,例 若学生的信息构成如下图,请为其定义合适的数据类型,struct address char city20; char street20; int number; ; struct student int num; char name20; struct address addr; int score; ;,void main() struct student stud1=201,“Zhang Hong“,“Hangzhou“,“QS“,11,92; printf(“%dn“,stud1.num); printf(“%sn“, ); printf(“%sn“,stud1.addr.city); printf(“%sn“,stud1.addr.street); printf(“%dn“,stud1.addr.number); printf(“%dn“,stud1.score); ,输出: 201 Zhang Hong Hangzhou QS 11 92,12,9.1.4 结构变量作为函数的参数,形参为结构变量,实参要求同类型的结构变量。 虚实结合:将实参结构变量的成员一一对应赋值于形参的结构变量,例9-3 改写例9-2。,#include struct employee int num; char name20; float jbgz, jj, bx, sfgz; ;,float count_sfgz(struct employee m) return m.jbgz+m.jj-m.bx; void main(void) int i, n; struct employee e; printf(“请输入职工人数n: “); scanf(“%d“, ,虚实结合: e.numm.num e.jbgzm.jbgz e.jjm.jj e.sfgzm.sfgz,13,9.2 结构数组,结构数组用结构类型定义的数组,例如 struct student int num; char name20; int score; ; struct student stud10;,数组元素 studi是一个数组元素(结构体变量),引用为 studi.num studi.score,或 struct int num; char name20; int score; stud10;,9.2.1 结构数组的定义和引用,14,9.2.2 结构数组的初始化,例 struct student int num; char name20; int score; ; struct student stud2=201,“Zhang Hong“,92,202,“Wang Fang“,80; 或 struct student stud2=201,“Zhang Hong“,92,202,“Wang Fang“,80;,每个.依次赋值于结构体数组元素,stud0.num=201;=“Zhang Hong“;stud0.score=92; stud1.num=202;=“Wang Fang“;stud1.score=80;,15,例9-4 建立有10个学生的结构记录,输出平均分数,并从高到低输出成绩。,#include struct student int num; char name20; int score; ; struct student stud10,temp; void main() int i,sum=0; for(i=0;i10;i+) scanf(“%d%s%d“,for(i=0;i=0;i-) printf(“%d%s%d“, ,16,9.4 结构指针 结构变量指针结构变量的地址 指向结构变量的指针指针变量的值为结构变量的地址,1.定义结构指针变量 格式 struct 结构体类型 *结构体指针变量名;,&stud1 ptr,例 struct student int num; char name20; int score; stud1=201,“Zhang Hong“,92; struct student *ptr; ptr=,17,2. 结构指针对结构分量访问 格式 (*指针名).分量名 或 指针名-分量名,如 (*ptr).num (*ptr).name ptr-num ptr-name,#include #include main() struct student int num; char name20; int score; ; struct student stud1,*p;,p=,例,&stud1 p,18,例 对于以下的变量定义,表达式_不符合C语言语法。 struct node int len; char *pk; x = 2, “right“, *p= A、p-pk B、*x.pk C、*p-pk D、*p.pk,答案 D,注 (*指针名).分量名中的括号是不可少的,分量运算符“.“的优先级高于“*“ 的优先级 如 (*ptr).name 不能写成 * 而是*(),不能用指向结构的指针直接指向结构体成员,如 struct student int num; char name20; int score; ;,struct student stud1,*p; int *q; p= 允许,结构变量虽然存储多数据,但结构的变量名仍不是地址值, 取地址必须&结构体变量名,19,3. 指向结构数组的指针 指向结构数组的指针指针变量的值为结构数组元素的地址,例 struct student int num; char name20; char sex; int age; struct student stud3,*p; p=stud;,stud,p &stud0,p+1 &stud1,p+2 &stud2,注 p+i 是作地址运算 p的地址值+sizeof(struct student )*i,20,#include #include void main() struct student int num; char name20; int score; ; struct student stud10,*p; int i,sum=0; for(p=stud;pnum,p-name, ,例 用结构指针求10个学生的平均分数。,stu,p &stud0,p+1 &stud1,p+2 &stud2,21,4. 结构指针作为函数参数,形参是结构数组或结构指针,实参应是同类型的结构数组名或结构指针。虚实结合方式:地址传递,例9-5 输入10个学生的学号、姓名和成绩,输出学生的成绩等级和不及格人数。 每个学生的记录包括学号、姓名、成绩和等级 要求定义和调用函数set_grade根据学生成绩设置等级,并统计不及格人数 等级设置: A :85100;B:7084;C:6069;D:059,22,#define N 10 struct student int num; char name20; int score; char grade; ; void main() struct student stuN, *ptr; ptr = stu; /* 输入 略 */ count = set_grade(ptr); ,int set_grade(struct student *p) int i, n=0; for(i=0;iscore=85) p-grade=A; else if(p-score=70) p-grade = B; else if(p-score=60) p-grade=C; else p-grade=D; n+; return n; ,23,例9-1 构建简单的手机通讯录 联系人的基本信息:姓名、年龄和联系电话 最多容纳50名联系人的信息 具有新建和查询功能,#include #include /*手机通讯录结构定义*/ struct friends_list char name10; /* 姓名 */ int age; /* 年龄 */ char telephone13; /* 联系电话 */ ; int count = 0; /* 全局变量记录当前联系人总数 */,24,/*新建联系人*/ void new_friend(struct friends_list friends ) struct
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 林业产品绿色制造与可持续发展考核试卷
- 沿海货物运输企业文化建设考核试卷
- 天然气行业国际合作的法律环境考核试卷
- 石油钻采设备润滑油脂的选择与应用考核试卷
- 建筑物安全标识系统考核试卷
- 相关方管理中的组织文化塑造与传播考核试卷
- 海洋生物技术前沿与应用考核试卷
- 毛皮制品加工客户服务与满意度考核试卷
- 2025标准租赁合同协议书【典范】
- 2025选调生-《行政职业能力测验》-言语理解与表达考前通关必练题库-含答案
- 河北省职业院校技能大赛(高职)体育活动设计与实施赛项参考试题库(含答案)
- 电梯维保管理体系手册
- 《110kV三相环氧树脂浇注绝缘干式电力变压器技术参数和要求》
- 2022-2023(2) 大学英语2学习通超星期末考试答案章节答案2024年
- 外研版英语(三起)五年级下册全册教案
- 保险专业代理机构投资人基本情况登记表(自然人股东)
- 江西省2023年初中学业水平考试语文试题卷含答案解析
- 变形监测安全协议书范文
- 血液透析瘙痒症的发病机制及药物治疗(2024)解读
- 图文制作服务 投标方案(技术方案)
- 太阳能热水器设计与安装考核试卷
评论
0/150
提交评论