分校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 成员名成员名2 2; 类型名类型名n n 成员名成员名n n; ;结构体结构体其中,其中,stru

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

5、; char name8char name8; int eng ,coup,sum;int eng ,coup,sum; float ave; float ave; ;5struct dateint year; int month; int day;也可以写成:也可以写成:struct dateint year,month,day;struct student int num; char name8,sex; float score4; ;struct:引入结构体定义。:引入结构体定义。date:结构体的名称,必须与:结构体的名称,必须与 struct 一起使用。一起使用。struct dat

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

7、,writer20,publisher50; int year,month;int year,month,day;7结构体类型的定义结构体类型的定义结构体定义说明结构体定义说明结构体的成员可以是基本类型和构造类型(数组和其他结构体)。结构体的成员可以是基本类型和构造类型(数组和其他结构体)。结构体结构体struct dateint year,month,day; birthday;struct StuRec int num;char name20;/这里包含了数组这里包含了数组 struct date birthday;/这里包含了上面的结构体这里包含了上面的结构体,称称结构体的嵌套结构体的嵌

8、套;结构体的成员不可以包含自身结构体的成员不可以包含自身但可以包含自身的指针但可以包含自身的指针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;yearmonthdayFF00FF04FF08birthbirth 的存储形式的存储形式TC中与中与VC中的不同中的不同9结构体变量结构体变量定义声明结构体变量定义声明结构体变量2.在定义结构体类型的同时,声明结构体变量在定义结构体类型的同时,声明结构体变量结构体结构体struct date int year,month,day; birth, days4, *

10、bPtr;struct int year,month,day; birth, days4, *bPtr;没有结构体名,没有结构体名,无法再次使用。无法再次使用。3.直接(只)声明结构体变量直接(只)声明结构体变量省略类型名。省略类型名。类型与变量是不同的概念,注意区分。系统能对变量赋值、存取、运算,类型与变量是不同的概念,注意区分。系统能对变量赋值、存取、运算,而类型则不能,编译时,系统只对变量分配存储空间,而类型则不分配。而类型则不能,编译时,系统只对变量分配存储空间,而类型则不分配。结构体中的成员也可以是一个结构体变量,即结构体的嵌套。结构体中的成员也可以是一个结构体变量,即结构体的嵌套。

11、10struct student /* student是结构体名,结构体成员有是结构体名,结构体成员有num,name,sex,date,scre4 */ int num; char name8,sex; struct date /*date是结构体名,其结构体变量表是是结构体名,其结构体变量表是birthday,成员包括年月日,成员包括年月日*/ int year,month,day; birthday; float score4; /*score4是数组,数组成员类型浮点型是数组,数组成员类型浮点型 */ xuesh;结构体中的成员名可以和程序中的变量同名;不同结构体结构体中的成员名可以和

12、程序中的变量同名;不同结构体中的成员名也可以同名。中的成员名也可以同名。11结构体的操作结构体的操作结构体变量可以执行的操作结构体变量可以执行的操作将结构体变量赋给相同类型的结构体变量。将结构体变量赋给相同类型的结构体变量。得到结构体变量的地址。得到结构体变量的地址。访问结构体变量的成员。访问结构体变量的成员。使用使用 sizeof 确确(测测)定结构体变量的大小。定结构体变量的大小。结构体结构体12结构体变量的初始化结构体变量的初始化给全部成员赋初值给全部成员赋初值结构体结构体struct student int num; char name8,sex; struct date int ye

13、ar,month ,day ; birthday; float sco 4;xuesh=101,“王小宁”,F,1975,5,21,83.6,88,75.5,90;将结构体变量各成员的初值顺序地放在一对大括号中,并用逗号分隔。对将结构体变量各成员的初值顺序地放在一对大括号中,并用逗号分隔。对结构体类型变量赋初值时,按每个成员在结构体中的顺序一一对应赋值。结构体类型变量赋初值时,按每个成员在结构体中的顺序一一对应赋值。同变量一样结构体变量在定义时也可以进行初始化。同变量一样结构体变量在定义时也可以进行初始化。13结构体变量的初始化结构体变量的初始化初始化结构体变量初始化结构体变量给部分成员赋初值

14、。给部分成员赋初值。结构体结构体struct StuRec int num; char name20; struct date int year,month,day; birthday; float score; student=101, “王小宁”;num(2B)name(20B)birthday(6B)score(4B)yearmonthday101王小宁0000.014结构体变量的成员结构体变量的成员访问结构体成员的两种方式访问结构体成员的两种方式结构体成员运算符:结构体成员运算符:.用于结构体变量用于结构体变量结构体指针运算符:结构体指针运算符:-用于指向结构体的指针用于指向结构体的指

15、针等价于等价于 (*cardPtr).face结构体结构体struct card myCard;printf(“%s”, myCard.face);struct card *cardPtr;printf(“%s”, cardPtr-face);struct card char *face; char *suit; myCard.face;15案例分析:结构体变量的成员案例分析:结构体变量的成员问题:访问结构体变量的成员。问题:访问结构体变量的成员。(cw1301.c)结构体结构体#include struct card char *face; char *suit;a;Int main() s

16、truct card a, *aPtr; a.face = Ace; a.suit = Spades; aPtr = &a;printf(%s%s%sn%s%s%sn%s%s%sn, a.face, of , a.suit, aPtr-face, of , aPtr-suit, (*aPtr).face, of , (*aPtr).suit);与数组的不同:与数组的不同:结构变量名不是指针结构变量名不是指针Ace of SpadesAce of SpadesAce of Spades注意:注意:结构不能作为整体输入输出。结构不能作为整体输入输出。必须逐个成员输入输出。必须逐个成员输入输

17、出。16案例分析:结构体作为函数的参数案例分析:结构体作为函数的参数问题:编写函数实现结构体的复制。问题:编写函数实现结构体的复制。结构体结构体#include#include structstruct date date 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);voidvoi

18、d clone(struct date, struct date clone(struct date, struct date * *););intint main() main() structstruct 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

19、= d1; show(d2, d2); show(d2, d2); 实现实现(cw1302.c)17案例分析:结构体作为函数的参数案例分析:结构体作为函数的参数结构体结构体 copy(d1, d3); copy(d1, d3); show(d3, d3); show(d3, d3); clone(d1, &d4); clone(d1, &d4); show(d4, d4); show(d4, d4); voidvoid show(char show(char * *name, struct date d)name, struct date d) printf(%s: %d-%d

20、-%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, copy(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:

21、2004-5-1d2: 2004-5-1d3: 0-0-24 (TC)在在VC中运行的结果不一样中运行的结果不一样-858993460-858993460-858993460d4: 2004-5-1用指针作形参用地址作实参传递/结构体变量作实参,值传递,d3未赋值作实参值不确定空返回,无值返回(cw1302.c)续)续18结构体数组结构体数组一、结构体数组的定义一、结构体数组的定义定义结构体数组的方法和定义结构体变量的方法一样,只定义结构体数组的方法和定义结构体变量的方法一样,只是必须说明其为数组。是必须说明其为数组。定义结构体变量的三种方法都可以用来定义结构体数组。定义结构体变量的三种方法都

22、可以用来定义结构体数组。二、结构体数组的初始化二、结构体数组的初始化和一般数组一样,结构体数组也可以进行初始化。和一般数组一样,结构体数组也可以进行初始化。数组每个元素的初值都放在一对大括号中,括号中依次排数组每个元素的初值都放在一对大括号中,括号中依次排列元素各成员的初始值列元素各成员的初始值三、结构体数组的引用三、结构体数组的引用对结构体数组的引用一般是对数组元素的成员进行引用。对结构体数组的引用一般是对数组元素的成员进行引用。引用只要遵循对数组元素的引用规则和对结构体变量成员的引用只要遵循对数组元素的引用规则和对结构体变量成员的引用规则即可。引用规则即可。19结构体数组结构体数组结构体数

23、组结构体数组数组的元素是结构体变量。数组的元素是结构体变量。常用结构体来表示记录,那么结构体数组就可以表示一组记常用结构体来表示记录,那么结构体数组就可以表示一组记录。录。案例分析案例分析全班全班 N 个学生,每个学生有学号、姓名、四门课的成绩。个学生,每个学生有学号、姓名、四门课的成绩。结构体结构体学号学号姓名姓名成绩成绩1成绩成绩2成绩成绩3成绩成绩4101WangHai80787681102ZhaoFei68667175130LiRui8276818420结构体数组结构体数组结构体数组结构体数组案例分析案例分析那么,可以定义结构体数组来保存那么,可以定义结构体数组来保存 N 个学生的数据

24、。个学生的数据。这样,每个学生的数据就对应一个结构体变量(一条记录),便于这样,每个学生的数据就对应一个结构体变量(一条记录),便于编程处理。编程处理。结构体结构体struct student int num; char name20; float scores4;struct student students30;21程序举例程序举例设某班有设某班有N名学生,每个学生数据包括学号,姓名,性别,年龄,平均成绩。名学生,每个学生数据包括学号,姓名,性别,年龄,平均成绩。要求输入任意一个学号,输出该学生的所有数据。要求输入任意一个学号,输出该学生的所有数据。分析:从一组数据中查找所需要的具有某特征

25、的内容,最简单的是顺序查找。分析:从一组数据中查找所需要的具有某特征的内容,最简单的是顺序查找。直到找到或找完为止。直到找到或找完为止。/*Cw1303.c 教材教材P171L11-1*/#include #define N 2struct student /定义结构体定义结构体 long int num;/学号学号 char name7;/姓名姓名 char sex3;/性别性别 int age,score;/成绩成绩stuN;/定义结构体数组定义结构体数组main() int i,t=-1;/t=-1为未查找到时的标志为未查找到时的标志 long int xuehao;/查找学号变量查找学

26、号变量 struct student stuN; /定义结构体类型数组定义结构体类型数组(cw1303.c)案例分析:结构体数组案例分析:结构体数组22printf(请按下列顺序输入请按下列顺序输入%d个学生的信息个学生的信息:n,N); /为结构体变量赋值为结构体变量赋值printf(t学号学号 姓名姓名 性别性别 年龄年龄 平均平均n);for (i=0;iN;i+) printf(NO%d:t,i+1);scanf(%ld%s%s%d%d,&stui.num,&,&stui.sex,&stui.age,&stui.score);p

27、rintf(请输入需查找学生的学号:请输入需查找学生的学号:);scanf(%ld,&xuehao);for(i=0;iN;i+) if(xuehao=stui.num) t=i;break; if (t!=-1) /*以下输出检索结果以下输出检索结果*/printf(%ld%8s%4s%4d%4dn,stut.num,,stut.sex,stut.age,stut.score);else printf(查无此人查无此人!n);(cw1303.c)续)续23案例分析:结构体数组案例分析:结构体数组检索检索问题:问题:某班有某班有 n 个学生,每个学生的数据包括学号、姓

28、名、年龄和性别。个学生,每个学生的数据包括学号、姓名、年龄和性别。要求给定任意一个学号,程序能输出检索的结果,并显示对应的学要求给定任意一个学号,程序能输出检索的结果,并显示对应的学生的数据。生的数据。分析分析定义结构体表示学生定义结构体表示学生用结构体数组保存学生数据用结构体数组保存学生数据采用顺序查找法采用顺序查找法结构体结构体输入学生信息输入学生信息输入查询条件输入查询条件查找学生信息,报告结果查找学生信息,报告结果24案例分析:结构体数组案例分析:结构体数组检索检索实现实现(cw1304.c)结构体结构体#include #define MAX 20int main() struct

29、StuRec int num; char name20; char gender; int age; studentMAX; int i, N, num;25案例分析:结构体数组案例分析:结构体数组检索检索实现实现结构体结构体printf(tInput a integer as the number of students:);scanf(%d, &N);printf(tInput %d students information:n,N);printf(ntNo.tNametGendertAgen);for (i=0;iN;i+) printf(student %d:nt, i+1);

30、 scanf(%d %s %c %d, &studenti.num, , &studenti.gender, &studenti.age);(cw1304.c)续)续26案例分析:结构体数组案例分析:结构体数组检索检索实现实现结构体结构体 printf(ntInput a number:); scanf(%d, &num); printf(ntPlease wait. Searching.n); for (i=0;iN;i+) if (num=studenti.num) break; if (iN) printf(ntNo.:%dntN

31、ame:%sntGender:%cntAge:%dn, studenti.num, , studenti.gender, studenti.age); else printf(ntNot found!n);输入查找条件输入查找条件查找查找(cw1304.c)续)续27案例分析:结构体数组案例分析:结构体数组检索检索问题:问题:可以多次查找。可以多次查找。结构体结构体输入学生信息输入学生信息输入查询条件输入查询条件查找学生信息,报告结果查找学生信息,报告结果是否继续查询是否继续查询YN人机交互人机交互28案例分析:结构体数组案例分析:结构体数组检索检索实现实现(cw13

32、04m.c)部分代码部分代码结构体结构体 do scanf(%d, &num); 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 (c=y|c=Y);1001y(cw1304.c)续)续29小结:知识要点小结:知识要点 结构体是由若干个不同类型数据项构成的集合。结构体是由若干个不同类型数据项构成的集合。结构体类型的定义:结构体类型的定义:1. 结构体类型定义的一般

33、形式结构体类型定义的一般形式2. 结构体类型定义中的注意事项结构体类型定义中的注意事项结构体类型变量:结构体类型变量:结构体数组:结构体数组:1. 结构体数组定义的三种方法结构体数组定义的三种方法2. 结构体数组的初始化结构体数组的初始化3. 对结构体数组元素的成员进行引用对结构体数组元素的成员进行引用 1. 结构体类型变量定义的三种方法结构体类型变量定义的三种方法2. 结构体类型变量的初始化结构体类型变量的初始化3. 对结构体变量中成员的引用对结构体变量中成员的引用4. 对整个结构体变量的引用对整个结构体变量的引用 30#include /预处理调用输入输出头文件预处理调用输入输出头文件#i

34、nclude /#define N 10/定义符号常量定义符号常量struct stu/定义结构体定义结构体long int sno;/学号长整型学号长整型int score4;/成绩浮点数一维数组三元素成绩浮点数一维数组三元素studN;/定义结构体数组定义结构体数组void sort(struct stu arr)/定义结构体数组成绩排序定义结构体数组成绩排序int i,j; /定义循环变量定义循环变量struct stu temp; /定义结构体临时变量定义结构体临时变量for(i=0;iN;i+) /外循环外循环for(j=i+1;jN;j+) /内循环内循环 if(arri.scor

35、e3arrj.score3) /比较前后两行比较前后两行 temp=arri;arri=arrj;arrj=temp;/排序交换排序交换输入一个班输入一个班10个学生的学号和每个学生考试三门功课(数学、英语、计算机基础)个学生的学号和每个学生考试三门功课(数学、英语、计算机基础)的成绩。编程计算出每个学生的总分和平均分,并按学生成绩优劣排序,最后打的成绩。编程计算出每个学生的总分和平均分,并按学生成绩优劣排序,最后打印一张按高分到低分名次排序的成绩单。要求:印一张按高分到低分名次排序的成绩单。要求:1)排序用一个函数实现。排序用一个函数实现。2)打印的成绩单表项包括:序号,学号、数学、英语、计

36、算机、总分、平均分。打印的成绩单表项包括:序号,学号、数学、英语、计算机、总分、平均分。 31int main()/主函数主函数int i;printf(请输入学号和数学、英语、计算机的成绩请输入学号和数学、英语、计算机的成绩n); for(i=0;iN;i+)/输入数据输入数据printf(“NO:%d”,i+1);scanf(%ld%d%d%d, &studi.sno,&studi.score0,&studi.score1,&studi.score2); studi.score3=studi.score0+studi.score1+studi.score2;

37、 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.score0,studi.score1,studi.score2,studi.score3,(float)studi.score3/3); 这是用结构体做实验报告这是用结构体做实验报告,思路方法同数组是一致的思路方法同数组是一致的.32本章到此结束,谢谢您的光临!本章到此

38、结束,谢谢您的光临!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 Card;void fillDeck(Card*, char*, char*);void shuffle(Card*);void deal(Card*);35案例分析:结构体数组案例分析:结构体数组高性能的洗牌和发牌程序高性能的

40、洗牌和发牌程序实现实现结构体结构体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(NULL); fillDeck(deck, face, suit); shuffle(deck); deal(deck);36案例分析:结构体数组案例分析:结构体数组高性能的洗牌和发牌程序高性能的洗牌和发牌程序实现实现结构体结构体void

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

42、= 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)%2 ? t : n); 39案例分析:结构体数组案例分析:结构体数组点票程序点票程序问题问题有三个候选人,有三个候选人,N个选举人,每次输入一个得票的候选人的名字,个选举人,每次输入一个得票的候选人的名字,要求最后输出各人的得票结果。要求最后输出各人的得票结果。定义数据

43、结构定义数据结构结构体结构体struct candidate char name20; /*姓名姓名*/ int count; /*得票数得票数*/ cand3;40案例分析:结构体数组案例分析:结构体数组点票程序点票程序算法算法结构体结构体输入候选人信息输入候选人信息输入选票输入选票查找得票人信息查找得票人信息找到否?找到否?得票人的票数增一得票人的票数增一输出点票结果输出点票结果点完否?点完否?YNNY41案例分析:结构体数组案例分析:结构体数组点票程序点票程序实现实现(cw1305.c)结构体结构体 do printf(Vote:t); gets(name); for (i=0;iM;i

44、+) if (strcmp(name, )=0) candi.count+; vote+; break; printf(tContinue?(y/n); c=getchar(); i=getchar(); while (c=y|c=Y);42案例分析:结构体数组案例分析:结构体数组改进点票程序改进点票程序问题:问题:假设选举人都是候选人假设选举人都是候选人分析点票过程中数组的变化分析点票过程中数组的变化结构体结构体litaolitao wanghai litao zhaofei litaowanghailitaowanghaizhaofei43案例分析:结构体数组案例分析:

45、结构体数组改进点票程序改进点票程序数据结构和算法数据结构和算法结构体结构体struct candidate char name20; int count; candM;输入选票输入选票查找得票人信息查找得票人信息找到否?找到否?得票人的票数增一得票人的票数增一输出点票结果输出点票结果点完否?点完否?YNNY加入新的候选人;加入新的候选人;其得票数为其得票数为1。44案例分析:结构体数组案例分析:结构体数组改进点票程序改进点票程序实现实现(cw1306.c)结构体结构体。 printf(Vote:t); gets(name); found=0; for (i=0;ilen;i+) if (str

46、cmp(name, )=0) candi.count+; found=1; break; if (!found) strcpy(,name); candi.count=1; len+; 。出现新的候选人出现新的候选人45案例分析:结构体数组案例分析:结构体数组增强点票程序增强点票程序问题问题要求按候选人得票数要求按候选人得票数从高到低顺序输出结果。从高到低顺序输出结果。修改算法修改算法结构体结构体输入选票输入选票查找得票人信息查找得票人信息找到否?找到否?得票人的票数增一得票人的票数增一输出点票结果输出点票结果点完否?点完否?YNNY加入新的候选人;加入

47、新的候选人;其得票数赋值其得票数赋值“1”。按得票数进行排序按得票数进行排序46案例分析:结构体数组案例分析:结构体数组增强点票程序增强点票程序实现实现(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案例分析:结构体数组案例分析:结构体数组优化点票程序优化点票程序问题问题如果候选人的信息较多,为了提高排序过程中数据交换的性能,增如果候选人的信息较多,为了提高排序过程中数据交

48、换的性能,增设一数组设一数组order,用来保存排序结果。,用来保存排序结果。分析分析结构体结构体01234530514220Wanghai 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的末态的末态从高到低从高到低01234548案例分析:结构体数组案例分析:结构体数组优化点票程序优化点票程序实现实现(cw1308.c)结构体结构体 for (i=0;ilen;i+) orderi=i; for (i=0;ilen-1;i+) for

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

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

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

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

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

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

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

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

57、同一表格中。据是不同的。现要求把它们放在同一表格中。图图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; category; category;person2;person2;

58、/ /* *先设人数为先设人数为2 2* */ /int main() int i; for(i=0;i2;i+) scanf(%d %s %c %c, &personi.num, &, &personi.sex, &personi.job);Cw1308.c58共用体共用体 if(personi.job = S)if(personi.job = S)scanf(%d, &personi.category.banji);scanf(%d, &personi.category.banji);else if(personi.j

59、ob = T)else if(personi.job = T)scanf(%s, personi.category.position);scanf(%s, personi.category.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 (per

60、soni.job = S)if (personi.job = S)printf(“%-6d%-10s%-3c%-3c%-6dn”,personi.num, printf(“%-6d%-10s%-3c%-3c%-6dn”,personi.num, , personi.sex, personi.job, , personi.sex, personi.job, personi.category.banji); personi.category.banji);else printf(“%-6d%-10s%-3c%-3c%-6sn”,personi.num, else printf(“%-6d%-10s%-3c%-3c%-6sn”,personi.num, ,personi.sex, personi.job, per

温馨提示

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

评论

0/150

提交评论