《数组(一维数组和二维数组)》由会员分享,可在线阅读,更多相关《数组(一维数组和二维数组)(49页珍藏版)》请在金锄头文库上搜索。
1、1. 掌握一维数组的定义, 数组元素的引用方法。 2. 掌握二维数组的定义, 数组元素的引用, 了解二维数组的实际意义。 3. 掌握字符数组与字符串的概念与定义方法, 熟悉常用的字符串处理函数。 4. 掌握应用数组进行应用程序的设计的一般方法。,第6章 数组,6.2 一维数组,6.1 概述,6.3 二维数组,结 束,6.4 字符数组和字符串,6.6 实例,6.7 小结,6.5 数组作为函数的参数, 6.1 数组概述,2.1 数组概述(P105) 编写程序的目的是处理数据,前面我们已经提到, 描述程序要处理的数据是程序设计很重要的一个方面。由程序处理的数据可能很简单, 也可能很复杂,为了描述各种
2、各样不同的数据, 要求语言系统有足够的数据表示能力。和大多数高级语言一样, C语言也采用了下面的数据机制: 把语言要处理的数据对象划分为一些类型, 每个类型是一个数据值的集合。 提供一组基本数据类型, 确定书写方式和一组相关基本操作, 以支持程序中对基本数据对象的表示和使用。 提供一组由简单数据类型、数据对象构造更加复杂的数据类型、数据对象的手段, 以满足程序中处理复杂数据的要求。,下页, 6.1 数组概述,C 语言的基本类型包括整型、实型和字符类型, 本课程的第2章介绍了C语言基本数据类型的表示和运算方面的问题。C语言的构造类型包括数组、结构和公用体, 还有用于数据组织的重要机制“指针”。
3、利用C语言的数据构造技术, 可以把多个基本类型的数据或不是基本类型的数据组成一个整体在程序中使用, 这样能更贴切地描述现实问题中的数据。由这种构造技术产生的数据类型和数据对象是复合数据类型和复合数据对象。对象的各个组成部分称为“元素”、“成员”和“成分”等。同样, 复合数据类型和复合数据对象都有名字, 同时C语言还提供访问复合对象成分的操作机制。,下页, 6.1 数组概述,数组是 C 语言对一组相同性质数据的顺序存储管理机制;利用数组可把多个具有相同类型的数据对象组合在一起并作为一个整体来管理, 这些数据对象称为数组的元素。C 语言中用 a0、a1 的形式表示数组元素, 方括号内的整型数称为数
4、组的下标。使用下标和数组名可以用同一方式处理一批或所有数组元素, 也可处理个别元素。 数组是最简单的构造类型, 但是十分有用, 许多问题不用数组几乎难以解决。 本章介绍一维和二维数组的定义、数组元素引用、字符数组。字符串和数组应用的基本算法。,构造数据类型之一 数组:有序数据的集合,用数组名标识 元素:属同一数据类型,用数组名和下标确定, 6.2 一维数组,6.2 一维数组 一维数组的定义 什么是一维数组 数组的维数是指数组使用的下标个数,如果数组中每个元素只带有一个下标,称为一维数组。 一维数组的定义形式 类型说明符 数组名常量表达式; 说明 类型说明符指出数组元素的数据类型; 数组名是标识
5、符; 常量表达式必须用方括号括起来, 指的是数组的元素个数(长度), 它是一个整型值, 其中可包含常数和符号常量 。,下页, 6.2 一维数组,不能用变量定义数组维数, 例: int n=10; int an; C 语言规定, 数组变量的大小是固定不变的, 因此需要在定义时规定元素类型和元素个数。 与普通变量一样, 可以在一个定义语句中定义多个数组 。 例如:int a10,b5,c; 一维数组的存储 意义 掌握一维数组在内存中的存储形式, 有利于理解数组机制和数组元素的性质。 存储 系统定义数组时, 根据定义语句中的空间需求分配足够的连续存储空间, 数组元素顺序存放在这些存储单元中。下标为
6、0 的元素排在最前面, 每个元素占据的存储空间完全相同。,下页, 6.2 一维数组,数组空间开销计算 有两种计算方法。 存储容量 = 元素个数sizeof(元素类型名) 存储容量 = sizeof(数组名) 数组名的本质 是数据组的内存起始地址。可以把数组名看作是一个表示存储地址的常量。 例如: 如果 a 是已有定义的整型数组名, scanf(“%d“, a); 将读入的一个整型数赋给 a 所表示的存储单元,该整型数正好是数组 a 的第一个数组元素的地址。(不能用 scanf(“%d“, 实例 int a5,数组名表示内存首地址,是地址常量,下页,a,编译时分配连续内存 内存字节数=元素个数*
7、sizeof(元素类型), 6.2 一维数组,一维数组的引用 数组元素表示形式: 数组名下标 其中:下标可以是常量或整型表达式 说明 数组必须先定义,后使用 只能逐个引用数组元素, 不能整体引用 下标是元素相对于数组起始地址的偏移量,所以从 0 (下界)开始顺序编号。最后一个元素的下标(上界) 值为数组元素个数减一。 注意: 元素的下标和元素在数组中的序号的关系, 如 Ai 表示数组 A 的第 i+1 个元素。 注意: C 语言系统并不自动检查数组的下标是否越界,对下标的控制由编称者完成。,例: int data5; data5=10;,下页, 6.2 一维数组,引用数组元素的本质是将数组元素
8、看作简单变量。数组元素可以作为定义类型的变量参加表达式计算和变量操作 (引用和赋值)。 只能逐个引用数组元素, 不能整体引用。 一维数组初始化 概念 在定义数组时, 为数组元素赋初值 (在编译阶段使之得到初值) 说明 存储在动态存储区中的 (局部) 数组不初始化, 其元素值为随机数 存储在静态存储区中 ( static、全局) 数组元素不赋初值, 系统会自动赋以 0 值 可以只给部分数组元素赋初值 全部数组元素赋初值时, 可不指定数组长度,int a6 = 1,2,3,4,5; 等价于:a0=1; a1=2; a2=3; a3=4; a4=5; a5=6;,static int a6 等价于:
9、a0=0; a1=0; a2=0; a3=0; a4=0; a5=0;,int a6= 1, 2 等价于:a0=1; a1=2; a2=0; a3=0; a4=0; a5=0; int a3= 1, 2, 3, 4 ,int a = 1, 2, 3, 4, 5, 6 ,下页, 6.2 一维数组,一维数组实例 【例6.2】求一组成绩的平均分数, 设给定的数据是 87, 90, 85, 98, 65, 80, 74, 67。 分析:考虑用数组表示这组成绩, 虽然给出的数据全是整数值, 但考虑作为成绩及可能需要进行的运算, 使用实型数更合适。本例使用数组定义时初始化的方式来表示要计算的数据, 其次,
10、为增加程序的通用性, 考虑让程序自动判断数据值的个数, 用于循环结束的控制条件。 程序:,下页,# include main() int i, num; float score = 87,90,85,98,65,80,74,67 float sum = 0.0; num = sizeof(score) / sizeof(float); for ( i = 0; inum; i+) sum += scorei ; printf(“Average:%.1f n“, sum/num); ,运行结果: Average: 80.8, 6.2 一维数组,【例6.3】编写程序。将前15 个奇数按每行 5个的
11、格式正序和反序输出。 分析:本例用循环结构控制数组的方法顺序或逆序地逐个引用数组元素的操作,实现换行动作的控制。 程序:,下页,# include # define M 15 main() int i, k=1, aM; for ( i = 0; i0; i-) printf(“%4d“, ai); if ( i%5 = 0 ) printf(“n“); ,运行结果: Sequence Output: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 Invert Output: 29 27 25 23 21 19 17 15 13 11 9 7 5 3 1, 6
12、.2 一维数组,【例6.4】编写程序,输入一组整数,将它们排序后由小到大输出。 分析:我们使用大家熟悉的冒泡方法来完成排序的操作。它的思路很简单,将相邻两个数组元素进行比较,将小的调整到前面。 排序过程: 比较第一个数与第二个数,若为逆序 a0a1,则交换;然后比较第二个数与第三个数;依次类推,直至第 n-1个数和第n个数比较为止 第一趟冒泡排序, 结果最大的数被安置在最后一个元素位置上 对前 n-1 个数进行第二趟冒泡排序, 结果使次大的数被安置在 第 n-1个元素位置 重复上述过程, 经n-1趟冒泡排序后, 排序结束,下页, 6.2 一维数组,算法举例,23,77,14,89,06,68,
13、23,14,77,06,68,第一趟,第二趟,14,23,06,68,第三趟,第四趟,14,06,23,第五趟,06,14,下页, 6.2 一维数组,程序: #include main( ) int a50, num, i, j, t, change=1; printf(“n Enter Numbers:“); scanf(“%d“, ,运行结果: Enter Numbers: 6 Enter Date: 23 77 14 89 6 68 Sorted Date: 6 14 23 68 77 89, 6.3 二维数组,6.3 二维数组 (P110) 二维数组的定义 什么是二维数组 如果数组中每
14、个元素带有两个下标,称这样的数组为二维数组。 二维数组的定义形式 类型说明符 数组名常量表达式1常量表达式2; 说明 定义中除了使用两个方括号和常量表达式外,与一维数组的要求相同。 可把二维数组看成是一个矩阵,常量表达式 1 表示矩阵的行数, 常量表达式 2 表示列数。,下页, 6.3 二维数组,可把二维数组看作一种特殊的一维数组,它的元素又是一维数组。即二维数组是数组的数组。 例如 int a34; 定义了一个二维数组 a, 数组元素是整型数, 数组有12 (34) 个元素,可以看成为 3 行 4 列的矩阵。同时, 可以把 a 看作是一个一维数组, 它有 3 个元素, 名字为 a0、a1、a
15、2, 每个元素又是一个包含 4 个元素一维数组, a0: a00, a01, a02, a03 a1: a10, a11, a12, a13 a2: a20, a21, a22, a23 多维数组的实现以二维数组为基础, 如把三维数组定义成元素是二维数组的数组。下例定义了一个三维数组:float a234,其元素是两个二维数组, a0 是一个 3 行 4 列的二维数组,a1 也是一个同样的二维数组。,下页, 6.3 二维数组,二维数组的存储 存储 二维数组在内存中占据一系列连续的存储单元, 数组元素按行顺序存放, 先放行下标是0 的元素,再放行下标是1的元素, 依此类推。,下页,原因: 内存是一维的。, 6.3 二维数组,二维数组的引用 数组元素表示形式: 数组名下标1 下标2 其中:下标可以是常量或整型表达式 说明 每个下标的值不能超越该下标的上界和下界, 数组元素可以出现在表达式中, 也可以被赋值。对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的 2 维数组元素。 不论是一维数组还是二维数组,都要注意数组引用和数组定义表示形式的区别。如定义中出现的 a34 表