自定义数据类型.ppt_第1页
自定义数据类型.ppt_第2页
自定义数据类型.ppt_第3页
自定义数据类型.ppt_第4页
自定义数据类型.ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第10章 自定义数据类型 1 试试并非受罪,问问并不吃亏 回顾 编译预处理 不带参数的宏定义 带参数的宏定义 2 试试并非受罪,问问并不吃亏 教学目标 理解为什么使用结构体 定义结构体 声明结构体变量 访问结构体成员 掌握结构体作为函数参数的用法 了解共用体 了解自定义数据类型 3 试试并非受罪,问问并不吃亏 思考 在程序里表示一个人(姓名、年龄、性别、成绩),怎么 表示? 想表示多个人呢? 如何用计算机程序实现下述表格的管理? 4 试试并非受罪,问问并不吃亏 结构体简介 I. 使用数组 MaryJohnPeterRoseKate FMFMF 0102030405 8978.56797.564 解决方案: score num sex name 不能建立数组间的关系 II. 使用多维数组 MaryJohnPeterRoseKate FMFMF 0102030405 8978.56797.564 C 语言不允许一个数组包含多 种数据类型 III. 使用结构体 numnamesexscore C 语言引入了称为结构体的数据存储方式 “结构体” 是一种构造数据类型,它是由若干数据项组 合而成的复杂数据对象,这些数据项称为结构体的成员 。 5 试试并非受罪,问问并不吃亏 定义结构体2-1 struct structurename datatype variable1; datatype variable2; . ; 结构体成员 ; 结构体名 structstudent int num; char name20; char sex; 定义结构体 float score; C 语言中的有效数据类型 6 试试并非受罪,问问并不吃亏 定义结构体2-2 struct student int num; char name20; char sex; float score; ; num name sex student 结构体定义并不预留内存 结构体定义放置在程序的开始部分,位于头文件声明之 后 score 结构体定义仅描述了一个结构体的形式。如果要在程序 里使用结构体,需要声明结构体变量。 7 试试并非受罪,问问并不吃亏 声明结构体变量 声明结构体变量 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 结构体的变量,将会为该变量分配内存, 大小是大于或等于其所有成员变量的大小之和。 8 试试并非受罪,问问并不吃亏 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 9 试试并非受罪,问问并不吃亏 内存 student3 struct student student3=3,“Yao Ming “,M,90.5; 结构体变量初始化 3Yao MingM 赋值的顺序应与成员声明时的顺序一样;允许 初始化语句中的值的数目比结构体成员数目少 。 student3.num student3.sex 90.5 student3.score 10 试试并非受罪,问问并不吃亏 student1 student1.num=1; scanf(“%s“, student1.sex=M; printf(“请输入成绩:n“); scanf(“%f“, 结构体变量赋值 1Zhang Zi Liang M q 用输入语句或赋值语句来给结构体变量的各个成员赋值 78 78 student2 = student1; student2 1Zhang Zi Liang M78 strcpy(,“ZhangSan“); 11 试试并非受罪,问问并不吃亏 结构体变量 如果要将“zhang”改为“zhong”,只要将结构变量 student1中的数组成员name下标为2的元素a改为o即 可。可以使用下列语句: 2 = o; /* 为结构变量中的数组成员的一个元素赋值 */ 12 试试并非受罪,问问并不吃亏 结构体变量 对结构变量的整体操作 要对结构进行整体操作有很多限制,C语言中能够对 结构进行整体操作的运算不多,只有赋值“=”和取地址 “ sunday = today; /* 结构变量整体赋值 */ 13 试试并非受罪,问问并不吃亏 结构体类型的引用 不能将一个结构变量作为一个整体直接访问。例如,已定 义 student1 为结构变量并且已有值。不能这样引用: printf (“%s,%c,%d,%d,%dn“, student1); 如果成员本身又是一个结构类型,则要用若干个成员运算 符,一级一级地找到最低的一级的成员。 只能对最低级的成员进行赋值或存取以及运算。例如,对 上面定义的结构变量student1,可以这样访问各个成员: student1.sex student1.birthday.month student1.birthday.day student1.birthday.year 14 试试并非受罪,问问并不吃亏 问题描述: 根据学员的成绩,输出不及格学员的详细信息。 使用结构体示例 #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 return 0; 不及格学员的名单如下: 3 姚光明 M 59.00 stu1 1 李亚鹏 M78 stu2 2 周晶晶 F92 stu3 3 姚光明 M59 15 试试并非受罪,问问并不吃亏 struct stu *pstu; (*pstu).num 或者: pstu-num 结构体指针变量 q 一个指针当用来指向一个结构体时, 称之为结构体指针变 量。 q 结构体指针变量中的值是所指向的结构体变量的首地址。 q 结构体指针变量声明的一般形式为: struct 结构体名 *结构体指针变量名 q 通过结构体指针可以访问该结构体变量的成员,一般形式 为: (*结构体指针变量).成员名 或者 结构体指针变量-成员名 #include struct student int num; char *name; char sex; float score;stu=1,“张宾“,F,55,*pstu; int main() pstu= printf(“学号:%d 姓名:%sn“,stu.num,); printf(“性别:%c 成绩:%5.2fnn“,stu.sex,stu.score); printf(“学号:%d 姓名:%sn“,(*pstu).num,(*pstu).name); printf(“性别:%c 成绩:%5.2fnn“,(*pstu).sex,(*pstu).score); printf(“学号:%d 姓名:%sn“,pstu-num,pstu-name); printf(“性别:%c 成绩:%5.2fnn“,pstu-sex,pstu-score); return 0; 学号:1 姓名:张宾 性别:F 成绩:55.00 学号:1 姓名:张宾 性别:F 成绩:55.00 学号:1 姓名:张宾 性别:F 成绩:55.00 Press any key to continue 16 试试并非受罪,问问并不吃亏 struct student int num; char* name; char sex; float score; stu30; 结构体数组 q 元素为结构体类型的数组称为结构体数组。 q 在实际应用中,经常用结构体数组来表示具有相同数据结构 体的一个群体。例如一个班的学员档案,一个公司的职工档 案等。 定义了一个结构体数组stu1,共有30个元素,stu0 stu29。每个数组元素都具有struct student的结构体形式 。 17 试试并非受罪,问问并不吃亏 问题描述: 求学员的总成绩和平均成绩,并统计不及格人数。 结构体指针变量 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;iyear = 2000; p-month = 5; p-day = 22; int main() struct date d; d.year = 1999; d.month = 4; d.day = 23; printf(“%d,%d,%dn”, d.year, d.month, d.day); func( printf(“%d,%d,%dn”, d.year, d.month, d.day); return 0; 1999,4,23 2000,5,22 22 试试并非受罪,问问并不吃亏 结构体成员作为函数参数 struct film char name25; /电影名 char director25; /导演 int duration; /片长; void display (char *, char *, int *); int main() struct film f1; printf(“nt 请输入电影的详细信息“); printf(“nn 请输入影片名:“); gets(); fflush(stdin); printf(“n 请输入导演姓名: “); gets(f1.director); fflush(stdin); printf(“n 请输入电影片长(分钟): “); scanf(“%d“, display(,f1.director, return 0; void display(char *n, char *d, int *m) printf(“nt 电影的详细信息n“); printf(“n 片名: %s“,n); printf(“n 导演: %s“,d); printf(“n 片长: %dn“,*m); 前两个参数为字符串 ,所以不使用“ /*此结构体表示梯形*/ struct trapezoid double height;/梯形的高度 double side1;/梯形的上底 double side2;/梯形的下底 ; int main() struct trapezoid trap; double total_area; /*接受用户输入的详细信息*/ printf(“n 请输入梯形的详细信息 n“); printf(“高度:“);scanf(“%lf“,fflush(stdin); printf(“上底“);scanf(“%lf“, fflush(stdin); printf(“下底:“);scanf(“%lf“, /* 调用以struct作为参数的函数 area*/ total_area = area(trap); /* 向用户显示详细信息 */ printf(“n 计算梯形的面积 n“); printf(“n 高:%3.2lf“,trap.height); printf(“n 上底:%3.2lf“,trap.side1); printf(“n 下底:%3.2lf“,trap.side2); printf(“n 梯形的面积是 %3.2lfn“,total_area); return 0; double area(struct trapezoid trap1) double a; a = 1.0/2 * (trap1.height * (trap1.side1 + trap1.side2); return a; 24 试试并非受罪,问问并不吃亏 传值方式与引用方式的区别 #include /*声明一个以结构体体指针作为参数的函数*/ double area(struct trapezoid *trap1); /*此结构体表示梯形*/ struct trapezoid double height;/梯形的高度 double side1;/梯形的上底 double side2;/梯形的下底; int main() struct trapezoid trap; double total_area; /*接受用户输入的详细信息*/ printf(“n 请输入梯形的详细信息 n“); printf(“高度:“);scanf(“%lf“,fflush(stdin); printf(“上底“);scanf(“%lf“,fflush(stdin); printf(“下底:“);scanf(“%lf“, /* 调用函数area并用指针指向作为参数的struct */ total_area = area( /* 向用户显示详细信息 */ printf(“n 计算梯形的面积 n“); printf(“n 高:%3.2lf“,trap.height); printf(“n 上底:%3.2lf“,trap.side1); printf(“n 下底:%3.2lf“,trap.side2); printf(“n 梯形的面积是 %3.2lfn“,total_area); return 0; double area(struct trapezoid *trap1) double a; a = 1.0/2 * (trap1-height * (trap1-side1 + trap1-side2); return a; 25 试试并非受罪,问问并不吃亏 传值方式与引用方式的区别 传值方式引用方式 原理复制一份实参, 把“复 制品”传给函数 的形参。 把实参的地址传递给 函数的形参。 简单变 量 占用的内存不多 ,复制 也快。 占用的内存不多,复制 也快。 结构体 变量 占用的内存大, 复制起 来也较占用时间 在VC的开发环境中,指针变量占用 4个字节的内存空间,相当于传递一 个整数,又小又快。 但是这种传递方式有个“隐患”, 如果写函数的人不小心,在该函数 内错误地修改了传入的参数,就会 造成程序难以查找的错误。 26 试试并非受罪,问问并不吃亏 动态数据结构 结构体声明时不能包含自我,但可以包含指向本结构体类 型的指针变量 链表(Linked table) struct Link int data; struct Link *next; ; data next head data next data next dataNULL 链表原理图 27 试试并非受罪,问问并不吃亏 共用体 共用体(Union)又称联合体,是将不同的数据类型组合 在一起,共同占有一段内存的用户自定义数据类型。 union number short x; char ch; float y; ; 基本上和struct一样 x、ch和y处于同样的地址 sizeof(union number)取决于占空间最多的那个成员变量 1000H 同一内存单元在每一瞬时 只能存放其中一种类型的成员; 起作用的成员是最后一次存放的成员 不能作为函数参数 28 试试并非受罪,问问并不吃亏 共用体的应用 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; 姓名 name 性别 sex 年龄 age 婚姻状况 婚姻状况 标记 未婚 已婚离婚 配 偶 子 女 年 月日 29 试试并非受罪,问问并不吃亏 共用体和结构体的区别 共用体与结构体都是由多个成员分量组成的一个整体; 共用体与结构体在定义、说明和使用(成员引用、指针)上 十分相似。 结构体:多个成员分量分别占用不同的存储空间构成一个 整体;成员分量之间是相互独立的,所进行的各种操作互 不影响。 共用体:多个成员分量共同占用同一存储空间;成员分量 之间是相互联系的,所进行的操作相互依赖。 30 试试并非受罪,问问并不吃亏 用户自定义类型 标准类型(如int、char、long、double等):系统已经 定义好的类型,用户可以直接使用,无须再进行定义。 用户自定义类型:用户根据自己的实际要求,自己定义的 新的数据类型。 除结构和联合等类型之外,还可以用类型说明语句 typedef定义新的类型来代替已有的类型。 31 试试并非受罪,问问并不吃亏 用户自定义类型 一般用在结

温馨提示

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

评论

0/150

提交评论