day03-函数和数组

2.7函数

  • 函数定义
  • 函数特点
  • 函数应用
  • 函数重载 

2.7.1函数定义

  • 什么是函数? 
    • 函数就是定义在类中的具有特定功能的一段独立小程序。 
    • 函数也称为方法。
  • 函数的格式: 
    修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,) 

    执行语句; 
    return 返回值; 
    }

返回值类型:函数运行后的结果的数据类型。 
参数类型:是形式参数的数据类型。 
形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。 
实际参数:传递给形式参数的具体数值。 
return:用于结束函数。 
返回值:该值会返回给调用者。

2.7.2函数的特点

  • 定义函数可以将功能代码进行封装,便于对该功能进行复用。
  • 函数只有被调用才会被执行。
  • 函数的出现提高了代码的复用性。
  • 对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一 
    行可以省略不写。
  • 注意: 
    1.函数中只能调用函数,不可以在函数内部定义函数。 
    2. 定义函数时,函数的结果应该返回给调用者,交由调用者处理。

2.7.3函数的应用

  • 两个明确: 
    1.明确要定义的功能最后结果是什么? 
    (明确返回值类型) 
    2.明确在定义的功能中,是否需要其他未知内容参与运算。 
    (明确参数列表)

  • 示例: 
    需求:定义一个功能,可以实现两个整数的加法运算。 
    分析: 
    1. 该功能的运算结果是什么? 
    是两个数的和 是int型 (返回值类型为int)。 
    2.在实现该功能的过程中是否有未知内容参与运算? 
    需要两个整数,被加数和加数是不确定的(参数列表 (int a,int b))。 
    代码:
    int add(int a,int b){ 
    return a+b; 
    }

2.7.4函数的重载

  • 定义:在同一个类中,允许存在一个以上的同名函数,只要他们的 参数个数或者 参数类型不同即可。
  • 重载的特点: 
    与函数的返回值类型无关,只和参数列表有关
  • 重载的好处: 
    方便于阅读,优化了程序设计。
  • 重载示例: 
    返回两个int型数的和 
    int add(int a,int b){ return a+b; } 
    返回两个double型数的和 
    double add(double a,double b){ return a+b; } //与第一个相比,参数类型 不同 
    返回三个int型数的和 
    int add(int a,int b,int c){ return a+b+c;} //与第一个相比,参数个数 不同哦,多了个参数c。

2.8数组

  • 数组的定义
  • 数组的内存分配及特点
  • 数组操作常见问题
  • 数组常见操作
  • 数组中的数组

2.8.1 数组的定义

概念:同一种类型数据的集合。其实数组就是一个容器。

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

格式1: 
元素类型[] 数组名 = new 元素类型[元素个数或数组长度]; 
示例:int[] arr = new int[5]; 
格式2: 
元素类型[] 数组名 = new 元素类型[]{元素,元素,……}; 

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

2.8.2数组的内存分配及特点

 int[] arr = new int[4];

1.arr引用 
new int[3],返回地址给arr引用。 
arr通过地址指向对应的实体数组的首地址。 

2.8.2.1内存结构

Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空 
间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内 
存管理方式。

  • 栈内存 
    用于存储局部变量,当数据使用完,所占空间会自动释放。
  • 堆内存 
    数组和对象,通过new建立的实例都存放在堆内存中。 
    每一个实体都有内存地址值。 
    实体中的变量都有默认初始化值。 
    实体不在被使用,会在不确定的时间内被垃圾回收器回收。
  • 方法区,本地方法区,寄存器

2.8.3数组操作常见问题

  • 数组脚标越界异常(ArrayIndexOutOfBoundsException)。 
    int[] arr = new int[2]; 
    System.out.println(arr[3]); 
    访问到了数组中的不存在的脚标时发生。
  • 空指针异常(NullPointerException) 
    int[] arr = null; 
    System.out.println(arr[0]); 
    arr 引用没有指向实体,却在操作实体中的元素时。

2.8.4数组常见操作

  • 获取最值(最大值和最小值)
  • 排序(选择排序,冒泡排序)
  • 查找(折半查找法)

获取最大值

方法一:交换数组中的具体数据实现

  
  
  1. public static int getMax(int[] arr){
  2. int max = arr[0]; //交换数组中的具体数据实现
  3. for(int i=1;i<arr.length;i++){
  4. if(arr[i]>max){
  5. max=arr[i];
  6. }
  7. }
  8. return max;
  9. }

方法二:交换数组的角标实现

  
  
  1. public static int getMaxByIndex(int[] arr){
  2. int max = 0; //交换数组的角标实现
  3. for(int i=1;i<arr.length;i++){
  4. if(arr[i]>arr[max]){
  5. max=i;
  6. }
  7. }
  8. return arr[max];
  9. }

获取最小值:

方法一:交换数组中的具体数据实现

  
  
  1. public static int getMin(int[] arr){
  2. int min = arr[0]; //交换数组中的具体数据实现
  3. for(int i=1;i<arr.length;i++){
  4. if(arr[i]<min){
  5. min=arr[i];
  6. }
  7. }
  8. return min;
  9. }

方法二:交换数组的角标实现

  
  
  1. public static int getMinByIndex(int[] arr){
  2. int min = 0; //交换数组的角标实现
  3. for(int i=1;i<arr.length;i++){
  4. if(arr[i]<arr[min]){
  5. min=i;
  6. }
  7. }
  8. return arr[min];
  9. }

2.8.5数组中的数组

二维数组 
格式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
  • 可以对这个三个一维数组分别进行初始化 
    arr[0] = new int[3]; 
    arr[1] = new int[1]; 
    arr[2] = new int[2]; 
    格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};
  • 定义一个名称为arr的二维数组
  • 二维数组中的有3个一维数组
  • 每一个一维数组中具体元素也都已初始化 
    第一个一维数组 arr[0] = {3,8,2}; 
    第二个一维数组 arr[1] = {2,7}; 
    第三个一维数组 arr[2] = {9,0,1,6}; 
    第三个一维数组的长度表示方式:arr[2].length;

代码练习:

ForFor示例

   
   
  1. /*
  2. 打印:
  3. ***
  4. ***
  5. ***
  6. ***
  7. ***
  8. */
  9. class ForForDemo{
  10. public static void main(String[] args){
  11. for(int x=0;x<5;x++){ //外循环--- 控制行数
  12. for(int y=0;y<3;y++){ //内循环-----控制列数
  13. System.out.print("*");
  14. }
  15. System.out.println();
  16. }
  17. }
  18. }

上三角 星型

——————————————————————————————————————————————————

   
   
  1. 上三角:
  2. *
  3. **
  4. ***
  5. ****
  6. *****
  7. 分析:一共有五行,外循环5次,内循环每次递增 且和行数一致,第一行一个* 第二行两个*
  8. for(int x=1;x<=5;x++){
  9. for(int y=1;y<=x;y++){//1-1 1-2 1-3 1-4 1-5
  10. System.out.print("*");
  11. }
  12. System.out.println();
  13. }

第二种方法:

   
   
  1. for(int x=1;x<=5;x++){
  2. for(int y=x;y>0;y--){ /* 1-1 2-1 3-1 4-1 5-1
  3. * y=1 1>0; * 0=y-- 0>0;
  4. y=2 2>0; * 1=y-- 1>0; * 0=y-- 0>0; */
  5. System.out.print("*");
  6. }
  7. System.out.println();
  8. }

下三角 星星

——————————————————————————————————————————————————————

   
   
  1. 下三角:
  2. *****
  3. ****
  4. ***
  5. **
  6. *
  7. for(int x=1;x<=5;x++){
  8. for(int y=x;y<=5;y++){//1-5 2-5 3-5 4-5 5-5
  9. System.out.print("*");
  10. }
  11. System.out.println();
  12. }

第二种:

   
   
  1. for(int x=1;x<=5;x++){
  2. for(int y=5;y>=x;y--){//5-1 5-2 5-3 5-4 5-5
  3. System.out.print("*");
  4. }
  5. System.out.println();
  6. }

——————————————————————————————————————————————————

99乘法表

99乘法表:
   
   
  1. 1*1=1
  2. 1*2=2 2*2=4
  3. 1*3=3 2*3=6 3*3=9
  4. 1*4=4 2*4=8 3*4=12 4*4=16
  5. 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
  6. 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
  7. 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
  8. 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
  9. 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

分析: 
从形式看,与上三角型相识,先打印上三角形,确定大概布局 
外循环分析:行数一共有9行,外循环要循环9次 
内循环分析:对第四行 每一列,被乘数都是从1开始递增到4(与行数相同?),乘数都是4(与行数相同)

所以形式是
for(i=1;i<=9;i++){ //控制外循环 9次
    for(y=1;y<=x;y++){ //内循环 上三角形式

    }
}

源代码:

   
   
  1. public class ForFor99{
  2. public static void main(String[] args){
  3. for(int x=1;x<=9;x++){
  4. for(int y=1;y<=x;y++){
  5. System.out.print(y+"*"+x+"="+y*x);
  6. System.out.print("\t");//制表符 严格按表格划分
  7. }
  8. System.out.println();//换行
  9. }
  10. }
  11. }

函数

需求1: 定义一个功能,完成两个整数的和的获取。

  • 明确一:这个功能的结果是什么? 
    结果是和,是int型。
  • 明确二:这个功能实现过程中是否需要未知内容参与运算? 
    有,被加数和加数。明确参数列表。
   
   
  1. public static int add(int a, int b){ //static 修饰符 使得此方法为静态方法,可以被其它静态方法调用。
  2. return a+b;
  3. }

需求2: 定义一个功能,画一个矩形在控制台。

  • 明确一:这个功能的结果是什么? 
    是一个矩形图案,无返回值,
  • 明确二:这个功能实现过程中是否需要未知内容参与运算? 
    有,矩形的长和宽,具体值不确定,(类型int型)
   
   
  1. public static void drawRectangle(int length,int width){
  2. for(int x=1;x<=width;x++){
  3. if(x==1||x==width){ //第一行和最后一行都是 ********* 中间没有空格
  4. for(int y=1;y<=length;y++){
  5. System.out.print("*");
  6. }
  7. }else{ //第一列和最后一列有星号,形式 * *
  8. for(int y=1;y<=length;y++){
  9. if(y==1||y==length)
  10. System.out.print("*");
  11. else
  12. System.out.print(" ");
  13. }
  14. }
  15. System.out.println();
  16. }
  17. }

需求3: 定义一个功能,比较两个数是否相等。

    明确一:这个功能的结果是什么?
                结果是true 或者false,是boolean类型
    明确二:这个功能实现过程中是否需要
   
   
  1. public static boolean equals(int a,int b){
  2. return a==b;
  3. }

需求4: 定义一个功能,获取两个整数中较大的那个数。

    明确一:这个功能的结果是什么?
                结果是 最大的数,是int型
    明确二:这个功能实现过程中是否需要未知内容参与运算?  
                有,两个比较的数。int型
   
   
  1. public static int getNumMax(int num1,int num2){
  2. return (num1>num2)?num1:num2;
  3. }

需求5:定义功能,打印99乘法表。

    明确一:这个功能的结果是什么?
                结果99乘法表,无返回值。
    明确二:这个功能实现过程中是否需要未知内容参与运算?
                可以不需要
   
   
  1. public static void multiTable99(){
  2. for(int x=1;x<=9;x++){
  3. for(int y=1;y<=x;y++){
  4. System.out.print(y+"*"+x+"="+y*x);
  5. System.out.print("\t");
  6. }
  7. System.out.println();
  8. }
  9. }

需求6:根据考试成绩获取学生分数对应的等级

    90~100     A
    80~89      B
    70~79      C
    60~69      D
    60以下        E
    明确一:这个功能的结果是什么?
                结果是 等级 ,字符型
    明确二:这个功能实现过程中是否需要未知内容参与运算?
                有,学生分数
   
   
  1. public static char getRank(int grades){
  2. char level;
  3. /*if(grades>=90&&grades<=100){
  4. level='A';
  5. }else if(grades>=80&&grades<=89){
  6. level='B';
  7. }else if(grades>=70&&grades<=79){
  8. level='C';
  9. }else if(grades>=60&&grades<=69){
  10. level='D';
  11. }else
  12. level='E'; */
  13. //使用switch实现
  14. switch(grades/10){
  15. case 9:
  16. level='A';
  17. break;
  18. case 8:
  19. level='B';
  20. break;
  21. case 7:
  22. level='C';
  23. break;
  24. case 6:
  25. level='D';
  26. break;
  27. default:
  28. level='E';
  29. break;
  30. }
  31. return level;
  32. }

——————————————————————————————————————————————————

数组

数组最值(最大值,最小值)

最大值:

   
   
  1. public static int getMax(int[] arr){
  2. int max = arr[0]; //交换数组中的具体数据实现
  3. for(int i=1;i<arr.length;i++){
  4. if(arr[i]>max){
  5. max=arr[i];
  6. }
  7. }
  8. return max;
  9. }

最小值

   
   
  1. public static int getMin(int[] arr){
  2. int min = arr[0]; //交换数组中的具体数据实现
  3. for(int i=1;i<arr.length;i++){
  4. if(arr[i]<min){
  5. min=arr[i];
  6. }
  7. }
  8. return min;
  9. }

1选择排序

思路; 
1.第一次外循环,先取第一个数 分别和之后的数比较,如果后面的数比第一个数大,就把数大的数值赋给第一个,以此类推。 
2.第二次外循环,取第二个数,分别和之后的数比较,如果后面的数比第一个数大,就把数大的数值赋给第一个,以此类推。 
3.。。。。。。。。。。 
4.直到取到最后一个数,结束循环。 
*/

   
   
  1. public static void selecSortaA(int[] arr){ //从小到大排序
  2. for(int x=0;x<arr.length;x++){
  3. for(int y=x+1;y<arr.length;y++){
  4. if(arr[x]>arr[y]){
  5. int temp=arr[x];
  6. arr[x]=arr[y];
  7. arr[y]=temp;
  8. }
  9. }
  10. }
  11. }

2冒泡排序

每一轮比较以后最大的数沉到底面(最后),因此,下一轮比较排除该数,体现在内循环减一。

   
   
  1. public static void bubbleSort(int[] arr){
  2. for(int x=0;x<arr.length-1;x++){
  3. for(int y=0;y<arr.length-1-x;y++){
  4. if(arr[y]>arr[y+1]){
  5. //swap(arr,y,y+1);
  6. int temp=arr[y];
  7. arr[y]=arr[y+1];
  8. arr[y+1]=temp;
  9. }
  10. }
  11. }
  12. }

折半查找(二分查找)

   
   
  1. public static int binarySearch_2(int[] arr,int key){
  2. int mid,min,max;
  3. min=0;
  4. max=arr.length-1;
  5. while(min<max){//如果遍历完整个数组,结束循环
  6. mid=(min+max)/2;
  7. if(key>arr[mid])
  8. min=mid+1;
  9. else if(key<arr[mid])
  10. max=mid-1;
  11. else //此时key==arr[mid]
  12. return mid;
  13. }
  14. return -1;
  15. }

一个整数如何转换为16进制数

转换的数存储在数组中

   
   
  1. public static char[] decToHex2(int num){
  2. char[] tab ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//表
  3. char[] arr = new char[8];
  4. int pos=arr.length;
  5. while(num!=0){
  6. int i = num&15;
  7. arr[--pos]=tab[i];
  8. num=num>>>4;
  9. }
  10. return arr; //返回引用
  11. }

转换的数存储在字符串中

   
   
  1. public static String decToHex(int num){
  2. char[] tab ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//表
  3. String str="";
  4. char temp =0; //临时存储0到F字符
  5. while(num!=0){
  6. /*与1111(15)相与获得 4位二进制数,相当于一位1
  7. 6进制数,通过此数,去表里查
  8. 询对应的字符比如0对应0 10对应A
  9. */
  10. int i =num&15;
  11. temp = tab[i];
  12. str = str+temp;//将字符连接
  13. num=num>>>4; //右移4位
  14. }
  15. return reverse(str);
  16. }
  17. public static String reverse(String str){ //字符串反转
  18. return new StringBuilder(str).reverse().toString();
  19. }

进制转换

   
   
  1. public static char[] toHex(int num){//十进制转十六进制
  2. return binary(num,15,4);//与1111相与,每次获取为4位二进制数
  3. }
  4. public static char[] toOct(int num){//十进制转八进制
  5. return binary(num,7,3);//与111相与,每次获取为3位二进制数
  6. }
  7. public static char[] toBin(int num){//十进制转二进制
  8. return binary(num,1,1);//与1相与,每次获取为1位二进制数
  9. }
  10. public static char[] binary(int num,int base,int offect){//数,进制 ,位操作偏移量
  11. char[] hextab ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//进制表
  12. char[] temp= new char[32];
  13. int pos=temp.length;
  14. while(num!=0){
  15. int x=num&base;
  16. temp[--pos]=hextab[x];//与b1111相与 获取4位二进制数,也即时是一位16进制数
  17. num=num>>>offect; //右移offect位
  18. }
  19. return temp;
  20. }

二维数组

   
   
  1. /**
  2. 二维数组
  3. */
  4. public class TwoArrayDemo{
  5. public static void main(String[] args){
  6. int[][] arr = new int[3][2];//定义一个二维数组,数组中有3个一维数组,每个一维数组有2个int型的元素
  7. System.out.println(arr[0]);//
  8. int[][] arr1 = new int[3][];
  9. System.out.println(arr1[0]);//null
  10. int[] arr3 =new int[3];
  11. System.out.println(arr3[0]);//0
  12. }
  13. }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值