day04函数与数组.docx

上传人:b****5 文档编号:11775854 上传时间:2023-04-01 格式:DOCX 页数:27 大小:144.57KB
下载 相关 举报
day04函数与数组.docx_第1页
第1页 / 共27页
day04函数与数组.docx_第2页
第2页 / 共27页
day04函数与数组.docx_第3页
第3页 / 共27页
day04函数与数组.docx_第4页
第4页 / 共27页
day04函数与数组.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

day04函数与数组.docx

《day04函数与数组.docx》由会员分享,可在线阅读,更多相关《day04函数与数组.docx(27页珍藏版)》请在冰豆网上搜索。

day04函数与数组.docx

day04函数与数组

1函数

1.1数的概述

发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表现形式则称作函数。

练习:

把两个整数相加:

publicclassFunctionDemo1{

publicstaticvoidmain(String[]args){

/*

inta=4+5;

System.out.println("a="+a);

intb=3+9;

System.out.println("b="+b);

*/

add(4,5)

}

publicstaticintadd(inta,intb){

returna+b;

}

}

举例:

地铁自动售票机,接收纸币或硬币,返回车票,该售票机具有独立功能,可以理解为函数。

有未知内容参与运算(要投币,纸币硬币,多少钱)。

有返回值(返回车票)

举例2:

手机,手机具备打电话功能,有未知内容(电话号码),键盘是(形参),输入的号码是实际参数。

1.2函数的格式

修饰符返回值类型函数名(参数类型形式参数1,参数类型形式参数2,…)

{

执行语句;

return返回值;

}

返回值类型:

运行这段程序得出的一个运算结果,结果类型,如果函数没有返回值则用void

来表示该函数没有返回值。

函数名:

仅仅是一个标识符,可以随意起名字。

形式参数:

是一个变量,用于存储调用函数传递进来的实际参数。

实际参数:

传递给形式参数的具体数值。

返回值:

返回给调用者。

 

定义函数:

1:

是否有未知内容参与运算

2:

是否有运算结果(返回值)

案例:

获取2个整数中的较大的数。

publicstaticintgetMax(intx,inty){

intresult;

if(x>y){

result=x;

}else{

result=y;

}

returnresult;

}

解析:

getMax方法

该方法方法名为:

getMax,方法的作用是获取找出两个整数中较大的值。

该方法有两个int型参数,:

x和y,方法返回两个数中较大的一个。

publicstatic是方法的修饰符

int是方法的返回值类型

getMax是方法的方法名

(intx,inty)是参数列表,x和y是形式参数。

{}花括号内的代码是方法体

returnresult;result是返回值。

方法定义完成之后,如何调用一个方法?

函数调用:

想要使用方法,必须调用它。

publicstaticvoidmain(String[]args){

intmax=getMax(5,7);

System.out.println(max);

}

一:

在main方法中调用getMax()方法,5和7就是给该方法传递的实际参数。

如果方法有返回值,可以定义一个变量接收返回值,变量类型和方法返回值类型一致。

本例中通过int类型变量max接收了getMax方法的返回值。

完整程序

这里的getMax(i,j);i和j就是实际参数。

publicclassDemo6{

publicstaticvoidmain(String[]args){

inti=5;

intj=7;

intmax=getMax(i,j);

System.out.println(i+"和"+j+"的最大值是:

"+max);

}

publicstaticintgetMax(intx,inty){

intresult;

if(x>y){

result=x;

}else{

result=y;

}

returnresult;

}

}

二:

上述案例中调用getMax方法,并将结果赋值给了max变量。

也可以直接打印getMax()方法的结果。

publicclassDemo6{

publicstaticvoidmain(String[]args){

inti=5;

intj=7;

//打印方法的结果

System.out.println(getMax(i,j));

}

publicstaticintgetMax(intx,inty){

intresult;

if(x>y){

result=x;

}else{

result=y;

}

returnresult;

}

}

注意:

main方法是程序的入口由虚拟机调用,方法和方法之间不能嵌套,方法之间通过调用来使用。

方法什么时候执行完毕:

当执行完return语句,或者执行到方法末尾的花括号时方法结束。

该类中包含了两个方法,main方法和getMax方法。

main方法由java虚拟机调用,并且main方法的写法是固定的。

Main方法可以调用其他方法。

当调用getMax方法时,变量i的值传递给方法中的x,j的值传递给方法中的y,并开始执行getMax方法中的语句,执行return,并返回运算结果。

getMax方法运行完毕。

 

1.3函数的特点

1、定义函数可以将功能代码进行封装

2、便于对该功能进行复用

3、函数只有被调用才会被执行

4、函数的出现提高了代码的复用性

5、对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。

注意:

函数中只能调用函数,不可以在函数内部定义函数。

定义函数时,函数的结果应该返回给调用者,交由调用者处理。

函数的返回值void

需求:

根据学生考试成绩划分ABCDA90-100B80-89C70-79D60-69E0-59,建议成绩使用double。

将该程序使用函数定义。

publicstaticvoidmain(String[]args){

printGrade(90);

printGrade(59.5);

}

publicstaticvoidprintGrade(doublescore){

chargrade;

if(score>=90.0)

System.out.println("A");

elseif(score>=80.0)

System.out.println("B");

elseif(score>=70.0)

System.out.println("C");

elseif(score>=60.0)

System.out.println("D");

else

System.out.println("E");

}

 

publicstaticvoidmain(String[]args){

getResult(5);

}

publicstaticintgetResult(intx){

System.out.println(returnx*8);

//调用该函数会报错.缺少返回值类型.

}

/*

*该方法没有具体的返回值,那么返回值的类型是不可以写int了

*但是又和函数的格式不符合了,怎么解决?

*当函数运算后,没有具体的返回值时,这时返回值类型用一个特殊的关键字做标志.

*该关键字就是voidvoid表示没有具体的返回值类型.

*当函数的返回值类型是void时,函数中的return语句可以省略不写.

*/

注意:

函数中只能调用函数,不可以在函数内部定义函数。

函数之间是平级的,相互之间是调用的关系.

错误写法

publicstaticvoidmain(String[]args){

publicstaticvoidgetResult(intx){

System.out.println(x*8);

//主函数,里边嵌套函数。

错误!

}

}

 

1.4函数的应用

案例一:

画矩形。

/*

为了提高代码的复用性

定义一个画矩形的函数

1、确定函数的运算结果的数据类型,void

2、确定没有未知参数。

*/

publicstaticvoiddraw(intwidth,intheight){

for(inti=0;i

for(intj=0;j

System.out.print("*");

}

System.out.println();

}

}

案例二:

两个数字对比是否相等

/*

1、确定函数的运算结果的数据类型,boolean

2、确定没有未知参数。

a,b

*/

publicstaticbooleanequlas(inta,intb){

/**

if(a==b){

returntrue;

}else{

returnfalse;

}

**/

returna==b?

true:

false;

}

 

案例三:

比较两个数的大小

/*

比较两个整数谁大.

*/

publicstaticintmax(inta,intb)

{

/*

if(a>b)

returna;

else

returnb;

*/

returna>b?

a:

b;

}

 

函数的使用注意事项:

1.函数中只能调用函数,不能定义函数,没有定义函数之前,不能调用函数。

2.输出语句只能对有具体返回结果的函数的进行打印。

3.返回值类型是void的函数,是不可以被输出语句打印的。

4.函数需要实现功能,那么函数只实现所需功能即可,不要实现不需要的功能。

1.5函数的重载

1、函数重载的定义:

在同一个类中,有一个以上的同名函数,只要函数的参数列表或参数类型不一样即可,与返回值无关,这些统称为方法的重载。

2、函数的重载存在的原因:

为了增强方法的阅读性,优化了程序设计。

案例1:

九九乘法表

privatestaticvoidprint99(){

for(inti=1;i<=9;i++){

for(intj=1;j<=i;j++){

System.out.print(i+"*"+j+"="+(i*j)+"");

}

System.out.println();

}

}

 

privatestaticvoidprint99(intnum){

for(inti=1;i<=num;i++){

for(intj=1;j<=i;j++){

System.out.print(i+"*"+j+"="+(i*j)+"");

}

System.out.println();

}

}

 

练习:

判断那个方法是重载

voidshow(intx,chary,doublez){}//false

voidshow(inta,doublec,charb){}//true

intshow(inta,doublec,charb){}//true

voidshow(inta,charb){}//true

voidshow(doublec){}//true

doubleshow(intx,chary,doublez){}//false

2数组

概念

同一种类型数据的集合。

其实数组就是一个容器。

数组的好处

可以自动给数组中的元素从0开始编号,方便操作这些元素。

格式1:

元素类型[]数组名=new元素类型[元素个数或数组长度];

示例:

int[]arr=newint[5];

格式2:

元素类型[]数组名=new元素类型[]{元素,元素,……};

int[]arr=newint[]{3,5,1,7};

int[]arr={3,5,1,7};

如果需要存储大量的数据,例如如果需要读取100个数,那么就需要定义100个变量,显然重复写100次代码,是没有太大意义的。

如何解决这个问题,Java语言提供了数组(array)的数据结构,是一个容器可以存储相同数据类型的元素,可以将100个数存储到数组中。

1数组的概念

同一种类型数据的集合。

其实数组就是一个容器。

运算的时候有很多数据参与运算,那么首先需要做的是什么.不是如何运算而是如何保存这些数据以便于后期的运算,那么数组就是一种用于存储数据的方式,能存数据的地方我们称之为容器,容器里装的东西就是数组的元素,数组可以装任意类型的数据,虽然可以装任意类型的数据,但是定义好的数组只能装一种元素,也就是数组一旦定义,那么里边存储的数据类型也就确定了。

2数组的好处

存数据和不存数据有什么区别吗?

数组的最大好处就是能都给存储进来的元素自动进行编号.注意编号是从0开始。

方便操作这些数据。

例如学生的编号,使用学号就可以找到对应的学生。

3数组的格式

元素类型[]数组名=new元素类型[元素个数或数组长度];

示例:

int[]arr=newint[5];

案例:

需求:

想定义一个可以存储3个整数的容器

实现:

1声明数组变量

为了使用数组必须在程序中声明数组,并指定数组的元素类型

=左半部分:

先写左边明确了元素类型是int,容器使用数组,那么如何来标识数组?

.那么用一个特殊的符号[]中括号来表示。

想要使用数组是需要给数组起一个名字的,那么我们在这里给这个数组起名字为x.接着跟上等号。

代码体现:

int[]x

注意:

intx[]也是一种创建数组的格式。

推荐使用int[]x的形式声明数组。

2创建数组

=右半部分:

要使用一个新的关键字.叫做new。

new用来在内存中产生一个容器实体,数据要存储是需要有空间的,存储很多数据的空间用new操作符来开辟,newint[3];这个3是元素的个数。

右边这部分就是在内存中定义了一个真实存在的数组,能存储3个元素。

newint[3]做了两件事情,首先使用newint[3]创建了一个数组,然后把这个数组的引用赋值给数组变量x。

int[]x=newint[3];

x是什么类型?

任何一个变量都得有自己的数据类型。

注意这个x不是int类型的。

int代表的是容器里边元素的类型。

那么x是数组类型的。

数组是一种单独的数据类型。

数据类型分为2大派,分为基本数据类型和引用数据类型。

第二大派是引用数据类型。

那么大家现在已经接触到了引用数据类型三种当中的一种。

就是数组类型[]中括号就代表数组。

4、int[]arr=newint[5];在内存中发生了什么?

内存任何一个程序,运行的时候都需要在内存中开辟空间.int[]arr=newint[5];这个程序在内存中是什么样?

这就涉及到了java虚拟机在执行程序时所开辟的空间,那么java开辟启动了多少空间呢?

继续学习java的内存结构。

数组的定义

格式1:

元素类型[]数组名=new元素类型[元素个数或数组长度];

示例:

int[]arr=newint[5];

格式2:

元素类型[]数组名=new元素类型[]{元素,元素,……};

int[]arr=newint[]{3,5,1,7};

int[]arr={3,5,1,7};

注意:

给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小。

创建数组之后不能修改数组的大小。

可以使用length属性获取数组的大小。

遍历数组

数组初始化

数组的格式

int[]x=newint[3];

x[0]=1;

x[1]=2;

另一种定义:

该形式可以直接明确数组的长度,以及数组中元素的内容

int[]x={1,2,3};

int[]x=newint[]{1,2,3};

初始化方式1:

不使用运算符new

int[]arr={1,2,3,4,5};

int[]arr2=newint[]{1,2,3,4,5};

初始化方式2:

int[]arr3=newint[3];

arr3[0]=1;

arr3[1]=5;

arr3[2]=6;

如果数组初始化中不使用运算符new。

需要注意:

下列写法是错误的。

int[]arr;

arr={1,2,3,4,5};

此时初始化数组,必须将声明,创建,初始化都放在一条语句中个,分开会产生语法错误。

所以只能如下写:

int[]arr={1,2,3,4,5};

数组遍历

publicstaticvoidmain(String[]args){

int[]x={1,2,3};

for(inty=0;y<3;y++){

System.out.println(x[y]);

//System.out.println("x["+y+"]="+x[y]);打印效果x[0]=1;

}//那么这就是数组的第一个常见操作.遍历

}

数组中有一个属性可以获取到数组中元素的个数,也就是数组的长度.数组名.length

publicstaticvoidmain(String[]args){

int[]x={1,2,3};

for(inty=0;y

System.out.println(x[y]);

//System.out.println("x["+y+"]="+x[y]);打印效果x[0]=1;

}//那么这就是数组的第一个常见操作.遍历

}

数组的常见异常

一数组角标越界异常:

,注意:

数组的角标从0开始。

publicstaticvoidmain(String[]args){

int[]x={1,2,3};

System.out.println(x[3]);

//java.lang.ArrayIndexOutOfBoundsException

}

 

二空指针异常:

publicstaticvoidmain(String[]args){

int[]x={1,2,3};

x=null;

System.out.println(x[1]);

//java.lang.NullPointerException

}

数组:

什么时候使用数组:

当元素较多时为了方便操作这些数组,会先进行来临时存储,所使用的容器就是数组。

特点:

数组长度是固定的。

数组的内存分析

案例分析一:

案例分析二:

数组的常见操作

6.1案例一个数组取出最大值

/*定义一个获取最大值的功能:

1、确定结果:

返回值类型int

2、未知内容:

要获取哪个数组的最大值没有确定,则是数组没有确定

思路:

1、定义一个变量,记录住数组的比较大的元素。

2、遍历整个数组,让数组的每一个元素都和该变量进行对比即可。

3、当变量遇到比它大的元素,则让该变量记录该元素的值,当循环结束时,最大值产生了

*/

publicstaticintgetMax(int[]arr)

{

//定义变量记录较大的值,初始化为数组中的任意一个元素。

intmax=arr[0];

for(intx=1;x

{

if(arr[x]>max)

max=arr[x];

}

returnmax;

}

6.2直接排序

案例二:

使用直接排序对数组进行排序:

/*

选择排序。

以一个角标的元素和其他元素进行比较。

在内循环第一次结束,最值出现的头角标位置上。

*/

publicstaticvoidselectSort(int[]arr)

{

for(intx=0;x

{

for(inty=x+1;y

因为每一次比较,

//都用x角标上的元素和下一个元素进行比较。

{

if(arr[x]>arr[y])

{

inttemp=arr[x];

arr[x]=arr[y];

arr[y]=temp;

}

}

}

}

6.3冒泡排序

案例三:

冒泡排序

/*

冒泡排序。

比较方式:

相邻两个元素进行比较。

如果满足条件就进行位置置换。

原理:

内循环结束一次,最值出现在尾角标位置。

*/

publicstaticvoidbubbleSort(int[]arr)

{

for(intx=0;x

{

for(inty=0;y

让每次参与比较的元减。

//-1:

避免角标越界。

{

if(arr[y]>arr[y+1])

{

inttemp=arr[y];

arr[y]=arr[y+1];

arr[y+1]=temp;

}

}

}

}

6.4折半查找(二分法)

案例四:

/*

为了提高查找效率,可使用折半查找的方式,注意:

这种查找只对有序的数组有效。

这种方式也成为二分查找法。

*/

publicstaticinthalfSeach(int[]arr,intkey)

{

intmin,mid,max;

min=0;

max=arr.length-1;

mid=(max+min)/2;

while(arr[mid]!

=key)

{

if(key>a

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1