C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金第9章 结构体与共用体

上传人:w****i 文档编号:94404988 上传时间:2019-08-06 格式:PPT 页数:116 大小:1.52MB
返回 下载 相关 举报
C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金第9章  结构体与共用体_第1页
第1页 / 共116页
C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金第9章  结构体与共用体_第2页
第2页 / 共116页
C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金第9章  结构体与共用体_第3页
第3页 / 共116页
C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金第9章  结构体与共用体_第4页
第4页 / 共116页
C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金第9章  结构体与共用体_第5页
第5页 / 共116页
点击查看更多>>
资源描述

《C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金第9章 结构体与共用体》由会员分享,可在线阅读,更多相关《C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金第9章 结构体与共用体(116页珍藏版)》请在金锄头文库上搜索。

1、9.1 结构体类型 9.2 结构体数组 9.3 结构体指针 9.4 共用体(联合体)类型 9.5 动态存储分配 9.6 链表 9.7 枚举类型 9.8 类型重定义typedef,第9章 结构体与共用体,9.9 位操作 9.10 位段 9.11 小结,数据类型的扩展,ANSI提供了数据基本类型,但在实际问题中,数据要复杂一些,往往具有不同的数据项和类型: 例如: 图书基本信息 学生基本信息 球赛基本信息 ,方法:创建结构体类型、共用体类型(或称为联合体类型)和枚举类型,用户自定义数据类型,第9章 结构体与共用体,了解C语言中的用户自定义数据类型; 掌握结构体类型的定义; 熟练掌握结构体变量,数组

2、,指针的用法; 掌握共用体类型的定义及操作; 学会进行类型重定义; 理解动态分配存储空间函数的用法; 学习链表的基本操作; 学会位操作,了解位段的意义。,学习目标,9.1 结构体类型,数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作,本章所介绍的数据类型,9.1 结构体类型,9.1.1 结构体的定义 结构体就是将不同的数据项组织成一个整体来对待.,结构体定义的一般形式: struct 结构体名 成员列表 ;,其中: (1) struct 是关键字; (2) “结构体名” 命名应符合用户标识符的书写规范 (3) 成员列表由一对组合,最后以“;”结束 (4) 每个

3、成员要分别说明 (5) 成员所属的类型可以是基本数据类型,也可以是已经声明过的用户自定义类型。,成员分别说明的一般形式: 类型标识符 成员名;,【例9.1】定义一个结构体类型struct book,描述图书基本信息,包含书名、作者、出版社和价格。,struct book char name40; /书名 char author100; /作者 char publish100; /出版社 float price; /价格 ;,【例9.2】定义一个结构体类型struct student,描述学生的基本信息,包含学号、姓名、性别和成绩,struct student int num; /学号 char

4、 name20; /姓名 char sex; /性别, M男,F女 float score; /成绩 ;,【例9.3】定义一个结构体类型struct date,描述日期的基本信息,包含年、月、日,struct date int year; /年 int month; /月 int day; /日 ;,9.1 结构体类型,9.1.2 结构体的嵌套定义 在结构体类型的定义中,如果结构体的成员数据类型也是结构体类型,可以嵌套定义,也可以将结构体类型分开定义。,【例9.4】对【例9.2】中学生的基本信息添加一项生日信息(birthday),struct date int year; /年 int mo

5、nth; /月 int day; /日 ;,struct student int num; /学号 char name20; /姓名 char sex; /性别, M男,F女 struct date birthday; float score; /成绩 ;,先定义日期类型,再定义学生类型,方式一:结构体类型的分别定义,struct student int num; /学号 char name20; /姓名 char sex; /性别, M男,F女 struct date int year; /年 int month; /月 int day; /日 birthday; float score;

6、/成绩 ;,嵌套定义,方式二:结构体类型的嵌套定义,9.1 结构体类型,9.1.3 结构体变量的定义,结构体类型一旦定义,编程人员就可以像使用系统类型一样方便的使用结构体类型。,(1)结构体变量的定义有三种方式: (1)先定义结构体类型,再定义结构体变量; (2)定义结构体类型的同时定义结构体变量; (3)定义无名结构体类型的同时定义结构体变量,先定义结构体类型,再定义结构体变量 struct 结构体名 成员列表 ; struct 结构体名 变量名列表;,例如: struct book char name40; char author100; char publish100; float pr

7、ice; ; struct book book1,book2;,定义了结构体类型: struct book 定义了结构体变量: book1,book2;,方式一:,定义结构体类型的同时定义结构体变量 struct 结构体名 成员列表 变量名列表;,struct book char name40; char author100; char publish100; float price; book1,book2;,定义了结构体类型: struct book 定义了结构体变量: book1,book2;,方式二:,定义无名结构体类型的同时定义结构体变量 struct 成员列表 变量名列表;,str

8、uct char name40; char author100; char publish100; float price; book1,book2;,说明:第三种方法,由于没有给出结构体类型标识符,在实际应用中,此方法往往是一次性的,适用于定义临时的局部变量或者嵌套的结构体成员变量。,方式三:,9.1 结构体类型,(2) 结构体变量的存储空间分配,类型是抽象的,结构体的定义是告诉编译系统如何表示数据,计算机不为其分配空间; 结构体变量是具体的,一旦结构体变量被定义,计算机就会为其分配数据存储空间,所分配的空间大小是其各成员所需的空间之和。,9.1 结构体类型,(2) 结构体变量的存储空间分配

9、,问题:前面实例中book1,book2变量的存储空间是多少?,分析:三种方法所定义的book1,book2变量都被编译系统分配了等长的数据存储单元,分配的空间大小是各成员所需的空间之和,在VC环境下是244字节,如下图示:,9.1 结构体类型,9.1.4 结构体成员的引用,在程序中使用结构体变量时,由于其成员类型可能不一致,不能把它作为一个整体来引用,应单独引用各成员,如果其成员的数据类型又是一个结构体类型,则必须逐级引用,直到最低级的成员。,(1)结构体成员引用的一般形式: 结构体变量名.成员名,例如:struct book book1,book2; book1.name,book2.na

10、me分别表示第一本书和第二本书的书名,其类型均为char; book1.price,book2.price分别表示第一本书和第二本书的价钱,其类型均为float;,例如:struct book book1,book2; gets(book1.name); / 输入字符串 scanf(“%f”, /结构体变量赋值,(2)结构体成员的操作 允许具有相同类型的结构体变量相互赋值 其他:赋值、输入、输出、运算等都是通过结构体变量的成员来实现,结构体变量相互赋值,其他对成员的操作,9.1 结构体类型,9.1.5 结构体变量初始化,结构体变量的初始化有三种方式: (1)在定义结构体变量的同时进行初始化;

11、(2)对结构体变量各成员分别赋值; (3)对结构体变量相互赋值,9.1 结构体类型,例如:对结构体变量stu1,stu2初始化。 struct student stu1=101,“Wang Gang“,M,1990,7,18,90.5,stu2=102,“Zhang ping“,F;,方式一:在定义结构体变量的同时进行初始化,定义了结构体变量: stu1,stu2 对stu1作了完全初始化赋值 对stu21作了部分初始化赋值,9.1 结构体类型,例如:对结构体变量stu1,stu2初始化。 struct student stu1,stu2; stu1.num=101; strcpy(stu1.

12、name,“Wang Gang“); stu1.sex=M; stu1.birthday.year=1990; stu1.birthday.month=7; stu1.birthday.day=18; stu1.score=90.5; stu2.num=102; strcpy(stu2.name, “Zhang ping“); stu2.sex=F;,方式二:对结构体变量各成员分别赋值,9.1 结构体类型,例如: stu2=stu1; 等价于: stu2.num=stu1.num; strcpy(stu2.name,stu1.name); stu2.sex=stu1.sex; stu2.bir

13、thday.year=stu1.birthday.year; stu2.birthday.month=stu1.birthday.month; stu2.birthday.day=stu1.birthday.day; stu2.score=stu1.score;,方式三:结构体变量相互赋值,【例9.6】编程对任意日期,进行当前日期、当月月历、当年年历的输出。,分析: (1)将日期定义为结构体类型; (2)定义判闰年、日期输出、月历输出、年历输出4个用户函数; (3)2月份要做特殊处理(28天或29天)。 闰年的判断,必须满足下面条件之一: (a)能被4整除,但不能被100整除;(b) 可以被4

14、00整除。 (4)在生成月历时,必须判断日期所属星期几,使用基姆拉尔森计算公式: W=(d+1+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 式中:d表示日期中的日数,m表示月份数,y表示年数,w表示星期几。 注意:在公式中有个与其它公式不同的地方:把一月和二月看成是上一年的第十三月和第十四月。,#include struct date /结构体类型定义 int year; int month; int day; ; int IsLeapYear(int year) /判断闰年,1-是,0-否 int leap; if(year%4=0 ,void output

15、MonthList(int y,int m) /输出月历 /根据基姆拉尔森计算日期公式 int d,w,i,days=0; int mon12=31,28,31,30,31,30,31,31,30,31,30,31; /设置天数 /输出月历头 printf(“n=%d年%d月=n“,y,m); printf(“星期日t星期一t星期二t星期三t星期四t星期五t星期六 n“); if(IsLeapYear(y)=1) mon1=29; /如果是闰年,二月就29天 /根据基姆拉尔森公式,将1月和2月当作上年的第13月和第14月 if(m=1|m=2) m+=12; y-; /定位本月1号的输出位置 d=1; w=(d+1+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; /计算星期几 for(i=0;iw;i+) printf(“t“);,/输出月历 for(d=1;d=mon(m-1)%

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号