Version 3.0
复杂数据类型及排序第十一章
2
回顾
上一节课主要讲解了以下内容:
– 字符串变量和常量
– 字符串指针
– 执行字符串的输入 /输出操作
– 各种字符串函数
– 如何将数组作为参数传递给函数
– 如何将字符串用作函数参数
3
目标
定义结构体
声明结构体变量
解释如何初始化结构体
解释如何将结构体作为参数传递给函数
使用结构体数组
解释结构体数组的初始化
解释 typedef 关键字
解释如何使用插入排序法和冒泡排序法对数组进行排序
4
结构体
结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型
结构体可以容纳需要的任意多数据项姓名等级武功英雄
5
结构体的使用
定义结构体元素
声明结构体变量
结构体赋值
结构体元素的引用
6
定义结构体元素
结构体定义形成了创建结构体变量的模板
结构体中的变量称为结构体元素或结构体成员
示例:
struct HERO
{
char name[11];
int grade;
int power;
float salary;
};
姓名等级武功英雄
7
声明结构体变量
一旦定义了结构体,就可以声明一个或多个该类型的变量
示例,struct HERO h1;
这条语句将会预留足够的内存来存放该结构体中的所有项
struct HERO
{
char name[11];
int grade;
int power;
float salary;
} h1,h2;
struct HERO h1;
struct HERO h2;
struct HERO h3,h4;
定义时,声明结构体变量 先定义,后声明
8
初始化结构体
与变量和数组一样,结构体变量也可以在声明时初始化
HERO 类型的变量 h1 和 h2 可以按照下面的方式进行声明和初始化:
struct HERO
{
char name[11];
int grade;
int power;
float salary;
};
struct HERO h1 = {,张飞,,3,99,15.5};
struct HERO h2 = {,关羽,,3,100,35.9};
9
结构体中使用的赋值语句 2- 1
可以使用一条简单的赋值语句将一个结构体变量的值赋给另一个相同类型的结构体变量
例如,如果 h1 和 h2 是同一类型的结构体变量,那么下列语句是有效的:
h2 = h1;
10
访问结构体元素
结构体元素通过使用点运算符(,)来引用,
这个运算符也称为成员运算符
语法:
结构体变量名,元素名
示例:
scanf("%s",h1,name);
11
结构体内的结构体
可以将一个结构体放入另一个结构体内。结构体不能嵌套它自身
struct issue
{
char borrower [20];
char dt_of_issue[8];
struct cat books;
}issl;
访问结构体元素的格式与访问正常的结构体类似,
issl.borrower
要访问结构体 cat 的元素,而 cat 是另一个结构体 issue 的一部分,应使用下列语句
issl.books.author
12
#include <stdio.h>
void main()
{
struct student
{
char name[10];
int chinese;
int english;
}score;
printf("姓名,");
scanf("%s",&score.name);
printf("语文成绩,");
scanf("%d",&score.chinese);
printf("英语成绩,");
scanf("%d",&score.english);
//为结构体元素赋值
printf("姓名 \t语文 \t英语 \n");
printf("%s\t",score.name);
printf("%d\t",score.chinese);
printf("%d\n",score.english);
}//输出结构体元素结构体范例
13
课堂练习
输入某物品的代号、名称、单价、数量,显示出该物品的上述信息以及金额。(用结构体)
14
将结构体作为参数进行传递
结构体变量可以作为参数传递给函数
使用这种方式可以将一组逻辑上相关的数据项一起传递,而不是逐个传递
变量的类型应该与参数的类型相匹配
15
结构体数组
结构体的一种常见用法是采用结构体数组的形式
首先定义结构体,然后声明该类型的数据变量
示例:
struct HERO heros[5];
访问数组 heros 的第三个元素中的变量
power:
heros[2].power
16
结构体数组的初始化
结构体数组是通过用一对大括号将其元素值列表括起来进行初始化的
示例:
struct HERO heros[5] =
{
{,张飞,,3,99,15.5},
{,关羽,,3,100,35.9},
{,赵云,,2,99,32.6}
}
17
结构体指针
结构体指针是通过在结构体变量名前放置一个星号( *)来进行声明的
-> 运算 符用于通过指针来访问结构体的元素
示例:
struct HERO *p,h1;
p = &h1;
printf("%s",p->name);
将结构体作为参数传递给函数使得该函数可以直接修改结构体元素
18
typedef 关键字
可以使用 typedef 关键字来定义新的数据类型名
它并没有新建数据类型,而只是为已有的类型定义新的名字
语法:
typedef 原类型名 新类型名 ;
示例:
typedef float deci;
typedef 不能用于存储类
19 有几个人
20
数组排序
排序需要将数组中的数据按照指定的顺序
(如升序或者降序)进行排列
有两种方式来对数组进行排序:插入排序法和冒泡排序法
在插入排序法中,检查数组中的每个元素,
将它插入排序的元素中的适当位置
在冒泡排序法中,从最底部的元素开始进行比较,较小的元素会向上冒
21
冒泡排序法将最小的数排在最上面,就像冒泡一样
22
插入排序法
23
结构体冒泡排序法
24
本课总结
本课主要讲解了以下内容
– 结构体
– 结构体数组
– typedef关键字
– 冒泡排序法
– 插入排序法