《java语言程序设计案例教程-第4章.ppt》由会员分享,可在线阅读,更多相关《java语言程序设计案例教程-第4章.ppt(26页珍藏版)》请在三一办公上搜索。
1、第4章 数组和方法,本章主要介绍Java语言的数组和方法。通过学习读者可以掌握方法及其参数的使用、方法调用方法、数组的使用和排序,以及方法、数组与循环语句的综合应用。本章要点4.1 数组4.2 方法思考与练习4,本章逻辑结构,4.1 数组4.1.1 什么是数组4.1.2 数组的使用实例27 投票选佳丽4.1.3 二维数组实例28 求两个矩阵的和实例29 矩阵的行列互换4.1.4 什么是排序实例30 插入排序法实例31 选择排序法实例32 冒泡排序法,本章逻辑结构,4.2 方法4.2.1 方法实例33 求最大公因数和最小公倍数之二4.2.2 递归实例34 费波纳契数列实例35 插入排序法之二实例
2、36 哥德巴赫猜想,4.1 数组,4.1.1 什么是数组 在实际应用中,经常需要处理一批相互有联系、有一定顺序、同一类型和具有相同性质的数据。例如,50个学生的期末总成绩,一个矩阵中的所有数据等等。Java语句提供了数组来保存和处理这类数据。数组是指一组类型相同的数据,每个数据称为一个数组元素。例如:如果上述50个学生的期末总成绩构成一个数组,则每个学生的成绩叫数组元素;如果某个矩阵中的数据构成一个数组,则其中的每个数字叫数组元素。有了数组,就可以用同一个变量名来表示一系列的数据,并用下标来表示同一数组中的不同数组元素。每个元素都具有一个下标值,也就是该元素在数组中的位置。在Java语言中数组
3、元素可以是简单数据类型,也可以是对象数据类型。数组的主要特点有5个。,4.1 数组,4.1.1 什么是数组(1)数组是相同数据类型元素的集合。(2)数组中的各个元素在内存中按照先后顺序连续存放在一起。(3)每个数组元素用其所在数组的名字和其在数组中的顺序位置表示。例如base0代表变量名为base的数组中的第一个元素,base1代表数组base的第二个元素,依此类推,basen代表数组base的第n+1个元素。(4)数组的下标值是从0开始的,其可以是int类型的数据、变量和算术表达式。例如,base a、s 5*10 都是合法的下标值。(5)每个数组都有长度,也就是其所能含有元素的个数。,4.
4、1 数组,4.1.2 数组的使用1使用数组的步骤使用数组一共有3个步骤,分别介绍如下。(1)定义数组。在使用数组之前必须先定义数组。定义数组主要是定义数组的名称和数组中元素的数据类型,其形式有两种:数组元素类型 数组名称;数组元素类型 数组名称;其中的数组名称必须符合Java语言标识符规则,例如,以下定义语句都是合法的。int results;boolean info;double tips_01;String abc;定义数组的目的只是告诉系统一个新的数组的名称和类型,数组本身不能存放任何数组元素,现阶段的数组值为null。,4.1 数组,4.1.2 数组的使用1使用数组的步骤(2)创建数组
5、。指定数组的长度,并分配相应的内存空间。创建数组使用关键字new,例如,results=new int50;表示给数组results分配内存空间,用来保存50个int类型的数字。定义数组和创建数组也可以合并为一条语句,例如,int results=new int50;String abc=new String100;在创建数组后,数组的默认值由其元素的类型决定,例如:整型数据的默认值为0,实型数据的默认值为0.0,布尔型数据的默认值为false。,4.1 数组,4.1.2 数组的使用1使用数组的步骤(3)数组元素在Java语言中,使用下标来标识数组中特定位置的元素,其形式为:数组名下标。下标值
6、由0开始到数组长度减1为止。以前面定义并创建的results数组为例:result0表示数组中的第一个元素;numbers49表示数组中的最后一个元素。数组results的结构如图4.1所示。图4.1 数组results的结构,图4.1 数组results的结构,4.1 数组,4.1.2 数组的使用2数组的初始化数组的初始化是指不使用系统的数组默认值,自行给数组赋初值,其方法有2种:(1)按照顺序依次给每个元素赋值。例如给数组results赋值:results0=87;results1=90;results48=45;results49=100;,4.1 数组,4.1.2 数组的使用2数组的初
7、始化(2)在定义数组的同时直接给数组赋初值,初值的个数是数组的长度。初值必须用大括号括起来,用逗号分隔开,例如:int results=87,90,77,55,98,37,64,100;String nums=one,two,three,four,five,six,seven,eight;在使用第2种方法时,一定要注意定义和初始化要在一条语句中完成,也就是说不可以定义数组后,在另一条语句中再给数组赋初值。例如:int numbers;numbers=1,2,3;是语法错误的语句。只可以写成int numbers=1,2,3;,4.1 数组,4.1.2 数组的使用3数组的复制事实上,我们创建的每
8、个数组都是Array类中的一个对象,所以在复制数组时有两种情况。(1)两个数组指向同一个元素空间。也就是说我们定义并创建了一个数组,其在内存中具有一定的空间,然后又定义了一个数组,让其同样表示该内存空间中的数组元素。例如:int num_1=1,2,3,4,5,6;int num_2;num_2=num_1;其中,num_2=num_1;语句表示数组num_2与数组num_1具有同样的元素,其关系如图4.2所示。,4.1 数组,4.1.2 数组的使用3数组的复制,图4.2 数组num_1与num_2的关系,4.1 数组,4.1.2 数组的使用3数组的复制如果改变一个数组中某个元素的值,则另一个
9、数组中相应位置的元素值也随之改变。例如:让num_28=60,则num_18中的值也随之变为60。这是因为num_1和num_2指向的是同一个数组,num_18和num_28保存的是同一个数值。(2)两个数组指向内容相同的两个元素空间。如果要真正复制一个数组,使得我们在修改复制数组的值时,不会影响到源数组的话,则需要定义一个和源数组长度相同的数组,然后再把源数组中的元素一一复制给新的数组。求任何数组的长度都可以使用:数组名.length数组num_1和num_2的关系如图4.3所示。,4.1 数组,4.1.2 数组的使用3数组的复制,图4.3 数组num_1与num_2的关系,4.1 数组,4
10、.1.3 二维数组1定义二维数组与定义一维数组类似,定义二维数组也有两种形式:(1)数组元素类型 数组名称;例如:int results;char c;(2)数组元素类型 数组名称;例如:String abc;double company_01;,4.1 数组,4.1.3 二维数组2创建二维数组二维数组可以看作一个按照行和列存储数据的内存空间。我们可以按照所需确定数组每行和每列的长度,有两种创建方法。(1)数组每行、每列之间长度相同。例如,int results=new int23;语句表示创建一个2行3列的二维数组,其结构如图4.5所示。该数组共有result00、result01、resu
11、lt02、result10、result11和result12六个数组元素。,图4.5 二维数组results,4.1 数组,4.1.3 二维数组2创建二维数组(2)数组每行、每列之间长度不相同。例如:results=new int2;/语句表示创建一个2行的二维数组。results0=new int3;/语句表示该数组的第一行有3列,也就是3个元素。results1=new int5;/语句表示该数组的第二行有5列,也就是5个元素。数组results的结构如图4.6所示。,图4.6 二维数组results,4.1 数组,4.1.3 二维数组3初始化二维数组与初始化一维数组类似,初始化二维数组
12、也有两种方法。(1)按照顺序依次给每个元素赋值。例如给数组results赋值:int results;results=new int23;results00=67;results01=97;results02=100;results10=89;results11=73;results12=65;(2)在定义数组的同时直接给数组赋初值。整个初值数据用大括号括起来,其中的每一行初值也必须用大括号括起来,用逗号分隔开。内层大括号内的数值也要用逗号分隔开。例如:int results=84,77,100,98,63,65;,4.1 数组,4.1.3 二维数组4二维数组的长度二维数组的长度是指行数的个数
13、,二维数组每行的长度是指每行的元素个数。例如:results.length表示二维数组results的长度,也就是行数;results i.length表示二维数组results第i行的长度,也就是元素个数。,4.1 数组,4.1.4 什么是排序所谓排序是指将一组无序的数据元素调整为一个从小到大或者从大到小排列的有序序列。排序是计算机程序设计中的一类重要运算。在实际工作中,我们经常要将数据进行比较、排序,以便对已排序的数据进行检索。例如:学生的高考成绩需要排序后,才能进行录取工作。排序是计算机语言编程的一个经典问题,到目前为止最常用排序方法有插入排序法、选择排序法和冒泡排序法等排序法。不论使用
14、哪种排序方法编写Java程序,其最根本的操作就是变量的数值交换。下面我们将通过实例来介绍3种常用排序法。,4.2 方法,4.2.1 方法1定义方法定义方法的形式有多种,这里介绍最基本的形式。方法类型 方法名称(参数1,参数2,参数n)方法体其中,方法类型也就是返回值的类型,它要与方法中的return语句内的返回数值类型保持一致。如果方法没有返回值,则方法类型为void。例如,Java Application中的main()方法的类型就是void,表示该方法没有返回值。方法的返回值类型可以是普通数据类型、数组和类。方法名称后面的小括号中,可以有方法参数,也可以没有参数。当参数为多个时,要用逗号隔
15、开。每个参数都必须定义类型和名称,类型可以是普通变量、数组和类的对象,名称要符合Java标识符的规则。方法体是在一对大括号内的一个或者多个语句。这些语句用来处理方法参数、类的全局变量和方法本身的局部变量中的数据,最后将结果通过return语句返回。或者,不返回任何值,只是完成指定的工作。,4.2 方法,4.2.1 方法2变量作用范围上面我们提到了全局变量(Global Variable)和局部变量(Local Variable),它们是根据变量被定义的位置不同而划分的。(1)全局变量:是在类中但不在任何方法内定义的变量。全局变量可以在整个类中,包括类的所有方法中使用。(2)局部变量:是在类中的
16、某个方法内定义的变量。局部变量只可以在其定义的方法内使用。如果要在其他方法内或类中使用,则会产生错误。3调用方法定义方法后,必须调用方法才能执行其中的语句,实现其功能。根据方法类型的不同,有两种调用形式。(1)void类型的方法。把方法调用作为一条语句。例如,print();(2)其他类型的方法。把方法调用作为一个表达式或者表达式中的一部分。例如,sum=numbers(n);语句中方法调用numbers(n)作为赋值语句的一部分。,4.2 方法,4.2.1 方法4return语句return语句是在方法中使用。它的作用是终止当前方法的执行,返回到调用该方法的语句处,并继续向下执行语句。ret
17、urn语句有两种形式。(1)return 表达式;计算表达式的值,然后将该值返回到调用该方法的语句中。Java语言要求返回值(也就是表达式的值)必须与方法声明中的返回值类型一致。(2)return;当方法的类型为void,不需要返回值时,可以使用这种格式终止方法的执行,并返回,继续执行下面的语句。这种格式一般用于if语句或者switch语句等选择结构形式。如果忽略该种格式,则在执行完方法中的所有语句后,自动返回并继续执行下面的语句。,4.2 方法,4.2.1 方法5方法的参数方法参数是在调用方法的同时,传递给方法的数据,用于方法体语句中。调用方法时所传递的参数类型、参数顺序和参数个数必须与方法
18、中的参数类型、参数顺序和参数个数一致。例如,如果调用a()方法的语句为int i=a(100,满分,A),则a()方法中的参数必须为a(int i,String s,char c),其中,作为参数的变量名称可以自行确定,但参数类型和参数顺序必须相同。,4.2 方法,4.2.2 递归1递归递归(Recursion)方式可以把一个大型复杂的问题层层转化,最终变成一个与原问题类似的简单问题。这样只需要少量的操作就可以解决一个复杂的计算,大大地减少了程序的语句数量。递归最主要的两个部分是:(1)递归出口。递归出口是递归结束的条件,也就是最终变成的简单问题。这个简单问题的解决方法必须已经知道,或者已经给
19、出计算结果。例如,在求费波纳契数列时,其递归出口为第一和第二个数的值为1。(2)递归表达式。从递归出口到最终复杂问题的转化规律。例如,在求费波纳契数列时,其递归表达式为一个数是其前两个数字之和,并且第一和第二个数的值为1。将其文字描述转换为数学表达式:当n=1时,a1=1,当n=2时,a2=1当n 2时,an=an-1+an-2,4.2 方法,4.2.2 递归2编写具有递归功能的方法Java程序中的方法能够具有递归功能,最主要是通过参数和方法调用自身方法来实现的。(1)参数是控制整个递归进程的关键。它相当于递归的数学表达式中的条件。例如上面费波纳契数列数学表达式中的n,阶乘数学表达式中的N。当
20、条件不同时,计算的方式和结果也不同。(2)方法调用自身方法是实现递归的过程。在调用自身方法时,一定要保证随着每一次的调用,方法的参数值越来越接近递归结束的条件。在具体编写中,我们一般使用if-else语句来控制计算的方式和结果。也就是说当参数值满足递归结束条件时,返回计算结果,否则继续调用方法本身。递归方法的运行顺序是依次调用其本身,不返回任何值,直到满足递归结束条件后,再依次返回各个被调用方法的值。例如,在求阶乘的方法中,如果n=4,则其运行的顺序如下。先依次调用factorial(3)、factorial(2)、factorial(1),再返回factorial(1)方法的值1,计算factorial(2)中的算术表达式2*1=2。再返回该值到factorial(3),计算3*2=6。再返回到最初的方法factorial(4),计算4*6=24。最后返回该值到调用factorial()方法的语句中。,