已阅读5页,还剩82页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 数组,主要内容,一维数组的定义、初始化和引用 二维数组的定义、初始化和引用 向函数传递一维数组 向函数传递二维数组 常用的排序和查找算法,前几章使用的变量都属于基本类型,例如:整型、字符型、浮点型数据,这些都是简单的数据类型。 对于有些数据,只用简单的数据类型是不够的,难以反映出数据的特点,也难以有效地进行处理。,问题:有如下几组数据,它们分别该如何存储呢?,一个班学生的学习成绩 一行文字 一个矩阵,这些数据的特点是: 1、具有相同的数据类型 2、使用过程中需要保留原始数据 C语言为这些数据,提供了一种构造数据类型:数组。,保存大量同类型的相关数据,为什么使用数组,数组是多个同类型数据对象的组合。 数组中汇集了多个数据项,称为数组元素。 数组元素的排列是有一定规律的,下标代表数据在数组中的序号 用一个数组名和下标唯一确定数组中的元素 数组中,可已统一方式处理一批/所有元素,是数组和独立变量的主要区别,数组的定义,定义数组时需要说明: 数组元素类型 数组名 数组的元素个数 元素个数也称数组的大小或长度 数组定义: 数据类型 数组名 整数1 整数2 整数n 如:int a10; double b107; 数组定义可以与其它变量定义在一起 如:int a10, n, a125;,数组大小最好使用宏来定义,以适应可能的变化 如: #define SIZE 10 int aSIZE;,数组大小定以后,将不能改变,数组存储,系统会在内存分配连续的空间给此数组。 如:int a10; 定义一个有10个int型元素的数组,使用a0、 a1、 a9这样的形式访问每个元素,可以像使用普通变量一样使用它们。 直接对a访问,就是访问此数组的首地址。,不带小标的数组名具有特殊含义,表示数组的首地址,数组的存储结构,根据数组的数据类型,为每个元素安排相同长度的存储空间 根据数组的存储类型,将其安排在内存的动态、静态存储区或者寄存器区。,用sizeof(数组名)获得数组所占字节数 一维数组占用字节数=数组长度sizeof(数组名) 二维数组占用字节数=第一维长度第二维长度 sizeof(数组名),数组使用,对于数组:类型 数组名 整数n,元素顺序编号为:首元素序号0,其余顺序编号。 n元数组元素编号:0到n-1。 元素编号称为下标。,一维数组的定义格式为: 类型说明符 数组名常量表达式; 例如: int a10; 它表示定义了一个整形数组,数组名为a,此数组有10个元素。,一维数组,说明: 1.数组名定名规则和变量名相同,遵循标识符定名规则。 2.在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。例如,指定a10,表示a数组有10个元素,注意下标是从0开始的,这10个元素是,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9。请持别注意,按上面的定义,不存在数组元素a10。 3. 常量表达式中可以包括常量和符号常量,但不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的:,举例: int n; scanf(“%d,, float a0; /* 数组大小为0没有意义 */ int b(2)(3); /* 不能使用圆括号 */ int k, ak; /* 不能用变量说明数组大小*/,数组说明中其他常见的错误,一维数组的输入和输出,输入方法: 输入第i个数组元素: scanf(“%d”, ,输出方法: 输出第i个数组元素: printf(“%d”, ai-1); 输入整个数组元素: for (i=0;i10;i+) printf(“%d”, ai);,int a10,不为自动数组初始化,数组中的元素值是不确定的 不为静态或外部数组初始化,则对数值型数组元素,初值为0,而对字符型数组元素,初值为空字符 0 对数组元素初始化的实现方法:,一维数组的初始化,1.在定义数组时对数组元素赋以初值。,例如: int a10=0,1,2,3,4,5,6,7,8,9; 将数组元素的初值依次放在一对花括弧内。经过上面的定义和初始化之后,a0=0,a1=1,a2=2,a3=3,a4=4,a5=5,a6=6,a7=7,a8=8,a9=9。,2.只给一部分元素赋值,未初始化的元素将自动被初始化为0。,如:int a10=0,1,2,3,4; 相当于: int a10=0,1,2,3,4,0,0,0,0,0;,3.如果想使一个数组中全部元素值为0,可以写成,int a10=0,0,0,0,0,0,0,0, 0,0; 或 int a10=0; 不能写成:int a10=0*10;,4.在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。,例如:int a5=1,2,3,4,5; 也可以写成 int a =1,2,3,4,5;,在第二种写法中,花括弧中有5个数,系统就会据此自动定义a数组的长度为5。但若数组长度与提供初值的个数不相同,则数组长度不能省略。例如,想定义数组长度为10,就不能省略数组长度的定义,而必须写成 int a10=1,2,3,4,5; 只初始化前5个元素,后5个元素为0。,一维数组在内存中的存放,每个数据元素占用的字节数,就是基类型的字节数 一个元素占4个字节,一维数组: float mark100;,数组名 下标 下标可以是整型常量或整型表达式。例如: a0=a5+a7-a2*3,一维数组元素的引用,数组元素的引用方式:,一维数组元素引用的程序实例,程序使a0到a9的值为09,然后按逆序输出。,程序举例1:用数组来处理,求解Fibonacci数列。,Fibonacci数列:斐波那契数列,又称黄金分割数列或兔子数列。 指的是这样一个数列:0、1、1、2、3、5、8、13,即满足公式:F(0)=0, F(1)=0、 F(n)= F(n-1)+ F(n-2),一维数组程序举例,二维数组,不能写成 float a3, 4,b(5)(10);,二维数组的定义格式为:,数据类型 数组名行标列标;,例如:定义a为34(3行4列)的数组,b为510(5行10列)的数组。如下: float a34,b510;,二维数组的输入和输出,输入方法: 输入第i行j列元素: scanf(“%d”, ,输出方法: 输出第i行j列元素: printf(“%d”, ai-1j-1); 输入整个数组元素: for (i=0;i2;i+) for (j=0;j3;i+) printf(“%d”, aij);,int a2 3,可以用下面4种方法对二维数组初始化,数据类型 数组名 常量表达式1常量表达式2初始化数据;,二维数组的初始化,1.分行给二维数组赋初值(按行初始化)。,如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;,2.可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值(按元素初始化)。,如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;,如:int a34; a34=1,2,3,4,5,6,7,8,9,10,11,12;,1 0 0 0 5 0 0 0 9 0 0 0,也可以对各行中的某一元素赋初值 如:int a34=1,0,6,0,0,0,11;,1 0 0 0 0 6 0 0 0 0 0 11,1 0 0 0 5 6 0 0 0 0 0 0,如:int a34=1,5,6;,3.对部分元素赋初值,未初始化的元素将自动被初始化为0。,如:int a34=1,5,9;,也可以只对某几行元素赋初值。,在定义时也可以只对部分元素赋初值而省略第一维的长度,最好按行赋初值。,0 0 3 0 0 0 0 0 0 10 0 0,4.如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。,如:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 它等价于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;,如:int a4=0,0,3,0,10;,如: int a33=1,2,3,4,5,6,7,0,0; 它等价于: int a3=1,2,3,4,5,6,7;,注意:不能省略第二维的长度。,二维数组在内存中的存放,二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素,地址 值 数组元素,b00 b01 b02 b10 b11 b12 b20 b21 b22,3000H 3002H 3004H 3006H 3008H 300AH 300CH 300EH 3010H,例如:整型数组 b33= 1,2,3, 4,5,6, 7,8,9 ;,1 2 3,4 5 6,789,问题:有了二维数组的基础,那么多维数组如何定义呢?,定义三维数组: float a234;,第一维下标值和第二维下标的值从0开始 数组元素可以出现在表达式中,也可以被赋值。 例如:b12=a23/2,二维数组的引用,二维数组元素的表示形式为: 数组名下标下标 例如: a23 下标可以是整型表达式,如 a2-12*2-1,常出现的错误有: int a34; /* 定义a为34的数组 */ a34=3;,在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。,下标越界是大忌!,以一维数组为例,an-1是数组的最后一个元素 编译程序不检查是否越界 下标越界,将访问数组以外的空间 那里的数据是未知的,不受我们掌控,可能带来严重后果,1,2,0,1,2,3,4,5,8,9,10,11,c和a的值因数组越界而被破坏了,0,1,2,3,4,5,6,6,7,8,9,10,11,二维数组程序举例,例: 将一个二维数组行和列元素互换,存到另一个二维数组中。,例:有一个34的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。,先用N-S流程图表示算法 ,如下:,例:从键盘输入某年某月(包括闰年),变成输入该月的天数,如何使两个数组的值相等,void main() int b4=1,2,3,4, a4; a=b; ,方法二:int i; for (i=0;i4;i+); ai=bi; ,方法一:a0=b0; a1=b1; a2=b2; a3=b3;,向函数传递一维数组,普通变量作函数参数按值调用 传递变量值的副本,实参与形参变量占不同的内存单元 数组作函数参数按值调用 数组元素可以是表达式的组成部分,因此数组元素可以作为函数的实参,与用变量作实参一样,是单向传递,即“值传送”方式。 数组作函数参数按地址调用 传递数组的首地址,实参与形参数组占同一段内存单元,传递整个数组给另一个函数,可以将数组的首地址作为参数传过去。 用数组名作函数参数 只复制一个地址自然比复制全部数组效率高 由于首地址相同,所以实参数组与形参数组占用同一内存 在该函数内,不仅可以读这个数组的元素,还可以修改它们,例:有两个数组a和b,各有10个元素,将它们对应地逐个相比(即a0与0比,a1与1比)。如果a数组中的元素大于数组中的相应元素的数目多于b数组中元素大于a数组中相应元素的数目(例如,aibi6次,biai3次,其中i每次为不同的值),则认为a数组大于b数组,并分别统计出两个数组相应元素大于、等于、小于的次数。,例:有一个一维数组score,内放10个学生成绩,求平均成绩。,解题思路: 用函数average求平均成绩,用数组名作为函数实参,形参也用数组名 在average函数中引用各数组元素,求平均成绩并返回main函数,例:有两个班级,分别有35名和30名学生,调用一个average函数,分别求这两个班的学生的平均成绩。,解题思路: 需要解决怎样用同一个函数求两个不同长度的数组的平均值的问题 定义average函数时不指定数组的长度,在形参表中增加一个整型变量i 从主函数把数组实际长度从实参传递给形参i 这个i用来在average函数中控制循环的次数 为简化,设两个班的学生数分别为5和10,向函数传递二维数组,使用不带方括号的数组名作为参数传递 传递的是数组的首地址,也是二维数组的第一个元素的地址 二维数组作为形参时不可以省略二维长度 由于二维数组的按行存储,编译器必须知道每行有多少个元素,否则会不确定具体的元素地址,用多维数组名作为函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中国餐饮行业发展展望及投资策略报告
- iqc检验员年终工作总结(34篇)
- 2025年文学常识试卷题库及答案
- 2025年新奥能源测评题库及答案
- 2025年造价电算化考试题及答案
- 中暑应急预案风险提示(3篇)
- 成人抽象智力测试题及答案
- C语言程序基础设计 答案
- 小学程序思维测试题及答案
- 智能家电市场增长驱动力-第1篇-洞察与解读
- 中国武侠电影研究知到课后答案智慧树章节测试答案2025年春云南艺术学院
- 2025年河南机电职业学院单招职业技能测试题库及参考答案
- 火灾爆炸事故专项的应急预案
- 外国近现代雕塑艺术欣赏
- 《安全文明施工标准化图集》
- 大学美育(河南财经政法大学)知到智慧树章节测试课后答案2024年秋河南财经政法大学
- 互联网信息审核员考试题及答案
- 2025年中远海运集团招聘笔试参考题库含答案解析
- 【MOOC】大学生心理健康-厦门大学 中国大学慕课MOOC答案
- 品管圈PDCA案例-中医医院减少住院患者艾灸烫伤率医院改善成果汇报
- 基于“双减”背景下的小学语文作业设计探究
评论
0/150
提交评论