Java综合练习

需求1:机票价格按照淡季旺季、头等舱和经济舱收费;输入机票原价、月份和头等舱或经济舱。
按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来年4月)头等舱7折,经济舱6.5折。

(关于这道题的代码,没有什么难度,只是对if语句不熟练,复习一下就回忆起来了,不是重点)

代码如下:

import java.util.Scanner;

public class TestDemo1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入机票的价格:");
        int ticket = scanner.nextInt();
        System.out.println("请输入当前的月份:");
        int month = scanner.nextInt();
        System.out.println("请机票的舱位:0 经济舱;1 头等舱");
        int seat = scanner.nextInt();
        System.out.println(price(ticket,month,seat));
    }
    static int price(int ticket,int month,int seat){
       if(month >= 5 && month <= 10){
           //旺季
           ticket = getTicket(seat, ticket, 0.85, 0.9);

       } else if((month >= 1 && month <= 4)  || (month >= 11 && month <= 12)) {
           //淡季
           ticket = getTicket(seat, ticket, 0.65, 0.7);
       }
       return ticket;
    }

    private static int getTicket(int seat, int ticket, double x, double x1) {
        if (seat == 0) {
            ticket = (int) (ticket * x);
        }
        if (seat == 1) {
            ticket = (int) (ticket * x1);
        }
        return ticket;
    }
}

回忆以前的知识点。

一、如何键盘录入?

1、创建一个Scanner对象;

2、然后通过对象调用nextInt()方法。

二、分支语句
(1)if语句

1、第一种格式:只有一个条件,只关注满足条件时要做什么。

if(条件表达式){
    语句体;
}

注意点:

如果语句体只有一行代码,则if后面的大括号可以省略,但是不建议这样做。

2、第二种格式:只有一个条件,关注两点,即满足条件和不满足条件时各自要做什么!

if(条件表达式){
    语句体;
}
else{
    语句体;
}

3、第三种格式:多条件判断,一般是判断一个值属于众多条件表达式中的哪一个。关注满足条件时要做什么,不满足条件时进入到下一个条件的判断。

if(条件表达式1){
    语句体1;
}
else if(条件表达式2){
    语句体2;
}
...

自己总结就是,else的后面可以是第一种格式,也可以是第二种格式。

(2)switch语句

多条件判断时用if语句很麻烦,这里就出现了switch。

基本格式:

switch(条件表达式){
    case 值1:
        语句体1;
        break;
    case 值2:
        语句体2;
        break;
        ...
    default:
        语句体n;
        break;
}

有一个疑问就是case后面的语句体要用大括号括起来吗?

1、关于default的位置以及default是否可以省略?

关于default的位置:default也可以放在case语句的前面,放在哪里都可以,不一定要放在最后的位置。

关于default是否可以省略:答案是可以,语法没有错误,但是当switch中条件表达式的值与case中的所有值都不匹配时会没有输出,这种情况不好,容易让人摸不着头脑,为了避免这种情况一般都加上default。

2、case穿透

因为case语句中没有写break,无法跳出switch,会继续执行所有的case语句中的语句体,直到方法结束或者遇到break。利用这一特性我们可以少写一些代码。

3、JDK12的switch新特性:简化switch的书写

具体怎么简化的呢?

①将冒号:改为->

②省略break,然后将语句体用大括号括起来,而且如果语句体只有一句,那大括号也可以省略。

有一个问题,就是我发现总是可以这样省略大括号,但是到了后面我根本就记不得什么时候可以省,什么时候不可以省。很烦。或者这样想,如果语句体只有一句那么大括号自然可以省略。

switch(条件表达式){
    case 值1 -> {
        语句体1;
    }
    case 值2 -> {
        语句体2;
    }
        ...
    default -> {
        语句体3;
    }
}

//语句体只有一句时省略大括号
switch(条件表达式){
    case 值1 -> 语句体1;
    case 值2 -> 语句体2;
        ...
    default -> 语句体3;
    }
}

4、if的第三种格式和switch分别什么时候使用呢?

判断一个变量属于众多条件中的哪一个。

if一般是判断变量是否属于某个范围,而switch则一般是判断变量是哪个值。

复习了switch以后新写的代码,感觉也不是很简洁。

import java.util.Scanner;

public class TestDemo2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入机票的价格:");
        int ticket = scanner.nextInt();
        System.out.println("请输入当前的月份:");
        int month = scanner.nextInt();
        System.out.println("请输入机票的舱位:0 经济舱;1 头等舱");
        int seat = scanner.nextInt();
        System.out.println(price(ticket,month,seat));
    }
    static int price(int ticket,int month,int seat){
        switch (month){
            case 1:
            case 2:
            case 3:
            case 4:
                ticket = getTicket(seat,ticket,0.65,0.7);
                break;
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:
            case 10:
                ticket = getTicket(seat,ticket,0.85,0.9);
                break;
            case 11:
            case 12:
                ticket = getTicket(seat,ticket,0.65,0.7);
                break;
        }
        return ticket;
    }
    private static int getTicket(int seat, int ticket, double x, double x1) {
        if (seat == 0) {
            ticket = (int) (ticket * x);
        }
        if (seat == 1) {
            ticket = (int) (ticket * x1);
        }
        return ticket;
    }
}

在这个例子中将if和switch进行比较,发现还是if比较方便。

IDEA中有一个快捷键:crtl+alt+M,抽取代码使其称为一个方法。

需求2:找出100-200之间的所有素数。

(这道题找素数更没什么好说的了,只不过额外将判断一个数是否为素数抽取为一个方法,然后遍历100-200中的每个数调用此方法进行判断就好了)

public class TestDemo3 {
    //如何判断1个数是否为素数,将其抽取为方法
    //循环100-200,调用此方法
    public static void main(String[] args) {
        for (int i = 100; i <= 200 ; i++) {
            if(isPrime(i)){
                System.out.println(i);
            }
        }
    }
    static boolean isPrime(int num){
        boolean flag = true;
        for (int i = 2; i < num; i++) {
            if (num % i == 0) {
                flag = false;
            }
        }
        return flag;
    }
}

这里我写的少了一点,就是当存在可以整除的因子时就可以判断出这个数不是素数了,应该立即跳出循环,所以可以加上break,结束循环,代码如下。

public class TestDemo3 {
    //如何判断1个数是否为素数,将其抽取为方法
    //循环100-200,调用此方法
    public static void main(String[] args) {
        for (int i = 100; i <= 200 ; i++) {
            if(isPrime(i)){
                System.out.println(i);
            }
        }
    }
    static boolean isPrime(int num){
        boolean flag = true;
        for (int i = 2; i < num; i++) {
            if (num % i == 0) {
                flag = false;
                break;
            }
        }
        return flag;
    }
}

需求3:定义方法实现随机产生一个5位的验证码
验证码格式:
长度为5
前四位是大写字母或者小写字母
最后一位是数字

(看到这个题目时我是没有一点想法的,因为把如何使用随机数也给忘记了,所以看视频讲解,重点在如何把52个大小写英文字母给放到数组中,为何能放是因为英文字母和数字是由对应关系的)

将52个大小写的英文字母放到数组中,然后随机抽取。

public class TestDemo4 {
    public static void main(String[] args) {
        char[] chars = new char[52];
        for (int i = 0; i < 52; i++) {
            if(i < 26) {
                chars[i] = (char) (65 + i);
            }
            else {
                chars[i] = (char) (97 + i - 26);
            }
        }
        String s = "";
        Random r = new Random();
        for (int i = 0; i < 5; i++) {
            if(i < 4){
                int num = r.nextInt(chars.length);
                s = s + chars[num];
            }
            else {
                int num = r.nextInt(10);
                s = s + num;
            }
        }
        System.out.println(s);
    }

}
 三、如何产生随机数?

1、创建一个Random对象

2、调用nextInt(L)方法并传入一个参数,此参数表示产生的随机数的范围是[0,L-1]。

需求4:复制一个数组中的数到新数组中

(这个更没啥好说的)

public class TestDemo5 {
    public static void main(String[] args) {
        int[] arr1 = {11,22,33,44,55};
        int[] arr2 = new int[arr1.length];
        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr2[i]);
        }
    }
}

 需求5:在唱歌比赛中,有6名评委给选手打分,分数范围是[0-100]之间的整数。选手的最后得分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分。

(我只关注了如何计算选手的得分,但是视频对题目提出了另外一个要求:就是要键盘录入评委的打分,而我是直接利用数组给出的,这里我并没有很重视,只关注不合法时给出提示,其实是要重新输入的。

而且我们求解的思路也不太一样,我是记录了最大值和最小值的下标,然后求和的时候不加上这两个值,视频里是获取最大值和最小值,然后将所有数加到一起求和之后再减去最大值和最小值。)

public class TestDemo6 {
    public static void main(String[] args) {
        int[] arr = {98,78,89,86,95,67};
        int max = 0, min = 0, max_index = 0, min_index= 0;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] > max){
                max_index = i;
            }
            if(arr[i] < min){
                min_index = i;
            }
        }
        int sum = 0, average = 0;
        for (int i = 0; i < arr.length; i++) {
            if((i != max_index) && (i != min_index)) {
                sum = sum + arr[i];
            }
        }
        average = sum/(arr.length - 2);
        System.out.println(average);
    }
}

我这里还有一个错误就是找最小值的时候,这里我将min初始化为0,那么6位评委的评分按理说是不会比0小的,所以min的值始终为0,是错误的,这里我们将min的值初始化为数组中0索引处的值。

import java.util.Scanner;

public class TestDemo7 {
    public static void main(String[] args) {
        //录入6为评委的评分
        Scanner scanner = new Scanner(System.in);
        int[] score = new int[6];
        for (int i = 0; i < 6;) {
            System.out.println("请输入第" + (i+1) + "个评委打分:");
            if(score[i] < 0 || score[i] >100){
                System.out.println("您输入的数据不合法!");
            }
            else {
                score[i] = scanner.nextInt();
                i++;
            }
        }
        System.out.println(getAverage(score));
    }
    public static int getMax(int[] arr){
        int max = 0;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] > max){
                max = arr[i];
            }
        }
        return max;
    }
    public 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;
    }
    public static int getAverage(int[] arr){
        int sum = 0, average = 0;
        for (int i = 0; i < arr.length; i++) {
            sum = sum + arr[i];
        }
        average = (sum - getMax(arr) - getMin(arr))/ (arr.length - 2);
        return average;
    }
}

 这里方法的定义和调用有些混乱吧,不是那么清晰。

四、获取一组数中的最小值

这个之所以加到上面是因为我写错了,以防后面再写错,加深一下印象。

public 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;
}

需求6:某系统的数字密码(大于0),比如1983,采用加密方式进行传输。
规则如下:
先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数。
 

public class TestDemo8 {
    public static void main(String[] args) {
        int num = 1983;
        int x = 0;
        int newNum = 0;
        while (num != 0) {
            //先得到每位数
            x = num % 10;
            //每位数加上5然后再对10求余
            x = (x + 5) % 10;
            //为得到下一个做准备
            num = num / 10;
            //进行反转
            newNum = newNum * 10 + x;
            System.out.println(newNum);
        }
        //System.out.println(newNum);
    }
}

刚开始反转不会写,后面看了视频抄的才写出来:newNum = newNum * 10 + x;

五、如何将一个数中的每位数按序存到数组当中去?

有两点需要注意:

1、首先要创建一个数组,但是创建一个数组需要给出数组的长度,所以要有一个方法知道一个数有几位。

2、得到一个数的每位数一般是从个位数开始的,然后将个位数1放到数组中的最后一位,即从后往前方。 

import java.util.Scanner;

public class TestDemo9 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个数字:");
        int num = sc.nextInt();
        int[] newArr = reverseArray(num);
        for (int i = 0; i < newArr.length; i++) {
            System.out.print(newArr[i]);
        }
    }
    //计算一个数的位数
    static int numberOfDigits(int num){
        int temp = num;
        int k = 0;
        while(temp != 0){
            temp = temp / 10;
            k++;
        }
        return k;
    }
    //将一个数的每位数正序存放到数组中
    static int[] numberToArray(int num){
        int k = numberOfDigits(num);
        int[] arr = new int[k];
        int i = arr.length - 1;
        while(num != 0){
            int x = num % 10;
            arr[i] = x;
            i--;
            num = num / 10;
        }
        return arr;
    }
    //将数组逆序,如7856,逆序为6587
    static int[] reverseArray(int num){
        int[] arr = numberToArray(num);
        int temp = 0;
        for (int i = 0,j = arr.length - 1; i < j; i++,j--) {
            temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
        }
        return arr;
    }
}
六、while语句

 关于while循环,我总是存在一个问题,就是习惯自己去算循环的次数,但这样其实是很没必要的,因为while循环就是因为不考虑循环的次数才被选择的,但是又习惯用while语句去统计循环的次数然后得到一个有用的信息,导致我在用while循环的时候很难受。那么在用while循环的时候应该着重考虑什么呢?没思考出来,还是不熟练。

七、逆序一个数组中的数

定义两个指针i和j,分别指向数组的第一个和最后一个元素,然后交换i和j指向的元素,当i大于或等于j时就可结束交换了,为什么?

(1)当数组的长度是偶数时:

此种情况下,当i和j向前走到第三步时 ,此时的j是大于i的,然后数组中的四个元素也已完成交换。

(2)当数组的长度是奇数时:

从上面两种情况可以看到, 当j大于等于i时循环就可以停止了,并且已经完成数组元素的逆序。

需求7:对需求6进行解密

import java.util.Scanner;

public class TestDemo10 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个数字:");
        int num = sc.nextInt();
        int[] b = decNumber(num);
        for (int i = 0; i < b.length; i++) {
            System.out.print(b[i]);
        }

    }
    //计算数的位数
    static int lengthOfNumber(int num){
        int k = 0;
        while (num != 0){
            k++;
            num = num / 10;
        }
        return k;
    }
    //将数正序放到数组中
    static int[] numberToArray(int num){
        int k = lengthOfNumber(num);
        int[] arr = new int[k];
        int x = 0, index = arr.length - 1;
        while (num != 0){
            x = (num % 10);
            arr[index] = x;
            index--;
            num = num / 10;
        }
        return arr;
    }
    //逆序数组
    static int[] reverseArray(int num){
        int[] arr = numberToArray(num);
        int temp = 0;
        for (int i = 0,j = arr.length - 1; i <j ; i++,j--) {
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        return arr;
    }
    //解密规则:
    static int[] decNumber(int num){
        int[] arr = reverseArray(num);
        int[] newArr = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            if((arr[i] >= 5) && (arr[i] <= 9)){
                newArr[i] = arr[i] - 5;
            }
            else if((arr[i] >= 0) && (arr[i] <= 4)){
                newArr[i] = arr[i] + 5;
            }
        }
        return newArr;
    }
}

需求8:一个大V直播抽奖,奖品是现金红包,分别有(2,588,888,1000,10000)五个奖金。请使用代码模拟抽奖打印出每个奖项,奖项的出现顺序要随机且不重复。打印效果如下:(随机顺序,不一定是下面的顺序)

(这个代码写的有问题,就是我一开始想用一个数组b去记录已经抽过的奖的下标,然后再次抽奖的时候和数组b里的数进行比对,如果已经抽到过,那么就需要再抽一次,但是这里我不知道怎解决了,而是只给出了没抽到过的怎么解决)

import java.util.Random;

public class TestDemo11 {
    public static void main(String[] args) {
        int[] arr = {2,588,888,1000,10000};
        for (int i = 0; i < arr.length; i++) {
            System.out.println("第" + (i+1) + "次抽奖");
            int num = Lottery(i,arr);
            System.out.println(arr[num] + "元的奖金被抽出");
        }

    }
    static int Lottery(int k,int[] arr){
        Random r = new Random();
        //num表示的是抽奖数组的下标
        int num = r.nextInt(5);
        //数组b记录的是抽过的奖的下标
        int[] b = new int[arr.length];
        boolean flag = true;
        for (int i = 0; i < b.length; i++) {
            if(num == b[i]){
                flag = false;
            }
        }
        if(flag){
            b[k] = num;
        }
        return num;
    }
}

看视频给出一个就解决办法,首先判断是否被抽到过(怎么判断是否被抽到过?用一个数组去存放抽到过的奖品金额,如果抽到过返回true,没抽到返回false)如果抽到过是要再抽一次,我们如何实现这个功能呢?答案就是将i++移到一个if判断里,只有抽到的是没抽过的才+1。

方法一:

import java.util.Random;

public class TestDemo11 {
    public static void main(String[] args) {
        int[] arr = {2,588,888,1000,10000};
        int[] newArr = new int[arr.length];
        for (int i = 0; i < arr.length;) {
            Random r = new Random();
            int index = r.nextInt(arr.length);
            int prize = arr[index];
            boolean flag = contains(newArr,prize);
            if(!flag){
                newArr[i] = arr[index];
                System.out.println(arr[index] + "元的奖金被抽出");
                i++;
            }
        }
    }
    //判断奖是否被抽到过,用newArr数组来存放已经抽过的奖
   static boolean contains(int[] arr,int prize){
       boolean flag = false;
       for (int i = 0; i < arr.length; i++) {
           if(prize == arr[i]){
               flag = true;
           }
       }
       return flag;
   }
}

再看这个代码发现和我的思路是相似的,但我的有些混乱。 

在这个示例中我学会了一个新知识点,就是for循环的i++可以拿出来放到if语句里,只有满足一些条件时才++。

 方法二:这个方法只是打乱了数组而已。

import java.util.Random;

public class TestDemo12 {
    public static void main(String[] args) {
        int[] arr = {2,588,888,1000,10000};
        int[] newArr = disNumber(arr);
        for (int i = 0; i < newArr.length; i++) {
            System.out.println(newArr[i] + "元的奖金被抽出");
        }
    }
    static int[] disNumber(int[] arr){
        Random r = new Random();
        int index = r.nextInt(arr.length);
        for (int i = 0; i < arr.length; i++) {
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }
        return arr;
    }
}

需求9:投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1-33中选择;蓝色球号码从1-16中选择。 

要求:随机生成中奖号码
           用户输入中奖号码
           判断中奖情况 

(1)判断某个数在数组中是否存在

static boolean contains(int[] arr, int num){
        boolean flag = false;
        for (int i = 0; i < arr.length - 1; i++) {
            if(num == arr[i]){
                flag = true;
            }
        }
        return flag;
    }

(2)写随机生成中奖号码的代码是没有问题的:

    //随机生成中奖号码
    static int[] createNumber(){
        //首先创建一个数组存7位数
        int[] numbers = new int[7];
        Random r = new Random();
        //然后生成6个红球号码且号码不能重复,号码范围:1-33
        for (int i = 0; i < numbers.length;) {
            int redNumber = r.nextInt(33) + 1;
            //判断生成的数是否已经存在
            boolean flag = contains(numbers, redNumber);
            if(!flag){
                numbers[i] = redNumber;
                i++;
            }
        }
        //生成1个蓝色球号码,可以和红色球号码重复,号码范围:1-16
        int blueNumber = r.nextInt(15) + 1;
        numbers[numbers.length - 1] = blueNumber;
        return numbers;
    }

(3)但是用户输入中奖号码这个我写的有问题:

    //用户输入中奖号码
    static int[] inputNumber(){
        int[] numbers = new int[7];
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入您的号码:");
        for (int i = 0; i < numbers.length; i++) {
            int number = sc.nextInt();
            //判断用户输入的红色球号码是否合法
            if (i < numbers.length - 1) {
                if ((number < 1) || (number > 33)) {
                    System.out.println("您输入的号码不合法!");
                }
            }
            //判断用户输入的蓝色球号码是否合法
            if ((number < 1) || (number > 16)) {
                System.out.println("您输入的号码不合法!");
            }
            numbers[i] = number;
        }
        return numbers;
    }

分析我上述的代码就可以发现,我是想在用户输入不合法的数据时进行提示,就是只进行了提示,不合法的数据依然存进了数组当中。但是却忘了一点,就是用户输入不合法的数据时是要重新回到输入的,所以依然应用上面的一个点:就是对某个条件进行判断,只有满足某些条件时才++,否则就回滚到之前的状态嘛。

这个是正确的代码:

//用户输入中奖号码
    static int[] inputNumber(){
        int[] numbers = new int[7];
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入您的号码:");
        //判断用户输入的红色球号码是否合法
        for (int i = 0; i < numbers.length - 1;) {
            int redNumber = sc.nextInt();
            //判断用户输入的红色球号码是否合法
            boolean flag = contains(numbers,redNumber);
            if(!flag){
                if ((redNumber < 1) || (redNumber > 33)) {
                    System.out.println("您输入的号码不合法!");
                }
                else {
                    numbers[i] = redNumber;
                    i++;
                }
            }
            else {
                System.out.println("当前号码您已输入过!");
            }
        }
        //判断用户输入的蓝色球号码是否合法
        while (true) {
            int buleNumber = sc.nextInt();
            if ((buleNumber >= 1) && (buleNumber <= 16)) {
                numbers[numbers.length - 1] = buleNumber;
                break;
            } else {
                System.out.println("您输入的号码不合法!");
            }
        }
        return numbers;
    }

这个代码是在视频中看到的,非常的好。

首先不仅考虑了用户输入的数据是否在范围之内,也考虑了用户输入的数据是否有重复,这点我并没有考虑到。 如何实现的呢?是两层if语句嵌套。关于for循环是可以多次判断的,然后如果只有一个东西需要判断,然后不符合就重新来的话可以使用while循环,即在判断的外面套上一层while(true),如果满足条件的话就break出循环,否则一直循环。

Tips: 

①经过总结可以发现,有一个条件,只考虑满足条件时怎么做,不满足时自然重头来过,适合用for和while的例子,而且不论是什么样的条件,比如需求8中的判断是否重复,还是这个例子中的是否在范围之内。

②crtl+alt+T:为某一段代码自动加上for、while循环,if else语句以及try catch语句。

(4)判断中奖情况:

//判断中奖情况
    static void isWinning(int[] numbers1){
        int[] numbers2 = inputNumber();
        int redCount = 0, blueCount = 0;
        for (int i = 0; i < numbers1.length; i++) {
            if(i < numbers1.length - 1){
                if(numbers2[i] == numbers1[i]){
                    redCount++;
                }
            }
            else {
                if(numbers2[i] == numbers1[i]){
                    blueCount++;
                }
            }

        }
        if((redCount == 0) && (blueCount == 0)){
            System.out.println("您没有中奖!");
        }
        if((redCount == 1) && (blueCount == 1)){
            System.out.println("奖金为5元");
        }
        if(((redCount == 2) && (blueCount == 1)) || ((redCount == 3) && (blueCount == 1)) || ((redCount == 4) && (blueCount == 0))) {
            System.out.println("奖金为10元");
        }
        if(((redCount == 4) && (blueCount == 1)) || ((redCount == 5) && (blueCount == 0))) {
            System.out.println("奖金为200元");
        }
        if((redCount == 5) && (blueCount == 1)){
            System.out.println("奖金为3000元");
        }
        if((redCount == 6) && (blueCount == 0)){
            System.out.println("奖金为500万元");
        }
        if((redCount == 6) && (blueCount == 1)){
            System.out.println("奖金为1000万元");
        }
    }

这个代码存在一个问题就是我是按顺序进行判断的,但在实际情况中是不按顺序的。而且仔细研究中奖情况的球发现并不是所有的情况都涵盖在内,所以我的多个if并列并不是很好,要用else。所以要进行修改。

修改后的代码如下:

static void isWinning(int[] numbers1){
        //其中numbers1是中奖号码
        //其中numbers2是用户输入的号码
        int[] numbers2 = inputNumber();
        int redCount = 0, blueCount = 0;
        //将用户输入的号码和中奖号码一个一个进行比对
        //判断红球相同的个数
        for (int i = 0; i < numbers2.length - 1; i++) {
            for (int j = 0; j < numbers1.length - 1; j++) {
                if (numbers1[i] == numbers2[j]) {
                    redCount++;
                }
            }
        }
        //判断蓝球相同个数
        if (numbers2[numbers2.length - 1] == numbers1[numbers1.length - 1]) {
            blueCount++;
        }
        if((redCount == 1) && (blueCount == 1)){
            System.out.println("奖金为5元");
        } else if(((redCount == 2) && (blueCount == 1)) || ((redCount == 3) && (blueCount == 1)) || ((redCount == 4) && (blueCount == 0))) {
            System.out.println("奖金为10元");
        } else if(((redCount == 4) && (blueCount == 1)) || ((redCount == 5) && (blueCount == 0))) {
            System.out.println("奖金为200元");
        } else if((redCount == 5) && (blueCount == 1)){
            System.out.println("奖金为3000元");
        } else if((redCount == 6) && (blueCount == 0)){
            System.out.println("奖金为500万元");
        } else if((redCount == 6) && (blueCount == 1)){
            System.out.println("奖金为1000万元");
        }else {
            System.out.println("您没有中奖!");
        }
    }

 整体代码如下:

import java.util.Random;
import java.util.Scanner;

public class TestDemo13 {
    public static void main(String[] args) {
        int[] numbers = createNumber();
        System.out.print("中奖号码为:");
        for (int i = 0; i < numbers.length; i++) {
            if(i == numbers.length - 1) {
                System.out.println(numbers[i] + " ");
            }
            else {
                System.out.print(numbers[i] + " ");
            }
        }
        isWinning(numbers);
    }
    //随机生成中奖号码
    static int[] createNumber(){
        //首先创建一个数组存7位数
        int[] numbers = new int[7];
        Random r = new Random();
        //然后生成6个红球号码且号码不能重复,号码范围:1-33
        for (int i = 0; i < numbers.length;) {
            int redNumber = r.nextInt(33) + 1;
            //判断生成的数是否已经存在
            boolean flag = contains(numbers, redNumber);
            if(!flag){
                numbers[i] = redNumber;
                i++;
            }
        }
        //生成1个蓝色球号码,可以和红色球号码重复,号码范围:1-16
        int blueNumber = r.nextInt(15) + 1;
        numbers[numbers.length - 1] = blueNumber;
        return numbers;
    }
    //判断某个数在数组中是否存在
    static boolean contains(int[] arr, int num){
        boolean flag = false;
        for (int i = 0; i < arr.length - 1; i++) {
            if(num == arr[i]){
                flag = true;
            }
        }
        return flag;
    }
    //用户输入中奖号码
    static int[] inputNumber(){
        int[] numbers = new int[7];
        Scanner sc = new Scanner(System.in);
        //System.out.print("请输入您的号码:");
        //判断用户输入的红色球号码是否合法
        for (int i = 0; i < numbers.length - 1;) {
            System.out.println("第"+ (i+1) + "个号码:");
            int redNumber = sc.nextInt();
            //判断用户输入的红色球号码是否合法
            boolean flag = contains(numbers,redNumber);
            if(!flag){
                if ((redNumber < 1) || (redNumber > 33)) {
                    System.out.println("您输入的号码不合法!");
                }
                else {
                    numbers[i] = redNumber;
                    i++;
                }
            }
            else {
                System.out.println("当前号码您已输入过!");
            }
        }
        //判断用户输入的蓝色球号码是否合法
        while (true) {
            System.out.println("第"+ numbers.length + "个号码:");
            int buleNumber = sc.nextInt();
            if ((buleNumber >= 1) && (buleNumber <= 16)) {
                numbers[numbers.length - 1] = buleNumber;
                break;
            } else {
                System.out.println("您输入的号码不合法!");
            }
        }
        return numbers;
    }
    //判断中奖情况
    static void isWinning(int[] numbers1){
        //其中numbers1是中奖号码
        //其中numbers2是用户输入的号码
        int[] numbers2 = inputNumber();
        int redCount = 0, blueCount = 0;
        //将用户输入的号码和中奖号码一个一个进行比对
        //判断红球相同的个数
        for (int i = 0; i < numbers2.length - 1; i++) {
            for (int j = 0; j < numbers1.length - 1; j++) {
                if (numbers1[i] == numbers2[j]) {
                    redCount++;
                }
            }
        }
        //判断蓝球相同个数
        if (numbers2[numbers2.length - 1] == numbers1[numbers1.length - 1]) {
            blueCount++;
        }
        if((redCount == 1) && (blueCount == 1)){
            System.out.println("奖金为5元");
        } else if(((redCount == 2) && (blueCount == 1)) || ((redCount == 3) && (blueCount == 1)) || ((redCount == 4) && (blueCount == 0))) {
            System.out.println("奖金为10元");
        } else if(((redCount == 4) && (blueCount == 1)) || ((redCount == 5) && (blueCount == 0))) {
            System.out.println("奖金为200元");
        } else if((redCount == 5) && (blueCount == 1)){
            System.out.println("奖金为3000元");
        } else if((redCount == 6) && (blueCount == 0)){
            System.out.println("奖金为500万元");
        } else if((redCount == 6) && (blueCount == 1)){
            System.out.println("奖金为1000万元");
        }else {
            System.out.println("您没有中奖!");
        }
    }
}
八、给定两个元素不重复的数组,如何判断两个数组中相同元素的个数? 

取出一个数组中的第一个元素,然后依次 与另外一个数组中的每个元素进行比较,由于数组中的元素各不相同所以可行,当有相同的就不好说了。

 for (int i = 0; i < numbers2.length - 1; i++) {
            for (int j = 0; j < numbers1.length - 1; j++) {
                if (numbers1[i] == numbers2[j]) {
                    redCount++;
                }
            }
        }
九、二维数组

 每次提到一个新的知识的时候,要关注如何定义什么的。

1、如何定义二维数组?

①静态定义:直接给出元素。

int[][] yearArrArr = {
                {22, 66, 44},
                {77, 33, 88},
                {25, 45, 65},
                {11, 66, 99}};

②动态定义:使用new,这种方式需要给出数组的长度。

int [][] arr = new int[3][4];
//或者不给出一位数组的长度
int [][] arr = new int[2][];
int [] a1 = {1,2,3};
int [] a2 = {4,5,6};
arr[0] = a1;
arr[1] = a2;

2、如何获取二维数组中的元素?

二维数组中的元素是一位数组。

a[i]:定位二维数组中的元素,也就是一维数组,其值是一维数组的地址;

a[i][j]:定位一维数组中的元素

3、二维数组的内存原理

需求10:某商城每个季度的营业额如下:单位(万元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
要求计算出每个季度的总营业额和全年的总营业额 。

我这里算成每个季度的平均营业额和平均季度营业总额了,不过没关系,重点不在这里。

public class TestDemo14 {
    public static void main(String[] args) {
        //静态初始化二维数组
        int[][] yearArrArr = {
                {22, 66, 44},
                {77, 33, 88},
                {25, 45, 65},
                {11, 66, 99}};
        //如何访问二维数组中的每个元素
        int totalSum = 0, yearAverage = 0;
        for (int i = 0; i < yearArrArr.length; i++) {
            int sum = 0, quarterAverage = 0;
            for (int j = 0; j < yearArrArr[i].length; j++) {
                sum = sum + yearArrArr[i][j];
                totalSum = totalSum + sum;
            }
            quarterAverage = sum / yearArrArr[i].length;
            System.out.println(quarterAverage);
        }
        yearAverage = totalSum / yearArrArr.length;
        System.out.println(yearAverage);
    }
}
好的,下面是一个ATM取款机的Java代码示例: ``` import java.util.Scanner; public class ATM { private static double balance = 1000; // 初始余额为1000元 public static void main(String[] args) { Scanner input = new Scanner(System.in); boolean flag = true; // 是否继续操作的标志 while (flag) { System.out.println("请选择操作类型:"); System.out.println("1. 查询余额"); System.out.println("2. 取款"); System.out.println("3. 存款"); System.out.println("4. 退出"); int choice = input.nextInt(); switch (choice) { case 1: checkBalance(); break; case 2: withdraw(); break; case 3: deposit(); break; case 4: flag = false; break; default: System.out.println("无效的操作类型,请重新选择!"); break; } } input.close(); System.out.println("感谢使用本 ATM 取款机,再见!"); } // 查询余额 public static void checkBalance() { System.out.println("您的余额为:" + balance + " 元"); } // 取款 public static void withdraw() { Scanner input = new Scanner(System.in); System.out.println("请输入取款金额:"); double amount = input.nextDouble(); if (amount <= balance) { balance -= amount; System.out.println("取款成功,您的余额为:" + balance + " 元"); } else { System.out.println("余额不足,取款失败!"); } input.close(); } // 存款 public static void deposit() { Scanner input = new Scanner(System.in); System.out.println("请输入存款金额:"); double amount = input.nextDouble(); balance += amount; System.out.println("存款成功,您的余额为:" + balance + " 元"); input.close(); } } ``` 这个代码示例实现了一个简单的ATM取款机,包括查询余额、取款、存款和退出等功能。在程序中,我们使用了一个静态变量 `balance` 来保存用户的余额,然后分别实现了查询余额、取款和存款等操作。当用户输入退出操作时,`flag` 变量被设置为 `false`,循环结束,程序退出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值