C语言第9章的课件

合集下载

《C语言程序设计教程(第二版)》 第09章-指针(1)

《C语言程序设计教程(第二版)》 第09章-指针(1)

访问p_int所 指向的变量
getch();
}
程序运行结果: num_int=12, *p_int=12 num_f=3.14, *p_f=3.14 num_ch=p, *p_ch=p
2019/2/22
11
1、指针变量的定义
指针变量的定义标识符
数据类型 *指针变量[,*指针变量2……];
例如, [案例9.1]中的语句:
int num_int=12, *p_int ;
特别说明:定义而未初始化的指针变量(例如 p_int)是悬空的。
使用悬空指针变量,很容易破坏系统,导致系统 瘫痪。
2019/2/22
12
2、取地址运算 : &变量名 例 如 , [ 案 例 9.1] 中 的 &num_int 、 &num_f 、 &num_ch 的结果,分别为对应变量的地址 (num_int 、 num_f、num_ch)。 注意:指针变量只能存放相同数据类型变量的 地址。 例如, [案例9.1]中的指针变量p_int、p_f、p_ch, 只能接收int型、float型、char型变量的地址,否则出 错。
使p_int指向变量num_int
2019/2/22
10
printf(“num_int=%d, *p_int=%d\n”, num_int, *p_int); printf(“num_f=%4.2f, *p_f=%4.2f\n”, num_f, *p_f); printf(“num_ch=%c, *p_ch=%c\n”, num_ch, *p_ch);
9.3* 1维数组的指针与列指针变量 9.4 字符串的指针和指向字符串的指针变量 9.5 指针数组与主函数main()的参数 9.6 返回指针值的函数

C语言数据结构-第9章 结构体共用体与枚举

C语言数据结构-第9章 结构体共用体与枚举
"Guang Zhou","13901000002"}, {"Gu YuPing",18,"F","2019010003",2019,5,5,"Han",
"Shang Hai","13901000003"}}; int i; for(i=0;i<3;i++) { printf("%s,%d,%s,%s,",stud[i].name,stud[i].age,stud[i].sex,stud[i].xh); printf("%d,%d,%d,",stud[i].birthday.year,stud[i].birthday.month, stud[i].birthday.day); printf("%s,%s,%s\n",stud[i].nation,stud[i].address,stud[i].tel); } }
成员运算符“.”的优先级最高,在表达式中的结构体变量成员不 需要加括号。例如:
wang.age++;
相当于
(wang.age)++;
注意
13
结构体变量的成员名可以相同,但必须处在不同的层次。 例如:
sturct student { int no;
char name[20]; struct { int no; char classname[20]; }class; struct { int no; char groupname[20]; }group; }wang;
定义结构体类型名的同时定义结构体数组,例如:
struct student{…} stud[50];

C语言程序设计 第9章 文件

C语言程序设计 第9章  文件

9.3 文件的顺序读写
❖ 【例9.4】fputs函数和fgets函数的使用。
9.3 文件的顺序读写
❖ 9.3.3 fprintf函数和fscanf函数 ❖ fprintf与fscanf函数为格式读写函数,与printf、scanf类似,fprintf与
fscanf用于从文件中读取指定格式的数据和把指定格式的数据写入文件,这 是按数据格式要求进行文件的输入/输出。其一般形式为: ❖ fscanf(fp,format,args); ❖ fprintf(fp,format,args); ❖ 其中,fp为文件指针,format为格式控制字符串,args为输入或输出的地 址列表。 ❖ 例如,若文件指针fp已指向一个已打开的文件文本,a、b分别为整型变量 ,则以下语句从fp所指向的文件中读入两个整数放入变量a和b中。 ❖ fscanf(fp,”%d%d”,&a,&b); ❖ 又如,若文件指针fp已指向一个已打开的文件文本,x、y分别为整型变量 ,则以下语句将x、y中的数据按%d的格式输出到fp所指向的文件中。 ❖ fprintf(fp,"%d%d",&a,&b);
本章小结
❖ 本章主要介绍了以下内容。 ❖ (1)文件的概念 ❖ 介绍了文件及文件指针的基本概念,以及文件的打开与关闭
函数fopen、fclose等。 ❖ (2)文件的顺序读写 ❖ 主要介绍了从文件中输出字符、字符串,以及将字符、字符
串写入文件的函数。 ❖ (3)随机文件的读写及错误检测 ❖ 主要介绍了随机文件读写的应用,以及文件的出错检测。
❖ 在实际读写文件中,人们常常希望能直接读到某一数据 项而不是按物理位置顺序逐个读下来。这种可以任意指 定读写位置的操作称为文件的随机读写。可以想象,只 要能移动位置指针到所需要的地方,实现文件的定位, 就能实现随机读写。

c语言教材第9章文件PPT教学课件

c语言教材第9章文件PPT教学课件

“w” ( 只 写 ) 为 输 出 打 开 一 文 本 文 件
“a” ( 追 加 ) 向 文 本 文 件 尾 加 数 据
“rb’ ( 只 读 ) 为 输 入 打 开 一 二 进 制 文 件
“wb” ( 只 写 ) 为 输 出 打 开 一 二 进 制 文 件
“ab” ( 追 加 ) 向 二 进 制 文 件 尾 加 数 据
运行结果:
test.txt 的内容是
3,4.50
} 2020/12/10
14
14
5. 文件定位
文件中有一个位置指针,指向当前读写的位置。 我们可以使用有关函数来改变其位置。
• 二进制文件:把内存中的数据按其在内存中的存 储形式原样输出到磁盘文件上。
4. 输入和输出方式
• 缓冲文件系统:系统自动在内存区为每一个正在
使用的文件名开辟一个缓冲区。从内存向磁盘输
出数据必须先送到内存的缓冲区中,装满缓冲区
后在一起送到磁盘中去。如果从磁盘向内存读入
数据,则一次从磁盘文件将一批数据
/* 文件操作模式 */ /* 下一个字符位置 */ /* 文件缓冲区位置 */
}FILE;
2020/12/10
7
7
2.文件类型指针
例: 定义一个FILE类型的数组
FILE -efile [-MAXFILE]; -MAXFILE: 数组元素个数,也就是可使用文件的
最大数目。
例:定义一个文件指针变量
“w b+ ’ ( 读 写 ) 为 读 /写 建 立 一 新 二 进 制 文 件
“ab+ ” ( 读 写 ) 为 读 /写 打 开 一 二 进 制 文 件
2020/12/10
11
11

C语言程序设计-杨路明第9章课件

C语言程序设计-杨路明第9章课件
现在定义了一个结构体数组students,它有3个元素,又定义了一个结构体变量 student1,则下面的赋值合法。 student1=students[0]; students[2]=students[1]; students[1]=student1;
9.3.3 结构体数组的使用
(3) 不能把结构体数组元素作为一个整体直接进行输入或输出,只能以单个成 员对象进行输入输出。例如:
/*学号*/
char name[20]; /*姓名*/
char sex;
/*性别*/
int age;
/*年龄*/
float score;
/*C成绩*/
char addr[40];
};
注:‘;’不能省
结构体类型定义描述结构 的组织形式,不分配内存
9.1 结构体类型的定义
例如,考虑10门课程成绩, 加上总成绩与平均成绩,可作如下定义:
struct是关键字,不能省略
struct
[结构体类型名] {
成员说明列表: ……….
}
成员类型可以是 基本型或构造型
9.1 结构体类型的定义
实例:定义结构体类型,描述下列数据 (1) 学生情况: 包含学生的学号、 姓名、 性别、 年龄、C语言课程成绩,地址:
struct student
{ int num;
输出stud变量,应该使用如下方式:
应该如何输出stud变量?
printf(″%s,%s,%ld\n″,,stud.addr,stud.num); 输入stud变量的各成员值,则用:
scanf(″%s%s%ld″,,stud.addr,&stud.num);
9.3 结构体类型数组
9.4.2 指向结构体数组元素的指针

C语言第9章结构体、共用体、枚举

C语言第9章结构体、共用体、枚举

结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类

C语言程序设计 第3版 第9章 编译预处理

C语言程序设计 第3版 第9章 编译预处理
int s; s=sum(5); printf("s%d\n",s); }
#include "test2.c" static int sum(int n) {
int i,s=0; for(i=1;i<=n;i++)
s=s+fact(i); return s; }
static int fact(int n) {
C语言程序设计
第9章 编译预处理
第1讲:编译预处理基本形式
提纲
1.宏定义 2.文件包含 3.条件编译
1.宏定义
不带参数宏定义 带参数宏定义
格式:
#define 标识符 字符串
功能:
指定标识符代替一个较复杂的字符串。
注意说明:
(1)宏名一般习惯用大写字母,例如宏名PI。 (2)宏名用做代替一个字符串,不作语法检查。 (3)宏定义无需在末尾加“;” (4)宏定义的有效范围为#undef命令终止。 (5)在进行宏定义时,可以引用已定义的宏名。
char web[50]; int i=0; gets(web); while(web[i]!='\0') {
#if(R==1) if(web[i]>='A'&&web[i]<='Z') {web[i]=web[i]+32; i++;}
#else if(web[i]>='a'&&web[i]<='z') {web[i]=web[i]-32; i++;}
形式3:
#ifndef 标识符 程序段1
#else 程序段2

第9章 结构体、共用体和枚举类型

第9章 结构体、共用体和枚举类型
第9章 结构体、共用体和枚举类型
9.1 结构体类型与结构体变量 9.2 结构体数组 9.3 向函数传递结构体型数据 9.4 链表 9.5 共用体 9.6 枚举类型 9.7 用户自定义类型

9.1 结构体类型与结构体变量
• 结构体类型的定义
–概述:
• 建立单链表的主要步骤为:
– 生成只含有头结点的空链表; – 然后读取数据信息,生成新结点,将数据存放于新结点中, 插入新结点到单链表中 – 重复第二步,直到输入结束。 根据新结点插入到链表的位置的不同,建立链表的方式, 分为在表尾插入的方法和在表头插入的方法。 •表尾插入: 例9.6 •表头插入: 例9.7
• 共用体变量的定义
–用已定义的共用体类型去定义共用体变量 –定义共用体类型的同时定义变量: –定义无名共用体类型的同时定义变量:
• 共用体变量的引用
–引用方式:共用体变量名.成员名 共用体变量名. 共用体变量名 –说明: 对于共用体变量,只能引用它的成员,而不能引用整个 共用体变量。若共用体的成员是构造类型的,则需要逐级引 用至最低级的成员。 –能通过定义指向共用体的指针变量来引用共用体变量。
在实际应用中,一组相关的数据可能是不同类型的。C语 言提供了包含不同类型成员的类型来定义这样的数据,这 种类型就是结构体类型 结构体类型。 结构体类型
– 定义形式:
struct 结构体名 类型名1 成员名1 {类型名1 成员名1; 类型名2 成员名2 类型名2 成员名2; …… 类型名n 成员名n 类型名n 成员名n; };
• 举例
例9.11 上一页
9.6 枚举类型
• 枚举类型的定义–定义来自式:enum 枚举类型名{枚举常量1,枚举常量2,……,枚举常量n}; •

第9章 一遍又一遍——循环结构

第9章  一遍又一遍——循环结构
如果把重复结构视为一层壳,那break的作用可说 是"破壳而出",当流程执行到循环结构中的 break语句时,循环结构提前结束,程序转而执行 循环结构之后的那条语句,用流程图来表示,如 图9-3所示.
9.5.2 重来一次——continue
break语句结束的是整个循环结构,而continue语 句结束的只是当前一次循环,形象地说是"再来 一次",流程图如所示.
9.2 简洁循环语句——while和do while结构
前面的示例中已经用到了while结构,其基本结构形式为: while (表达式) { 循环结构体 } 首先计算表达式的值,当表达式为真(非0)时,重复执行 循环体,直到表达式变为假(0),跳出while结构向下执 行. do while结构与while结构略有不同,其基本形式为: do { 循环结构体 } while( 表达式 ); /*不要忘记末尾的分号*/
第9章 一遍又一遍——循环结构
所谓"循环",就是对某块代码段重复多次地执 行,循环结构是C语言程序书写中常用的一种重要 控制结构,C语言提供了3种循环结构,分别是 while结构,do while结构和for结构,本章将对 其展开讨论.
9.1 构造循环
循环结构有两大要素:循环条件和循环体,当满 足某个条件时,重复执行某些动作,直到该条件 不再满足,这个表述很好地体现了循环条件和循 环体的关系.构造循环时,首先要明白要做什么, 即"循环体是什么",这是和程序的目的相关的, 知道要干什么了还不够,还要明白什么时候开始 做,什么时候停,如果没有合理设定循环条件, 很容易造成程序死循环,甚至是资源耗尽导致电 脑死机.
9.4 循环嵌套
循环结构也支持嵌套,如果把简单的循环形容为 "一遍又一遍",那循环嵌套便可称为"一层又 一层,一遍又一遍",可以用时钟来打比方,走 一格代表执行一次循环,那么一小时里,分针要 走60个格,而分针每走一格,秒针也要走60格, 如此,秒针的走动可以看成是内层循环,而分针 走动可看成是外层循环.

第9章C语言

第9章C语言

9.2.1 文件的打开
在C语言中,打开文件是由fopen()函数实现的,函数原型 如下: FILE *fopen( char *filename, char *mode ) 其中,filename和mode分别是所要打开文件的文件名和将要 对其操作的模式;函数的返回值是一个文件类型指针,指向 被打开文件的文件缓冲区(结构体变量)的起始地址。如果 文件打开失败,则函数返回值是一个NULL指针。 为了对已打开的文件进行操作,应该立即把fopen()函数 的返回值赋给一个文件类型指针变量,若没有立即把返回值 赋给一个文件类型指针,而进行其它操作,可能导致此函数 的返回值丢失,而无法对所打开的文件进行操作。 如果需要对磁盘文件file1.txt,进行读写操作,可用如下 方式打开这个文件:

9.3.1 输入和输出一个字符
(a)命令窗口中输入的命令 (b)读出的文件中的内容 图9-3 例9.1的执行结果
9.3.1 输入和输出一个字符



其中,“C Language!”是文件file1.txt中的内容。 需要注意的是,该程序是将打开文件中的字符,逐一 的取出并显示出来。直到遇到文件的结束标志,结束 读出操作。 可以通过该程序打开任意的文本文件,只要把所要打 开的文件名作为命令的参数即可。
9.1 文件概述
9.1.1 文件的基本概念 9.1.2 缓冲文件系统和非缓冲文件系统 9.1.3 文件类型指针
9.1.1 文件的基本概念
所谓文件是指记录在外部介质上的数据的集合。数据是 以文件的形式存放在外部介质上的。操作系统都是以文 件为单位对数据进行管理的,如果系统要从外部存储设 备上寻找需要的数据,系统首先找到该部分数据属于的 文件,根据文件名找到所指定的文件,然后从文件中读 出数据。如果要向外部存储设备上存储数据,也需要把 待存储的数据建立成文件,再以文件的形式向外输出。

第9章C语言程序设计

第9章C语言程序设计

9.1位运算符
例9.2 按位或程序举例 main() { int a=9,b=5,c; c=a|b; printf("a=%d\nb=%d\nc=%d\n",a,b,c); } 运行结果:
9.1位运算符
9.1.3 按位异或运算
按位异或运算符“^”是双目运算符。其功能是参与运算的两数 各对应的二进位相异或,当两对应的二进位相异时,结果为1。参 与运算数仍以补码出现,例如9^5可写成算式如下: 00001001 ^00000101 00001100 (十进制为12) 9^5结果为12。按位异或通常用来: (1)与0异或,可以保留原值不变。如10^0 00001010 ^ 00000000 00001010
00001001 &00000101 00000001
按位与运算通常用来对某些位清0或保留某些位。例如即想让 某一个字节或多个字节中的位为0。例如:00001001(十进制9) 只要找到这样的数00000110、11110110、00000000等都可以, 即只要和要清零数中每一个二进制位相反即可,或者某一位二进制 位为0和0与结果也是0。
9.1位运算符
9.1.4求反运算
求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算 的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110。
9.1位运算符
9.1.5 左移运算
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算 数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数, 高位丢弃,低位补0。例如: a<<2 指把a的各二进位向左移动2位。 如a=2,十进制00000010,左移2位后为00001000 (十进制8)。 高位左移,低位补0。并且左移一位相当于乘以2的运算,左移两位 相当于乘以4即22。 例9.4 左移程序举例 main() { int a=2; a=a<<2; printf(“a=%d\n”,a); } 运算结果:

51单片机C语言应用与开发(第9章)

51单片机C语言应用与开发(第9章)

4. 具有将可变的选择与特殊操作组合在一起的 能力,改善了程序的可读性;
5. 提供的库包含许多标准子程序,具有较强的 数据处理能力; 6. 由于具有方便的模块化编程技术,使已编好 程序可容易地移植;
C51程序结构
预处理命令 全局变量说明; 函数1说明; …… …… 函数n说明;
main() { 局部变量说明; 执行语句; 函数调用(实际参数表); 函数1(形式参数说明) { 局部变量说明; 执行语句; 函数调用(实际参数表); } …… …… 函数n(形式参数说明) { 局部变量说明; 执行语句; 函数调用(实际参数表); }
8
片内RAM,间接寻址,共256字节。
片外RAM,分页间址,共256字节。(MOVX @Ri)
xdata
code
16
16
片外RAM,间接寻址,共64k字节。(MOVX @DPTR)
ROM区域,间接寻址,共64k字节。(MOVC @DPTR)
访问片内RAM比访问片外RAM的速度要快得 多,所以对于经常使用的变量应该置于片内 RAM中,即用bdata、data、idata来定义;对 于不经常使用的变量或规模较大的变量应该置于 片外RAM中,即用pdata、xdata来定义。例如:
/* IP */ sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8; /* P3 */ sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0; /* SCON */ sbit SM0 = 0x9F; sbit SM1 = 0x9E; sbit SM2 = 0x9D; sbit REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98; #endif

数据结构-C语言描述(第二版)(耿国华)章 (9)

数据结构-C语言描述(第二版)(耿国华)章 (9)

第9章 内部排序
我们知道, 在进行直接插入排序时, 若待排序记录序 列已经有序时, 直接插入排序的时间复杂度可以提高到 O(n)。 可以设想, 若待排序记录序列基本有序时, 即序 列中具有特性 r[i].key<Max{ r[j].key},(1≤j<i) 的记录较少时, 直接插入排序的效率会大大提高。 希尔排 序正是从这一点出r[0];
/*将待插入记录插入到已排序的序列
}
第9章 内部排序
【算法9.1 直接插入排序】 该算法的要点是:① 使用监视哨r[0]临时保存待插入 的记录; ② 从后往前查找应插入的位置;③ 查找与移动在同一 循环中完成。 直接插入排序算法分析: 从空间角度来看,它只需要一个辅助空间r[0]。从时间 耗费角度来看, 主要时间耗费在关键字比较和移动元素上。 对于一趟插入排序,算法中的while循环的次数主要取决 于待插记录与前i-1个记录的关键字的关系上。
· 向量结构:将待排序的记录存放在一组地址连续的存 储单元中。 由于在这种存储方式中,记录之间的次序关系由其存 储位置来决定,所以排序过程中一定要移动记录才行。
第9章 内部排序
· 链表结构:采用链表结构时,记录之间逻辑上的相 邻性是靠指针来维持的,这样在排序时,就不用移动记录元素, 而只需要修改指针。 这种排序方式被称为链表排序。
第9章 内部排序 第9章 内部排序
9.1 9.2 插入类排序 9.3 交换类排序法 9.4 选择类排序法 9.5 9.6 分配类排序 9.7 各种排序方法的综合比较
第9章 内部排序 9.1 排序的基本概念
1. 排序
有n个记录的序列{R1,R2,…,Rn},其相应关键字的序列 是{K1,K2,…,Kn},相应的下标序列为1,2,…,n。通过排序, 要求找出当前下标序列1,2,…, n的一种排列p1,p2, …,pn, 使得相应关键字满足如下的非递减(或非递增)关系,即: Kp1≤Kp2≤…≤Kpn , 这 样 就 得 到 一 个 按 关 键 字 有 序 的 记 录 序 列 {Rp1,Rp2,…,Rpn}。

C语言9

C语言9

第 九 章 编 译 预 处 理
7-1
宏定义 不带参数的宏定义 带参数的宏定义
7-1-1 7-1-2
7-2
7-3
文件包含
条件编译
9-1
宏定义
例9-1 请看下面的程序: #define PI 3.14159 main() {float r,l,s; scanf("%f",&r); l=2*PI*r; s=PI*r*r; printf("l=%7.2f,s=%7.2f\n",l,s); } 程序的第一行内容:#define PI 3.14159 就是一个宏定义,PI 称为宏名,其作用是用标识符PI代表3.14159这样一串字符。在此之后 的程序中就可以用标识符PI代替3.14159,称为宏引用。 预处理时,程序中的PI 将被所定义的串3.14159替换,称为宏展开 或宏替换,如程序中的语句:l=2*PI*r;和s=PI*r*r;中的宏展开后分别 为:l=2*3.14159*r;和s=3.14159*r*r;。 有两种形式的宏 :不带参数的宏和带参数的宏。
9-2
文件包含(1)
一个C 程序由若干个源程序组成,而一个源文件还可以将另一个源 文件的全部内容包含进来,即将指定源文件的内容包含在当前文件中。 例如有两个源文件file1.c和file2.c,文件的内容分别如下: file1.c的内容: int max(int x,int y) {int z; if(x>y) z=x; else z=y; return z; } file2.c的内容: #include "file1.c" main() {int a,b,c; scan("%d,%d",&a,&b); c=max(a,b); printf("c=%d\n",c); }

严蔚敏版数据结构C语言版PPT第九章

严蔚敏版数据结构C语言版PPT第九章

度较大,特别不适用于表长较大的查找表。

据 结
若以有序表表示查找表,则查找过程
构 可以基于“折半”进行。
折半查找只适用于有序表,且限于顺序存储结构
13
第 9 章 查找 9.2 基于线性表的查找 ②折半查找
基本思想: 数 1.首先确定查找表的中间位置;

结 2.然后将待查的值与中间位置的值进行比较, 构 若相等,则查找成功并返回此位置,否则须
50 -2 60 1
80 0 (a)一棵平衡二叉排序树
58 0 (b)一棵失去平衡的二叉排序树
30
第 9 章 查找
9.4 计算式查找法—哈希表
哈希表是什么?
以上两节讨论的表示查找表的各种结构的

共同特点:


1.记录在表中的位置和它的关键

字之间不存在一个确定的关系;
2.查找的过程为给定值依次和关 键字集合中各个关键字进行比较;
23
第 9 章 查找 9.3 基于树的查找 ①二叉排序树
例如: 50

30
80
据 结
20
40
90

10 25 35
66 85
23
88
不 是二叉排序树。
24
第 9 章 查找
9.3 基于树的查找 ①二叉排序树 查找算法
若二叉排序树为空,则查找不成功;
否则,
数 1. 若给定值等于根结点的关键字,则查找成功;
线性表的三种查找方法比较
顺序查找 折半查找 分块查找

据 表的结构 有序、无序
有序
表间有序

构 表的存储 顺序、链式
顺序
顺序、链式
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

12
9.1.3 引用结构体变量
在定义了结构体变量以后,当然可以引用这个 在定义了结构体变量以后 当然可以引用这个 变量。但应遵守以下规则: 变量。但应遵守以下规则 (1) 不能将一个结构体变量作为一个整体进行输入和 输出。例如,已定义 已定义student1和student2为结构体 输出。例如 已定义 和 为结构体 变量并且它们已有值。不能这样引用: 变量并且它们已有值。不能这样引用 printf ("%d,%s,%c,%d,%f,%s\n",student1); 只能对结构体变量中的各个成员分别进行输入 和输出。 和输出。引用结构体变量中成员的方式为 结构体变量名.成员名 结构体变量名 成员名
2
9.1 结构体类型和结 构体变量
3
9.1.1 结构体类型
迄今为止,已介绍了基本类型(或称简单类型) 迄今为止,已介绍了基本类型(或称简单类型)的变量 如整型、实型、字符型变量等) (如整型、实型、字符型变量等),也介绍了一种构造类型数 数组, 据——数组,数组中的各元素是属于同一个类型的。但是只 数组 数组中的各元素是属于同一个类型的。 有这些数据类型是不够的。 有这些数据类型是不够的。有时需要将不同类型的数据组合 成一个有机的整体,以便于引用。 成一个有机的整体,以便于引用。这些组合在一个整体中的 数据是互相联系的。例如,一个学生的学号、姓名、性别、 数据是互相联系的。例如,一个学生的学号、姓名、性别、 年龄、成绩、家庭地址等项。这些项都与某一学生相联系。 年龄、成绩、家庭地址等项。这些项都与某一学生相联系。 见图9.1 可以看到性别(sex) 年龄(age) 成绩(score) 9.1。 (sex)、 (age)、 (score)、 见图9.1。可以看到性别(sex)、年龄(age)、成绩(score)、地 址(addr)是属于学号为10010和名为“Li Fun”的学生的。如 (addr)是属于学号为10010和名为“ Fun 的学生的。 是属于学号为10010和名为 的学生的 果将num name、sex、age、score、addr分别定义为互相 num、 果将num、name、sex、age、score、addr分别定义为互相 独立的简单变量,难以反映它们之间的内在联系。 独立的简单变量,难以反映它们之间的内在联系。
5
结构体结构声明格式: 结构体结构声明格式: struct 结构体名 {成员列表}; 结构体变量的一般定义格式: 结构体变量的一般定义格式: struct 结构体名 变量名; 变量名; 例: struct student {int num; ; char name[20]; ; char sex; ; int age; ; float score; ; char addr[30]; ; }; ;
16
(3) 对结构体变量的成员可以像普通变量一样 进行各种运算(根据其类型决定可以进行的运 进行各种运算 根据其类型决定可以进行的运 算)。例如: 。例如: student2.score=student1.score; ; sum=student1.score+student2.score; ; student1.age++; ; ++student1.age; ; 由于“ 运算符的优先级最高 运算符的优先级最高, 由于“.”运算符的优先级最高,因此 student1.age++是对 是对student1.age进行自加 是对 进行自加 运算,而不是先对age进行自加运算。 进行自加运算。 运算,而不是先对 进行自加运算
14
struct date { int year; 从键盘输入一个时间并输出 int month; int day; }; main() { struct date d; printf("Enter today\'s date(yyyy-mm-dd):"); scanf("%d-%d-%d",&d.year,&d.month,&d.day); printf("\nToday is %d-%d-%d",d.year,d.month,d.day); }
第9章 用户建立的 章 数据类型
1
本章要求
掌握结构体类型的概念和定义, 掌握结构体类型的概念和定义,结构体变 结构体数组及结构体变量指针的定义, 量、结构体数组及结构体变量指针的定义, 成员运算符与结构体变量的引用; 成员运算符与结构体变量的引用; 掌握共用体类型的概念、定义及应用; 掌握共用体类型的概念、定义及应用; 掌握枚举类型的概念、定义及应用; 掌握枚举类型的概念、定义及应用; 会用typedef定义类型。 定义类型。 会用 定义类型
18
(5) C程序中相同结构体类型的两个结构体 程序中相同结构体类型 程序中相同结构体类型的两个结构体 变量间,可以整体赋值。 变量间,可以整体赋值。 struct person p1,p2; ... p1=p2;/*将结构体变量 的所有成员值赋 将结构体变量p2的所有成员值赋 将结构体变量 值给结构体变量p1的对应成员 的对应成员*/ 值给结构体变量p1的对应成员*/ ...
4
应当把它们组织成一个组合项, 应当把它们组织成一个组合项,在一个组合项中 包含若干个类型不同(当然也可以相同 的数据项。 语言 当然也可以相同)的数据项 包含若干个类型不同 当然也可以相同 的数据项。C语言 允许用户自己指定这样一种数据结构, 允许用户自己指定这样一种数据结构,它称为结构体 (structure)。它相当于其他高级语言中的“记录”。 。它相当于其他高级语言中的“记录”
7
在定义了结构体变量后,系统会为之分配内存 单元。例如student1和student2在内存中各占59个字 节(2+20+1+2+4+30=59)。
8
2. 在声明类型的同时定义变量。 在声明类型的同时定义变量。
例如: 例如: struct student { int num; ; char name[20]; ; char sex; ; int age; ; float score; ; char addr[30]; ; } student1,student2; , ; 它的作用与第一种方法相同, 它的作用与第一种方法相同,即定义了两个 struct student类型的变量 类型的变量student1、student2。 类型的变量 、 。
9
3. 直接定义结构类型变量 其一般形式为 struct { 成员表列 }变量名表列; 变量名表列; 变量名表列 即不出现结构体名。 即不出现结构体名。
10
说明
(1) 类型与变量是不同的概念,不要混同。只能 类型与变量是不同的概念,不要混同。 对变量赋值、存取或运算, 对变量赋值、存取或运算,而不能对一个类型赋 存取或运算。在编译时, 值、存取或运算。在编译时,对类型是不分配空 间的,只对变量分配空间。 间的,只对变量分配空间。 (2) 对结构体中的成员 即“域”),可以单独使用, 对结构体中的成员(即 ,可以单独使用, 它的作用与地位相当于普通变量。 它的作用与地位相当于普通变量。 (3) 成员也可以是一个结构体变量。 成员也可以是一个结构体变量。 (4) 成员名可以与程序中的变量名相同 二者不代 成员名可以与程序中的变量名相同,二者不代 表同一对象。例如,程序中可以另定义一个变量 表同一对象。例如 程序中可以另定义一个变量 num,它与 它与struct student中的 中的num是两回事 互 是两回事,互 它与 中的 是两回事 不干扰。 不干扰。
此处必须加分号
6
9.1.2 定义结构体类型变量
1. 先声明结构体类型再定义变量名。 先声明结构体类型再定义变量名。 如上面已定义了一个结构体类型struct 如上面已定义了一个结构体类型 student,可以用它来定义变量。如: ,可以用它来定义变量。 struct student student1, student2; ; 结构体类型名) 结构体变量名) (结构体类型名) (结构体变量名) 定义了student1和student2为struct 定义了 和 为 student类型的变量,即它们具有 类型的变量, 类型的变量 即它们具有struct student类型的结构。 类型的结构。 类型的结构
19
9.1.4 结构体变量的初始化
和其他类型变量一样, 和其他类型变量一样,对结构体变量可以 在定义时指定初始值。 在定义时指定初始值。 对结构体变量初始化。 例9.1对结构体变量初始化。 对结构体变量初始化 注意:各初值的类型和顺序必需和结构体 注意: 各成员对应一致。 各成员对应一致。
20
main() {struct student 定义并初始化结构体变量 { long int num; ; char name[20]; ; char sex; ; char addr[20]; ; }a={10101, }a={10101,“Li Lin”,‘M’,“123 Beijing Lin”, M’, Road”}; ; printf("NO.:%ld\nname:%s\nsex:%c\naddress:%s\ n",a.num,,a.sex,a.addr); , , , , }
11
如:
struct date /*声明一个结构体类型 声明一个结构体类型*/ 声明一个结构体类型 { int month; ; int day; ; int year; ; }; ; struct student { int num; ; char name[20]; ; char sex; ; int age; ; struct date birthday; /*birthday是struct date类型 类型*/ ; 是 类型 char addr[30]; ; } student1,student2; ,
相关文档
最新文档