C语言程序设计
项目五 旅游小帮手 要求: 定义country结构体,包含地理位置、最高温度、最低温度、代表景观等信息,用户输入温度范围,给出旅游建议,并提示它的代表景观。 解决问题需要的知识点: 1、结构体的定义; 2、结构体的引用。
项目五 旅游小帮手 任务1:旅游建议小助手 —— 第9章 结构体与共用体 章节主要内容 9.1 结构体 9.2 共用体 9.3 枚举 9.1 结构体 9.2 共用体 9.3 枚举 9.4 用户定义类型
9.1 结构体 什么是结构体? 结构体是一种构造数据类型。 用途:将描述同一事物不同特征的数据构造成一个整体数据类型 -------自定义数据类型。
结构体示例解析: 学生的基本情况: 要使用这类具体的数据必须先定义结构体类型,其中各个数据成为结构体类型的成员项。 字段 学号 姓名 性别 籍贯 分数 类型 long char float 实例 20057345 王晓 女 合肥 80.5 要使用这类具体的数据必须先定义结构体类型,其中各个数据成为结构体类型的成员项。
由用户定义结构体类型的名字;在定义的结构体类型中,各个成员项的名字和类型。 一般形式为: 9.1.1 结构体类型定义 由用户定义结构体类型的名字;在定义的结构体类型中,各个成员项的名字和类型。 一般形式为: 例:struct student { long iNum; char chpName[20]; char chSex; int iAge; char chAddress[30]; float fScore; }; struct 结构体名 { 类型标识符 成员名; ……………. };
9.1.2 结构体变量的说明 形式一:先定义结构体类型,然后说明结构体变量 struct 结构体名 { 类型标识符 成员名; ……………. 类型标识符 成员名; ……………. }; struct 结构体名 变量名表列;
形式二:定义结构体类型的同时定义结构体变量 struct 结构体名 { 类型标识符 成员名; ……………. }变量名表列;
形式三:直接通过无名结构体定义结构体变量 struct { 类型标识符 成员名; ……………. }变量名表列;
说明: 结构体类型与结构体变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体结构体的成员项可以是各种类型的变量,包括已定义好的结构体变量 结构体成员名与程序中变量名可相同,不会混淆 结构体类型及变量的作用域与生存期
9.1.3 结构体变量的初始化 形式一: struct 结构体名 { 类型标识符 成员名; ……………. }; 类型标识符 成员名; ……………. }; struct 结构体名 结构体变量={初始数据};
形式二: struct 结构体名 { 类型标识符 成员名; ……………. }结构体变量={初始数据};
形式三: struct { 类型标识符 成员名; ……………. }结构体变量={初始数据};
可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用 9.1.4 结构体变量的引用 引用规则 结构体变量不能整体引用,只能引用变量成员(函数参数以及函数返回值除外) 结构体变量的各个成员项,具有同类型变量的一切特征 引用方式: 结构体变量名.成员名 可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用
9.1.5 结构体数组 结构体数组的定义 一般形式: struct 结构体名 结构体数组名[整型常量表达式];
9.1.6 结构体指针 指向结构体变量的指针,称为结构体指针。 定义形式: struct 结构体名 *结构体指针名;
9.1.7 结构体与函数 结构体变量或结构体指针可以作为函数的参数或函数的返回值,这时结构体变量可以整体引用 结构体与函数参数 用结构体变量的成员作参数----值传递 用指向结构体变量或结构体数组的指针作参数----地址传递 用结构体变量作参数----多值传递,效率低
9.1.8 链 表 链表的概念: 由若干组数据(称结点)组成,前一结点“指向”下一个结点,即欲找某结点必须先找到它的前一结点。 9.1.8 链 表 链表的概念: 由若干组数据(称结点)组成,前一结点“指向”下一个结点,即欲找某结点必须先找到它的前一结点。 一种动态分配内存的数据组织方式。该方式允许用户根据需要随时增减数据项,而且,数据项在内存中不必连续。
项目五 旅游小帮手 任务1:旅游建议小助手 —— 第9章 结构体与共用体 章节主要内容 9.1 结构体 9.2 共用体 9.3 枚举 9.1 结构体 9.2 共用体 9.3 枚举 9.4 用户定义类型
9.2 共用体 共用体是构造数据类型,也叫联合体 用途:使几个不同类型的变量共占一段内存(相互覆盖)
9.2.1 共用体类型定义 定义形式: union 共用体名 { 类型标识符 成员名; ……………. };
9.2.2 共用体变量定义 x y 形式一: union exam { int a; flort b; char c; }; union data x,y; 形式二: union exam { int a; float b; char c; }x,*px,d[5]; 形式三: union { int a; flort b; char c; }x,y,*px,*py,ar[10]; x y 共用体变量定义分配内存, 长度=最长成员所占字节数 共用体变量任何时刻 只有一个成员存在
9.2.3 共用体变量引用 引用方式和规则: 不能在定义共用体变量时初始化 可以用一个共用体变量为另一个变量赋值 不能引用共用体变量,只能引用其成员 共用体变量中起作用的成员是最后一次存放的成员
项目五 旅游小帮手 任务1:旅游建议小助手 —— 第9章 结构体与共用体 章节主要内容 9.1 结构体 9.2 共用体 9.3 枚举 9.1 结构体 9.2 共用体 9.3 枚举 9.4 用户定义类型
9.3 枚 举 C语言提供了一种称为“枚举”的类型。说明一类变量的取值范围被限定在这个类型说明的范围内。
9.3.1 枚举类型的定义 枚举类型通过列举一序列有限的标识符来定义。 一般形式为: enum 枚举类型名{枚举元素表 }; 9.3.1 枚举类型的定义 枚举类型通过列举一序列有限的标识符来定义。 一般形式为: enum 枚举类型名{枚举元素表 }; 例如:enum weekday { sun,mon,tue,wed,thu,fri,sat }; 枚举元素表反映了该枚举类型的变量所取值的集合。枚举元素如果不给值,自动取0~n-1整数值(n是枚举元素个数),如例中的sun是0,mon是1,…sat是6;在定义枚元素表时,可以对某个枚举元素赋值,其后元素的值将按顺序自动加一递增。
说明: enum是关键字(enumerable),标识枚举类型。花括号内均是用户标识符是枚举类型的元素。 定义的只是数据类型,不是变量。 列举的元素只是一些符号。并不自动代表什么含义,在程序中代表什么含义,完全由程序员确定。 所有元素都是常量,不能被改变。系统为其分配值,即它们在列表中的顺序号(从0开始,且在定义时可赋顺序号的值)。 名称、元素和元素顺序之一不同的枚举类型,都认为是不同的枚举类型。
9.3.2 枚举变量的说明 ⒈先定义后说明 enum weekday { sun,mon,tue,wed,thu,fri,sat }; enum weekday workday,week_end; ⒉同时定义说明 { sun,mon,tue,wed,thu,fri,sat } workday,week_end; ⒊直接说明 enum
9.3.3 枚举变量的引用 同普通变量,但其值只能取相应枚举元素。 枚举类型数据不是字符串,C语言也没有提供枚举类型数据的格式控制,不能直接输入输出。 输入输出多采用switch…case语句。 枚举元素是常量,不是变量,不能在程序中用赋值语句再对它赋值。例如对枚举类型day的元素再作以下赋值:mon=2;是错误的。 只能把枚举元素名赋给枚举变量,不能把元素对应的数值直接赋给枚举变量。如:day1=mon;是正确的。而day1=1是错误的。如果要赋枚举元素的对应的值可以通过强制类型转换,如:day1=(enum weekday)1赋值。
9.4 用户定义类型 功能:用自定义名字为已有数据类型命名 类型定义 typedef 原数据类型名 用户定义的类型名;
9.4.1基本类型定义 int是整型变量的类型说明符。int的完整写法为integer,为了增加程序的可读性,可把整型说明符用typedef定义为INTEGER型; 步骤: 按定义变量方法先写出定义体 如: int i; 将变量名换成新类型名 如: int INTEGER; 最前面加typedef 如: typedef int INTEGER; 用新类型名定义变量 如: INTEGER i,j;
用typedef定义数组类型,可以使程序书写简单,而且使意义更为明确,因而增强了程序的可读性。步骤: 9.4.2 数组类型定义 用typedef定义数组类型,可以使程序书写简单,而且使意义更为明确,因而增强了程序的可读性。步骤: 例 定义数组类型 char a[100]; char NAME[100]; typedef char NAME[100]; NAME a,b,c; char a[100],b[100],c[100];
9.4.3 结构类型定义 PERSONDOC a,b,*p; 例:定义结构体类型 struct data { long num; float score; }d; 例:定义结构体类型 struct data { long num; float score; } PERSONDOC; 例:定义结构体类型 typedef struct data { long num; float score; }PERSONDOC; 例:定义结构体类型 PERSONDOC a,b,*p; struct data { long num; float score; }a,b, *p;
9.4.4 指针类型定义 例:定义指针类型 char *str; 例:typedef struct club struct data char *STRING; typedef char *STRING; STRING p,s[10]; 例:typedef struct club struct data { long num; float score; }PERSONDOC; typedef PERSONDOC *PG; PG pb; PERSONDOC为结构体类型 PG为指向PERSONDOC的指针类型 PERSONDOC *pb; struct club *pb; char *p; char *s[10]; 在用户定义类型中用户定义的类型名一般用大写表示,以便于区别。
第9章 结构体与共用体——总结 内 容 总 结 结构体(结构体的定义、说明、初始化、引用、链表) 语言基础 第9章 结构体与共用体——总结 结构体(结构体的定义、说明、初始化、引用、链表) ;共用体(共用体的定义、说明、引用)、枚举(定 义、说明、引用);用户定义类型(基本类型、数组 类型、结构类型)。 内 容 总 结 知 识 点 结构体(结构体的定义、说明、初始化、引用、链表) ;共用体(共用体的定义、说明、引用)、枚举(定 义、说明、引用)。 重 难 点