您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Chapter 2a Arrays and Structures
Slide1-1Chapter2ArraysandStructures(1)Slide1-21.为什么需要结构体?2.结构体与结构体类型的定义3.指向结构体数据的指针4.引用结构体变量的成员5.结构体数组6.结构体的自引用结构结构体的主要内容Slide1-31.为什么需要结构体?结构体(structure)是一种构造型数据类型,它把互相联系的数据组合成一个整体。例如:一个学生的学号、姓名、性别、年龄、成绩、地址,是互相联系的数据,在C语言中用“结构体(structure)”来定义。Slide1-42.结构体的定义声明结构类型的一般形式为:struct结构体名{类型名结构体成员名1;类型名结构体成员名2;类型名结构体成员名n;};结构体的定义以分号结束,被看作一条语句关键字struct和它后面的结构体名一起组成一个新的数据类型Slide1-5structstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/intage;/*年龄*/floatscore;/*成绩*/charaddr[30];/*地址*/};struct是关键字,不能省略。student是定义的结构体名。结构体中的每一项数据,称为结构体“成员”(member)或“分量”。Slide1-6结构体的定义嵌套结构类型:structdate{intyear;intmonth;intday;};structstudent{intnumber;charname[8];charsex;structdatebirthday;doublescore[3];};嵌套结构类型:structstudent{intnumber;charname[8];charsex;structdate{intyear;intmonth;intday;}birthday;doublescore[3];};Slide1-7structstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/intage;/*年龄*/floatscore;/*成绩*/charaddr[30];/*地址*/};typedefstructstudentStudent;或者typedefstructstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/intage;/*年龄*/floatscore;/*成绩*/charaddr[30];/*地址*/}Student;结构体类型的定义Slide1-8【例1】编写程序,要求用户从键盘输入n个学生的姓名和语文、数学、英语成绩,计算每个学生的平均分,输出平均分最高的学生姓名和平均分(保留2位小数)。#includestdio.htypedefstructstudent{/*结构体类型*/charname[8];doublechinese,math,english;doubleaverage;}STUDENT;Slide1-9可以声明指向结构变量的指针,简称结构体指针。可以使用取地址运算符“&”得到结构体变量的地址,该地址实际上是结构体变量中第一个成员的地址。将结构体变量的地址赋给结构体指针,这样就可以通过结构体指针访问结构体变量中的各个成员。typedefstructpoint{doublex;doubley;}POINT;POINTpoint1={1.25,3.58},*pointPtr;pointPtr=&point1;3.指向结构体数据的指针Slide1-10方式1:在声明了结构体变量后,通过成员选择运算符“.”来访问该结构体变量中的结构体成员,一般形式如下:结构体变量名.结构体成员名POINTpoint1;point1.x=1.25;point1.y=3.58;方式2:通过结构体指针和成员选择运算符“.”来访问结构体成员。(*pointPtr).x=5.32;等价于:point1.x=5.32;成员选择运算符“.”的左边应该是一个结构体变量而不是结构体指针。*pointPtr表示结构体指针pointPtr所指向的结构体变量。成员选择运算符“.”的优先级高于解引用运算符“*”,*pointPtr外的“()”必不可少。如果缺少“()”,*pointPtr.x等价于*(pointPtr.x),语义发生了变化,就会产生错误。•2020/1/304.引用结构体变量的成员Slide1-11方式3:通过结构体指针和成员选择运算符“-”来访问结构体成员。pointPtr-x=5.32;等价于:point1.x=5.32;成员选择运算符“-”的左边应该是一个结构体指针而不是结构体变量。通过结构体指针访问结构体成员时,通常使用成员选择运算符“-”。•2020/1/30Slide1-12一个结构体变量只能表示一个实体的信息,如果有许多相同类型的实体,就需要使用结构体数组。与普通数组的不同之处在于结构体数组每个数组元素都是一个结构体类型的数据。POINTpointArray[4];在声明了结构体数组后,通过数组下标和成员选择运算符“.”来访问结构体数组元素中的结构成员:结构体数组名[下标].结构体成员名pointArray[0].x=1.25;pointArray[0].y=3.58;pointArray[1].x=2.34;pointArray[1].y=3.28;5.结构体数组Slide1-13结构体数组名就是结构体数组第一个元素地址。可以将结构体数组名赋给结构指针,通过结构体指针访问结构数组各元素。POINTpointArray[4];POINT*pointPtr=pointArray;pointPtr-x=1.25;pointPtr-y=3.58;(pointPtr+1)-x=2.34;(pointPtr+1)-y=3.28;•2020/1/30Slide1-14【例1】编写程序,要求用户从键盘输入n个学生的姓名和语文、数学、英语成绩,计算每个学生的平均分,输出平均分最高的学生姓名和平均分(保留2位小数)。使用结构编写程序•2020/1/30#includestdio.h#defineARRAY_SIZE50structstudent{/*结构体类型*/charname[8];doublechinese,math,english;doubleaverage;}STUDENT;intmain(void){STUDENTstudentArray[ARRAY_SIZE];/*结构体数组*/STUDENTmaxAverage;/*结构体变量*/inti,n;printf(输入学生人数:);scanf(%d,&n);printf(输入学生的姓名和语文、数学、英语成绩:\n);Slide1-15使用结构编写程序(续)for(i=0;in;++i){printf(学生%d:,i+1);scanf(%s%lf%lf%lf,studentArray[i].name,&studentArray[i].chinese,&studentArray[i].math,&studentArray[i].english);studentArray[i].average=(studentArray[i].chinese+studentArray[i].math+studentArray[i].english)/3;}maxAverage=studentArray[0];for(i=1;in;++i){if(maxAverage.averagestudentArray[i].average)maxAverage=studentArray[i];}printf(平均分最高的学生:\n);printf(%s平均分%.2f\n,maxAverage.name,maxAverage.average);return0;}Slide1-16【例1-修改1】编写程序,要求用户从键盘输入n个学生的姓名和语文、数学、英语成绩,计算每个学生的平均分,输出平均分最高的学生姓名和平均分(保留2位小数)。修改1:动态内存分配+结构体指针。使用结构编写程序#includestdio.h#include“PublicDS.h”structstudent{/*结构体类型*/charname[8];doublechinese,math,english;doubleaverage;}STUDENT;intmain(void){STUDENT*studentArray,*p,maxAverage;inti,n;printf(输入学生人数:);scanf(%d,&n);printf(输入学生的姓名和语文、数学、英语成绩:\n);MALLOC(studentArray,n*sizeof(STUDENT),STUDENT*);Slide1-17使用结构编写程序(续)for(p=studentArray;pstudentArray+n;p++){printf(学生%d:,i+1);scanf(%s%lf%lf%lf,&(p-name),&(p-chinese),&(p-math),&(p-english));p-average=(p-chinese+p-math+p-english)/3.0;}maxAverage=studentArray[0];for(p=studentArray;pstudentArray+n;p++){if(maxAverage.averagep-average)maxAverage=*p;}printf(平均分最高的学生:\n);printf(%s平均分%.2f\n,maxAverage.name,maxAverage.average);FREE(studentArray);system(“pause”);return0;}Slide1-186.结构体的自引用结构结构体成员next具有STUDENT*类型,存放一个指向STUDENT结构体的指针。结构体成员不能是自身的结构体变量,但可以用自身结构体指针作为结构体成员。结点的这种形式被称为“自引用结构”,一个“自引用结构”通过指针引用另一个“自引用结构”,这样,多个“自引用结构”通过指针连接起来。这种引用其他结构的指针被称为链接,通过链接形成的数据结构被称为链接结构。#includestdio.htypedefstructstudent{/*结构体类型*/charname[8];doublechinese,math,english;doubleaverage;STUDENT*next;}STUDENT;Slide1-19【例1-修改2】编写程序,要求用户从键盘输入n个学生的姓名和语文、数学、英语成绩,计算每个学生的平均分,输出平均分最高的学生姓名和平均分(保留2位小数)。修改2:链表存储。使用结构编写程序#includestdio.h#include“PublicDS.h”structstudent{/*结构体类型*/charname[8];doublechinese,math,english;doubleaverage;STUDENT*next;}STUDENT;intmain(void){STUDENT*First,*p,maxAverage;inti,n;printf(输入学生人数:);scanf(%d,&n);printf(输入学生的姓名和语文、数学、英语成绩:\n);MALLOC(First,sizeof(STUDENT),STUDENT*);…}
本文标题:Chapter 2a Arrays and Structures
链接地址:https://www.777doc.com/doc-3392501 .html