JAVA模块六------ 综合案例基础巩固
- 1 逢7跳过
- 2 数组元素求和
- 3 判断两个数组的内容是否相同
- 4 查找某个数组元素索引
- 5 数组元素反转输出:(逆序输出)
- 6 评委打分
- 7 随机产生验证码
- 其他:
- 方法抽取:
 
1 逢7跳过
要求:
数字包含7或者是7的倍数的,跳过
控制台打印1-100满足的数字
my:
 
百位的判断是不必要的:百位最高是1
 continue也不必要:continue语句后没有其他语句了,会自动进行下次循环判断,可以省略
修改后:
 
2 数组元素求和
题目要求
my:
 
 缺点:只针对该数组的方法,局限性过强(不具有普适性)
使用方法传参(传址)后:
 
3 判断两个数组的内容是否相同
题目要求

输出结果是:true
4 查找某个数组元素索引
题目要求:
我的:
 
优化后(前提假设,找到后break,后面不再进行遍历):
 
但是,如果元素在数组中多次出现:
注意:return只能返回一个结果数据,需要返回多个结果怎么办
可以将多个结果存放在一个数组容器当中,将这个数组返回去
那么这个用于存放结果的数组使用哪种初始化
(1)静态初始化:需要知道存放的内容,显然不可能
(2)动态初始化需要知道数组的长度(元素个数):
可以定义一个计数器,对数组中的元素进行遍历
 
完整代码:
public class FindSuoyin {
    public static void main(String[] args) {
        int[] arr={19,28,37,46,50,19,19};
        //          0  1  2  3  4  5  6
        int[] results=findSuoyin(19,arr);
        if(results.length==0){
            System.out.println("你要查找的数字在该数组中不存在");
        }else{
            for (int i = 0; i < arr.length; i++) {
                System.out.println(results[i]);
            }
        }
    }
//    查找索引位置
    public static int[] findSuoyin(int number,int[] arr){
//      1 先统计要查找的元素,在数组中出现的个数
        int count=0;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]==number)
                count++;
        }
//      2 根据统计的个数动态初始化数组
        int[] results=new int[count];
//      3 查找并且存储要找元素的索引值
        int index=0;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]==number){
             results[index]=i;
             index++;
            }
        }
//       整个结束之后,result数组中存放的就是要找的数字的全部索引值
//       将这个数组返回
        return results;
    }
}
5 数组元素反转输出:(逆序输出)
题目要求
我的:

思路:首尾互换
 
数组长度为5,需要交换2次(5/2=2)
数组长度为6(偶数次),需要交换3次(6/2=3)
交换的动作重复执行:可以使用循环(循环条件为i<arr.length)
实现方法1:
public class Test5 {
   /*
       已知一个数组arr为{11,22,33,44,55,}
       交换后{55,44,33,22,11}
       1 确定好谁跟谁换:
           第一个和倒数第一个
           第二个和倒数第二个
           第三个和倒数第三个
           arr[i]和arr[arr.length-1-i]
   */
   public static void main(String[] args) {
       int[] arr={11,22,33,44,55};
       for (int i = 0; i < arr.length / 2; i++) {
           int temp=arr[i];
           arr[i]=arr[arr.length-1-i];
           arr[arr.length-1-i]=temp;
       }
       for (int i = 0; i < arr.length; i++) {
           System.out.println(arr[i]);
       }
   }
}
方法二:
设置两个指针:其中一个指向首元素,另一个指向最后一个元素
 
指针所指向的位置就进行交换动作,交换之后,两指针分别都向中间移动
思路步骤:
1 定义两个变量,模拟开始和结束两个指针
2 交换
3 每一次交换完成,指针向中间移动(只要首地址所指向的位置<=尾地址所指向的位置就继续移动)
public static void main(String[] args) {
    int[] arr={11,22,33,44,55};
    //模拟首尾两个指针
    int start=0,end=arr.length-1;
    //交换动作
    for(;start<end;start++,end--){
        int temp=arr[start];
        arr[start]=arr[end];
        arr[end]=temp;
    }
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
    }
}
6 评委打分
题目要求:
思路:
 1 键盘录入这六个数据(读取)
2 求和,找到最大值,最小值,并减去
3 除法求平均值
初始代码:有bug
public static void main(String[] args) {
    int[] arr=new int[6];
    //1 键盘录入,召唤精灵
    Scanner sc=new Scanner(System.in);
    System.out.println("请输入六个打分:");
    //键盘录入6个数组中于数组中
    for (int i = 0; i < arr.length; i++) {
        System.out.println("请输入第"+(i+1)+"位评委的打分:");
        arr[i]= sc.nextInt();
    }
    //2 求和
    int sum=0;
    for (int i = 0; i < arr.length; i++) {
        sum+=arr[i];
    }
    //3 找最大值
    int max=arr[0];
    for (int i = 1; i < arr.length; i++) {
        if(arr[i]>max)
            max=arr[i];
    }
    //4 找最小值
    int min=arr[0];
    for (int i = 1; i < arr.length; i++) {
        if(arr[i]<min)
            min=arr[i];
    }
    //5 求平均分=(总和-最大值-最小值)/4
    double aver=(sum-max-min)/((arr.length-2)*1.0);
    System.out.println("选手的最终得分为"+aver);
}
精进后:防止录入过大或者负数(分数校验)
public static void main(String[] args) {
    int[] arr=new int[6];
    //1 键盘录入,召唤精灵
    Scanner sc=new Scanner(System.in);
    System.out.println("请输入六个打分:");
    //键盘录入6个数组中于数组中
    for (int i = 0; i < arr.length; i++) {
        System.out.println("请输入第" + (i + 1) + "位评委的打分:");
        int score = sc.nextInt();
        if (score > 0 && score < 100) {
            arr[i] = score;
        } else {
            System.out.println("您的输入有误,请重新输入:");
            i--;
        }
    }
    //求和
    int sum=0;
    for (int i = 0; i < arr.length; i++) {
        sum+=arr[i];
    }
    //3 找最大值
    int max=arr[0];
    for (int i = 1; i < arr.length; i++) {
        if(arr[i]>max)
            max=arr[i];
    }
    //4 找最小值
    int min=arr[0];
    for (int i = 1; i < arr.length; i++) {
        if(arr[i]<min)
            min=arr[i];
    }
    //5 求平均分=(总和-最大值-最小值)/4
    double aver=(sum-max-min)/((arr.length-2)*1.0);
    System.out.println("选手的最终得分为"+aver);
}
再次精进:将各个逻辑放到独立的方法当中去(方法抽取)
public static void main(String[] args) {
    //1 初始化数组
    int[] arr = initDate();
    //2 求和
    int sum = getSum(arr);
    //3 找最大值
    int max = getMax(arr);
    //4 找最小值
    int min = getMin(arr);
    //5 求平均分=(总和-最大值-最小值)/4
    double aver=(sum-max-min)/((arr.length-2)*1.0);
    System.out.println("选手的最终得分为"+aver);
}
private static int getMin(int[] arr) {
    int min= arr[0];
    for (int i = 1; i < arr.length; i++) {
        if(arr[i]<min)
            min= arr[i];
    }
    return min;
}
private static int getMax(int[] arr) {
    int max= arr[0];
    for (int i = 1; i < arr.length; i++) {
        if(arr[i]>max)
            max= arr[i];
    }
    return max;
}
private static int getSum(int[] arr) {
    int sum=0;
    for (int i = 0; i < arr.length; i++) {
        sum+= arr[i];
    }
    return sum;
}
private static int[] initDate() {
    int[] arr=new int[6];
    //1 键盘录入,召唤精灵
    Scanner sc=new Scanner(System.in);
    System.out.println("请输入六个打分:");
    //键盘录入6个数组中于数组中
    for (int i = 0; i < arr.length; i++) {
        System.out.println("请输入第" + (i + 1) + "位评委的打分:");
        int score = sc.nextInt();
        if (score > 0 && score < 100) {
            arr[i] = score;
        } else {
            System.out.println("您的输入有误,请重新输入:");
            i--;
        }
    }
    return arr;
}
7 随机产生验证码
题目要求
思路:考虑从数组中随机取出元素
代码实现
public static void main(String[] args) {
    String[] sArr={"noodles","rice","soup"};
                    //0        1       2
    Random r=new Random();
    int i=r.nextInt(sArr.length);//i读取的随机数的范围是0-5但不包含5
    //将随机数当作索引去数组中获取对应的元素
    System.out.println(i);
    System.out.println(sArr[i]);
}
可以用于制作自己吃什么饭,抽奖等…
问题实现:
思路:
1 随机生成验证码
2 将生成的验证码拼接到一个字符串上
3 键盘录入用户输入的字符串
4 和随机生成的字符串进行比较
public static void main(String[] args) {
        char[] chs={
                'a','b','c','d','e',
                'A','B','C','D','R',
                '1','4','8'
        };
        Random r=new Random();
        String checkCode="";
        //产生5个随机字符组成的验证码
        for(int i=1;i<=5;i++){
            int index=r.nextInt(chs.length);
            checkCode+=chs[index];
        }
        System.out.println("产生的验证码为"+checkCode);
        //校验验证码
        System.out.println("请输入验证码");
        Scanner sc=new Scanner(System.in);
        //字符串变量来接收用户键盘录入的验证码
        String inputCode=sc.next();
        //将用户输入和随机生成的验证码进行比对
//        if(checkCode==inputCode){
//
//        }
    }
代码优化:
1 数组进行动态初始化
注意:打印字符数组数组名,输出的结果是字符数组的内容,不是地址(源代码会对字符串进行遍历输出)
2 将模块化的逻辑抽取为方法
public static void main(String[] args) {
        char[] chs = getConents();
        String checkCode = getCheckCode(chs);
        System.out.println("产生的验证码为"+checkCode);
        //校验验证码
        System.out.println("请输入验证码");
        Scanner sc=new Scanner(System.in);
        //字符串变量来接收用户键盘录入的验证码
        String inputCode=sc.next();
        //将用户输入和随机生成的验证码进行比对
//        if(checkCode==inputCode){
//
//        }
    }
    private static String getCheckCode(char[] chs) {
        Random r=new Random();
        String checkCode="";
        //产生5个随机字符组成的验证码
        for(int i=1;i<=5;i++){
            int index=r.nextInt(chs.length);
            checkCode+= chs[index];
        }
        return checkCode;
    }
    private static char[] getConents() {
        char[] chs=new char[26+26+10];
        int index=0;
//        使用循环将数组动态初始化
        for(char c='a';c<='z';c++) {
            chs[index]=c;
            index++;
        }
        System.out.println();
        for(char c='A';c<='Z';c++){
            chs[index]=c;
            index++;
        }
        for(char c='0';c<='9';c++){
            chs[index]=c;
            index++;
        }
        return chs;
    }
其他:
方法抽取:
抽取某段逻辑为独立的方法快捷键:ctrl+alt+m

























