欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载  

    《c语言程序设计教学资料》第8章---数组.ppt

    • 资源ID:3045517       资源大小:9.05MB        全文页数:87页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《c语言程序设计教学资料》第8章---数组.ppt

    第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为3×4(3行4列)的数组,b为5×10(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为3×4的数组 */ 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,二维数组程序举例,例: 将一个二维数组行和列元素互换,存到另一个二维数组中。,例:有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。,先用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,向函数传递二维数组,使用不带方括号的数组名作为参数传递 传递的是数组的首地址,也是二维数组的第一个元素的地址 二维数组作为形参时不可以省略二维长度 由于二维数组的按行存储,编译器必须知道每行有多少个元素,否则会不确定具体的元素地址,用多维数组名作为函数实参和形参。在被调函数中对形参数组定义时可以指定每一维的大小 。,例:有一个×的矩阵,求所有元素中的最大值。,解题思路: 先使变量max的初值等于矩阵中第一个元素的值,然后将矩阵中各个元素的值与max相比,每次比较后都把“大者”存放在max中,全部元素比较完后,max 的值就是所有元素的最大值。,当形参被声明为二维数组时,可以省略数组第一维的长度声明,但不能省略第二维的长度声明,例:某班期末考试科目为数学、英语、物理。班级人数不超过40人,要求计算:,排序和查找算法,排序算法 交换法排序 选择法排序 冒泡法排序 插入法排序,交换法排序:,例:用选择法对数组中10个整数按由小到大排序。,解题思路: 选择法就是先将10个数中最小的数与a0对换;再将a1到a9中最小的数与a1对换每比较一轮,找出一个未经排序的数中最小的一个 共比较9轮,程序举例:用冒泡法对10个数排序(由小到大)。,起泡法的思路是:将相邻两个数比较,将小的调到前头。,经过第一轮(共5次比较与交换)后,最大的数9已“沉底” 。然后进行对余下的前面5个数第二轮比较,如果有n个数,则要进行n-1轮比较。在第1轮比较中要进行n-1次两两比较,在第j轮比较中要进行n-j次两两比较。,经过第二轮(共4次比较与交换)后,得到次大的数8。,程序流程图如下:,数据溢出,mid=(high+low)/2;,如果数组很多,low和high之和大于整数的取值范围 就会发生数据溢出 防止溢出的解决方案 修改计算中间值的方法,用减法代替加法 mid=low+(high-low)/2;,常见错误P219,

    注意事项

    本文(《c语言程序设计教学资料》第8章---数组.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开