欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

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

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

    加入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为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 05 0 0 0 9 0 0 0,也可以对各行中的某一元素赋初值如:int a34=1,0,6,0,0,0,11;,1 0 0 00 6 0 00 0 0 11,1 0 0 05 6 0 0 0 0 0 0,如:int a34=1,5,6;,3.对部分元素赋初值,未初始化的元素将自动被初始化为0。,如:int a34=1,5,9;,也可以只对某几行元素赋初值。,在定义时也可以只对部分元素赋初值而省略第一维的长度,最好按行赋初值。,0 0 3 00 0 0 00 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;,注意:不能省略第二维的长度。,二维数组在内存中的存放,二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素,地址 值 数组元素,b00b01b02b10b11b12b20b21b22,3000H3002H3004H3006H3008H300AH300CH300EH3010H,例如:整型数组 b33=1,2,3,4,5,6,7,8,9;,123,456,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,向函数传递二维数组,使用不带方括号的数组名作为参数传递传递的是数组的首地址,也是二维数组的第一个元素的地址 二维数组作为形参时不可以省略二维长度由于二维数组的按行存储,编译器必须知道每行有多少个元素,否则会不确定具体的元素地址,用多维数组名作为函数实参和形参。在被调函数中对形参数组定义时可以指定每一维的大小。,例:有一个的矩阵,求所有元素中的最大值。,解题思路:先使变量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)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开