图 第5章批量数据处理一数组 线性数据结构 ©一维数组 ®排序和查找 ©二维数组 ©字符串 司 LoCcS
第5章 批量数据处理—数组 线性数据结构 一维数组 排序和查找 二维数组 字符串
图 数组 数组是保存一组同类元素的数据类型,它有两 个特征: 数组元素是有序的 ·数组元素是同类的 定义数组要定义三个基本内容: ·数组名字 ·数组元素的类型 ·数组的大小 司 LoCCS
数组 数组是保存一组同类元素的数据类型,它有两 个特征: • 数组元素是有序的 • 数组元素是同类的 定义数组要定义三个基本内容: • 数组名字 • 数组元素的类型 • 数组的大小
图 数组的定义 ©格式: 类型 数组名[元素个数]; 其中,元素个数必须是常量。如: int i intarray [10]; int n=10; int intarray[n];错误 ©常用的方法是将元素个数定义为一个常量。如: #define NumOfElement 10 int intarray[NumOfEl ement];相当于 int intarray [10]; 司 LoCcS
数组的定义 格式: 类型 数组名[元素个数]; 其中,元素个数必须是常量。如: int intarray[10]; int n=10; int intarray[n];错误 常用的方法是将元素个数定义为一个常量。如: #define NumOfElement 10 int intarray[NumOfElement]; 相当于 int intarray[10];
初始化 初始化表 ©定义数组时可以对数组初始化 f1oatx[5]={-1.1,0.2,33.0,4.4, 5.05}; 初始化表的长度短于要被初始化的数组元素数目, 那么剩余元素被初始化为0。 带有初始化的数组可以不定义数组规模,编译器 根据初值的个数决定数组的大小 inta[]={1,2,3,4,5};则默认数组大小为 5 LoCcS
初始化 定义数组时可以对数组初始化 float x[5] = { -1.1, 0.2, 33.0, 4.4, 5.05 }; 初始化表的长度短于要被初始化的数组元素数目, 那么剩余元素被初始化为0。 带有初始化的数组可以不定义数组规模,编译器 根据初值的个数决定数组的大小 int a[]={1,2,3,4,5}; 则默认数组大小为 5 初始化表
图 数组元素 数组元素的使用是通过数组名及元素的序号来指 定,如intarray[2]。当数组的大小为n时,元素 的序号为0-n-1。 元素的序号称为下标。程序中,下标可为整数、 整型变量或结果为整型的任意表达式。正是这一 特性,使得数组的应用非常灵活。 例如:a[i],a[i+j门;a[++i] 司 LoCcS
数组元素 数组元素的使用是通过数组名及元素的序号来指 定,如intarray[2]。当数组的大小为n时,元素 的序号为0 – n-1。 元素的序号称为下标。程序中,下标可为整数、 整型变量或结果为整型的任意表达式。正是这一 特性,使得数组的应用非常灵活。 例如:a[i], a[i+j]; a[++i]
图 数组在内存中 定义数组就是定义了一块连续的空间,空间的 大小等于元素数*每个元素所占的空间大小。 数组元素按序存放在这块空间中。 司 LoCcS
数组在内存中 定义数组就是定义了一块连续的空间,空间的 大小等于元素数*每个元素所占的空间大小。 数组元素按序存放在这块空间中
图 为数组分配空间 如:int intarray[5];占用了20个字节,因 为每个整型数占四个字节。如给intarray[3] 赋值为3,如果这块空间的起始地址为100,那 么在内存中的情况是: 随机值 随机值 随机值 3 随机值 100 104 108 112 116 103 107 111 115 119 当你引用变量intarray[idx]时,系统计算它 的地址100+ⅰdx*4,对该地址的内容进行操作。 LoCcS
为数组分配空间 如: int intarray[5];占用了20个字节,因 为每个整型数占四个字节。如给intarray[3] 赋值为3,如果这块空间的起始地址为100,那 么在内存中的情况是: 当你引用变量intarray[idx]时,系统计算它 的地址100+idx*4,对该地址的内容进行操作。 随机值 随机值 随机值 3 随机值 100 103 104 107 108 111 112 115 116 119
图 数组下标超界问题 C/C+语言不检查数组下标的超界。如定义数 组int intarray[10];合法的下标范围是0- 9,但如果你引用intarray[10],系统不会报 错。如数组intarray的起始地址是1000,当 引用intarray[10]时,系统对1040号内存进行 操作。而1040可能是另一个变量的地址 解决方法:由程序员自己控制。在对下标变量 进行操作前,先检查下标的合法性。 司 LoCcS
数组下标超界问题 C/C++语言不检查数组下标的超界。如定义数 组 int intarray[10]; 合法的下标范围是0 – 9,但如果你引用intarray[10],系统不会报 错。如数组intarray 的起始地址是1000,当 引用intarray[10]时,系统对1040号内存进行 操作。而1040可能是另一个变量的地址 解决方法:由程序员自己控制。在对下标变量 进行操作前,先检查下标的合法性
数组的操作 数组的操作主要是数组元素的操作。 © 不能直接对数组名进行赋值。如:intarray=30 是错的。事实上,数组名中存放的是该数组的起 始地址。 eg.数组的输入输出 int mainO) int intarray 10],idx; for (idx 0;idx intarray idx]; cout <endl; for idx 0;idx <=9;++idx)cout <intarray[idx]; 3 LoCcS
数组的操作 数组的操作主要是数组元素的操作。 不能直接对数组名进行赋值。如:intarray=30 是错的。事实上,数组名中存放的是该数组的起 始地址。 eg. 数组的输入输出 int main() {int intarray[10], idx; for (idx = 0; idx > intarray[idx] ; cout << endl; for ( idx = 0; idx <= 9; ++idx) cout << intarray[idx]; }
数组应用 ©从终端输入一串字符,统计字符串中个字母出现的 次数。 ©解决方法: ·方法一:用26个整型变量计数26个字母,对输入字符串中 的每一字符用switch语句分别计数。 ·方法二:用一个26个元素的数组,如num[26],表示计数。 num[0]存放a的个数,num[1]存放b的个数..。这样对每一 个字符不必用switch,而只需用一个简单的计算: ++num[toupper (ch)-'A']; 就可以了。 LoCcS
数组应用 从终端输入一串字符,统计字符串中个字母出现的 次数。 解决方法: • 方法一:用26个整型变量计数26个字母,对输入字符串中 的每一字符用switch语句分别计数。 • 方法二:用一个26个元素的数组,如num[26], 表示计数。 num[0]存放a的个数, num[1]存放b的个数…。这样对每一 个字符不必用switch,而只需用一个简单的计算: ++num[toupper(ch) - ’A’]; 就可以了