




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章 自定义数据类型,教学目标,理解为什么使用结构体 定义结构体 声明结构体变量 访问结构体成员 掌握结构体作为函数参数的用法 了解共用体 了解自定义数据类型 作业书P228的1,3,6实验书P125的1,思考,在程序里表示一个人(姓名、年龄、性别、成绩),怎么表示? 想表示多个人呢? 如何用计算机程序实现下述表格的管理?,结构体简介,I. 使用数组,解决方案:,score,num,sex,name,不能建立数组间的关系,II. 使用多维数组,C 语言不允许一个数组包含多种数据类型,III. 使用结构体,C 语言引入了称为结构体的数据存储方式,“结构体” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构体的成员。,定义结构体2-1,struct structurename datatype variable1; datatype variable2; . ;,结构体成员,;,结构体名,struct,student,int num;,char name20;,char sex;,定义结构体,float score;,C 语言中的有效数据类型,定义结构体2-2,struct student int num; char name20; char sex; float score; ;,num,name,sex,student,结构体定义并不预留内存,结构体定义放置在程序的开始部分,位于头文件声明之后,score,结构体定义仅描述了一个结构体的形式。如果要在程序里使用结构体,需要声明结构体变量。,声明结构体变量,声明结构体变量,struct student int num; char name20; char sex; float score; ; struct student student1,student2;,I.先定义结构体,再声明结构体变量,struct student int num; char name20; char sex; float score; student1,student2;,II.在定义结构体类型的同时声明结构体变量,struct int num; char name20; char sex; float score; student1,student2;,III. 直接声明结构体变量,声明一个类型为 student 结构体的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。,struct date int month; int day; int year; ;,嵌套结构体,struct int num; char name20; char sex; struct date birthday; float score; student1,student2;,访问成员是通过成员的名字,称为“按名引用”。在程序中使用结构中成员的方法为: 结构体变量名.成员名 例如:student1.num、student2.sex、student1.birthday.month,struct student student3=3,“Yao Ming “,M,90.5;,结构体变量初始化,3,Yao Ming,M,赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构体成员数目少。,student3.num,,student3.sex,90.5,student3.score,student1.num=1; scanf(“%s“,结构体变量赋值,1,Zhang Zi Liang,M,用输入语句或赋值语句来给结构体变量的各个成员赋值,78,78,student2 = student1;,1,Zhang Zi Liang,M,78,strcpy(,“ZhangSan“);,结构体变量,如果要将“zhang”改为“zhong”,只要将结构变量student1中的数组成员name下标为2的元素a改为o即可。可以使用下列语句: 2 = o; /* 为结构变量中的数组成员的一个元素赋值 */,结构体变量,对结构变量的整体操作 要对结构进行整体操作有很多限制,C语言中能够对结构进行整体操作的运算不多,只有赋值“=”和取地址“ /* 结构变量整体赋值 */,结构体类型的引用,不能将一个结构变量作为一个整体直接访问。例如,已定义 student1 为结构变量并且已有值。不能这样引用: printf (“%s,%c,%d,%d,%dn“, student1); 如果成员本身又是一个结构类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。 只能对最低级的成员进行赋值或存取以及运算。例如,对上面定义的结构变量student1,可以这样访问各个成员: student1.sex student1.birthday.month student1.birthday.day student1.birthday.year,问题描述: 根据学员的成绩,输出不及格学员的详细信息。,使用结构体示例,#include struct student int num;/学号 char *name;/姓名 char sex;/性别 float score;/成绩; int main() static struct student stu1=1,“李亚鹏“,M,61; static struct student stu2=2,“周晶晶“,F,92.5; static struct student stu3=3,“姚光明“,M,59; printf(“不及格学员的名单如下:n“); if(stu1.score=60 ,不及格学员的名单如下:,3 姚光明 M 59.00,1,李亚鹏,M,78,2,周晶晶,F,92,3,姚光明,M,59,struct stu *pstu; (*pstu).num 或者: pstu-num,结构体指针变量,一个指针当用来指向一个结构体时, 称之为结构体指针变量。 结构体指针变量中的值是所指向的结构体变量的首地址。 结构体指针变量声明的一般形式为: struct 结构体名 *结构体指针变量名 通过结构体指针可以访问该结构体变量的成员,一般形式为: (*结构体指针变量).成员名 或者 结构体指针变量-成员名,#include struct student int num; char *name; char sex; float score;stu=1,“张宾“,F,55,*pstu; int main() pstu= ,学号:1 姓名:张宾 性别:F 成绩:55.00 学号:1 姓名:张宾 性别:F 成绩:55.00 学号:1 姓名:张宾 性别:F 成绩:55.00 Press any key to continue,struct student int num; char* name; char sex; float score; stu30;,结构体数组,元素为结构体类型的数组称为结构体数组。 在实际应用中,经常用结构体数组来表示具有相同数据结构体的一个群体。例如一个班的学员档案,一个公司的职工档案等。,定义了一个结构体数组stu,共有30个元素,stu0stu29。每个数组元素都具有struct student的结构体形式。,问题描述: 求学员的总成绩和平均成绩,并统计不及格人数。,结构体数组,struct student int num; char *name; char sex; float score; stuN= 1,“李芳“,F,45,2,“于红“,F,62.5,3,“何万山“,M,92.5,4,“程亚丽“,M,87,5,“王明“,M,58; int main( ) int i,count=0; float ave,sum=0; for(i=0;iN;i+) sum+=stui.score; if(stui.score60) count+; printf(“总分:%7.2fn“,sum); ave=sum/5; printf(“平均分:%5.2fn“,ave); printf(“不及格人数为:%dn“,count); return 0; ,总分: 345.00 平均分:69.00 不及格人数为:2 Press any key to continue,结构体作为函数参数,可以将结构体作为参数传递给函数,也可以定义返回结构体值的函数。 结构体作为函数参数有三种不同方法: 将结构体成员的值传递给函数处理。 将整个结构体作为参数值传递给函数。 将结构体指针变量做函数的参数。,把结构体作为整体来处理,但作用方式和效果不同。,整个结构体作为参数,struct date int year; int month; int day; ; void func(struct date p) p.year = 2000; p.month = 5; p.day = 22; printf(“%d,%d,%dn“, p.year, p.month, p.day); ,void main() struct date d; d.year = 1999; d.month = 4; d.day = 23; printf(“%d,%d,%dn“, d.year, d.month, d.day); func(d); printf(“%d,%d,%dn“, d.year, d.month, d.day); ,1999,4,23,2000,5,22,1999,4,23,整个结构体作为参数,struct date int year; int month; int day; struct date func(struct date p) p.year = 2000; p.month = 5; p.day = 22; printf(“%d,%d,%dn“, p.year, p.month, p.day); return p; ,void main() struct date d; d.year = 1999; d.month = 4; d.day = 23; printf(“%d,%d,%dn”, d.year, d.month, d.day); d = func(d); printf(“%d,%d,%dn”, d.year, d.month, d.day); ,1999,4,23,2000,5,22,2000,5,22,结构体指针做为参数,struct date int year; int month; int day; ; void func(struct date *p) p-year = 2000; p-month = 5; p-day = 22; printf(“%d,%d,%dn”, p- year, p- month, p- day); ,void main() struct date d; d.year = 1999; d.month = 4; d.day = 23; printf(“%d,%d,%dn”, d.year, d.month, d.day); func( ,1999,4,23,2000,5,22,2000,5,22,结构体成员作为函数参数,#include struct film char name25; /电影名 char director25; /导演 int duration; /片长 ; void display (char *, char *, int *); void main() struct film f1; printf(“nn 请输入影片名:“); gets(); printf(“n 请输入导演姓名: “); gets(f1.director); printf(“n 请输入电影片长(分钟): “); scanf(“%d“, ,void display(char *n, char *d, int *m) printf(“nt 电影的详细信息n“); printf(“n 片名: %s“,n); printf(“n 导演: %s“,d); printf(“n 片长: %dn“,*m); ,前两个参数为字符串,所以不使用“&“,传值方式与引用方式的区别,问题:求梯形的面积,#include struct trape /*此结构体表示梯形*/ double height; double side1; double side2; ; double area( struct trape t1) double a; a = 1.0/2 * (t1.height * (t1.side1 + t1.side2); return a; void main() struct trape t; double area1; printf(“n 请输入梯形的详细信息 n“); printf(“高度:“); scanf(“%lf“, ,传值方式与引用方式的区别,#include struct trape /*此结构体表示梯形*/ double height ,side1, side2; /梯形的高度,上底,下底 ; double area( struct trape *t ) double a; a = 1.0/2 * (t-height * (t-side1 + t-side2); return a; void main() struct trape t; double a1; printf(“n 请输入梯形的详细信息 n“); /*接受用户输入的详细信息*/ printf(“高度:“); scanf(“%lf“, ,传值方式与引用方式的区别,动态数据结构,结构体声明时不能包含自我,但可以包含指向本结构体类型的指针变量 链表(Linked table),struct Link int data; struct Link *next; ;,共用体,共用体(Union)又称联合体,是将不同的数据类型组合在一起,共同占有一段内存的用户自定义数据类型。,union number short x; char ch; float y; ; 基本上和struct一样 x、ch和y处于同样的地址 sizeof(union number)取决于占空间最多的那个成员变量,同一内存单元在每一瞬时 只能存放其中一种类型的成员; 起作用的成员是最后一次存放的成员 不能作为函数参数,共用体的应用,struct person char name20; char sex; int age; union int single; struct char spouseName20; int child; married; struct date divorcedDay; marital; int marryFlag; ;,union int single; struct char spouseName20; int child; married; struct date divorcedDay; marital;,struct char spouseName20; int child; married;,共用体和结构体的区别,共用体与结构体都是由多个成员分量组成的一个整体; 共用体与结构体在定义、说明和使用(成员引用、指针)上十分相似。 结构体:多个成员分量分别占用不同的存储空间构成一个整体;成员分量之间是相互独立的,所进行的各种操作互不影响。 共用体:多个成员分量共同占用同一存储空间;成员分量之间是相互联系的,所进行的操作相互依赖。,用户自定义类型,标准类型(如int、char、lon
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新能源技术创新视角下的全球产业格局演变报告
- 2025我国某科技公司合同能源管理解决方案案例
- 2025年光伏建筑一体化项目在建筑能耗监测系统中的应用报告
- 2025年彭州网格员考试题及答案
- 2025年周界安防技术创新在国家安全领域的应用
- 2025年智能养老社区综合服务体系建设与社区养老服务效率提升可行性报告
- 2025年智能搜索在教育资源共享平台技术创新中的应用
- 2025年智能零售行业无人店防盗系统技术创新与市场竞争力分析
- 2025年中国仿真冰行业市场全景分析及前景机遇研判报告
- 2025【建筑企业各类合同】建筑企业设备租赁合同(范本)
- 2025年现代教育技术与教学设计理论知识考试试卷及答案
- 大学生职业规划大赛《书画艺术专业》生涯发展展示
- 2025年第十届全国中小学“学宪法、讲宪法”知识竞赛题库
- 热缩片儿童课件
- 塑料制品企业三年专项整治方案
- 植入类器械培训
- 食品欺诈培训课件
- 污水零直排工作专题汇报
- QGDW11008-2013低压计量箱技术规范
- 火电厂维护检修作业指导书1
- 2025-2030年中国电镀工业园区行业市场深度调研及发展前景展望研究报告
评论
0/150
提交评论