第五章 数组 数组 一维数组 二维数组 主讲:李祥 时间:2015年10月.

Slides:



Advertisements
Similar presentations

Advertisements

2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
数据结构的引入. 通讯录管理 社团机构管理 校园导航管理 通讯录管理 社团机构管理 校园导航管理.
第四单元 100 以内数的认识
第四单元 100 以内数的认识
练一练: 在数轴上画出表示下列各数的点, 并指出这些点相互间的关系: -6 , 6 , -3 , 3 , -1.5, 1.5.
2 、 5 的倍数特征 集合 2 的倍数(要求) 在百数表上依次将 2 的倍数找出 并用红色的彩笔涂上颜色。
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
程序设计导论 ——第15讲 结构与结构数组.
程序设计导论 结构与结构数组.
§1 二阶与三阶行列式 ★二元线性方程组与二阶行列式 ★三阶行列式
一、二阶行列式的引入 用消元法解二元线性方程组. 一、二阶行列式的引入 用消元法解二元线性方程组.
二级指针与二维数组.
一维数组 乾坤以有亲可久; 君子以厚德载物。.
C语言程序设计.
第14章 c++中的代码重用.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
字符串与二维数组.
VB程序设计语言 主讲教师:王 杨.
第5章 数组 Visual Basic程序设计.
在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。
管理信息结构SMI.
走进编程 程序的顺序结构(二).
辅导课程六.
元素替换法 ——行列式按行(列)展开(推论)
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
动态规划(Dynamic Programming)
第六章 指针 指针的概念 指针的运算 指向变量的指针 指向数组的指针 指向函数的指针 二级指针 主讲:李祥 时间:2015年10月.
第五章 习题课 电子信息与计算机科学系 曾庆尚.
绿色圃中小学教育网 比例 比例的意义 绿色圃中小学教育网
第一章 函数与极限.
第4章 PHP流程控制语句.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
数列.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
第七章 数组.
顺序表的删除.
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
第二章 Java基本语法 讲师:复凡.
第六章 数组.
请编写如下程序: 输入100名学生的成绩,要求输出高于平均分的成绩。
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第4章 Excel电子表格制作软件 4.4 函数(一).
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第九节 赋值运算符和赋值表达式.
3.16 枚举算法及其程序实现 ——数组的作用.
第4课时 绝对值.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第二章 Java基本语法 讲师:复凡.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
本节内容 指针类型的使用 视频提供:昆山爱达人信息技术有限公司.
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
我们能够了解数学在现实生活中的用途非常广泛
插入排序的正确性证明 以及各种改进方法.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
§4.5 最大公因式的矩阵求法( Ⅱ ).
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

第五章 数组 数组 一维数组 二维数组 主讲:李祥 时间:2015年10月

2.1 什么是数组 2.2 一维数组 2.3 二维数组 2.4 多维数组 2.5 本章小结

5.1 什么是数组 在程序中,经常需要对一批数据进行操作,例如,统计某个公司100个员工的平均工资。如果使用变量来存放这些数据,就需要定义100个变量,显然这样做很麻烦,而且很容易出错。这时,可以使用x[0]、x[1]、x[2]……x[99]表示这100个变量,并通过方括号中的数字来对这100个变量进行区分。 在程序设计中,使用x[0]、x[1]、x[2]……x[n]表示的一组具有相同数据类型的变量集合称为数组x,数组中的每一项称为数组的元素,每个元素都有对应的下标(n),用于表示元素在数组中的位置序号,该下标是从0开始的。 为了大家更好地理解数组,接下来,通过一张图来描述数组x[10]的元素分配情况,如图5-1所示 :

5.1 什么是数组 图5-1 数组X[10] 图5-1中可以看出,数组x包含10个元素,并且这些元素是按照下标的顺序进行排列的。由于数组元素的下标是从0开始的,因此,数组x的最后一个元素为x[9]。 需要注意的是,根据数据的复杂度,数组下标的个数是不确定的。通常情况下,数组元素下标的个数也称为维数,根据维数的不同,可将数组分为一维数组、二维数组、三维数组、四维数组等。通常情况下,我们将二维及以上的数组称为多维数组。

5.2 一维数组 一维数组指的是只有一个下标的数组,它用来表示一组具有相同类型的数据。在C语言中,一维数组的定义方式如下所示: 例如: 5.2.1 一维数组的定义与初始化 一维数组指的是只有一个下标的数组,它用来表示一组具有相同类型的数据。在C语言中,一维数组的定义方式如下所示: 在上述语法格式中,类型说明符表示数组中所有元素的类型,常量表达式指的是数组的长度,也就是数组中存放元素的个数。 例如: 上述代码定义了一个数组,其中,int是数组的类型,array是数组的名称,方括号中的5是数组的长度。 类型说明符 数组名[常量表达式]; int array[5];

5.2 一维数组 完成数组的定义后,只是对数组中的元素开辟了一块内存空间。这时,如果想使用数组操作数据,还需要对数组进行初始化。数组初始化的常见的方式有三种,具体如下: 1.直接对数组中的所有元素赋值,示例代码如下: 上述代码定义了一个长度为5的数组i,并且数组中元素的值依次为1、2、3、4、5。 2.只对数组中的一部分元素赋值,示例代码如下: 在上述代码中,定义了一个int类型的数组,但在初始化时,只对数组中的前三个元素进行了赋值,其它元素的值会被默认设置为0。 int i[5]={1,2,3,4,5}; int i[5]={1,2,3};

5.2 一维数组 3. 对数组全部元素赋值,但不指定长度,示例代码如下: 在上述代码中,数组i中的元素有4个,系统会根据给定初始化元素的个数定义数组的长度,因此,数组i的长度为4。 注意: 1. 数组的下标是用方括号括起来的,而不是圆括号。 2. 数组名的命名同变量名的命名规则相同。 3. 数组定义中,常量表达式的值可以是符号常量,例如下面的定义是合法的。 int i[]={1,2,3,4};

5.2 一维数组 5.2.2 一维数组的引用 在程序中,经常需要访问数组中的一些元素,这时可以通过数组名和下标来引用数组中的元素。一维数组元素的引用方式如下所示: 在上述方式中,下标指的是数组元素的位置,数组元素的下标是从0开始的。例如,引用数组x的第三个元素的方式x[2]。 为了帮助大家更好地理解数组元素的引用,接下来通过一个案例来演示,如例5-1所示: 数组名[下标];

5.2 一维数组 例5-1: 运行结果如图5-2: 图5-2 运行结果 #include<stdio.h> void main(int argc,char *argv[]) { int x[5] = { 2, 3, 1, 4, 6 }; int i; for ( i= 0; i < 5; i++) printf("%d\n",2*x[i]); }

5.2 一维数组 在例5-1中,首先定义了一个数组x,然后通过下标的形式获取到数组中的元素,最后将元素乘以2后输出。 注意: 数组的下标都有一个范围,即“0~[数组长度-1]”,假设数组的长度为6,其下标范围为0~5。当访问数组中的元素时,下标不能超出这个范围,否则程序会报错。

5.2 一维数组 5.2.2 一维数组的常见操作 数组在编写程序时应用非常广泛,如经常需要对数组进行遍历、获取最值、排序等操作,灵活地使用数组对实际开发很重要。接下来针对一维数组的常见操作进行详细地讲解,具体如下: 一维数组的遍历 在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历。接下来用for循环依次遍历数组中的元素,如例5-2所示: #include <stdio.h> void main(int argc, char* argv[]) { int x[5] = { 1, 2, 3, 4, 5 }; int i = 0; for (i = 0; i < 5; i++) { printf("x[%d]:%d\n", i, x[i]); } }

5.2 一维数组 运行结果如图5-3所示: 图5-3 运行结果 在例5-2中,首先定义了一个长度为5的数组x,然后定义了一个变量i,由于数组的下标范围为0~4,因此可以将i的值作为下标,依次去访问数组中的元素,并将元素的值输出。

5.2 一维数组 一维数组的最值 在操作数组时,经常需要获取数组中元素的最值。接下来通过一个案例来演示如何获得数组中的最大值,如例5-3所示: 例5-3: #include <stdio.h> int main(int argc, char* argv[]) { int x[5] = {1,2,3,4,5}; int nMax = x[0]; int i = 0; for (i = 1; i < 5; i++) { if (x[i] > nMax) { nMax = x[i]; } } printf("max:%d\n", nMax); return 0;

5.2 一维数组 运行结果如图5-4所示: 图5-4 运行结果 在例5-3中,实现了获取数组x最大值的功能。在第7行代码中假定数组中的第一个元素为最大值,并将其赋值给nMax,在第7~13行代码对数组中的其他元素进行遍历,如果发现比nMax值大的元素,就将最大值nMax设置为这个元素的值,这样,当数组遍历完成后,nMax中存储的就是数组中的最大值。

5.2 一维数组 一维数组的排序 在操作数组时,经常需要对数组中的元素进行排序。接下来为大家介绍一种比较常见的排序算法—冒泡排序。在冒泡排序的过程中,不断地比较数组中相邻的两个元素,较小者向上浮,较大者往下沉,整个过程和水中气泡上升的原理相似,接下来,分步骤讲解冒泡排序的整个过程,具体如下: 第一步,从第一个元素开始,将相邻的两个元素依次进行比较,直到最后两个元素完成比较。如果前一个元素比后一个元素大,则交换它们的位置。整个过程完成后,数组中最后一个元素自然就是最大值,这样也就完成了第一轮的比较。

5.2 一维数组 第二步,除最后一个元素,将剩余的元素继续进行两两比较,过程与第一步相似,这样就可以将数组中第二大的数放在倒数第二个位置。 第三步,依次类推,持续对越来越少的元素重复上面的步骤,直到没有任何一对元素需要比较为止。 了解了冒泡排序的原理之后,接下来通过一个案例来实现冒泡排序,如例5-4所示: 例5-4: #include <stdio.h> void main(int argc, char ** argv[]) { int x[5] = { 9, 8, 3, 5, 2 }; int m = 0, n = 0; int nTemp = 0;

5.2 一维数组 int i = 0; printf("冒泡排序前:\n"); for (i = 0; i < 5; i++) { printf("%d ", x[i]); } printf("\n"); for (m = 0; m < 5 - 1; m++) { for (n = 0; n < 5 - 1 - m; n++) { if (x[n] > x[n + 1]) { nTemp = x[n]; x[n] = x[n + 1]; x[n + 1] = nTemp; } } } printf("冒泡排序后:\n"); { printf("%d ", x[i]); } }

5.2 一维数组 运行结果如图5-5所示: 图5-5 运行结果 图5-5 运行结果 在例5-4中,通过嵌套for循环实现了冒泡排序。其中,外层循环用来控制进行多少轮比较,每一轮比较都可以确定一个元素的位置,由于最后一个元素不需要进行比较,因此,外层循环的次数为数组的长度-1,内层循环的循环变量用于控制每轮比较的次数,在每次比较时,如果前者小于后者,就交换两个元素的位置,具体执行过程如图5-6所示。

5.2 一维数组 图5-6 冒泡排序过程 在图5-6中所示的第一轮比较中,第一个元素9为最大值,因此它在每次比较时都会发生位置的交换,被放到最后一个位置。第二轮比较与第一轮过程相似,元素8被放到倒数第二个位置,第三轮比较中,第一次比较没有发生位置的交换,在第二次比较时才发生位置交换,元素5被放到倒数第三个位置。后面的以此类推,直到数组中所有元素完成排序。

5.2 一维数组 值得一提的是,当元素交换时,会通过一个中间变量temp记住arr[j],然后将arr[j+1]赋给arr[j],最后再将temp赋给arr[j+1],其交换过程如图5-7所示: 图5-7 交换步骤

5.3 二维数组 5.3.1 二维数组的定义与初始化 在实际的工作中,仅仅使用一维数组是远远不够的,例如,一个学习小组有5个人,每个人有三门课的考试成绩,如果使用一维数组解决是很麻烦的。这时,可以使用二维数组,二维数组的定义方式与一维数组类似,其语法格式如下: 在上述语法格式中,“常量表达式1”被称为行下标,“常量表达式2”被称为列下标。 例如,定义一个3行4列的二维数组,具体如下: 类型说明符 数组名[常量表达式1][常量表达式2]; int a[3][4];

5.3 二维数组 在上述定义的二维数组中,共包含3*4个元素,即12个元素。接下来,通过一张图来描述二维数组a的元素分布情况,如图5-8所示: 图5-8 二维数组 从图5-8中可以看出,二维数组a是按行进行存放的,先存放a[0]行,再存放a[1]行、a[2]行,并且每行有四个元素,也是依次存放的。

5.3 二维数组 完成二维数组的定义后,需要对二维数组进行初始化,初始化二维数组的方式有四种,具体如下: 按行给二维数组赋初值。例如: 在上述代码中,等号后面有一对大括号,大括号中的第一对括号代表的是第一行的数组元素,第二对括号代表的是第二行的数组元素。 2. 将所有的数组元素按行顺序写在一个大括号内。例如: 在上述代码中,二维数组a共有两行,每行有三个元素,其中,第一行的元素依次为1、2、3,第二行元素依次为4、5、6。 int a[2][3] = {{1,2,3},{4,5,6}}; int a[2][3] = {1,2,3,4,5,6};

5.3 二维数组 对部分数组元素赋初值。例如: 在上述代码中,只为数组b中的部分元素进行了赋值,对于没有赋值的元素,系统会自动赋值为0,数组b中元素的存储方式如图5-9所示: 图5-9 二维数组 int b[3][4] = {{1},{4,3},{2,1,2}};

5.3 二维数组 如果对全部数组元素置初值,则二维数组的第一个下标可省略,但第二个下标不能省略。例如: 可以写为: 系统会根据固定的列数,将后边的数值进行划分,自动将行数定位2。 int a[2][3] = {1,2,3,4,5,6}; int a[][3] = {1,2,3,4,5,6};

5.3 二维数组 5.3.2 二维数组的引用 二维数组的引用方式同一维数组的引用方式一样,也是通过数组名和下标的方式来引用数组元素,其语法格式如下: 在上述语法格式中,下标值应该在已定义的数组的大小范围内,例如下面这种情况是错误的: 在上述代码中,数组a可用的行下标范围是0~2,列下标是0~3,a[3][4]超出了数组的下标范围。 数组名[下标][下标]; int a[3][4]; // 定义a为3行4列的二维数组 a[3][4]=3; // 对数组a第3行第4列元素赋值,出错

5.3 二维数组 为了帮助读者更好地掌握二维数组的引用,接下来,通过一个案例来演示二维数组的遍历,如例5-5所示: #include<stdio.h> void main() { //声明并初始化数组 int array[3][4] = { {1,2,3,4 }, {5,6,7,8}, {9,10,11,12} }; for (int i = 0; i < 3; i++) //循环遍历行 { for (int j = 0; j < 4; j++) //循环遍历列 printf("[%d][%d]: %d ", i, j, array[i][j]); } printf("\n");//每一行的末尾添加换行符

5.3 二维数组 运行结果如图5-10所示: 图5-10 运行结果 图5-10 运行结果 在例5-5中,定义了一个二维数组array,该数组有3行4列。当使用嵌套for循环遍历二维数组元素时,外层for循环用于变量数组的行元素,内层for循环用于遍历数组的列元素。从图5-10中可以看出,程序依次将数组array中的元素输出了。

5.3 二维数组 5.3.3 二维数组的应用 熟悉了二维数组的定义和引用,接下来定义一个二维数组StuScore[5][3],用来存放5名同学3门课程的成绩,并定义变量m表示学生,n表示第几门成绩,aver表示每名同学3门课程的平均成绩,sum表示每名同学3门课的总成绩,具体如例5-6所示: #include <stdio.h> void main(int argc, char * argv[]) { int StuScore[5][3] = { { 88, 70, 90 }, //张同学 { 80, 80, 60 }, //王同学 { 89, 60, 85 }, //李同学 { 80, 75, 78 }, //赵同学 { 70, 80, 80 } //周同学 };

5.3 二维数组 int m = 0, n = 0; int nStuTotalScore; int nMathTotalScore = 0; int nChineseTotalScore = 0; int nEnglishTotalScore = 0; printf("个人总成绩:\n"); for (m = 0; m < 5; m++) { nStuTotalScore = 0; for (n = 0; n < 3; n++) { nStuTotalScore += StuScore[m][n]; switch (n) { case 0: { nMathTotalScore += StuScore[m][0]; break; } case 1: { nChineseTotalScore += StuScore[m][1]; break; } case 2: { nEnglishTotalScore += StuScore[m][2]; break; } } switch (m) { case 0: { printf("张同学:%d\n", nStuTotalScore); break;} case 1: { printf("王同学:%d\n", nStuTotalScore); break;} case 2: { printf("李同学:%d\n", nStuTotalScore); break;} case 3: { printf("赵同学:%d\n", nStuTotalScore); break;} case 4: { printf("周同学:%d\n", nStuTotalScore); break;} } printf("小组数学总分:%d 小组数学平均分:%.2f\n", nMathTotalScore, (double)nMathTotalScore / 5); printf("小组语文总分:%d 小组语文平均分:%.2f\n", nChineseTotalScore, (double)nChineseTotalScore / 5); printf("小组英语总分:%d 小组英语平均分:%.2f\n", nEnglishTotalScore, (double)nEnglishTotalScore / 5);

5.3 二维数组 运行结果如图5-11所示: 图5-11 运行结果 图5-11 运行结果 例5-6中实现了计算小组各科平均分的功能。其中,第4~15行代码定义了一个二维数组,用来存储小组中每个成员的各科成绩。第25~45行代码通过遍历列下标获取每个小组不同学科的总分,第46~74行代码通过遍历行下标获取每个小组成员的总分,最后将小组不同学科的总分和平均分输出。

5.4 多维数组 在计算机中,除一维数组和二维数组外,还有三维,四维,……等多维数组,它们用在某些特定程序开发中,多维数组的定义与二维数组类似,其语法格式具体如下: 定义一个三维数组的示例代码如下: 上面的这个例子,定义了一个三维数组,数组的名字是x,数组的长度为3,每个数组的元素又是一个二维数组,这个二维数组的长度是4,并且这个二维数组中的每个元素又是一个一维数组,这个一维数组的长度是5,元素类型是int。 多维数组在实际的工作中使用不多,并且使用方法与二维数组相似,这里不再做详细地讲解,有兴趣的读者可以自己学习。 数组类型修饰符 数组名 [n1][n2]…[nn]; int x[3][4][5];

本章小结 本章主要首先讲解什么是数组,然后讲解了一维数组的定义、初始化、引用以及数组的常见操作,然后讲解了二维数组的相关知识,最后简单介绍了多维数组的定义方式,掌握好本章的内容有助于后面课程的学习。

谢 谢!