第9章用户自己建立数据类型.ppt
《第9章用户自己建立数据类型.ppt》由会员分享,可在线阅读,更多相关《第9章用户自己建立数据类型.ppt(153页珍藏版)》请在三一文库上搜索。
1、第9章 用户自己建立数据类型,9.1 定义和使用结构体变量 9.2 使用结构体数组 9.3 结构体指针 9.4 用指针处理链表 9.5 共用体类型 9.6 使用枚举类型 9.7 用typedef声明新类型名,9.1 定义和使用结构体变量,9.1.1 自己建立结构体类型 9.1.2 定义结构体类型变量 9.1.3 结构体变量的初始化和引用,9.1.1 自己建立结构体类型,用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体 例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,是属于同一个学生的,因此组成一个组合数据,如student_1的变量,反映它们之间的内在联系,9.1.1
2、 自己建立结构体类型,struct Student int num; char name20; char sex; int age; float score; char addr30; ;,由程序设计者指定了一个结构体类型struct Student 它包括num,name,sex,age,score,addr等不同类型的成员,9.1.1 自己建立结构体类型,声明一个结构体类型的一般形式为: struct 结构体名 成员表列 ;,类型名 成员名;,9.1.1 自己建立结构体类型,说明: 结构体类型的名字是由一个关键字struct和结构体名组合而成的。结构体名由用户指定,又称“结构体标记”。花括
3、号内是该结构体所包含的子项,称为结构体成员。“成员表列” 也称为“域表” ,每个成员是结构体的一个域,成员命名规则与变量名相同。,9.1.1 自己建立结构体类型,说明: (1)结构体类型并非只有一种,而是可以设计出许多种结构体类型,例如 struct Teacher struct Worker struct Date 等结构体类型 各自包含不同的成员,9.1.1 自己建立结构体类型,说明: (2) 成员可以属于另一个结构体类型。 struct Date int month; int day; int year; ; struct Stu int num;char name20; char se
4、x;int age; struct Date birthday; char addr30; ;,9.1.1 自己建立结构体类型,说明: (2) 成员可以属于另一个结构体类型。,9.1.2 定义结构体类型变量,前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。 相当于设计好了图纸,但并未建成具体的房屋。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。,9.1.2 定义结构体类型变量,1. 先声明结构体类型,再定义该类型变量 声明结构体类型struct Student,可以用它来定义变量 struct
5、Student student1,student2;,结构体类型名,结构体变量名,9.1.2 定义结构体类型变量,1. 先声明结构体类型,再定义该类型变量 声明结构体类型struct Student,可以用它来定义变量 struct Student student1,student2;,student1,student2,9.1.2 定义结构体类型变量,2.在声明类型的同时定义变量 struct Student int num; char name20; char sex; int age; float score; char addr30; student1,student2;,9.1.2
6、定义结构体类型变量,3. 不指定类型名而直接定义结构体类型变量 其一般形式为: struct 成员表列 变量名表列; 指定了一个无名的结构体类型 。,9.1.2 定义结构体类型变量,(1) 结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、访问或运算,而不能对一个类型赋值、访问或运算。在编译时,对类型是不分配空间的,只对变量分配空间。,9.1.2 定义结构体类型变量,(2) 结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。 (3) 对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。(对成员的引用见下例),例9.1 把一个学生的信息(包
7、括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。 解题思路: 自己建立一个结构体类型,包括有关学生信息的各成员(定义) 用它定义结构体变量,同时赋以初值(赋值) 输出该结构体变量的各成员(输出),9.1.3 结构体变量的初始化和引用,#include int main() struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; printf(“NO.:%ldnname:%sn sex:%cnaddress:%sn“,
8、a.num,a.name,a.sex,a.addr); return 0; /* . 为成员运算符,在所有运算符中优先级最高*/,#include int main() struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; printf(“NO.:%ldnname:%sn sex:%cnaddress:%sn“, a.num,a.name,a.sex,a.addr); return 0; ,#include int main() struc
9、t Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; ,a.num=10010; 对,printf(“%sn”,a); 不对,#include int main() struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; ,b=a; 对,struct Student b;,b.num+; 对,#in
10、clude int main() struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; ,scanf(%ld, 对,printf(%o, 对,scanf(“%ld,%s,%c,%sn”, 错,#include int main() struct Date int month; int day; int year; ; struct Stu int num;char name20; char sex;int age; struct Date
11、birthday; char addr30; a,b;,a.birthday.month=12; 对,a.age=10; b.age=9; 对,sum=a.age+b.age; 对,例9.2 输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩 解题思路: (1)定义两个属于同一结构体类型的结构体变量student1和student2; (2)分别输入两个学生的学号、姓名和成绩; (3)比较两个学生的成绩,如果学生1的成绩高于学生2,就输出学生1的全部信息,如果学生2的成绩高于学生1,就输出学生2的全部信息。如果二者相等,输出2个学生的全部信息,#include int main
12、() struct Student int num; char name20; float score; student1,student2; scanf(“%d%s%f“,不能加&,printf(“The higher score is:n“); if (student1.scorestudent2.score) printf(“%d %s %6.2fn“,student1.num, student1.name, student1.score); else if (student1.scorestudent2.score) printf(“%d %s %6.2fn“,student2.num
13、, student2.name, student2.score); else printf(“%d %s %6.2fn“,student1.num, student1.name, student1.score); printf(“%d %s %6.2fn“,student2.num, student2.name, student2.score); return 0; ,程序分析: (1) student1和student2是struct Student类型的变量,在3个成员中分别存放学号、姓名和成绩; (2) 用scanf函数对结构体变量赋值时,必须分别输入它们成员的值,不能在scanf函数中
14、使用结构体变量名一揽子输入全部成员的值; (3) 根据student1.score和student2.score的比较结果,输出不同学生的信息。结构体是“组合项”,各成员之间相互关联,是结构体的特点。,9.2 使用结构体数组,9.2.1 定义结构体数组 9.2.2 结构体数组的应用举例,9.2.1定义结构体数组,例9.3 有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。,9.2.1定义结构体数组,解题思路: 设一个结构体数组,数组中包含3个元素 每个元素中的信息应包括候选人的姓名(字符型)和得票数(整型) 依次输入被选人的姓名,然后与
15、数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成员的值加1 输出所有元素的信息(每个人的得票数),#include #include struct Person char name20; int count; leader3=“Li”,0,“Zhang”,0,“Sun”,0;,全局的结构体数组,name,count,leader0,Li,0,Zhang,0,Sun,0,int main() int i,j; char leader_name20; for (i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(str
16、cmp(leader_name, leaderj.name)=0) leaderj.count+; for(i=0;i3;i+) printf(“%5s:%dn“,leaderi.name, leaderi.count); return 0; ,leaderj.count=leaderj.count+1;,int main() int i,j; char leader_name20; for (i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name, leaderj.name)=0) leaderj.
17、count+; for(i=0;i3;i+) printf(“%5s:%dn“,leaderi.name, leaderi.count); return 0; ,说明: (1)定义结构体数组一般形式是 struct 结构体名 成员表列 数组名数组长度; 先声明一个结构体类型,然后再用此类型定义结构体数组: 结构体类型 数组名数组长度; 如: struct Person leader3;,说明: (2)对结构体数组初始化的形式是在定义数组的后面加上: 初值表列; 如: struct Person leader3= “Li“,0,“Zhang“,0,“Fun“,0;,9.2.2 结构体数组的应用举
18、例,例9.4 有n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。 解题思路:用结构体数组存放n个学生信息,采用选择法对各元素进行排序(进行比较的是各元素中的成绩)。 /*元素是结构体类型数据,成绩是结构体类型数据的一个成员值*/,#include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101,“Zhang“,78 , 10103,“Wang“,98.5, 10106,“Li“, 86 , 10108,“Ling”, 73.5, 10
19、110,“Fun”, 100 ; struct Student temp; const int n = 5 ; int i,j,k;,常变量,若人数变为30,30,#include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101,“Zhang“,78 , 10103,“Wang“,98.5, 10106,“Li“, 86 , 10108,“Ling”, 73.5, 10110,“Fun”, 100 ; struct Student temp; const int n
20、 = 5 ; int i,j,k;,#define N 5,注意temp的类型,printf(“The order is:n“); for(i=0;istuk.score) k=j; temp=stuk; stuk=stui; stui=temp; for(i=0;in;i+) printf(“%6d %8s %6.2fn“, stui.num,stui.name,stui.score); printf(“n“); return 0; ,写法上与普通变量一致,程序分析: (1) 程序中定义了常变量n,在程序运行时不能改变。也可以用符号常量达到同样的目的; (2) 在定义结构体数组时进行初始化,
21、将每个学生的信息用一对花括号包起来,清晰易阅读; (3)用于交换数据的临时变量temp也必须定义为struct Student类型,以达到整体互换的目的。,9.3 结构体指针,9.3.1 指向结构体变量的指针 9.3.2 指向结构体数组的指针 9.3.3 用结构体变量和结构体变量的指针作函数参数,9.3.1 指向结构体变量的指针,结构体指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。 指向一个结构体变量的指针变量的基类型必须与该结构体变量的类型相同。例如: struct Student *pt;,9.3.1 指向结构体变量的指针,例9.5 通过指向结构体变量的指针变量输出结构体
22、变量中成员值。 解题思路:在已有的基础上,本题要解决两个问题: 怎样对结构体变量成员赋值(不用初始化的方法); 怎样通过指向结构体变量的指针访问结构体变量中成员。,#include #include int main() struct Student long num; char name20; char sex; float score; ; ,struct Student stu_1; struct Student * p; p= ,stu_1,10101 Li Lin M 89.5,p,struct Student stu_1; struct Student * p; p= ,stu_1
23、,10101 Li Lin M 89.5,p,说明: 为了使用方便和直观,C语言允许把(*p).num用p-num来代替 (*p).name等价于p-name 如果p指向一个结构体变量stu,以下等价: stu.成员名(如stu.num) (*p).成员名(如(*p).num) p-成员名(如p-num) /* -为指向运算符 */,9.3.2 指向结构体数组的指针,例9.6 有3个学生的信息,放在结构体数组中,要求用指向结构体数组的指针的方法输出全部学生的信息。 /*注:在既可以用指针方法也可以用下标法的时候,初学者尽量使用下标法*/,解题思路:用指向结构体变量的指针处理 (1)声明stru
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用户 自己 建立 数据类型
链接地址:https://www.31doc.com/p-2258240.html