函数的概述
什么是函数?函数就是定义在类中的具有特定功能的一段独立小程序。函数也称为方法。
函数的格式:修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,....)
{
执行语句;
return 返回值;
}
返回值类型:函数运行后的结果的数据类型。
参数类型:是形式参数的数据类型。
形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
实际参数:传递给形式参数的具体数值。
return :用于结束函数。
返回值:该值会返回给调用者。
函数的代码练习:
1.定义一个功能并打印一个矩形 ;row代表行,col代表列;
public static void juxing(int row,int col)
{
for(int x=0; x<row; x++)
{
for(int y=0; y<col; y++)
{
System.out.print("*");
}
System.out.println();
}
}
2.定义一个打印99乘法表功能的函数。
思路:
1. 先明确该功能的运算结果;没有结果,因为直接打印,所以返回值类型定义为void
2.再明确是否有未知内容参与运算;没有~!行与列都是9。
示例代码:
public static void print99()
{
for(int x=1; x<=9; x++)
{
for(int y=1; y<=x; y++) //尖朝上可以改变条件表达式,让条件随着外循环变化。
{
System.out.print(y+"*"+x+"="+y*x+"\t");
}
System.out.println(); //只有一个功能就是换行。
}
}
函数的特点:
1.定义函数可以将功能代码进行封装。
2.便于对该功能进行复用。
3.函数只有被调用才会被执行。
4.函数的出现提高了代码的复用性。
5.对于函数没有具体返回值的情况,返回值类型用void表示,那么该函数中的return语句如果在最后一行可以省略不写。
注意:函数中只能调用函数,不可以在函数内部定义函数。 定义函数时,函数的结果应该返回给调用者,交由调用者处理。
1.因为函数是一个独立的功能,所以要先明确该功能的运算结果,也就是返回值类型。
2.再要明确在定义该功能的过程中是否需要未知的内容参与运算,也就是说这个函数可以独立实现还是需要依靠调用者提供的一些数据才能完成实现呢(这是在明确函数的参数列表:参数类型和参数的个数)。
例:定义一个功能完成 3+4 的运算,并将结果返回给调用者。
1.明确功能的运算结果是一个整数的和(也就是明确函数的返回值类型)。
2.在实现该功能的过程中没有未知内容参与运算(明确函数的参数类型和参数的个数)。
public static int getsum(){
return 3+4;
}
概念:在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。
特点:与返回值类型无关,只看参数列表。 好处:方便阅读,优化了程序设计。
什么时候用重载? 当定义的功能相同但参与运算的未知内容不同时,这时就定义同一个函数名称以表示其功能,方便阅读,而通过参数列表的不同来区分多个同名函数。
函数重载练习:
定义一个加法运算,获取两个整数的和。
定义一个加法运算,获取三个整数的和。
class FunctionOverload
{
public static void main(String[] args)
{
sum(4,5);
sum(5,6,7);
}
public static int sum(int a,int b)
{
return a+b;
}
public static int sum(int a, int b, int c)
{
return sum(a,b)+c;
}
}
数组笔记总结
数组:
概念:同一种类型数据的集合,其实数组就是一个容器。 好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。格式 1: 元素类型[] 数组名 = new 元素类型[元素个数或数组长度]; 示例 :int[] arr = new int[5];
格式 2: 元素类型[] 数组名 = new 元素类型[]{元素,元素,元素,.....}; 示例 :int[] arr = new int[]{3,5,1,7};
凡是局部变量都在栈内存中。 局部变量是指:定义在方法中的变量;定义在方法的参数上的变量;定义在for循环里的变量都是局部变量。 boolean类型的数组默认初始化值是false。 boolean[] bool = new boolean[2]; bool[0] = false;
凡是new里出来的东西(实体)都在堆内存中。堆里存放的就是实体,实体包括数组和对象。
int数组的默认初始化值是0。
堆内存的特点:1.内存地址值;2.默认初始化值;3.垃圾回收机制。
.ArrayIndexOutOfBoundsException: 3 此错误代表:操作数组时访问到了不存在的角标。
.NullPointerException 此错误说明:空指针异常。也就是说arr这个引用已经不再指向任何数组实体了,而你还在用arr引用去操作某一个数组中的元素,这是不允许的。当引用没有任何指向值为空的情况该引用还在用于操作实体,就会发生这种情况
数组的操作: 获取数组中的元素最为常见。通常会用到遍历。
数组中有一个属性可以直接获取到数组中元素的个数,就是length 。使用方式:数组名称.length
数组排序:
1.选择排序的特点:内循环结束一次,最值出现在第一个角标位置上。
选择排序示例代码:
class SelectSort
{
public static void main(String[] args)
{
int[] arr = {9,10,8,1,5,3,6,2,4};
printArray(arr); //排序前打印数组
selectSort(arr); //调用选择排序功能
printArray(arr); //排序后打印数组
}
public static void selectSort(int[] arr) //选择排序功能。
{
for(int x=0; x<arr.length-1 ; x++)
{
for(int y=x+1; y<arr.length; y++)
{
if(arr[y] < arr[x]) //这里是判断。
{
/*
int temp= arr[x]; //这里是换位动作。
arr[x] = arr[y];
arr[y] = temp; */
swap(arr,x,y);
}
}
}
}
public static void printArray(int[] arr) //打印数组功能。
{
System.out.print("[ ");
for(int x=0; x<arr.length; x++)
{
if(x!=arr.length-1)
System.out.print(arr[x]+",");
else
System.out.println(arr[x]+" ]");
}
}
public static void swap(int[] arr, int a, int b) //定义一个功能进行位置置换。
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
2.冒泡排序:相邻的两个元素进行比较,如果符合条件换位。最值出现在最后角标位置上。
冒泡排序示例代码:
class BubbleSort
{
public static void main(String[] args)
{
int[] arr ={8,5,3,6,4,1,9,22,7};
printArray(arr);
bubbleSort(arr);
printArray(arr);
}
public static void bubbleSort(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
for(int y=0; y<arr.length-x-1; y++) //-x的目的是让每次比较的元素减少。-1是避免角标越界
{
if(arr[y] > arr[y+1])
{
/*int temp =arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;*/
swap(arr,y,y+1); //调用位置置换功能
}
}
}
}
public static void printArray(int[] arr) //打印数组功能。
{
System.out.print("[ ");
for(int x=0; x<arr.length; x++)
{
if(x!=arr.length-1)
System.out.print(arr[x]+",");
else
System.out.println(arr[x]+" ]");
}
}
public static void swap(int[] arr, int a, int b) //定义一个功能进行位置置换。
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
在排序中可以把换位置这个功能单独提取出来封装成一个函数。无论什么排序都需要元素之间换位置,所以可以把这部分相同的代码提取出来单独封装成一个函数。
请看下面代码:
public static void swap(int[] arr, int a, int b) //定义一个功能进行位置置换。
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
折半查找可以提高效率,但要求该数组必须是有顺序的数组。如果将一个元素插入到一个有序的数组中,而且还需保证插入后的数组也是有序的。那么,如何获取该元素在数组中的位置呢?经得出结论:min就是该元素在数组中的位置。
折半查找示例代码:
class ArrayTest
{
public static void main(String[] args)
{
int[] arr ={1,4,5,6,9,11,14,52};
int num =getIndex(arr,8);
System.out.println("num="+num);
}
//折半查找的一种方式
public static int half(int[] arr,int key)
{
int min,max,mid;
min =0;
max =arr.length-1;
mid =(min+max)/2;
while(arr[mid]!=key)
{
if(key > arr[mid])
min =mid+1;
else if(key < arr[mid])
max =mid-1;
if(min > max)
return -1;
mid =(min+max)/2;
}
return mid;
}
//折半查找的另一种方式。
public static int half_2(int[] arr,int key)
{
int min =0, max =arr.length-1, mid;
while(min<=max)
{
mid =(min+max)>>1;
if(key<arr[mid])
max =mid-1;
else if(key>arr[mid])
min =mid+1;
else
return mid;
}
return -1;
}
}
十进制转换二进制在程序中体现:day05/ArrayTest1; StringBuffer 名称 = new StringBuffer(); //存储数据的容器。 名称.append(num%2); //存储数据的容器提供了一个方法append添加。//名称.reverse() 容器中反转的功能。
查表法:将所有的元素临时存储起来,建立对应关系。每一次&15后的值作为索引去查建立好的表就可以找对应的元素。这样比 -10+‘A’简单的多。 通过数组的形式建表。
二维数组:[][] ,数组中的数组。格式1:int[][] arr = new int[3][2]; 定义了名称为arr的二维数组,二维数组中有3个一维数组,每个一维数组中有2个元素。一维数组的名称分别为 arr[0] ,arr[1] ,arr[2] 。给第一个一维数组中的1角标位赋值为78的写法是:arr[0][1] = 78; 格式2:int[][] arr = new int[3][]; 二维数组中有3个一维数组,每个一维数组都是默认初始化值null,可以对3个一维数组分别进行初始化:arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];