第09章_结构体(四--gai)

合集下载

第9章 编译预处理、结构体和共用体

第9章 编译预处理、结构体和共用体

讲课提纲
讲课内容
课后作业
上机实验
定义结构变量后,该变量包含的所有成员 就会被分配相应大小的存储空间。
时钟 退出
第9章 编译预处理、结构体和共用体
9.3.2 定义结构体变量
目标要求
在定义结构体的同时也可以定义结构变量 例如:
struct data { char name[20]; short age; char address[80]; float wage; }data1,data2; 在定义结构体的同时定义了两个结构变量data1和 data2。
时钟
退出
第9章 编译预处理、结构体和共用体
9.2.1
目标要求
宏定义
注意事项 在使用宏进行程序设计时,必须注意以下 问题:
同一个宏名不能重复定义,并且定义中的3部分 必须以空格隔开。 为了便于区别“宏名”与“变量名”,“宏名” 一般习惯用大写字母,这是一种约定俗成的做 法。 如果“宏体”较长,不能写在一行内,可以使 用“\”来表示宏体的换行。 宏替换只能替换简单的函数,此处的简单性包 括形式上的简单(即语句较少,无复杂流程控 制),也包括实现过程的简单,如不能包含递 归过程等。
时钟 退出
讲课提纲
讲课内容
课后作业
上机实验
第9章 编译预处理、结构体和共用体
9.3.4 结构变量成员的访问
目标要求
讲课提纲
讲课内容
对结构体变量进行定义和初始化后, 就可对其中的成员进行引用。C语言规 定对结构体变量的成员进行赋值、引 用、输出时不能整体进行,因为它的 各个成员之间是相互独立的,要引用 其成员,可以使用两种运算符:
课后作业
上机实验
时钟
退出
第9章 编译预处理、结构体和共用体

C程序设计第九章结构体与共用体

C程序设计第九章结构体与共用体

则p为结构指针变量,它可用来存放student型变 量的地址 x1 p name 令 p=&x1; sex age 则 p为x1的首地址. score addr 访问结构成员: pname 表示x1的姓名; pname 等价于 (*p).name
page
表示x1的年令; page
等价于 (*p).age
a structure is a collection of variables that are referenced under one name, providing a convenient means of keeping related information together. called aggregate data types because they consist of several different, yet logically connected, variables. also referred to as compound or conglomerate data types, for the same reason. user-defined types
9.5 结构体数组
结构体数组的定义
三种形式:
形式一: struct student 形式二: { int num; struct student 形式三: char name[20]; { int num; struct char sex; char name[20]; { int num; int sex; charage; }; char name[20]; int age; char sex; struct student stu[2]; }stu[2]; int age; }stu[2];

第9章结构体类型与共用体类型习题及答案

第9章结构体类型与共用体类型习题及答案

第九章结构体类型与公用体类型习题及其答案9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。

解:#include "stdio.h"struct date{char month[10];int daynumber;}main(){int i ;date a[12]={{n January u,31},{“February”,29}, {“March”,31}, {” Aprial”,30}, {”May“,31},{“June",30}, {“july”,31},{” August”,31},「'September”,30} ,{“October”,31},{"November",30},{"December",31}};for(i=0;i<12;i++);printf(u%d 月:%s %d\n",i+l,a[i].month,a[i].daynumber);}思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用?9-4编写程序求空间任一点到原点的距离,点用结构体描述。

并请考虑求空间中任意两点的距离的程序。

解:#include "stdio.h"#include "math.h'1struct point{float x ;float y;float z;}void main()double dl,d2,d;point pl,p2 ;printfC请输入第一个点的坐标:“);scanf(”%f,%f,%f",&pl.x,&pl.y,&pl.z);printf(u W输入第二个点的坐标:”);scanf(”%f,%f,%f”,&p2.x,&p2.y,&p2.z);d 1 =sqrt(p l.x*p l.x+p l.y*p l.y+p l.z*p l.z);d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z);d=sqrt((p2.x-p l.x)*(p2.x-p l.x)+(p2.y-p 1 .y)*(p2.y-p l.y)+(p2.z-pl.z)*(p2.z-pl.z));printfC第一个点到原点的距离:%f\n”,dl);printf(“第二个点到原点的距离:%f\n”,d2);printfC俩点间的距离:%f\n”,d);}9-5编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。

C程序设计第四版Chap9(链表)-谭浩强

C程序设计第四版Chap9(链表)-谭浩强

2013 - 2014 Lu & Xiao. All rights reserved.
14
单向链表查找、遍历
查找:确定某个值的节点是否存在 遍历:从头到尾逐个查看节点
2013 - 2014 Lu & Xiao. All rights reserved.
15
单向链表查找 例
int found(struct student* head,int number) { while (head) { if (head->num==number) return 1; head = head->next; } return 0; }
struct student* del(struct student* head) { struct student *tmp; if (head==NULL) { printf("\n list null!\n"); return head; } tmp = head; head = head->next; free(tmp); return head; }
2013 - 2014 Lu & Xiao. All rights reserved.
23
第 9章
结束
2013 - 2014 Lu & Xiao. All rights reserved.
3
单向链表概念
例子:
head 1249 1249 A 1356 1356 B 1475 1475 C 1021 1021 D NULL
2013 - 2014 Lu & Xiao. All rights reserved.
4
单向链表概念
链表有一个“头指针”变量,一个链表使用 “头指针”来标识。“头指针”为NULL时表示 空链表。 链表的每个元素称为“结点”,它由实际元素 数据和指向下一结点的指针两部分组成。最后 一个节点指向NULL,表示链表的尾部。 要访问每个元素,必须从“头指针”开始,一 个一个地访问结点,直至找到所要访问的结点。

第9章 结构体、共用体和枚举类型

第9章 结构体、共用体和枚举类型
第9章 结构体、共用体和枚举类型
9.1 结构体类型与结构体变量 9.2 结构体数组 9.3 向函数传递结构体型数据 9.4 链表 9.5 共用体 9.6 枚举类型 9.7 用户自定义类型

9.1 结构体类型与结构体变量
• 结构体类型的定义
–概述:
• 建立单链表的主要步骤为:
– 生成只含有头结点的空链表; – 然后读取数据信息,生成新结点,将数据存放于新结点中, 插入新结点到单链表中 – 重复第二步,直到输入结束。 根据新结点插入到链表的位置的不同,建立链表的方式, 分为在表尾插入的方法和在表头插入的方法。 •表尾插入: 例9.6 •表头插入: 例9.7
• 共用体变量的定义
–用已定义的共用体类型去定义共用体变量 –定义共用体类型的同时定义变量: –定义无名共用体类型的同时定义变量:
• 共用体变量的引用
–引用方式:共用体变量名.成员名 共用体变量名. 共用体变量名 –说明: 对于共用体变量,只能引用它的成员,而不能引用整个 共用体变量。若共用体的成员是构造类型的,则需要逐级引 用至最低级的成员。 –能通过定义指向共用体的指针变量来引用共用体变量。
在实际应用中,一组相关的数据可能是不同类型的。C语 言提供了包含不同类型成员的类型来定义这样的数据,这 种类型就是结构体类型 结构体类型。 结构体类型
– 定义形式:
struct 结构体名 类型名1 成员名1 {类型名1 成员名1; 类型名2 成员名2 类型名2 成员名2; …… 类型名n 成员名n 类型名n 成员名n; };
• 举例
例9.11 上一页
9.6 枚举类型
• 枚举类型的定义–定义来自式:enum 枚举类型名{枚举常量1,枚举常量2,……,枚举常量n}; •

C语言-第9章 结构体与共用体

C语言-第9章 结构体与共用体

第9章 结构体与共用体 一、单项选择题 1. 若有以下说明语句: struct student { int num; char name[ ]; float score; }stu; 则下面的叙述不正确的是: ( ) A) struct是结构体类型的关键字 B) struct student 是用户定义的结构体类型 C) num, score都是结构体成员名 D) stu是用户定义的结构体类型名 2. 若有以下说明语句: struct date { int year; int month; int day; }brithday; 则下面的叙述不正确的是_____. A) struct是声明结构体类型时用的关键字 B) struct date 是用户定义的结构体类型名 C) brithday是用户定义的结构体类型名 D) year,day 都是结构体成员名 3. 已知:(设整型2字节,字符型1字节,浮点型4字节) struct { int i; char c; float a; }test; 则sizeof(test)的值是 。 A) 4 B) 5 C) 6 D) 7 4. 以下对结构变量stul中成员age的非法引用是 。 struct student { int age; int num; }stu1,*p; p=&stu1; A) stu1.age B) student.age C) p->age D) (*p).age 5. 有如下定义 struct person{char name[9]; int age;}; struct person class[10]={“Tom”,17,“John”,19, “Susan”,18,“Adam”,16,}; 根据上述定义,能输出字母A的语句是 A) printf(“%c\n”,class[3].name); B) printf(“%c\n”,class[3].name[0]); C) printf(“%c\n”,class[3].name[1]); D) printf(“%c\n”,class[2].name[3]); 6. 存放100个学生的数据、包括学号、姓名、成绩。在如下的定义中,不正确的是( )。 A.struct student {int sno; char name[20]; float score; } stu[100]; B. struct student stu[100] {int sno; char name[20]; float score}; C. struct { int sno; char name[20]; float score;} stu[100]; D. struct student {int sno; char name[20]; float score;}; struct student stu[100]; 7. 设有定义语句“struct {int x; int y;} d[2]={{1,3},{2,7}};” 则“printf(“%d\n”,d[0].y/d[0].x*d[1].x);”输出的是( )。 A.0 B)1 C)3 D)6 8. 设有如下定义,则对data中的a成员的正确引用是( )。 struct sk{ int a; float b;} data,*p=&data; A)(*p))data.a B)(*p).a C)p->data.a D)p.data.a 9、已知: struct sk { int a; float b; }data, *p; 若有p=&data,则对data中的成员a的正确引用是( )。 A、(*p).data.a B、p->data.a C、(*p).a D、p.data.a 10. 设有如下定义: struck sk { int a; float b; }data; int *p; 若要使P指向data中的a域,正确的赋值语句是 A) p=&a; B) p=data.a; C) p=&data.a; D)*p=data.a; 11. 以下对结构变量stu1中成员age的非法引用是( )。 struct student { int age; int num; }stu1,*p; p=&stu1; A、 stu1.age B、 student.age C、 p->age D、 (*p).age 12、设有以下说明语句: typedef struct stu { int a; float b; } stutype; 则下面叙述中错误的是( )。 A、struct是结构类型的关键字 B、struct stu是用户定义的结构类型 C、a和b都是结构成员名 D、stutype是用户定义的结构体变量名 *13、已知: union { int i; char c; float a; }test; 则sizeof(test)的值是( )。 A、6 B、5 C、4 D、7 二、阅读程序,写出运行结果 1. #include struct st { int x; int y; } a[2]={5, 7, 2, 9} ; main() { printf("%d\n",a[0].y*a [1].x); } 运行结果是: 14

第9章结构体等构造数据类型

struct { 成员表; } 结构体变量表;
不能混淆结构体名和结构体变量这两 个概念。结构体名实际上标识了程序员定 义的一种新的数据类型,编译系统不可能 为结构体名分配内存空间。只有当变量被 说明为这种由程序员自己定义的数据类型 的结构体时,编译系统才会为结构体变量 分配存储空间。在不引起混淆的情况下, 结构体变量可以简称为结构体。
下面我们说明一个可以描述一个股票 信息的结构体:
struct STOCK {
char stockname[8];
/*股票名称
*/
char stockcode[6];
/*股票代码
*/
float price[3];
/*买 入价、卖出价、成交价 */
};
例9.3 结构体中包含数组。
#include "stdio.h"
%02d:%02d:%02d",\ audit_begin.hour,audit_begin.minute,\ audit_begin.second); }
注意,对嵌套结构体的引用必须引用
到最末一级。
struct OBJECT { struct TASK
{ long plan; long start; long finish;
这种方法的语法格式是: struct 结构体名 { 成员表; } 结构体变量表;
第三种方法是在说明结构体时直接定义 结构体变量,并且不用指定结构体名。
struct { int hour;
int minute; int second; 形式的语法为:
void main()
{ int i;
struct STOCK {
char stockname[16];

第9章结构体与联合体

第9章结构体与联合体
结构体类型指针也可以指向数组或数组元素,因此,当
形参是结构体类型指针变量时,实参也可以是结构体类 型数组名或数组元素的地址。
与标准数据类型的数组与指针一样,在结构体类
型数组指针作函数参数时,也可以有以下4种情况:
(1)实参与形参都用结构体类型数组名;
(2)实参用结构体类型数组名,形参用结构体类型指 针变量;
将存储空间中的每一个存储结点分为两部分
:一部分用于存储数据元素的值,称为数据域;另
一部分用于存放下一个数据元素的存储序号(即存 储结点的地址),称为指针域。
第9章结构体与联合体
在链表中,用一个专门的指针HEAD指向链表中第 一个数据元素的结点(即存放第一个数据元素的存 储结点的序号)。链表中最后一个元素后面已没有 结点元素,因此,链表中最后一个结点的指针域为 空(用NULL或0表示),表示链表终止。
{ 成员表 } 变量表;
第9章结构体与联合体
9.1.2 结构体类型变量的引用
在程序中定义了某结构体类型的变量后就可以被引 用。
结构体变量的一般引用方式如下:
结构体变量名.成员名
其中“.”为结构体成员运算符,它的优先级最高。由
此可以看出,在引用结构体变量时,一般是对其中 的成员逐个引用。
第9章结构体与联合体
第9章结构体与联合体
1. 结构体类型变量的成员作为函数参数 与数组元素可以作为函数参数一样,结构体类型
变量中的成员也可以作为函数参数。在这种情况下, 在被调用函数中的形参是一般变量,而调用函数中 的实参是结构体类型变量中的一个成员,但要求它 们的类型应一致。
第9章结构体与联合体
2. 结构体类型变量作为函数参数 与一般变量可以作为函数参数一样,结构体类型

9.结构体


对结构体变量初始化. 例 对结构体变量初始化 #include <stdio.h> void main() () {struct student { int num; ; char name[20]; char sex; ; char addr[20]; ;
运行结果: 运行结果: No.:10101 : name:LiLin : sex:M :M address:123 Beijing Road :
}a={10101,〃LiLin〃,′M′,〃123 Beijing Road〃}; , , , };
/* 对结构体变量 赋初值 对结构体变量a赋初值 赋初值*/ printf(〃No.:%d\nname:%s\nsex:%c\naddress:%s\n〃, , a.num,,a.sex,a.addr); , , , }
例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }; struct student stu1={112,"Wang Lin",'M',19, "200 Beijing Road"};
形式二:(用的最多)
num 2字节
… …..
name sex age score
20字节 1字节 2字节 4字节
addr
30字节
(2)在声明类型的同时定义变量 (2)在声明类型的同时定义变量 这种形式的定义的一般形式为: 这种形式的定义的一般形式为: struct 结构体名 { 成员表列 变量名表列; }变量名表列;
* Num/ name sex age Month §图11-3 day year

C语言课件—第9章 结构体和共用体

案例代码(详见教材代码实现)
✎ 【案例3】-案例描述
一个小组中有3个学生,每个学生有3门课程的成绩需要统计。案例 要求通过编程依次输入学生的学号、姓名和三门课程的成绩,计算出平 均成绩并依次把每个学生的学号、姓名和平均成绩打印在屏幕上。
✎ 【案例3】-案例分析
很显然,用刚刚学过的结构体存放学生的信息是最好的选择。一个 结构体变量可以存储一组数据,如一个学生的学号、姓名和成绩等。但 是本案例中有3个学生的信息需要存储,因此需要采用结构体数组。与 前面讲解的数组不同,结构体数组中的每个元素都是结构体类型的,它 们都具有若干个成员项。接下来将针对结构体数组的定义、引用及初始 化方式进行讲解。
1. 结构体的每个成员变量相对于结构体首地址的偏移量,是该成 员变量的基本数据类型(不包括结构体、数组等)大小的整数 倍,如果不够,编译器会在成员之间加上填充字节。
2. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如 果不够,编译器会在最末一个成员之后加上填充字节。
✎ 【案例1】-必备知识
✎ 【案例3】-必备知识
• 结构体数组的初始化
− 结构体数组的初始化方式与数组类似,都是通过为元素赋值的方式完 成的。由于结构体数组中的每个元素都是一个结构体变量,因此,在 为每个元素赋值的时候,需要将其成员的值依次放到一对大括号中。
1.先定义结构体数组类型,再初始化结构体数组 2.在定义结构体数组的同时,对结构体数组初始化
✎ 【案例2】-案例描述
此案例是对案例1的补充,案例1中使用结构体变量存储了小明的学 号、姓名、年龄和身高等信息,此案例要求用两种方法把小明的基本 信息输出到屏幕上。
✎ 【案例2】-案例分析
实现本案例有两种方法。第一种方法是:在引用各成员时,结构体 变量使用成员运算符“.”访问成员。另一种方法将用到一个新的知识 ,即结构体指针。顾名思义,指针指向结构体,它的用法与一般指针 没有太大差异。它使用指向运算符“->”访问结构体内各成员。接下 来将围绕结构体指针变量进行详细讲解。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档