Java程序设计 课件 【ch04】数组_第1页
Java程序设计 课件 【ch04】数组_第2页
Java程序设计 课件 【ch04】数组_第3页
Java程序设计 课件 【ch04】数组_第4页
Java程序设计 课件 【ch04】数组_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数组Java程序设计第四章01一维数组一维数组必须先声明后使用。声明数组时,需要指明数组名称和数组元素的数据类型。一维数组声明的语法格式有以下两种,建议使用第一种方式。方式一:数组元素类型[]数组名;例如:int[]a; double[]b;方式二:数组元素类型数组名[];例如:inta[]; doubleb[];1.一维数组的声明4.1一维数组4.1.1一维数组的声明与访问4.1一维数组2.一维数组的创建声明数组仅仅给出了数组的名称和其中可存放数据的类型,而要真正使用数组来保存数据,还必须为该数组分配内存空间,即创建数组。在创建数组时,必须指明数组的长度,即数组中可存储的数据个数。Java语言中创建数组的语法格式为:数组名=new数组元素类型[数组长度];例如,对于前面声明的数组a和b,可以进一步来创建:a=newint[20];b=newdouble[10];也可以将数组的定义和创建合二为一,例如:Int[]a=newint[20];Double[]b=newdouble[10];4.1一维数组3.一维数组的初始化在定义数组的同时,可以对数组进行初始化,也就是为数组元素设置指定的初始值。例如:int[]a={9,12,-1,3,6};或者Int[]a=new[]{9,12,-1,3,6}声明了一个int类型的数组a,并且用花括号中的数据对这个数组进行了初始化,各个数据之间用“,”分隔开。此时数组的大小由花括号中的用于初始化数组的元素个数决定,注意不要在数组声明中指定数组的大小,否则将会引起错误。例如:Inta[20]={9,12,-1,3,6};//编译出错4.1一维数组4.一维数组元素的访问声明并创建数组以后,就可以访问它了。需要注意的是,数组的访问以元素为单位,不能直接访问数组整体。数组元素可通过下标访问,一般形式为:数组名[下标]例如:a[0]=3;s=s+a[i];下标可以是整型表达式。Java中数组元素的下标从0开始,因此,若数组长度为n,则下标从0开始,最大为n−1。程序中可以使用如下形式的表达式来获得数组的长度值,也就是数组的元素个数。数组名.lenght4.1一维数组【例4-1】输入一个班10名学生的数学成绩,求这10名学生的平均数学成绩。【程序】【运行结果】输入内容为:输出内容为:【程序说明】一旦数组被建立,数组就具有固定大小。因此,数组引用使用的下标必须指向有效的数组元素,即下标范围必须是0~n−1(n为数组长度)。4.1一维数组【例4-2】用foreach实现例4-1。【程序】【运行结果】输入内容为:输出内容为:【程序说明】foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句。如果要引用数组或者集合的索引,foreach语句无法做到,foreach仅能老老实实地遍历数组或者集合一遍。4.1一维数组4.1.2顺序查找一维数组的一个典型应用就是解决查找问题。查找是指在一批数据中查找某个指定的数据。例如,在10个数(92,23,40,90,82,34,12,98,35,5)中查找90这个数,或者在这10个数中查找100这个数,前者可以找到90,而后者找不到100。顺序查找法是最简单、最直观的查找方法。要查找的指定数据通常称为关键字,顺序查找的基本思路是,从表中的第一个元素开始,依次与关键字比较,若某个元素与关键字相等,则查找成功;若查找到最后一个元素,仍然没有数组元素与关键字相等,则查找失败。顺序查找的优点是数组中的数据无须按大小顺序排列,缺点是时间复杂度较大,数据规模较大时,效率较低。4.1一维数组【例4-3】顺序查找。【程序】【程序说明】index用于存放与关键字相等的数组元素的下标,初始值设置为−1。for循环语句实现数组元素与关键字的依次比较,如果相等,则记录下标,并用break语句终止循环;否则继续比较。循环结束以后,如果index的值为−1,表明index一直没有被重新赋值,也就是没有数组元素值与关键字相等,否则index的值即为与关键字相等的数组元素的下标。4.1一维数组4.1.3二分查找对于元素已排序的数组数据,常利用二分查找法。假设数组元素已按升序排列,二分查找法的核心思想如下。(1)首先,将数组中间位置元素与关键字比较,如果两者相等,则查找结束;否则进行下一步操作。(2)利用中间位置元素将数组分成前、后两段,如果中间位置元素大于查找数据,则进一步查找前半段,否则进一步查找后半段,这样查找范围将缩小一半。(3)重复以上过程,直到找到和查找数据匹配的元素,则查找成功,若查找区间为空,则表示找不到要查找的数据。二分查找的效率显著高于顺序查找,但前提是数组元素必须是有序的。4.1一维数组【例4-4】二分查找。【程序】【程序说明】程序中用while循环结构实现二分查找,每循环一次,查找区间缩小一半。如果找到要查找的数据,记录数组下标,并用break语句终止循环。4.1一维数组4.1.4选择排序排序是指将一组无序的数据,重新排列成一个有序(升序或降序)序列的过程。n个数据选择排序(升序)的思想如下:第1步:在未排序的n个数(a[0]~a[n−1])中找到最小数,将其与a[0]交换;第2步:在剩下未排序的n−1个数(a[1]~a[n−1])中找到最小数,将其与a[1]交换;第3步:在剩下未排序的n−2个数(a[2]~a[n−1])中找到最小数,将其与a[2]交换;……第n−1步:在剩下未排序的2个数(a[n−2]~a[n−1])中找到最小数,将其与a[n−2]交换;n个数据选择排序的算法如下:4.1一维数组【例4-5】创建长度为10的整型一维数组,元素初始值为随机正整数,用选择法排序输出。【程序】【程序说明】程序中,在查找最小值的过程中,记录下标值minIndex,然后进行比较和交换。4.1一维数组4.1.5冒泡排序冒泡排序同样是一种经典的排序方法。其基本思想是,从数组的第1个元素开始,数组前后两个元素两两比较,如果两个元素的顺序不满足要求,则相互交换位置。这样,经过第1轮比较,数组中最大的元素到达数组末尾,经过第2轮比较,数组中次大的元素到达数组倒数第二的位置。重复以上步骤,数组中所有元素即完成了从小到大的排序。由于该排序类似于气泡小的上升、大的沉底,故名冒泡法。冒泡排序的算法过程如下(以n个数从小到大排序为例):(1)第1轮冒泡排序:对n个数的每相邻两数进行比较,如果不是从小到大的顺序,则交换两数。结果为最大的数被安置在最后一个位置上;(2)第2轮冒泡排序:对前面的n−1个数进行冒泡,结果为次大的数被安置在最后第二的位置上;……(3)重复上述过程,共经过n−1轮冒泡排序后,排序结束。4.1一维数组【例4-6】创建长度为10的整型一维数组,元素初始值为随机正整数,用冒泡法排序输出。【程序】【程序说明】外层循环的含义:需要遍历a.length−1次数组,才能将数组排好序。内层循环的含义:待排序区域的起始和结尾位置。02二维数组4.2二维数组4.2.1二维数组的声明、创建与初始化1.二维数组的声明同一维数组类似,二维数组的声明方式也有以下两种。方式一:数据类型[][]数组名称例如:Double[][]b;方式二:数据类型数组名称[][];例如:doubleb[][];4.2二维数组2.二维数组的创建同一维数组类似,通过new运算符可进行二维数组的创建。创建每行列数都相同的二维数组的语法格式如下:数组名称=new数据类型[数组行数][数组列数]例如,对于前面声明,可以用以下语句创建3行4列的二维数组b:b=newdouble[3][4];与一维数组类似,也可以将声明和创建合二为一:double[][]b=newdouble[3][4]Java语言不要求二维数组中每行的元素个数相同,例如:a数组中元素的分布如图4-1所示。4.2二维数组3.二维数组的初始化同一维数组一样,二维数组创建之后,系统为每个数组元素分配一个默认值,如int型数据的值为0,double型数据的值为0.0。在声明数组的同时,也可以为数组中的元素赋值,例如:intscore[][]={{85,90,65},{70,93,88}};//数组行数为2,列数为3doubleweight[][]={{61.5,70.3},{91.4,89.5}}//2行2列的数组需要注意的是,在声明二维数组的同时为数组中的元素赋值时,必须用花括号{}将数组中的行元素括起来,不同的行元素之间用逗号分隔开。对于每行元素个数不一样的二维数组,可以采用如下方式初始化:intscore[][]={{60},{85,90},{70,93,88}}则数组score第1行有1个元素,第2行2个元素,第3行3个元素。4.2二维数组4.二维数组元素的引用可以通过行下标和列下标来引用二维数组中的某个数组元素,其中,数组行下标和列下标均从0开始。因此,对一个2行3列的数组,其行下标为0和1,列下标为0,1,2。否则,程序将发生数组下标越界异常。和一维数组不同的是,二维数组的length属性指明了数组的行数。通过“数组名称.length”可以得到数组的行数,通过“数组名称[i].length”可以得到数组第i行的列数。4.2二维数组【例4-7】输入10名学生4门课的成绩,计算输出每名学生的总成绩。【程序】【程序说明】外层循环变量i控制矩阵的行数,内层循环变量j控制矩阵的列数。4.2二维数组4.2.2用二维数组表示矩阵矩阵是由m*n个数排成的m行n列的数组,记为:矩阵是高等数学中的常见工具,也常用于统计分析等应用数学学科中。在物理学中,矩阵在电路学、力学、光学和量子物理中都有应用。在计算机科学中,三维动画制作也需要用到矩阵。矩阵的运算是数值分析领域的重要问题,二维数组是矩阵的常用表示方式。需要注意的是,在数学上,矩阵的下标从1开始,而Java中数组的行下标和列下标都从0开始。4.2二维数组【例4-8】矩阵的乘法运算。设A为m*p的矩阵,B为p*n的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积。其中,矩阵C中的第i行第j列的元素可以表示为【程序】【程序说明】二维数组A的长度是2,B的长度是3,三重循环中,最内层循环k的值为从0到2。03范例4.3范例【例4-9】输入一个班10名学生的数学成绩,求数组中大于平均值的元素并显示。【程序】【分析】求解数组的题目一般分为几个步骤:数组的声明与输入;数组的相关操作;结果的输出。本题中使用foreach语句,简化了for循环的编写。4.3范例【例4-10】输入一个班10名学生的数学成绩,将数学最高分显示输出。【程序】【分析】设最大值变量为max,由于变量存放为数学成绩,故不会出现负值,所以max可以设置为0,然后与数组中的元素分别进行比较,得出最大值。4.3范例【例4-11】使用Java随机生成30个0~9之间的数字,分别统计0~9这10个数字分别出现了多少次。【程序】【分析】首先生成30个0~9之间的数字,定义数组b来存放每个数字出现的次数,a的值恰好是数组b的下标。4.3范例【例4-12】筛选法求质数:输入一个整数n,求小于这个整数的所有质数。【程序】【分析】定义一个长度为n的boolean型数组,true表示是质数,false表示不是质数,初始值均为true,之后从2开始循环。(1)找到第一个值为true的下标i。(2)把所有下标为i的倍数的值置为false。直到扫描完数组中的所有数值,最后遍历数组,如果下标i的值为true,则说明i为质数。范例【例4-13】假设有10位候选人参加学生会主席选举,实现选票的统计工作,输出最终获胜者的编号。【程序】【分析】每位候选人的编号为1~10,如果希望为某位候选人投票,就从键盘上输入这位候选人的编号。每位候选人的选票数存放在一个数组a中,a[i]的值就表示编号为i的候选人的选票数。程序中,先用do-while循环输入选票并统计各候选人的选票数,然后从数组中找出最大值的下标。4.3范例【例4-14】明明想在学校中请同学一起做一项问卷调查,为了调查的客观性,他先用计算机生成了n个1到1000之间的随机整数(1≤n≤100),对于其中重复的数字,只保留一个,不同的数对应不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。【分析】这里的n个整数都是1到1000之间的整数,可以定义长度为1001(下标为0~1000)的数组a。数组元素a[i]的值为0,表示i不存在。4.3范例【程序】4.3范例【例4-15】输入一个日期,输出该天是这一年中的第几天。【分析】闰年的二月份是29天,非闰年的二月份是28天,可以将每个月的天数存放在一个2行12列的二维数组中,第1行存放非闰年的每月天数,第2行存放闰年的每月天数。将所输入日期之前的所有完整月的天数相加,再加上本月到该日期为止的天数,就是该日期在这一年中的第几天。例如,如果输入的天数是2016年9月

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论