分校C课件第14讲结构体32(72)_第1页
分校C课件第14讲结构体32(72)_第2页
分校C课件第14讲结构体32(72)_第3页
分校C课件第14讲结构体32(72)_第4页
分校C课件第14讲结构体32(72)_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

1、1 第十四讲第十四讲 结构体结构体 相关数据的集合。相关数据的集合。 数据的类型可以不相同。数据的类型可以不相同。 用来定义保存在文件中的记录。用来定义保存在文件中的记录。 与指针一起创建动态的数据结构:与指针一起创建动态的数据结构: 链表链表 队列队列 栈栈 树树 2 第十四讲第十四讲 结构体结构体 结构体的概念结构体的概念 结构体类型的定义结构体类型的定义 结构体变量结构体变量 定义和声明定义和声明 初始化初始化 使用使用 结构体数组结构体数组 C C语言程序设计语言程序设计 本讲是教材第11章,但我们由 于课时和全国C的大纲关系,第 四至10节不讲,有兴趣者,自己 学习.本课件后面还有一

2、些有 趣的例子,如冼牌,选举计票程 序, 有兴趣者也可以自学. 结构体是派生的数据类型结构体是派生的数据类型 使用其他类型的对象来构造使用其他类型的对象来构造 结构体。结构体。 3 结构体结构体 结构体结构体 数组是由相同类型的数据构成,而现实生活中由一些不相数组是由相同类型的数据构成,而现实生活中由一些不相 同类型的数据构成的一组数据是相当多的,例如学号、姓名和同类型的数据构成的一组数据是相当多的,例如学号、姓名和 学生成绩。学生成绩。C C语言提供了这种数据结构称为语言提供了这种数据结构称为结构体,它是一种结构体,它是一种 较为复杂而又非常灵活的构造型的数据类型。较为复杂而又非常灵活的构造

3、型的数据类型。 一个结构体类型可以由若干个成员(或域)的成分组成,一个结构体类型可以由若干个成员(或域)的成分组成, 不同的结构体类型其成员不同。不同的结构体类型其成员不同。 对于一个具体的结构体而言其成员的数量是固定的(同数对于一个具体的结构体而言其成员的数量是固定的(同数 组),各成员的数据类型可以不同,这是结构体与数组的重要组),各成员的数据类型可以不同,这是结构体与数组的重要 相同和不同点。相同和不同点。 4 结构体类型定义的一般形式为:结构体类型定义的一般形式为: struct struct 结构体名结构体名 类型名类型名1 1 成员名成员名1 1; 类型名类型名2 2 成员名成员名

4、2 2; 类型名类型名n n 成员名成员名n n; ; 结构体结构体 其中,其中,structstruct是关键字,是结构体类型的标志。结构体名是是关键字,是结构体类型的标志。结构体名是 由用户定义的标识符,它规定了所定义的结构体类型的名称。由用户定义的标识符,它规定了所定义的结构体类型的名称。 结构体类型的组成成分称为成员,成员名的命名规则与变量名结构体类型的组成成分称为成员,成员名的命名规则与变量名 相同。相同。 如果成员的类型相同,则可以同变量一样在一个类型名后写如果成员的类型相同,则可以同变量一样在一个类型名后写 出几个成员名,他们之间用逗号分隔。出几个成员名,他们之间用逗号分隔。 s

5、truct struct student long int xuhao long int xuhao; char name8char name8; int eng ,coup,sum;int eng ,coup,sum; float ave; float ave; ; 5 struct date int year; int month; int day; ; 也可以写成:也可以写成: struct date int year,month,day; struct student int num; char name8,sex; float score4; ; struct:引入结构体定义。:引入

6、结构体定义。 date:结构体的名称,必须与:结构体的名称,必须与 struct 一起使用。一起使用。 struct date 结构体包含结构体包含3个个 int * 类型的类型的成员成员: year Month day 例如例如A: 这里struct student结构体包含有: Int 型num(学号) char name8(姓名),sex(性别) Float score4(成绩数组) 例如例如B: 6 结构体类型的定义结构体类型的定义 结构体定义说明结构体定义说明 同一个结构体内不可以有同名的成员。同一个结构体内不可以有同名的成员。 不同结构体的成员名可以相同,不互相冲突。不同结构体的成

7、员名可以相同,不互相冲突。 结构体结构体 struct date int year,month,day; ; struct Book char title50,writer20,publisher50; int year,month; ; int year,month,day; 7 结构体类型的定义结构体类型的定义 结构体定义说明结构体定义说明 结构体的成员可以是基本类型和构造类型(数组和其他结构体)。结构体的成员可以是基本类型和构造类型(数组和其他结构体)。 结构体结构体 struct date int year,month,day; birthday; struct StuRec int

8、num;char name20;/这里包含了数组这里包含了数组 struct date birthday;/这里包含了上面的结构体这里包含了上面的结构体,称称结构体的嵌套结构体的嵌套 ; 结构体的成员不可以包含自身结构体的成员不可以包含自身 但可以包含自身的指针但可以包含自身的指针 struct student char name20; char gender; float scores4; struct student next; /*error*/ struct student *nextPtr; /*correct*/ ; 8 结构体变量结构体变量 结构体定义说明结构体定义说明 只是创建

9、了新的数据类型,并不能保留内存空间。只是创建了新的数据类型,并不能保留内存空间。 必须定义结构体变量来获得内存空间。必须定义结构体变量来获得内存空间。 定义定义(声明声明)结构体变量结构体变量 有三种方法有三种方法: 1.定义结构体类型后,像声明普通变量一样声明结构体变量。定义结构体类型后,像声明普通变量一样声明结构体变量。 结构体结构体 struct date int year,month,day; ; struct date birth; year month day FF00 FF04 FF08 birth birth 的存储形式的存储形式 TC中与中与VC中的不同中的不同 9 结构体变

10、量结构体变量 定义声明结构体变量定义声明结构体变量 2.在定义结构体类型的同时,声明结构体变量在定义结构体类型的同时,声明结构体变量 结构体结构体 struct date int year,month,day; birth, days4, *bPtr; struct int year,month,day; birth, days4, *bPtr; 没有结构体名,没有结构体名, 无法再次使用。无法再次使用。 3.直接(只)声明结构体变量直接(只)声明结构体变量省略类型名。省略类型名。 类型与变量是不同的概念,注意区分。系统能对变量赋值、存取、运算,类型与变量是不同的概念,注意区分。系统能对变量赋

11、值、存取、运算, 而类型则不能,编译时,系统只对变量分配存储空间,而类型则不分配。而类型则不能,编译时,系统只对变量分配存储空间,而类型则不分配。 结构体中的成员也可以是一个结构体变量,即结构体的嵌套。结构体中的成员也可以是一个结构体变量,即结构体的嵌套。 10 struct student /* student是结构体名,结构体成员有是结构体名,结构体成员有num,name,sex,date,scre4 */ int num; char name8,sex; struct date /*date是结构体名,其结构体变量表是是结构体名,其结构体变量表是birthday,成员包括年月日,成员包括

12、年月日*/ int year,month,day; birthday; float score4; /*score4是数组,数组成员类型浮点型是数组,数组成员类型浮点型 */ xuesh; 结构体中的成员名可以和程序中的变量同名;不同结构体结构体中的成员名可以和程序中的变量同名;不同结构体 中的成员名也可以同名。中的成员名也可以同名。 11 结构体的操作结构体的操作 结构体变量可以执行的操作结构体变量可以执行的操作 将结构体变量赋给相同类型的结构体变量。将结构体变量赋给相同类型的结构体变量。 得到结构体变量的地址。得到结构体变量的地址。 访问结构体变量的成员。访问结构体变量的成员。 使用使用

13、sizeof 确确(测测)定结构体变量的大小。定结构体变量的大小。 结构体结构体 12 结构体变量的初始化结构体变量的初始化 给全部成员赋初值给全部成员赋初值 结构体结构体 struct student int num; char name8,sex; struct date int year,month ,day ; birthday; float sco 4; xuesh=101,“王小宁”,F,1975,5,21,83.6,88,75.5,90; 将结构体变量各成员的初值顺序地放在一对大括号中,并用逗号分隔。对将结构体变量各成员的初值顺序地放在一对大括号中,并用逗号分隔。对 结构体类型变

14、量赋初值时,按每个成员在结构体中的顺序一一对应赋值。结构体类型变量赋初值时,按每个成员在结构体中的顺序一一对应赋值。 同变量一样结构体变量在定义时也可以进行初始化。同变量一样结构体变量在定义时也可以进行初始化。 13 结构体变量的初始化结构体变量的初始化 初始化结构体变量初始化结构体变量 给部分成员赋初值。给部分成员赋初值。 结构体结构体 struct StuRec int num; char name20; struct date int year,month,day; birthday; float score; student=101, “王小宁”; num (2B) name (20B

15、) birthday(6B)score (4B) yearmonthday 101 王小宁 0000.0 14 结构体变量的成员结构体变量的成员 访问结构体成员的两种方式访问结构体成员的两种方式 结构体成员运算符:结构体成员运算符:. 用于结构体变量用于结构体变量 结构体指针运算符:结构体指针运算符:- 用于指向结构体的指针用于指向结构体的指针 等价于等价于 (*cardPtr).face 结构体结构体 struct card myCard; printf(“%s”, myCard.face); struct card *cardPtr; printf(“%s”, cardPtr-face);

16、 struct card char *face; char *suit; myCard.face; 15 案例分析:结构体变量的成员案例分析:结构体变量的成员 问题:访问结构体变量的成员。问题:访问结构体变量的成员。(cw1301.c) 结构体结构体 #include struct card char *face; char *suit; a; Int main() struct card a, *aPtr; a.face = Ace; a.suit = Spades; aPtr = printf(%s%s%sn%s%s%sn%s%s%sn, a.face, of , a.suit, aPtr

17、-face, of , aPtr-suit, (*aPtr).face, of , (*aPtr).suit); 与数组的不同:与数组的不同: 结构变量名不是指针结构变量名不是指针 Ace of Spades Ace of Spades Ace of Spades 注意:注意: 结构不能作为整体输入输出。结构不能作为整体输入输出。 必须逐个成员输入输出。必须逐个成员输入输出。 16 案例分析:结构体作为函数的参数案例分析:结构体作为函数的参数 问题:编写函数实现结构体的复制。问题:编写函数实现结构体的复制。 结构体结构体 #include#include structstruct date d

18、ate int year, month, day; ; int year, month, day; ; voidvoid show(char show(char * *, struct date);, struct date); voidvoid copy(struct date, struct date); copy(struct date, struct date); voidvoid clone(struct date, struct date clone(struct date, struct date * *);); intint main() main() structstruct

19、 date d1, d2, d3, d4; date d1, d2, d3, d4; d1.year = 2004; d1.year = 2004; d1.month = 5; d1.month = 5; d1.day = 1; d1.day = 1; show(“d1”, d1); show(“d1”, d1); /结构体变量作实参,值传递结构体变量作实参,值传递 d2 = d1;d2 = d1; show(d2, d2); show(d2, d2); 实现实现(cw1302.c) 17 案例分析:结构体作为函数的参数案例分析:结构体作为函数的参数 结构体结构体 copy(d1, d3);

20、copy(d1, d3); show(d3, d3); show(d3, d3); clone(d1, clone(d1, show(d4, d4); show(d4, d4); voidvoid show(char show(char * *name, struct date d)name, struct date d) printf(%s: %d-%d-%dn, name, d.year, d.month, d.day); printf(%s: %d-%d-%dn, name, d.year, d.month, d.day); voidvoid copy(struct date s, co

21、py(struct date s, struct date dstruct date d) ) d = s; d = s; voidvoid clone(struct date s, clone(struct date s, struct date struct date * *dPtrdPtr) ) * *dPtr = s; dPtr = s; d1: 2004-5-1 d2: 2004-5-1 d3: 0-0-24 (TC)在在VC中运行的结果不一样中运行的结果不一样-858993460-858993460-858993460 d4: 2004-5-1 用指针作形参 用地址作实参传递 /结

22、构体变量作实参,值传递,d3未赋值作实参值不确定 空返回,无值返回 (cw1302.c)续)续 18 结构体数组结构体数组 一、结构体数组的定义一、结构体数组的定义 定义结构体数组的方法和定义结构体变量的方法一样,只定义结构体数组的方法和定义结构体变量的方法一样,只 是必须说明其为数组。是必须说明其为数组。 定义结构体变量的三种方法都可以用来定义结构体数组。定义结构体变量的三种方法都可以用来定义结构体数组。 二、结构体数组的初始化二、结构体数组的初始化 和一般数组一样,结构体数组也可以进行初始化。和一般数组一样,结构体数组也可以进行初始化。 数组每个元素的初值都放在一对大括号中,括号中依次排数

23、组每个元素的初值都放在一对大括号中,括号中依次排 列元素各成员的初始值列元素各成员的初始值 三、结构体数组的引用三、结构体数组的引用 对结构体数组的引用一般是对数组元素的成员进行引用。对结构体数组的引用一般是对数组元素的成员进行引用。 引用只要遵循对数组元素的引用规则和对结构体变量成员的引用只要遵循对数组元素的引用规则和对结构体变量成员的 引用规则即可。引用规则即可。 19 结构体数组结构体数组 结构体数组结构体数组 数组的元素是结构体变量。数组的元素是结构体变量。 常用结构体来表示记录,那么结构体数组就可以表示一组记常用结构体来表示记录,那么结构体数组就可以表示一组记 录。录。 案例分析案例

24、分析 全班全班 N 个学生,每个学生有学号、姓名、四门课的成绩。个学生,每个学生有学号、姓名、四门课的成绩。 结构体结构体 学号学号姓名姓名成绩成绩1成绩成绩2成绩成绩3成绩成绩4 101WangHai80787681 102ZhaoFei68667175 130LiRui82768184 20 结构体数组结构体数组 结构体数组结构体数组 案例分析案例分析 那么,可以定义结构体数组来保存那么,可以定义结构体数组来保存 N 个学生的数据。个学生的数据。 这样,每个学生的数据就对应一个结构体变量(一条记录),便于这样,每个学生的数据就对应一个结构体变量(一条记录),便于 编程处理。编程处理。 结构

25、体结构体 struct student int num; char name20; float scores4; ; struct student students30; 21 程序举例程序举例 设某班有设某班有N名学生,每个学生数据包括学号,姓名,性别,年龄,平均成绩。名学生,每个学生数据包括学号,姓名,性别,年龄,平均成绩。 要求输入任意一个学号,输出该学生的所有数据。要求输入任意一个学号,输出该学生的所有数据。 分析:从一组数据中查找所需要的具有某特征的内容,最简单的是顺序查找。分析:从一组数据中查找所需要的具有某特征的内容,最简单的是顺序查找。 直到找到或找完为止。直到找到或找完为止。

26、 /*Cw1303.c 教材教材P171L11-1*/ #include #define N 2 struct student /定义结构体定义结构体 long int num;/学号学号 char name7;/姓名姓名 char sex3;/性别性别 int age,score;/成绩成绩 stuN;/定义结构体数组定义结构体数组 main() int i,t=-1;/t=-1为未查找到时的标志为未查找到时的标志 long int xuehao;/查找学号变量查找学号变量 struct student stuN; /定义结构体类型数组定义结构体类型数组 (cw1303.c)案例分析:结构体

27、数组案例分析:结构体数组 22 printf(请按下列顺序输入请按下列顺序输入%d个学生的信息个学生的信息:n,N); /为结构体变量赋值为结构体变量赋值 printf(t学号学号 姓名姓名 性别性别 年龄年龄 平均平均n); for (i=0;iN;i+) printf(NO%d:t,i+1); scanf(%ld%s%s%d%d, printf(请输入需查找学生的学号:请输入需查找学生的学号:); scanf(%ld, for(i=0;iN;i+) if(xuehao=stui.num) t=i;break; if (t!=-1) /*以下输出检索结果以下输出检索结果*/ printf(%

28、ld%8s%4s%4d%4dn,stut.num,,stut.sex,stut.age, stut.score); else printf(查无此人查无此人!n); (cw1303.c)续)续 23 案例分析:结构体数组案例分析:结构体数组 检索检索 问题:问题: 某班有某班有 n 个学生,每个学生的数据包括学号、姓名、年龄和性别。个学生,每个学生的数据包括学号、姓名、年龄和性别。 要求给定任意一个学号,程序能输出检索的结果,并显示对应的学要求给定任意一个学号,程序能输出检索的结果,并显示对应的学 生的数据。生的数据。 分析分析 定义结构体表示学生定义结构体表示学生 用结构体

29、数组保存学生数据用结构体数组保存学生数据 采用顺序查找法采用顺序查找法 结构体结构体 输入学生信息输入学生信息 输入查询条件输入查询条件 查找学生信息,报告结果查找学生信息,报告结果 24 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现(cw1304.c) 结构体结构体 #include #define MAX 20 int main() struct StuRec int num; char name20; char gender; int age; studentMAX; int i, N, num; 25 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现 结构体

30、结构体 printf(tInput a integer as the number of students:); scanf(%d, printf(tInput %d students information:n,N); printf(ntNo.tNametGendertAgen); for (i=0;iN;i+) printf(student %d:nt, i+1); scanf(%d %s %c %d, (cw1304.c)续)续 26 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现 结构体结构体 printf(ntInput a number:); scanf(%d, pr

31、intf(ntPlease wait. Searching.n); for (i=0;iN;i+) if (num=studenti.num) break; if (iN) printf(ntNo.:%dntName:%sntGender:%cntAge:%dn, studenti.num, , studenti.gender, studenti.age); else printf(ntNot found!n); 输入查找条件输入查找条件 查找查找 (cw1304.c)续)续 27 案例分析:结构体数组案例分析:结构体数组 检索检索 问题:问题: 可以多次查找。可以多

32、次查找。 结构体结构体 输入学生信息输入学生信息 输入查询条件输入查询条件 查找学生信息,报告结果查找学生信息,报告结果 是否继续查询是否继续查询 Y N 人机交互人机交互 28 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现(cw1304m.c) 部分代码部分代码 结构体结构体 do scanf(%d, for (i=0;iN;i+) if (num=studenti.num) break; if (iN) /* Found! */ else printf(ntNot found!n); printf(ntContinue?(y/n); c=getchar(); while (

33、c=y|c=Y); 1001y (cw1304.c)续)续 29 小结:知识要点小结:知识要点 结构体是由若干个不同类型数据项构成的集合。结构体是由若干个不同类型数据项构成的集合。 结构体类型的定义:结构体类型的定义: 1. 结构体类型定义的一般形式结构体类型定义的一般形式 2. 结构体类型定义中的注意事项结构体类型定义中的注意事项 结构体类型变量:结构体类型变量: 结构体数组:结构体数组: 1. 结构体数组定义的三种方法结构体数组定义的三种方法 2. 结构体数组的初始化结构体数组的初始化 3. 对结构体数组元素的成员进行引用对结构体数组元素的成员进行引用 1. 结构体类型变量定义的三种方法结

34、构体类型变量定义的三种方法 2. 结构体类型变量的初始化结构体类型变量的初始化 3. 对结构体变量中成员的引用对结构体变量中成员的引用 4. 对整个结构体变量的引用对整个结构体变量的引用 30 #include /预处理调用输入输出头文件预处理调用输入输出头文件 #include / #define N 10/定义符号常量定义符号常量 struct stu/定义结构体定义结构体 long int sno;/学号长整型学号长整型 int score4;/成绩浮点数一维数组三元素成绩浮点数一维数组三元素 studN;/定义结构体数组定义结构体数组 void sort(struct stu arr)

35、/定义结构体数组成绩排序定义结构体数组成绩排序 int i,j; /定义循环变量定义循环变量 struct stu temp; /定义结构体临时变量定义结构体临时变量 for(i=0;iN;i+) /外循环外循环 for(j=i+1;jN;j+) /内循环内循环 if(arri.score3arrj.score3) /比较前后两行比较前后两行 temp=arri;arri=arrj;arrj=temp;/排序交换排序交换 输入一个班输入一个班10个学生的学号和每个学生考试三门功课(数学、英语、计算机基础)个学生的学号和每个学生考试三门功课(数学、英语、计算机基础) 的成绩。编程计算出每个学生的

36、总分和平均分,并按学生成绩优劣排序,最后打的成绩。编程计算出每个学生的总分和平均分,并按学生成绩优劣排序,最后打 印一张按高分到低分名次排序的成绩单。要求:印一张按高分到低分名次排序的成绩单。要求: 1)排序用一个函数实现。排序用一个函数实现。 2)打印的成绩单表项包括:序号,学号、数学、英语、计算机、总分、平均分。打印的成绩单表项包括:序号,学号、数学、英语、计算机、总分、平均分。 31 int main()/主函数主函数 int i; printf(请输入学号和数学、英语、计算机的成绩请输入学号和数学、英语、计算机的成绩n); for(i=0;iN;i+)/输入数据输入数据 printf(

37、“NO:%d”,i+1); scanf(%ld%d%d%d, studi.score3=studi.score0+studi.score1+studi.score2; sort(stud);/调用排序函数调用排序函数 printf(“名次名次t学号学号t数学数学t英语英语t计算机计算机t总分总分t平均分平均分n); /输出题头输出题头 for(i=0;iN;i+)/顺序输出整行顺序输出整行 printf(%dt%ld%t%dt%dt%dt%dt%.1fn,i+1,studi.sno,studi.scor e0,studi.score1,studi.score2,studi.score3,(fl

38、oat)studi.score 3/3); 这是用结构体做实验报告这是用结构体做实验报告,思路方法同数组是一致的思路方法同数组是一致的. 32 本章到此结束,谢谢您的光临!本章到此结束,谢谢您的光临! THANK YOU VERY THANK YOU VERY MUCH MUCH ! 33 案例分析:结构体数组案例分析:结构体数组 高性能的洗牌和发牌程序高性能的洗牌和发牌程序 数据结构数据结构 用一个纸牌结构体数组保存一副牌。用一个纸牌结构体数组保存一副牌。 纸牌的花色和号码名依然保存在字符串数组中。纸牌的花色和号码名依然保存在字符串数组中。 这样,数组中的纸牌俨然已有一个顺序了,则可以改进算

39、这样,数组中的纸牌俨然已有一个顺序了,则可以改进算 法。法。 洗牌:随机打乱纸牌在数组中的位置。洗牌:随机打乱纸牌在数组中的位置。 不存在无限延期。不存在无限延期。 发牌:按纸牌在数组中的顺序显示输出。发牌:按纸牌在数组中的顺序显示输出。 数组遍历一次。数组遍历一次。 结构体结构体 34 案例分析:结构体数组案例分析:结构体数组 高性能的洗牌和发牌程序高性能的洗牌和发牌程序 实现实现(cw1304a.c) 结构体结构体 #include #include #include struct card char *face; char *suit; ; typedef struct card Car

40、d; void fillDeck(Card*, char*, char*); void shuffle(Card*); void deal(Card*); 35 案例分析:结构体数组案例分析:结构体数组 高性能的洗牌和发牌程序高性能的洗牌和发牌程序 实现实现 结构体结构体 int main() Card deck52; char *face = Ace,Deuce,Three, Four,Five, Six,Seven,Eight, Nine,Ten, Jack,Queen,King; char *suit = Hearts,Diamonds,Clubs,Spades; srand(time(

41、NULL); fillDeck(deck, face, suit); shuffle(deck); deal(deck); 36 案例分析:结构体数组案例分析:结构体数组 高性能的洗牌和发牌程序高性能的洗牌和发牌程序 实现实现 结构体结构体 void fillDeck(Card *wDeck, char *wFace, char *wSuit) int i; for (i=0; i=51; i+) wDecki.face = wFacei%13; wDecki.suit = wSuiti/13; 37 案例分析:结构体数组案例分析:结构体数组 高性能的洗牌和发牌程序高性能的洗牌和发牌程序 实现

42、实现 结构体结构体 void shuffle(Card *wDeck) int i, j; Card temp; for (i=0; i=51; i+) j = rand()%52; temp = wDecki; wDecki = wDeckj; wDeckj = temp; 38 案例分析:结构体数组案例分析:结构体数组 高性能的洗牌和发牌程序高性能的洗牌和发牌程序 实现实现 结构体结构体 void deal(Card *wDeck) int i; for (i=0; i=51; i+) printf(%5s of %-8s%c, wDecki.face, wDecki.suit, (i+1

43、)%2 ? t : n); 39 案例分析:结构体数组案例分析:结构体数组 点票程序点票程序 问题问题 有三个候选人,有三个候选人,N个选举人,每次输入一个得票的候选人的名字,个选举人,每次输入一个得票的候选人的名字, 要求最后输出各人的得票结果。要求最后输出各人的得票结果。 定义数据结构定义数据结构 结构体结构体 struct candidate char name20; /*姓名姓名*/ int count; /*得票数得票数*/ cand3; 40 案例分析:结构体数组案例分析:结构体数组 点票程序点票程序 算法算法 结构体结构体 输入候选人信息输入候选人信息 输入选票输入选票 查找得票

44、人信息查找得票人信息 找到否?找到否? 得票人的票数增一得票人的票数增一 输出点票结果输出点票结果 点完否?点完否? Y N N Y 41 案例分析:结构体数组案例分析:结构体数组 点票程序点票程序 实现实现(cw1305.c) 结构体结构体 do printf(Vote:t); gets(name); for (i=0;iM;i+) if (strcmp(name, )=0) candi.count+; vote+; break; printf(tContinue?(y/n); c=getchar(); i=getchar(); while (c=y|c=Y); 42 案

45、例分析:结构体数组案例分析:结构体数组 改进点票程序改进点票程序 问题:问题: 假设选举人都是候选人假设选举人都是候选人 分析点票过程中数组的变化分析点票过程中数组的变化 结构体结构体 litao litao wanghai litao zhaofei litaowanghai litaowanghaizhaofei 43 案例分析:结构体数组案例分析:结构体数组 改进点票程序改进点票程序 数据结构和算法数据结构和算法 结构体结构体 struct candidate char name20; int count; candM; 输入选票输入选票 查找得票人信息查找得票人信息 找到否?找到否?

46、得票人的票数增一得票人的票数增一 输出点票结果输出点票结果 点完否?点完否? Y N N Y 加入新的候选人;加入新的候选人; 其得票数为其得票数为1。 44 案例分析:结构体数组案例分析:结构体数组 改进点票程序改进点票程序 实现实现(cw1306.c) 结构体结构体 。 printf(Vote:t); gets(name); found=0; for (i=0;ilen;i+) if (strcmp(name, )=0) candi.count+; found=1; break; if (!found) strcpy(,name); candi.co

47、unt=1; len+; 。 出现新的候选人出现新的候选人 45 案例分析:结构体数组案例分析:结构体数组 增强点票程序增强点票程序 问题问题 要求按候选人得票数要求按候选人得票数 从高到低顺序输出结果。从高到低顺序输出结果。 修改算法修改算法 结构体结构体 输入选票输入选票 查找得票人信息查找得票人信息 找到否?找到否? 得票人的票数增一得票人的票数增一 输出点票结果输出点票结果 点完否?点完否? Y N N Y 加入新的候选人;加入新的候选人; 其得票数赋值其得票数赋值“1”。 按得票数进行排序按得票数进行排序 46 案例分析:结构体数组案例分析:结构体数组 增强点票程序增强点票程序 实现

48、实现(cw1307.c) 排序部分排序部分 结构体结构体 for (i=0;ilen-1;i+) for (j=0;jlen-1-i;j+) if (candj.countcandj+1.count) tmp=candj; candj=candj+1; candj+1=tmp; 47 案例分析:结构体数组案例分析:结构体数组 优化点票程序优化点票程序 问题问题 如果候选人的信息较多,为了提高排序过程中数据交换的性能,增如果候选人的信息较多,为了提高排序过程中数据交换的性能,增 设一数组设一数组order,用来保存排序结果。,用来保存排序结果。 分析分析 结构体结构体 012345 305142

49、 20Wanghai M 43 P 12Zhaofei F 41 P 6Lilan F 38 N 35Huangjin M 52 P 9Wuma M 29 N 15Hecheng M 36 P order的初态的初态 order的末态的末态 从高到低从高到低 0 1 2 3 4 5 48 案例分析:结构体数组案例分析:结构体数组 优化点票程序优化点票程序 实现实现(cw1308.c) 结构体结构体 for (i=0;ilen;i+) orderi=i; for (i=0;ilen-1;i+) for (j=0;jlen-1-i;j+) if (candorderj.countcandorder

50、j+1.count) tmp=orderj; orderj=orderj+1; orderj+1=tmp; for (i=0;ilen;i+) printf(t%st%dn, , candorderi.count); 交换序号交换序号 排序数组赋初值排序数组赋初值 按照按照order保存的顺序输出候选人信息。保存的顺序输出候选人信息。 49 结构体作为函数的参数结构体作为函数的参数 把结构体的单个成员传递给函数把结构体的单个成员传递给函数 值传递。值传递。 被调用函数不能修改调用函数中的结构体成员。被调用函数不能修改调用函数中的结构体成员。 把整个结构体传递给函数

51、把整个结构体传递给函数 值传递。值传递。 被调用函数不能修改调用函数中的结构体。被调用函数不能修改调用函数中的结构体。 把结构体指针传递给函数把结构体指针传递给函数 模拟引用传递。模拟引用传递。 被调用函数能修改调用函数中的结构体。被调用函数能修改调用函数中的结构体。 结构体结构体 50 在函数中使用结构体在函数中使用结构体 把整个结构体作为单个数据返回把整个结构体作为单个数据返回 因为结构体变量之间可以赋值。因为结构体变量之间可以赋值。 按值传递把数组传递给函数按值传递把数组传递给函数 把数组作为结构体的成员,然后把结构体传递给函数。把数组作为结构体的成员,然后把结构体传递给函数。 被调用函

52、数不能修改调用函数中的数组。被调用函数不能修改调用函数中的数组。 结构体结构体 51 共用体共用体或称为或称为联合联合(Union) 使几个不同的变量共占同一段内存的结构称为使几个不同的变量共占同一段内存的结构称为 “ “共用体共用体” 或者或者“联合联合”类型的结构。类型的结构。 1、共用体的概念 union number short x; char ch; float y; ; 基本上和基本上和struct一样一样 x、ch和和y处于处于同样的地址同样的地址 sizeof(union xxx)取决于占空间最多的那个成员变量。取决于占空间最多的那个成员变量。 11.8 52 共用体共用体 u

53、nion data int i; char ch; float f; a,b,c; 同一内存单元在每一瞬时只能存放其中一种类型的成员;同一内存单元在每一瞬时只能存放其中一种类型的成员; 并非同时都起作用,起作用的成员是最后一次存放的成员并非同时都起作用,起作用的成员是最后一次存放的成员 不能作为函数参数不能作为函数参数 union data int i; char ch; float f; ; union data a,b,c; 或: 共用体和结构体的比较:共用体和结构体的比较: 结构体变量所占内存长度是各成员占的内存长度之和。每个成员结构体变量所占内存长度是各成员占的内存长度之和。每个成员

54、分别占有其自己的内存单元。分别占有其自己的内存单元。 共用体变量所占的内存长度等于最长的成员的长度。共用体变量所占的内存长度等于最长的成员的长度。 上面定义的上面定义的“共用共用 体体”变量、变量、 各占个字节各占个字节 (因为一个实型变(因为一个实型变 量占个字节),量占个字节), 而不是各占而不是各占 个字节。个字节。 例如: 53 共用体共用体 只有先定义了共用体变量才能引用它,而且不能引用共用只有先定义了共用体变量才能引用它,而且不能引用共用 体变量,而只能引用共用体变量中的成员。体变量,而只能引用共用体变量中的成员。 例如:前面定义了a、b、c为共用体变量 a.i a.i (引用共用

55、体变量中的整型变量)引用共用体变量中的整型变量) a.cha.ch(引用共用体变量中的字符变量)引用共用体变量中的字符变量) a.f a.f (引用共用体变量中的实型变量)引用共用体变量中的实型变量) 2 共用体变量的引用方式 54 共用体共用体 (1)(1)同一个内存段可以用来存放几种不同类型的成员,但在每一同一个内存段可以用来存放几种不同类型的成员,但在每一 瞬时只能存放其中一种,而不是同时存放几种。瞬时只能存放其中一种,而不是同时存放几种。 (2) (2) 共用体变量中起作用的成员是最后一次存放的成员,在存共用体变量中起作用的成员是最后一次存放的成员,在存 入一个新的成员后原有的成员就失

56、去作用。入一个新的成员后原有的成员就失去作用。 (3) (3) 共用体变量的地址和它的各成员的地址都是同一地址。共用体变量的地址和它的各成员的地址都是同一地址。 (4) (4) 不能对共用体变量名赋值,也不能企图引用变量名来得到不能对共用体变量名赋值,也不能企图引用变量名来得到 一个值,又不能在定义共用体变量时对它初始化。一个值,又不能在定义共用体变量时对它初始化。 (5) (5) 不能把共用体变量作为函数参数,也不能使函数带回共用不能把共用体变量作为函数参数,也不能使函数带回共用 体变量,但可以使用指向共用体变量的指针体变量,但可以使用指向共用体变量的指针 (6) (6) 共用体类型可以出现

57、在结构体类型定义中,也可以定义共共用体类型可以出现在结构体类型定义中,也可以定义共 用体数组。反之,结构体也可以出现在共用体类型定义中,用体数组。反之,结构体也可以出现在共用体类型定义中, 数组也可以作为共用体的成员。数组也可以作为共用体的成员。 3 共用体类型数据的特点 55 共用体共用体 设有若干个人员的数据,其中有学生和教师。学生的数据中包设有若干个人员的数据,其中有学生和教师。学生的数据中包 括:姓名、号码、性别、职业、括:姓名、号码、性别、职业、班级班级。教师的数据包括:姓名、。教师的数据包括:姓名、 号码、性别、职业、号码、性别、职业、职务职务。可以看出,学生和教师所包含的数。可以

58、看出,学生和教师所包含的数 据是不同的。现要求把它们放在同一表格中。据是不同的。现要求把它们放在同一表格中。 图图11-2511-25 例 56 用指针处理链表用指针处理链表 图图11-2611-26 算法:算法: 57 共用体共用体 #include #include structstruct int num; int num; char name10; char name10; char sex; char sex; char job; char job; union union int banji; int banji; char position10;char position10;

59、category; category; person2;person2;/ /* *先设人数为先设人数为2 2* */ / int main() int i; for(i=0;i2;i+) scanf(%d %s %c %c, Cw1308.c 58 共用体共用体 if(personi.job = S)if(personi.job = S) scanf(%d, scanf(%d, else if(personi.job = T)else if(personi.job = T) scanf(%s, personi.category.position);scanf(%s, personi.cate

60、gory.position); else printf(“Input error!”); printf(n);else printf(“Input error!”); printf(n); printf(No. name sex job class/positionn);printf(No. name sex job class/positionn); for(i=0;i2;i+)for(i=0;i2;i+) if (personi.job = S)if (personi.job = S) printf(“%-6d%-10s%-3c%-3c%-6dn”,personi.num, printf(

温馨提示

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

最新文档

评论

0/150

提交评论