1、Chap 9 结构,9.1 输出平均分最高的学生信息 9.2 学生成绩排序 9.3 修改学生成绩,本章要点,什么是结构?结构与数组有什么差别? 有几种结构的定义形式,它们之间有什么不同? 什么是结构的嵌套? 什么是结构变量和结构成员变量?如何引用结构成员变量? 结构变量如何作为函数参数使用? 什么是结构数组?如何定义和使用结构数组? 什么是结构指针?它如何实现对结构分量的操作? 结构指针是如何作为函数的参数的?,9.1输出平均分最高的学生信息,9.1.1 程序解析 9.1.2 结构的概念与定义 9.1.3 结构的嵌套定义 9.1.4 结构变量的定义和初始化 9.1.5 结构变量的使用,9.1.
2、1 程序解析,例9-1 输出平均分最高的学生信息 假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩。输入 个学生的成绩信息, 计算并输出平均分最高的学生信息。,9.1.1 程序解析,#include struct student /* 学生信息结构定义 */int num; /* 学号 */char name10; /* 姓名 */int computer, english, math; /* 三门课程成绩 */double average; /* 个人平均成绩 */ ;,int main(void) int i, n; struct student s1,max; /* 定义结
3、构变量 */ printf(“Input n: “); scanf(“%d“, ,9.1.2 结构的概念与定义,使用结构来表示学生信息: struct studentint num; /* 学号 */char name10; /* 姓名 */int computer, english, math; /* 三门课程成绩 */double average; /* 个人平均成绩 */ ; 结构是C语言中一种新的构造数据类型,它能够把有内在联系的不同类型的数据统一成一个整体,使它们相互关联 结构又是变量的集合,可以按照对基本数据类型的操作方法单独使用其变量成员。,结构与数组比较: 都是构造类型,是多个
4、变量的集合 数组成员类型相同,结构成员类型不同,9.1.2 结构的概念与定义,结构类型定义的一般形式为:struct 结构名 类型名 结构成员名1;类型名 结构成员名2; 类型名 结构成员名n;;,结构的定义以分号结束,C语言中把结构的定义看作是一条语句,关键字struct和它后面的结构名一起组成一个新的数据类型名,9.1.2 结构的概念与定义,例如,平面坐标结构:struct pointfloat x;float y;,虽然x、y的类型相同,也可以用数组的方式表示,但采用结构进行描述,更贴近事物本质,从而增加了程序的可读性,使程序更易理解,结构适合用于描述具有多个属性的实体或对象,9.1.3
5、 结构的嵌套定义,在我们的实际生活中,一个较大的实体可能由多个成员构成,而这些成员中有些又有可能是由一些更小的成员构成。 在学生信息中可以再增加一项:“通信地址”,它又可以再划分为:城市、街道、门牌号、邮政编码。,9.1.3 结构的嵌套定义,由此,我们可以对其结构类型进行如下重新定义: struct addresschar city10;char street20;int code;int zip; ;,struct nest_student int num; char name10; struct address addr; int computer, english, math; doub
6、le average; ;,在定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。,9.1.4 结构变量的定义和初始化,在语言中定义结构变量的方式有三种: 1.单独定义:先定义一个结构类型,再定义一个具有这种结构类型的变量 struct studentint num; /* 学号 */char name10; /* 姓名 */int computer, english, math; /* 三门课程成绩 */double average; /* 个人平均成绩 */ ; struct student s1,s2;,9.1.4结构变量的定义和初始化,2. 混合定义:在定义结构类型的同时
7、定义结构变量 struct studentint num; /* 学号 */char name10; /* 姓名 */int computer, english, math; /* 三门课程成绩 */double average; /* 个人平均成绩 */ s1, s2;3. 无类型名定义:在定义结构变量时省略结构名 struct int num; /* 学号 */char name10; /* 姓名 */int computer, english, math; /* 三门课程成绩 */double average; /* 个人平均成绩 */ s1, s2;,9.1.4结构变量的定义和初始化,
8、结构变量的初始化struct student s1 = 101, “Zhang“, 78, 87, 85;,9.1.5 结构变量的使用,1. 结构变量成员的引用 在C语言中,使用结构成员操作符“.”来引用结构成员,格式为:结构变量名 . 结构成员名s1.num = 101; strcpy(s1.name, “Zhang“); nest_s1.addr.zip = 310015;,9.1.5 结构变量的使用,2. 结构变量的整体赋值 具有相同类型的结构变量可以直接赋值。赋值时,将赋值符号右边结构变量的每一个成员的值都赋给了左边结构变量中相应的成员。 struct student s1 = 101
9、, “Zhang“, 78, 87, 85, s2;s2 = s1;,9.1.5 结构变量的使用,3. 结构变量作为函数参数 如果一个C程序的规模较大,功能较多,必然需要以函数的形式进行功能模块的划分和实现 如果程序中含有结构数据,则就可能需要用结构变量作为函数的参数或返回值,以在函数间传递数据。 例:double count_average( struct student s ) main:s1.average = count_average ( s1 );,特点:可以传递多个数据且参数形式较简单 缺点:对于成员较多的大型结构,参数传递时所进行的结构数据复制使得效率较低,9.2 学生成绩排序
10、,9.2.1 程序解析 9.2.2 结构数组操作,9.2.1 程序解析,例9-2 输入n(n50)个学生的成绩信息,按照学生的个人平均成绩从高到低输出他们的信息。struct student students50, temp; /* 定义结构数组 */* 输入 */,9.2.1 程序解析,/* 结构数组排序,选择排序法 */for( i = 0; i studentsindex.average) /* 比较平均成绩*/index = j;temp = studentsindex; /* 交换数组元素 */studentsindex = studentsi;studentsi = temp;/*
11、 输出排序后的信息 */printf(“numt namet averagen“);for (i = 0; i n; i+ ) printf(“%dt%st %.2lfn“, studentsi.num, studentsi.name, studentsi.average);,一个结构变量只能表示一个实体的信息,如果有许多相同类型的实体,就需要使用结构数组。 结构数组是结构与数组的结合,与普通数组的不同之处在于每个数组元素都是一个结构类型的变量。,9.2.2 结构数组操作,结构数组的定义方法与结构变量类似struct student students50;,结构数组students,它有50个
12、数组元素,从students0到students49,每个数组元素都是一个结构类型struct student的变量,9.2.2 结构数组操作,9.2.2 结构数组操作,结构数组的初始化struct student students50 = 101,“zhang“, 76, 85, 78 , 102, “wang“, 83, 92, 86 ;,结构数组元素的成员引用 ,其格式为:结构数组名下标 . 结构成员名使用方法与同类型的变量完全相同: studentsi.num = 101; strcpy(studentsi.name, “zhang“); studentsi = studentsk,9
13、.2.2 结构数组操作,9.3 修改学生成绩,9.3.1 程序解析 9.3.2 结构指针的概念 9.3.3 结构指针作为函数参数,9.3.1程序解析,例9-3 输入n(n50)个学生的成绩信息,再输入一个学生的学号、课程以及成绩,在自定义函数中修改该学生指定课程的成绩。,int main(void) int course, i, n, num, pos, score; struct student students50; /* 定义结构数组 */ /* 输入n个学生信息 */ /* 输入待修改学生信息 */ /*调用函数,修改学生成绩*/ pos = update_score(students
14、, n, num, course, score); /*输出修改后的学生信息*/ . ,9.3.1程序解析,/* 自定义函数,修改学生成绩 */ int update_score(struct student *p, int n, int num, int course, int score) int i,pos; for(i = 0; i num = num)break; if(i math = score; break;case 2: p-english = score; break;case 3: p-computer = score; break;pos = i; /* 被修改学生在数
15、组中的下标 */ else /* 无此学号 */pos = -1; return pos; ,9.3.2结构指针的概念,指针可以指向任何一种变量,而结构变量也是C语言中的一种合法变量,因此,指针也可以指向结构变量,这就是结构指针。结构指针就是指向结构类型变量的指针,9.3.2结构指针的概念,struct student s1 = 101, “zhang“, 78, 87, 85, *p; p = ,P,9.3.2结构指针的概念,结构指针的使用 (1) 用*p访问结构成员。如:(*p).num = 101; (2) 用指向运算符“-”访问指针指向的结构成员。如:p-num = 101;,当p指向
16、结构变量s1时,下面三条语句的效果是一样的:s1.num = 101;(*p).num = 101;p-num = 101;,9.3.3结构指针作为函数参数,结构指针的操作是非常灵活的,如果将结构指针作为函数的参数,可以完成比基本类型指针更为复杂的操作。 例9-3 main: pos = update_score(students, n, num, course, score); 自定义函数: int update_score(struct student *p, int n, int num, int course, int score),函数update_score运行完毕返回主函数后,主
17、函数中的结构数组students中的值已被修改,9.3.3结构指针作为函数参数,与结构变量作为函数参数相比,用结构指针作为函数参数的效率更高。 就例-3 而言, 在函数update_score()中需要修改主函数中结构数组students的数据,根据第 8章介绍的知识,在此处也只能使用指针作为函数参数的方式才能通过间接访问操作来实现程序功能。,本章总结,结构的概念与定义(含嵌套结构) 结构变量 定义 初始化 使用(成员引用、相互赋值、作为函数参数) 结构数组 定义、初始化、结构数组成员引用 结构指针 概念 结构指针操作 结构指针作为函数参数,能够根据实际情况合理定义结构 能够使用结构变量与结构数组进行熟练编程 掌握结构指针的操作,并应用于函数参数传递,