今日内容

断点调试

知识点复写

一、断点调试

1.作用

断点调试,让我们看到程序的执行过程,同时能够看到变量的变化情况
帮助我们排查程序中的错误

2.步骤

打断点:
    在代码编辑区域最左边【双击】,打断点
Debug运行:
    方法1:点击绿色小虫子
    方法2:右键-->Debug As-->Java Application
    程序会从上往下执行,当执行到断点处时,会停下来
单行执行:
    点击工具栏向下的小箭头(下面有一个横杠)    
进入到方法中执行:
    点击工具栏向下的小箭头(下面有两个横杠)

下面准备了两个案例,我们试着用Debug调试一下,掌握Debug调试的步骤

Debug案例1:

//基本类型作为参数
public static void show(int a){
    a=a+1;
}

//引用类型作为参数
public static void show(int[] arr){
    arr[0]+=1;
}

Debug案例2:

/*
    分析以下需求,并用代码实现(循环,if):
    (1)打印1到100之内的整数,但数字中包含9的要跳过
    (2)每行输出5个满足条件的数,之间用空格分隔
    (3)如:1 2 3 4 5 
 */
public static void function3(){ 
    int count=0;    
    for(int i=1;i<100;i++){
        if(!(i%10==9||i/10%10==9)){
            System.out.print(i+" ");
            count++;        
        }

        if(count%5==0){
            System.out.println("");
        }
    }
}

/*
    执行结果如下:在38和40之间多了一个空行
    .....省略......
    34 35 36 37 38 

    40 41 42 43 44 
    .....省略......
*/

二、前面知识点复写

1. 打印输出所有的回文数

/*
    需求:在控制台输出所有满足条件的5位数
        条件:个位==万位,十位==千位
*/
public static void main(String[] args){
    //5位数告诉了我们数据的范围,用for循环实现
    for(int x=10000; x<100000; x++) {
        //拿到每一个5位数后,获取其个位,十位,千位,万位的数据
        int ge = x%10;
        int shi = x/10%10;
        int qian = x/10/10/10%10;
        int wan = x/10/10/10/10%10;

        //根据条件进行判断,把满足条件的数据输出即可
        if((ge == wan) && (shi == qian)) {
            System.out.println(x);
        }
    }
}

2.按要求写代码

/*
    定义一个int类型的一维数组,内容{171,72,19,16,118,51,210,7,18}
    求出该数组中满足要求的元素和。
        要求:元素的个位和十位不能包含7,并且只能为偶数。
*/
public static void main(String[] args) {
    //定义一个int类型的一维数组
    int[] arr = {171,72,19,16,118,51,210,7,18};

    //定义一个求和变量
    int sum = 0;

    //遍历数组,获取数组中的每一个元素
    for(int x=0; x<arr.length; x++) {
        //判断该元素是否满足条件,如果满足条件就累加
        if((arr[x]%10 != 7) && (arr[x]/10%10 != 7) && (arr[x]%2 == 0)) {
            sum += arr[x];
        }
    }

    //输出求和结果
    System.out.println("sum:"+sum);
}

3.不死神兔问题

/*
    斐波那契提出一个假设:
        有一对兔子,从出生后第3个月起每个月都生一对兔子,
        小兔子长到第三个月后每个月又生一对兔子,
        假如兔子都不死,问第二十个月的兔子对数为多少? 

    不死神兔问题,演化过来其实就是一个数学问题(不要再关注兔子了),如下:
    //找出下面数列的规律
    1,1,2,3,5,8,13,21,34....

    规律:
        第一个数是   1
        第二个数是   1
        从第3个数开始 这个数=前1个数+前2个数

    用Java代码去表示这些数
        //不止一个数,所以可以采用数组来存储,假设有20个数
        int[] arr=new int[20];
        //第一个数是 1
        arr[0]=1;
        //第二个数是 1
        arr[1]=1;
        //从第3个数开始 这个数=前1个数+前2个数
        arr[2]=arr[1]+arr[0];
        arr[3]=arr[2]+arr[1];
        ...
        arr[n]=arr[n-1]+arr[n-2];   

*/
public static void main(String[] args) {
    //不止一个数,所以可以采用数组来存储,假设有20个数
    int[] arr = new int[20];
    //第一个数和第二个数,都是1
    arr[0] = 1;
    arr[1] = 1;
    //从第3个数开始 这个数=前1个数+前2个数
    for(int x=2; x<arr.length; x++) {
        arr[x] = arr[x-1] + arr[x-2];
    }
    //输出结果
    System.out.println("第二十个数为:"+arr[19]);
}

4.评委打分问题

/*
    在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。
    选手的最后得分为:去掉一个最高分和一个最低分后 的4个评委平均值。
    请写代码实现。(不考虑小数部分)

    分析:
        A:定义一个长度为6的数组
        B:键盘录入评委的分数
        C:写方法实现获取最高分,最低分
        D:写方法求评委的分数和
        E:平均分:(和-最高分-最低分)/(arr.length-2)
        F:输出平均分即可
*/
public static void main(String[] args) {
    //定义一个长度为6的数组
    int[] arr = new int[6];
    //创建键盘录入对象
    Scanner sc = new Scanner(System.in);
    //键盘录入评委的分数
    for(int x=0; x<arr.length; x++) {
        //接收数据
        System.out.println("请输入第"+(x+1)+"个评委给出的分数(0-100):");
        int score = sc.nextInt();
        arr[x] = score;
    }
    //写方法实现获取最高分,最低分
    //调用方法
    int max = getMax(arr);
    int min = getMin(arr);
    //写方法求评委的分数和
    int sum = sum(arr);
    //平均分:(和-最高分-最低分)/(arr.length-2)
    int avg = (sum-max-min)/(arr.length-2);
    //输出平均分即可
    System.out.println("该选手的最终得分是:"+avg);
}

//求数组元素的和
public static int sum(int[] arr) {
    //定义求和变量
    int sum = 0;

    for(int x=0; x<arr.length; x++) {
        sum += arr[x];
    }
    return sum;
}

//求数组中元素的最小
public static int getMin(int[] arr) {
    //定义参照物
    int min = arr[0];

    for(int x=1; x<arr.length; x++) {
        if(arr[x] < min) {
            min = arr[x];
        }
    }

    return min;
}

//求数组中元素的最大值
public static int getMax(int[] arr) {
    //定义参照物
    int max = arr[0];

    for(int x=1; x<arr.length; x++) {
        if(arr[x] > max) {
            max = arr[x];
        }
    }

    return max;
}

5.数组元素反转

public static void main(String[] args) {
    //定义一个长度为5的数组
    int[] arr = new int[5];
    //通过键盘录入数据给数组中的元素赋值
    Scanner sc = new Scanner(System.in);
    for(int x=0; x<arr.length; x++) {
        System.out.println("请输入"+(x+1)+"个元素值:");
        int number = sc.nextInt();
        arr[x] = number;
    }
    //反转前
    printArray(arr);
    //定义方法将arr数组中的内容反转
    reverse(arr);
    //定义方法对反转后的数组进行遍历
    printArray(arr);
}

//把指定数组中的元素反转
public static void reverse(int[] arr) {
	for(int start=0,end=arr.length-1;start<=end;start++,end--){
		//start和end索引位置的元素互换
		int temp=arr[start];
		arr[start]=arr[end];
		arr[end]=temp;
	}
}
//遍历数组
public static void printArray(int[] arr) {
    System.out.print("[");
    for(int x=0; x<arr.length; x++) {
        if(x==arr.length-1) {
            System.out.println(arr[x]+"]");
        }else {
            System.out.print(arr[x]+", ");
        }
    }
}

6.数组元素查找

/*
    查找指定元素再数组中第一次出现的索引
    参数解释
        arr[] arr  指定的数组
        int value  要查找的元素
    返回值解释
        int类型 
        返回value这个元素在arr数组中第一次出现的索引,如果没有找到返回-1

*/
public static int getIndex(int[] arr,int value) {
    //遍历数组,依次比较元素,如果相等,就把该处的索引返回即可
    for(int x=0; x<arr.length; x++) {
        if(arr[x] == value) {
            return x;
        }
    }
    return -1;
}