Java基础实战(一)

文章内容输出来源:拉勾教育大数据开发高薪训练营

源代码:https://gitee.com/tommie523/lagou_bigdata_class/tree/master/task01

Java基础实战(一)

第一题

提示用户输入年月日信息,判断这一天是这一年中的第几天并打印。

错误
正确
输入
退出
检查日期
闰年
闰年数组
平年数组
获取月份
输出结果
退出程序
  • 第一步 获取用户输入:
            // 获取输入
            Scanner sc = new Scanner(System.in);
            String str = sc.nextLine();
  • 第二步 添加循环体,并根据输入“q”作为退出条件:
            Scanner sc = new Scanner(System.in);
            // 添加循环体
            while (true) {

                String str = sc.nextLine();

                // 当输入q时结束程序
                if ("q".equals(str)) {
                    System.out.println("bye!");
                    break;
                }
            }
  • 第三步 检查日期,并添加输入提示:
            Scanner sc = new Scanner(System.in);
						while (true) {

            // 添加提示,明确输入的日期格式
            System.out.println("请输入一个标准格式日期(例如:\"2020-1-1\");输入'q'退出程序。");

            String str = sc.nextLine();

            if ("q".equals(str)) {
                System.out.println("bye!");
                break;
            }

            // 设定日期格式
            SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
          
            // 声明日期变量,初始化为null
            Date date=null;
          
            // 检查:正确则返回日期,错误则提示错误
            try {
                date = sd.parse(str);
            } catch (Exception e) {
                System.out.println(str + "日期格式错误。");
            }
          
            //如果日期为null则继续循环,否则开始方法体进行下一步判断
            if(date!=null){
              
            }
        }
  • 第四步 获取日期的年份值,判断是否为闰年
            Scanner sc = new Scanner(System.in);
						while (true) {

            System.out.println("请输入一个标准格式日期(例如:\"2020-1-1\");输入'q'退出程序。");

            String str = sc.nextLine();

            if ("q".equals(str)) {
                System.out.println("bye!");
                break;
            }

            SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");

            Date date = null;

            try {
                date = sd.parse(str);
            } catch (Exception e) {
                System.out.println(str + "日期格式错误。");
            }

            if (date != null) {
                //格式化日期,取出年份字符串
                String yearStr = String.format("%tY", date);
                //字符串转整型
                int year = Integer.parseInt(yearStr);
                //判断是否为闰年
                boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
                if (isLeapYear) {
                    // 闰年输出
                } else {
                    // 平年输出
                }
            }

        }
  • 第五步 定义一个静态方法,输出最终结果
    public static void judgeDate(Date date, int[] array) {
      	// 获取年
        String year = String.format("%tY", date);
      	// 获取月并转为整型
        int month = Integer.parseInt(String.format("%tm", date));
      	// 获取日并转为整型
        int day = Integer.parseInt(String.format("%td", date));
      	// 获日期和:例如2020-4-2,依次获取1、2、3月的天数,加上2,即日期所在年天数
        for (int i = 0; i < month - 1; i++) {
            day += array[i];
        }
      	// 格式化日期
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-M-d");
        System.out.printf("%s是%s年的第%d天。\n\n", sd.format(date), year, day);
    }
  • 完整代码
package task01;

import java.util.Scanner;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Code0101 {
  	// 获取日期在当年的天数
    public static void getDays(Date date, int[] array) {
        String year = String.format("%tY", date);
        int month = Integer.parseInt(String.format("%tm", date));
        int day = Integer.parseInt(String.format("%td", date));
        for (int i = 0; i < month - 1; i++) {
            day += array[i];
        }
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-M-d");
        System.out.printf("%s是%s年的第%d天。\n\n", sd.format(date), year, day);
    }

    public static void main(String[] args) {
      	// 定义平年,润年各月天数
        int[] leapYear = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        int[] nonLeapYear = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请输入一个标准格式日期(例如:\"2020-1-1\");输入'q'退出程序。");
            String str = sc.nextLine();

            if ("q".equals(str)) {
                System.out.println("bye!");
                break;
            }

            SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
            Date date = null;
            try {
                date = sd.parse(str);
            } catch (Exception e) {
                System.out.println(str + "日期格式错误。");
            }

            if (date != null) {
                String yearStr = String.format("%tY", date);
                int year = Integer.parseInt(yearStr);
                boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
                if (isLeapYear) {
                  	// 闰年输出
                    getDays(date, leapYear);
                } else {
                  	// 平年输出
                    getDays(date, nonLeapYear);
                }
            }

        }
      	// 关闭
        sc.close();

    }
}

        // 请输入一个标准格式日期(例如:"2020-1-1");输入'q'退出程序。
        // 2020-3-2
        // 2020-3-2是2020年的第62天。
        
        // 请输入一个标准格式日期(例如:"2020-1-1");输入'q'退出程序。
        // 20200201
        // 20200201日期格式错误。

        // 请输入一个标准格式日期(例如:"2020-1-1");输入'q'退出程序。
        // q
        // bye!

第二题

编程找出 1000 以内的所有完数并打印出来。 所谓完数就是一个数恰好等于它的因子之和,如:6=1+2+3。

div=div+1
x=x+1
x=x+1
x=1
x<=1000
div=1,sum=0
x%div=0
sum=sum+div
div < x
x=sum
保留结果
输出保留结果
  • 第一步 for循环1000以内的整数:
        int max = 1000;
				// 0不能做整数除法的除数,从1开始按1递增循环输出
        for (int num = 1; num <= max; num++) {

        }
  • 第二步 for循环小于一个整数的所有整数:
        int max = 1000;
        for (int num = 1; num <= max; num++) {
          	// for循环小余整数num的所有整数,从1开始按1递增循环输出
            for (int div = 1; div < num; div++) {
              
            }
        }
  • 第三步 真因子判断与真因子求和
        int max = 1000;
        int sum;
        for (int num = 1; num <= max; num++) {
          	// 内循环外定义一个整数收集真因子和
            sum = 0;
          	// 真因子为不包含num本身的因子,即div < num
            for (int div = 1; div < num; div++) {
            		// 如果div为num因子,则累加至sum
                if (num % div == 0) {
                    sum += div;
                }
            }
        }
  • 第四步 完数判断并收集
        int max = 1000;
        int sum;
				// 定义一个空字符串收集完数
        String res = "";
        for (int num = 1; num <= max; num++) {
            sum = 0;
            for (int div = 1; div < num; div++) {
                if (num % div == 0) {
                    sum += div;
                }
            }
          	// 真因子和是否与num相等,是则连接进字符串res
            if (num == sum) {
                res = res + num + ",";
            }
        }
  • 完整代码
package task01;

public class Code0102 {
    public static void main(String[] args) {
        int max = 1000;
        int sum;
        String res = "";
        for (int num = 1; num <= max; num++) {
            sum = 0;
            for (int div = 1; div < num; div++) {
                if (num % div == 0) {
                    sum += div;
                }
            }
            if (num == sum) {
                res = res + num + ",";
            }
        }
      	// 打印结果
        System.out.println("" + max + "以内的完数有:" + res.substring(0, res.length() - 1) + "。");
    }
}

        // 1000以内的完数有:6,28,496。

第三题

实现双色球抽奖游戏中奖号码的生成,中奖号码由 6 个红球号码和 1 个蓝球号码组成。 其中红球号码要求随机生成 6 个 1~33 之间不重复的随机号码。 其中蓝球号码要求随机生成 1 个 1~16 之间的随机号码。

z=z+1
x=x+1
x = 0
x < 6
随机数num
z = 0
数组第z位元素=num
数组第x位元素赋值num
z < 6
输出结果
  • 第一步 给长度为6的整数一维数组循环赋值随机数,存放红色号码:
        Random rd = new Random();
				// 定义一维数组
        int[] red = new int[6];
				// 定义随机数num,定义与初始化循环退出条件i=0
        int num;
        int i = 0;
        while (i < red.length) {
          	// 获取随机数
            num = rd.nextInt(33) + 1;
          	// 数组赋值
            red[i] = num;
            i++;
        }
  • 第二步 解决随机数重复的问题:
        Random rd = new Random();
        int[] red = new int[6];
        int num;
        int i = 0;
				// 标注外层循环
        outer: while (i < red.length) {
            num = rd.nextInt(33) + 1;
          	// 遍历整个数组
            for (int j = 0; j < red.length; j++) {
              	// 判断随机数是否已经在数组中存在
                if (red[j] == num) {
                    System.out.println("已有数字,重来!");
                  	// 在外层while循环跳过后面的代码,继续循环
                    continue outer;
                }
            }
            red[i] = num;
            i++;
        }
  • 完整代码
package task01;

import java.util.Arrays;
import java.util.Random;

public class Code0103 {
    public static void main(String[] args) {
        Random rd = new Random();
        int[] red = new int[6];
        int num;
        int i = 0;
        outer: while (i < red.length) {
            num = rd.nextInt(33) + 1;
            for (int j = 0; j < red.length; j++) {
                if (red[j] == num) {
                    System.out.println("已有数字,重来!");
                    continue outer;
                }
            }
            red[i] = num;
            i++;
        }
      	// 随机一个蓝号
        int blue = rd.nextInt(16) + 1;
				
      	// 打印结果
        System.out.println("红号:" + Arrays.toString(red) + ";\n蓝号:" + blue);
    }
}

        // 已有数字,重来!
        // 红号:[12, 18, 14, 32, 28, 16];
        // 蓝号:14

第四题

编程题 自定义数组扩容规则,当已存储元素数量达到总容量的 80%时,扩容 1.5 倍。 例如,总容量是 10,当输入第 8 个元素时,数组进行扩容,容量从 10 变 15。

x=x+1
x=0
x/数组长度>0.8
数组扩大1.5倍
数组增加一个元素
x<14
退出程序
  • 第一步 设置循环,模拟添加元素14个:
        int i = 0;
        do {
						//数组添加元素
            i += 1;
        } while (i < 14);
  • 第二步 定义一个长度为10的整数数组,循环赋值:
        int[] arr = new int[10];
        int i = 0;
        do {
          	// 判断继续添加元素是否会超过数组长度80%,结束循环时数组为[1, 2, 3, 4, 5, 6, 7, 8, 0, 0]
            if ((i+1) * 1.0 / arr.length > 0.8) {
                break;
            }
          	// 数组赋值
            arr[i] = i + 1;
            System.out.printf("添加第%d个元素,当前数组长度为%d:%s\n", i + 1, arr.length, Arrays.toString(arr));
            i += 1;
        } while (i < 14);
  • 完整代码
package task01;

import java.util.Arrays;

public class Code0104 {
    public static void main(String[] args) {
        int[] arr = new int[10];
        int i = 0;
        do {
            if ((i+1) * 1.0 / arr.length > 0.8) {
                // break;
                System.out.println("\n继续添加将超出数组容量80%,进行" + 1.5 + "倍扩容");
              	// 定义一个新数组,长度为原数组1.5倍
                int[] newArr = new int[(int) (arr.length * 1.5)];
              	// 赋值原数组数据到新数组
                System.arraycopy(arr, 0, newArr, 0, arr.length);
              	// 将原数组的对象引用指向新数组
                arr = newArr;
            }
            arr[i] = i + 1;
            System.out.printf("添加第%d个元素,当前数组长度为%d:%s\n", i + 1, arr.length, Arrays.toString(arr));
            i += 1;
        } while (i < 14);
    }
}

        // 添加第1个元素,当前数组长度为10:[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        // 添加第2个元素,当前数组长度为10:[1, 2, 0, 0, 0, 0, 0, 0, 0, 0]
        // 添加第3个元素,当前数组长度为10:[1, 2, 3, 0, 0, 0, 0, 0, 0, 0]
        // 添加第4个元素,当前数组长度为10:[1, 2, 3, 4, 0, 0, 0, 0, 0, 0]
        // 添加第5个元素,当前数组长度为10:[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
        // 添加第6个元素,当前数组长度为10:[1, 2, 3, 4, 5, 6, 0, 0, 0, 0]
        // 添加第7个元素,当前数组长度为10:[1, 2, 3, 4, 5, 6, 7, 0, 0, 0]
        // 添加第8个元素,当前数组长度为10:[1, 2, 3, 4, 5, 6, 7, 8, 0, 0]

        // 继续添加将超出数组容量80%,进行1.5倍扩容
        // 添加第9个元素,当前数组长度为15:[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0]
        // 添加第10个元素,当前数组长度为15:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]
        // 添加第11个元素,当前数组长度为15:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0]
        // 添加第12个元素,当前数组长度为15:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 0]

        // 继续添加将超出数组容量80%,进行1.5倍扩容
        // 添加第13个元素,当前数组长度为22:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        // 添加第14个元素,当前数组长度为22:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0]


第五题

使用二维数组和循环实现五子棋游戏棋盘的绘制,具体如下:

Java基础实战(一)_第1张图片

  • 第一步 定义一个行列17的二维数组,循环赋值和打印
        // 定义二维数组
				String[][] arr2 = new String[17][17];
				// 行
        for (int i = 0; i < arr2.length; i++) {
          	// 列
            for (int j = 0; j < arr2[0].length; j++) {
							
              	// 赋值
                arr2[i][j] = "+";

            }
        }

				// 打印二维数组
        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[i].length; j++) {
                System.out.print(arr2[i][j] + " ");
            }
            System.out.println();
        }

        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
        // + + + + + + + + + + + + + + + + + 
  • 第二步 判断首行,首列,赋值十六进制数字字符串:
        String[][] arr2 = new String[17][17];
        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[0].length; j++) {
              
              	// 首行判断
                if (i == 0) {
                  	// 赋值:当前列数-1,字符串格式化整数为十六进制
                    arr2[i][j] = String.format("%x", j - 1);
                  
                // 首列判断
                } else if (j == 0) {
                  	// 赋值:当前行数-1,字符串格式化整数为十六进制
                    arr2[i][j] = String.format("%x", i - 1);
                  
                // 其他则赋值+
                } else {
                    arr2[i][j] = "+";
                }
            }
        }

        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[i].length; j++) {
                System.out.print(arr2[i][j] + " ");

            }
            System.out.println();

        }

        // ffffffff 0 1 2 3 4 5 6 7 8 9 a b c d e f 
        // 0 + + + + + + + + + + + + + + + + 
        // 1 + + + + + + + + + + + + + + + + 
        // 2 + + + + + + + + + + + + + + + + 
        // 3 + + + + + + + + + + + + + + + + 
        // 4 + + + + + + + + + + + + + + + + 
        // 5 + + + + + + + + + + + + + + + + 
        // 6 + + + + + + + + + + + + + + + + 
        // 7 + + + + + + + + + + + + + + + + 
        // 8 + + + + + + + + + + + + + + + + 
        // 9 + + + + + + + + + + + + + + + + 
        // a + + + + + + + + + + + + + + + + 
        // b + + + + + + + + + + + + + + + + 
        // c + + + + + + + + + + + + + + + + 
        // d + + + + + + + + + + + + + + + + 
        // e + + + + + + + + + + + + + + + + 
        // f + + + + + + + + + + + + + + + + 
  • 完整代码
package task01;

public class Code0105 {
    public static void main(String[] args) {
        String[][] arr2 = new String[17][17];
        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[0].length; j++) {
                if (i == 0) {
                    arr2[i][j] = String.format("%x", j - 1);
                } else if (j == 0) {
                    arr2[i][j] = String.format("%x", i - 1);
                } else {
                    arr2[i][j] = "+";
                }
            }
        }
			
      	// 修改第一个元素为空格
        arr2[0][0] = " ";

        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[i].length; j++) {
                System.out.print(arr2[i][j] + " ");
            }
            System.out.println();
        }
    }
}

        //   0 1 2 3 4 5 6 7 8 9 a b c d e f 
        // 0 + + + + + + + + + + + + + + + + 
        // 1 + + + + + + + + + + + + + + + + 
        // 2 + + + + + + + + + + + + + + + + 
        // 3 + + + + + + + + + + + + + + + + 
        // 4 + + + + + + + + + + + + + + + + 
        // 5 + + + + + + + + + + + + + + + + 
        // 6 + + + + + + + + + + + + + + + + 
        // 7 + + + + + + + + + + + + + + + + 
        // 8 + + + + + + + + + + + + + + + + 
        // 9 + + + + + + + + + + + + + + + + 
        // a + + + + + + + + + + + + + + + + 
        // b + + + + + + + + + + + + + + + + 
        // c + + + + + + + + + + + + + + + + 
        // d + + + + + + + + + + + + + + + + 
        // e + + + + + + + + + + + + + + + + 
        // f + + + + + + + + + + + + + + + + 

你可能感兴趣的:(Java)