Chap 9 结构 9.1 构建学生信息库 9.2 计算学生平均成绩 9.3 学生成绩排序 9.4 修改学生成绩.

Slides:



Advertisements
Similar presentations
数据结构的引入. 通讯录管理 社团机构管理 校园导航管理 通讯录管理 社团机构管理 校园导航管理.
Advertisements

阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
程序设计导论 ——第15讲 结构与结构数组.
程序设计导论 结构与结构数组.
第7章 指针 存储地址的变量的类型就是指针类型 能直接对内存地址操作, 实现动态存储管理 容易产生副作用, 初学者常会出错
第九讲 结构体与文件 陆 铭
C语言程序设计基础 第10章 指针进阶 刘新国.
大学实用教程 C语言.
6.4 字符串与指针 1. 用字符数组存放一个字符串.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第7章 结构体、联合体和枚举类型 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
第九章 结构体 主讲教师 :贾月乐 电话:
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第 十 章 指 针.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
Chap 9 结构 9.1 构建手机通讯录 9.2 结构变量 9.3 结构数组 9.4 结构指针.
第9章 用户自己建立数据类型 9.1 定义和使用结构体变量 9.2 使用结构体数组 9.3 结构体指针 9.4 用指针处理链表
程序设计专题 第2讲 - 结构 刘新国.
STRUCTURE 授課:ANT 日期:2010/5/12.
C语言程序设计基础 第9章 结构 刘新国.
自定义数据类型 潘荣江 山东大学计算机科学与技术学院
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第九章 结构体和共用体 结构体的定义 结构体的使用 共用体的定义 共用体的使用 主讲:李祥 时间:2015年10月.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
走进编程 程序的顺序结构(二).
辅导课程六.
第7讲 结构体与共用体 7.1 结构体 7.2 共用体.
二维数组的指针表示 与复杂的指针例子 专题研讨课之三.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第8章 结 构 体.
第二章 Java语言基础.
第七章 结构体、共同体和枚举类型.
第五章 习题课 电子信息与计算机科学系 曾庆尚.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第七章 操作符重载 胡昊 南京大学计算机系软件所.
实验九 函数嵌套、函数参数 第27讲 C程序设计 Main() { int x,y; X=10; y=x*x+1;
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言复习3----结构体.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
OOP6 結構Struct 黃兆武.
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
C++大学基础教程 第7章 其它自定义数据类型 北京科技大学 信息基础科学系.
第九章 用户建立的数据类型.
第二章 Java基本语法 讲师:复凡.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C qsort.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第九节 赋值运算符和赋值表达式.
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第二章 Java基本语法 讲师:复凡.
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 结构体.
本节内容 指针类型的使用 视频提供:昆山爱达人信息技术有限公司.
C语言程序设计 第9章 结构体.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第14讲 结构体和共用体 计算机与通信工程学院.
第八章 结构体和共用体 结构体类型和结构体变量 结构体数组 结构体指针变量 共用体.
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
<编程达人入门课程> 本节内容 有符号数与无符号数 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
本节内容 this指针 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
安排座位.
Presentation transcript:

Chap 9 结构 9.1 构建学生信息库 9.2 计算学生平均成绩 9.3 学生成绩排序 9.4 修改学生成绩

本章要点 什么是结构?结构与数组有什么差别? 有几种结构的定义形式,它们之间有什么不同? 什么是结构的嵌套? 什么是结构变量和结构成员变量?如何引用结构成员变量? 结构变量如何作为函数参数使用? 什么是结构数组?如何定义和使用结构数组? 什么是结构指针?它如何实现对结构分量的操作? 结构指针是如何作为函数的参数的?

9.1 构建学生信息库 9.1.1 程序解析 9.1.2 结构的概念与定义 9.1.3 结构的嵌套定义

9.1.1 程序解析 例9-1 构建学生信息库 假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩,且最多需要处理50名学生的数据。 构建学生信息库,实现学生基本信息的建立、查询和输出功能。 (源程序参见教材例9-1)

9.1.1 程序解析 主函数main:主界面功能控制 函数new_student:新建学生信息 9.1.1 程序解析 主函数main:主界面功能控制 函数new_student:新建学生信息 函数search_student:查询学生信息 函数output_student:输出学生信息 main() new_student() search_student() output_student()

9.1.1 程序解析 程序首部定义了结构类型struct student,其中的成员分别代表学生的基本信息 9.1.1 程序解析 程序首部定义了结构类型struct student,其中的成员分别代表学生的基本信息 struct student{ int num; /* 学号 */ char name[10]; /* 姓名 */ int computer, english, math; /* 三门课程成绩 */ double average; /* 个人平均成绩 */ }; 主函数中定义的结构数组students中每一个数组元素就是一个结构变量,对应一名学生 struct student students[50];

9.1.1 程序解析 全局变量Count用于计数当前学生总数 三个自定义函数的参数之一都是结构数组。 9.1.1 程序解析 全局变量Count用于计数当前学生总数 三个自定义函数的参数之一都是结构数组。 void new_student(struct student students[ ] ); void search_student(struct student students[ ], int num); void output_student(struct student students[ ]); 结构数组名作为函数实参实际上与普通数组名作函数参数是一样的,就是将数组首地址传递给函数形参。

9.1.2 结构的概念与定义 使用结构来表示学生信息: 9.1.2 结构的概念与定义 结构与数组: 都是构造类型,是多个变量的集合 数组成员类型相同,结构成员类型不同 使用结构来表示学生信息: struct student{ int num; /* 学号 */ char name[10]; /* 姓名 */ int computer, english, math; /* 三门课程成绩 */ double average; /* 个人平均成绩 */ }; 结构是C语言中一种新的构造数据类型,它能够把有内在联系的不同类型的数据统一成一个整体,使它们相互关联 结构又是变量的集合,可以按照对基本数据类型的操作方法单独使用其变量成员。

关键字struct和它后面的结构名一起组成一个新的数据类型名 结构的定义以分号结束,C语言中把结构的定义看作是一条语句 9.1.2 结构的概念与定义 结构类型定义的一般形式为: struct 结构名 { 类型名 结构成员名1; 类型名 结构成员名2;    类型名 结构成员名n; }; 关键字struct和它后面的结构名一起组成一个新的数据类型名 结构的定义以分号结束,C语言中把结构的定义看作是一条语句

9.1.2 结构的概念与定义 { float x; float y; }; 例如,平面坐标结构: struct point 9.1.2 结构的概念与定义 例如,平面坐标结构: struct point { float x; float y; }; 虽然x、y的类型相同,也可以用数组的方式表示,但采用结构进行描述,更贴近事物本质,从而增加了程序的可读性,使程序更易理解 结构比较适合用于描述具有多个属性的实体或对象

9.1.3 结构的嵌套定义 在我们的实际生活中,一个较大的实体可能由多个成员构成,而这些成员中有些又有可能是由一些更小的成员构成。 9.1.3 结构的嵌套定义 在我们的实际生活中,一个较大的实体可能由多个成员构成,而这些成员中有些又有可能是由一些更小的成员构成。 在学生信息中可以再增加一项:“通信地址”,它又可以再划分为:城市、街道、门牌号、邮政编码。 学号 姓名 通信地址 计算机 英语 数学 平均成绩 城市 街道 门牌号 邮编

9.1.3 结构的嵌套定义 由此,我们可以对其结构类型进行如下重新定义: 9.1.3 结构的嵌套定义 由此,我们可以对其结构类型进行如下重新定义: struct address{ char city[10]; char street[20]; int code; int zip; }; struct nest_student{ int num; char name[10]; struct address addr; int computer, english, math; double average; }; 在定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。

9.2 计算学生平均成绩 9.2.1 程序解析 9.2.2 结构变量的定义和初始化 9.2.3 结构变量的使用

9.2.1 程序解析 例9-2 输入n个学生的成绩信息,计算并输出每个学生的个人平均成绩。 计算平均成绩:结构变量作为函数参数

9.2.1 程序解析 int main(void) { 为什么s1.name前面没有“&” 9.2.1 程序解析 double count_average(struct student s) { return (s.math + s.english + s.computer) / 3.0; } int main(void) { int i, n; struct student s1; /* 定义结构变量 */ printf("Input n: "); scanf("%d", &n); printf("Input the student’s number, name and course scores\n”); for(i = 1; i <= n; i++){ printf("No.%d: ", i); scanf("%d%s%d%d%d",&s1.num,s1.name,&s1.math,&s1.english,&s1.computer); s1.average = count_average (s1); printf("num:%d, name:%s, average:%.2lf\n", s1.num, s1.name, s1.average); } return 0; 为什么s1.name前面没有“&”

9.2.2结构变量的定义和初始化 在C语言中定义结构变量的方式有三种: 1.单独定义:先定义一个结构类型,再定义一个具有这种结构类型的变量 struct student{ int num; /* 学号 */ char name[10]; /* 姓名 */ int computer, english, math; /* 三门课程成绩 */ double average; /* 个人平均成绩 */ }; struct student s1,s2;

9.2.2结构变量的定义和初始化 2. 混合定义:在定义结构类型的同时定义结构变量 3. 无类型名定义:在定义结构变量时省略结构名 struct student{ int num; /* 学号 */ char name[10]; /* 姓名 */ int computer, english, math; /* 三门课程成绩 */ double average; /* 个人平均成绩 */ }s1, s2; 3. 无类型名定义:在定义结构变量时省略结构名 struct { } s1, s2;

9.2.2结构变量的定义和初始化 结构变量的初始化 struct student s1 = {101, "Zhang", 78, 87, 85};

9.2.3 结构变量的使用 1. 结构变量成员的引用 在C语言中,使用结构成员操作符“.”来引用结构成员,格式为: 9.2.3 结构变量的使用 1. 结构变量成员的引用 在C语言中,使用结构成员操作符“.”来引用结构成员,格式为: 结构变量名 . 结构成员名 s1.num = 101; strcpy(s1.name, "Zhang"); nest_s1.addr.zip = 310015;

9.2.3 结构变量的使用 2. 结构变量的整体赋值 具有相同类型的结构变量可以直接赋值。赋值时,将赋值符号右边结构变量的每一个成员的值都赋给了左边结构变量中相应的成员。 struct student s1 = {101, "Zhang", 78, 87, 85}, s2; s2 = s1;

9.2.3 结构变量的使用 3. 结构变量作为函数参数 如果一个C程序的规模较大,功能较多,必然需要以函数的形式进行功能模块的划分和实现 9.2.3 结构变量的使用 3. 结构变量作为函数参数 如果一个C程序的规模较大,功能较多,必然需要以函数的形式进行功能模块的划分和实现 如果程序中含有结构数据,则就可能需要用结构变量作为函数的参数或返回值,以在函数间传递数据。 例9-2中: double count_average( struct student s ) main:s1.average = count_average ( s1 ); 特点:可以传递多个数据且参数形式较简单 缺点:对于成员较多的大型结构,参数传递时所进行的结构数据复制使得效率较低

9.3 学生成绩排序 9.3.1 程序解析 9.3.2 结构数组操作

9.3.1 程序解析 例9-3 输入n(n<50)个学生的成绩信息,按照学生的个人平均成绩从高到低输出他们的信息。 9.3.1 程序解析 例9-3 输入n(n<50)个学生的成绩信息,按照学生的个人平均成绩从高到低输出他们的信息。 struct student students[50], temp; /* 定义结构数组 */ double count_average(struct student s); /* 例9-2中的函数,计算平均成绩 */ /* 输入 */ … students[i].average = count_average( students[i] );

9.3.1 程序解析 /* 结构数组排序,选择排序法 */ for( i = 0; i < n-1; i++ ){ 9.3.1 程序解析 /* 结构数组排序,选择排序法 */ for( i = 0; i < n-1; i++ ){ index = i; for (j = i+1; j <n; j++ ) if (students[j].average > students[index].average) /* 比较平均成绩*/ index = j; temp = students[index]; /* 交换数组元素 */ students[index] = students[i]; students[i] = temp; } /* 输出排序后的信息 */ printf("num\t name\t average\n"); for (i = 0; i < n; i++ ) printf("%d\t%s\t %.2lf\n", students[i].num, students[i].name, students[i].average);

9.3.2 结构数组操作 一个结构变量只能表示一个实体的信息,如果有许多相同类型的实体,就需要使用结构数组。 9.3.2 结构数组操作 一个结构变量只能表示一个实体的信息,如果有许多相同类型的实体,就需要使用结构数组。 结构数组是结构与数组的结合,与普通数组的不同之处在于每个数组元素都是一个结构类型的变量。

9.3.2 结构数组操作 结构数组的定义方法与结构变量类似 struct student students[50]; 9.3.2 结构数组操作 结构数组的定义方法与结构变量类似 struct student students[50]; 结构数组students,它有50个数组元素,从students[0]到students[49],每个数组元素都是一个结构类型struct student的变量

9.3.2 结构数组操作 结构数组的初始化 struct student students[50] = { { 101,"zhang", 76, 85, 78 }, {102, "wang", 83, 92, 86} }; students[0] 101 Zhang 76 85 78 students[1] 102 Wang 83 92 86 … students[9]

9.3.2 结构数组操作 结构数组元素的成员引用 ,其格式为: 结构数组名[下标] . 结构成员名 使用方法与同类型的变量完全相同: 9.3.2 结构数组操作 结构数组元素的成员引用 ,其格式为: 结构数组名[下标] . 结构成员名 使用方法与同类型的变量完全相同: students[i].num = 101; strcpy(students[i].name, "zhang"); students[i] = students[k]

9.4 修改学生成绩 9.4.1 程序解析 9.4.2 结构指针的概念 9.4.3 结构指针作为函数参数

9.4.1程序解析 例9-4 输入n(n<50)个学生的成绩信息,再输入一个学生的学号、课程以及成绩,在自定义函数中修改该学生指定课程的成绩。 int main(void) { int course, i, n, num, pos, score; struct student students[50]; /* 定义结构数组 */ … /* 输入n个学生信息 */ … /* 输入待修改学生信息 */ /*调用函数,修改学生成绩*/ pos = update_score(students, n, num, course, score); … /*输出修改后的学生信息*/ ... }

9.4.1程序解析 /* 自定义函数,修改学生成绩 */ int update_score(struct student *p, int n, int num, int course, int score) { int i,pos; for(i = 0; i < n; i++, p++) /* 按学号查找 */ if(p->num == num) break; if(i < n) /* 找到,修改成绩 */ switch(course){ case 1: p->math = score; break; case 2: p->english = score; break; case 3: p->computer = score; break; } pos = i; /* 被修改学生在数组中的下标 */ else /* 无此学号 */ pos = -1; return pos;

9.4.2结构指针的概念 指针可以指向任何一种变量,而结构变量也是C语言中的一种合法变量,因此,指针也可以指向结构变量,这就是结构指针。 结构指针就是指向结构类型变量的指针

9.4.2结构指针的概念 struct student s1 = {101, "zhang", 78, 87, 85}, *p; p = &s1; P 101 zhang 78 87 85

9.4.2结构指针的概念 结构指针的使用 (1) 用*p访问结构成员。如: (*p).num = 101; (2) 用指向运算符“->”访问指针指向的结构成员。如: p->num = 101; 当p指向结构变量s1时,下面三条语句的效果是一样的: s1.num = 101; (*p).num = 101; p->num = 101;

9.4.3结构指针作为函数参数 结构指针的操作是非常灵活的,如果将结构指针作为函数的参数,可以完成比基本类型指针更为复杂的操作。 例9-4 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运行完毕返回主函数后,主函数中的结构数组students中的值已被修改

9.4.3结构指针作为函数参数 在例9-1中,结构数组名students作为函数参数时,其实质就是结构指针作为函数参数,因为数组名代表数组的首地址。 void new_student(struct student students[ ] ); void search_student(struct student students[ ], int num); void output_student(struct student students[ ]); 与结构变量作为函数参数相比,用结构指针作为函数参数的效率更高,因而是更佳的选择。

本章总结 结构的概念与定义(含嵌套结构) 结构变量 结构数组 结构指针 能够根据实际情况合理定义结构 能够使用结构变量与结构数组进行熟练编程 掌握结构指针的操作,并应用于函数参数传递 结构的概念与定义(含嵌套结构) 结构变量 定义 初始化 使用(成员引用、相互赋值、作为函数参数) 结构数组 定义、初始化、结构数组成员引用 结构指针 概念 结构指针操作 结构指针作为函数参数