1、5个一行输出1-100之间的偶数

(1)输出1-100偶数,

(2)要求:每5个偶数一行,一行中的每个偶数数字之间使用逗号分隔

Java基础练习题(三)_i++

public class Homework1 {
    public static void main(String[] args) {
        for (int i=2; i<=100; i+=2){
            if(i%10 != 0){
                System.out.print(i + ",");
            }else{
                System.out.println(i);
            }
        }
    }
}

或者

public class Homework1 {
    public static void main(String[] args) {
        int count = 0;
        for (int i=2; i<=100; i+=2){
            count++;
            if(count<5){
                System.out.print(i + ",");
            }else{
                System.out.println(i);
                count = 0;
            }
        }
    }
}

2、趣味折纸

世界最高山峰是珠穆朗玛峰,它的高度是8848.86米,假如有一张足够大的纸,它的厚度是0.1毫米。

请问,这张纸需要折叠(对折)多少次,才可以折成珠穆朗玛峰的高度?

public class Homework2 {
    public static void main(String[] args) {
        //定义一个计数器,初始值为0
        int count = 0;

        //定义珠穆朗玛峰的高度
        int zf = 8848860;//单位毫米

        //循环的执行过程中每次纸张折叠,纸张的厚度要加倍
        for(double paper = 0.1; paper < zf;  paper *= 2){
            //在循环中执行累加,对应折叠了多少次
            count++;
        }

        //打印计数器的值
        System.out.println("需要折叠:" + count + "次");
    }
}

3、计算这一天是这一年的第几天

案例需求:从键盘分别输入年、月、日,使用循环for+if实现,判断这一天是当年的第几天

开发提示:

(1)每个月总天数如下:

- 平年的2月份有28天,闰年的2月份有29天。
- 1月、3月、5月、7月、8月、10月、12月有31天,
- 4月、6月、9月、11月有30天。

 (2)闰年的判断标准是:

- 年份year可以被4整除,但不能被100整除

- 或年份year可以被400整除
import java.util.Scanner;

public class Homework3 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.print("请输入年:");
        int year = input.nextInt();

        System.out.print("请输入月:");
        int month = input.nextInt();

        System.out.print("请输入日:");
        int day = input.nextInt();
        
        input.close();
        
        //计算这一天是这一年的第几天
        int days = day;
        for (int i = 1; i < month; i++) {
            if (i == 4 || i == 6 || i == 9 || i == 11) {
                days += 30;
            } else if (i == 2) {
                if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                    days += 29;
                } else {
                    days += 28;
                }
            } else {
                days += 31;
            }
        }
        System.out.println(year + "年" + month + "月" + day + "日是这一年的第" + days + "天");
    }
}

4、计算这一天是这一年的第几天

案例需求:

(1)从键盘分别输入年、月、日,判断这一天是当年的第几天。

(2)要求要对输入值进行合法性的判断,确保输入的年份值必须大于0,月份值必须在[1,12]之间,日期值必须在[1, 当月最大日期值]范围内。

开发提示:

(1)每个月总天数如下:

- 平年的2月份有28天,闰年的2月份有29天。
- 1月、3月、5月、7月、8月、10月、12月有31天,
- 4月、6月、9月、11月有30天。

 (2)闰年的判断标准是:

- 年份year可以被4整除,但不能被100整除
- 或年份year可以被400整除
import java.util.Scanner;

public class Homework4 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        //如果要考虑输入非法值的情况,代码就比较复杂
        System.out.println("请输入日期:");
        int year;
        while(true){
            System.out.print("年:");
            year = input.nextInt();

            if(year > 0){
                break;
            }else{
                System.out.println("年份必须大于0");
            }
        }

        int month;
        while(true){
            System.out.print("月:");
            month = input.nextInt();

            if(month >=1 && month <= 12){
                break;
            }else{
                System.out.println("月份范围是[1,12]");
            }
        }

        //计算month月的总天数
        int totalDaysOfMonth;
        if (month == 2) {
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                totalDaysOfMonth = 29;
            } else {
                totalDaysOfMonth = 28;
            }
        } else if (month == 4 || month == 6 || month == 9 || month == 11) {
            totalDaysOfMonth = 30;
        } else {
            totalDaysOfMonth = 31;
        }

        int day;
        while(true){
            System.out.print("日");
            day = input.nextInt();

            if(day <= 0){
                System.out.println("日期必须大于0");
            }else if(day > totalDaysOfMonth){
                System.out.println(year +"年" + month +"月最多只有" + totalDaysOfMonth + "天");
            }else{
                break;
            }
        }

        input.close();

        //计算这一天是这一年的第几天
        int days = day;
        for (int i = 1; i < month; i++) {
            if (i == 4 || i == 6 || i == 9 || i == 11) {
                days += 30;
            } else if (i == 2) {
                if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                    days += 29;
                } else {
                    days += 28;
                }
            } else {
                days += 31;
            }
        }
        System.out.println(year + "年" + month + "月" + day + "日是这一年的第" + days + "天");
    }
}

5、计算这一天是在打鱼还是晒网

案例需求:

(1)假设从2000年1月1日开始三天打鱼,两天晒网,

(2)从键盘输入今天的日期年、月、日,显示今天是打鱼还是晒网?

(3)开发提示:

- 先计算这一天是这一年的第几天,即总天数
- 再用总天数 % 5(三天打鱼两天晒网的周期),根据结果来判断是打鱼还是晒网

(4)每个月总天数:

- 平年的2月份有28天,闰年的2月份有29天。
- 1月、3月、5月、7月、8月、10月、12月有31天,
- 4月、6月、9月、11月有30天。

(5)闰年的判断标准是:

- 年份year可以被4整除,但不能被100整除
- 或者年份year可以被400整除
import java.util.Scanner;

public class Homework5 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        //如果要考虑输入非法值的情况,代码就比较复杂
        System.out.println("请输入日期:");
        int year;
        while(true){
            System.out.print("年:");
            year = input.nextInt();

            if(year >=2000){
                break;
            }else{
                System.out.println("年份必须大于等于2000");
            }
        }

        int month;
        while(true){
            System.out.print("月:");
            month = input.nextInt();

            if(month >=1 && month <= 12){
                break;
            }else{
                System.out.println("月份范围是[1,12]");
            }
        }

        //计算month月的总天数
        int totalDaysOfMonth;
        if (month == 2) {
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                totalDaysOfMonth = 29;
            } else {
                totalDaysOfMonth = 28;
            }
        } else if (month == 4 || month == 6 || month == 9 || month == 11) {
            totalDaysOfMonth = 30;
        } else {
            totalDaysOfMonth = 31;
        }

        int day;
        while(true){
            System.out.print("日");
            day = input.nextInt();

            if(day <= 0){
                System.out.println("日期必须大于0");
            }else if(day > totalDaysOfMonth){
                System.out.println(year +"年" + month +"月最多只有" + totalDaysOfMonth + "天");
            }else{
                break;
            }
        }

        input.close();

        //计算[2000, year-1]年的总天数
        int days = 0;
        for(int i=2000; i<year; i++){//这个i代表年份
            if(i%4==0 && i%100!=0 || i%400==0){
                days+=366;
            }else{
                days+=365;
            }
        }

        //计算这一天是第year年的第几天
        for (int i = 1; i < month; i++) {
            if (i == 4 || i == 6 || i == 9 || i == 11) {
                days += 30;
            } else if (i == 2) {
                if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                    days += 29;
                } else {
                    days += 28;
                }
            } else {
                days += 31;
            }
        }
        days += day;

        //判断
        System.out.print(year + "年" + month + "月" + day + "日这一天在");
        if(days%5==1 || days%5==2 || days%5==3){
            System.out.println("打鱼");
        }else{
            System.out.println("晒网");
        }
    }
}

6、月份

(1)用一个数组,保存12个月的英语单词

{"January","February","March","April","May","June","July","August","September","October","November","December"}

(2),从键盘输入1-12,显示对应的单词。

import java.util.Scanner;

public class Homework6 {
    public static void main(String[] args) {
        String[] monthNames = {"January","February","March","April","May","June","July","August","September","October","November","December"};

        Scanner input = new Scanner(System.in);
        System.out.print("请输入月份值:");
        int month = input.nextInt();

        if(month <1 || month> 12){
            System.out.println("输入有误");
        }else{
            System.out.println("月份" + month +"是" + monthNames[month-1]);
        }

        input.close();
    }
}

7、打印扑克牌

案例需求:遍历输出一副扑克牌。

开发提示:

(1)用第一个数组保存扑克牌的所有花色:黑桃、红桃、梅花、方片

String[] hua = {"黑桃","红桃","梅花","方片"};

(2)用第二个数组保存具有以上花色的数字:2-K

String[] dian = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

(3)用第三个数组保存扑克牌的牌面

String[] pu = new String[hua.length*dian.length+2];

(4)嵌套遍历第1个、第2个数组,排列组合生成扑克牌牌面,并把结果放到第3个数组的元素中

(5)单独考虑大王小王

(6)遍历输出

Java基础练习题(三)_整除_02

public class Homework7 {
    public static void main(String[] args) {
        String[] hua = {"黑桃","红桃","梅花","方片"};
        String[] dian = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

        String[] pu = new String[hua.length*dian.length+2];
        for(int i=0,k=0; i<hua.length; i++){
            for(int j=0; j<dian.length; j++,k++){
                pu[k] = hua[i]+dian[j];
            }
        }
        pu[pu.length-2] = "大王";
        pu[pu.length-1] = "小王";

        for (int i = 1; i <= pu.length; i++) {
            System.out.print(pu[i-1]+" ");
            if(i%13==0){
                System.out.println();
            }
        }
    }
}

8、正序和逆序输出26个英文字母

(1)要求使用char数组存储26个英文字母,并分别用正序和逆序方式显示输出。

(2)要求每10个字母一行。

public class Homework8 {
    public static void main(String[] args) {
        char[] letters = new char[26];

        for (int i=0; i<letters.length; i++){
            letters[i] = (char)('a' + i);
        }

        System.out.println("小写字母的正序排序:");
        int count = 0;
        for (int i = 0; i <letters.length; i++) {
            count++;
            if(count == 10 || i == letters.length-1){
                System.out.println(letters[i]);
                count = 0;
            }else if(count < 10) {
                System.out.print(letters[i]+",");
            }
        }

        System.out.println("小写字母的逆序排序:");
        count = 0;
        for (int i = letters.length-1; i >= 0; i--) {
            count++;
            if(count == 10 || i == 0){
                System.out.println(letters[i]);
                count = 0;
            }else if(count < 10) {
                System.out.print(letters[i]+",");
            }
        }
    }
}

Java基础练习题(三)_大乐透_03

9、随机生成一组验证码

案例需求:随机生成一组验证码,验证码由大小写字母和10个阿拉伯数字字符中的任意6位组成。

开发提示:

1、声明一个char[]数组,长度为62,并存储26个小写字母、26个大写字母、10个阿拉伯数字字符

2、随机生成6位下标,下标范围是[0,62),取出该下标对应的字符,把它们拼接成一个6位字符构成的验证码

public class Homework9 {
    public static void main(String[] args) {
        char[] letters = new char[26*2+10];
        //[0,25]存储小写字母
        //[26,51]存储大写字母
        //[52,61]存储大写字母
        for (int i=0; i<26; i++){
            letters[i] = (char)('a' + i);
            letters[26+i] = (char)('A' + i);
        }
        for (int i=0; i<10; i++){
            letters[52 + i] = (char)('0' + i);
        }

        String code = "";
        for (int i=0; i<6; i++){
            /*
            Math.random():[0,1)的小数
            Math.random()*letters.length:[0,letters.length)的小数
            (int)(Math.random()*letters.length):[0,letters.length)的整数,
            								即[0, letters.length-1]
            */
            int index = (int)(Math.random()*letters.length);
            code += letters[index];
        }
        System.out.println("随机验证码:" + code);
    }
}

10、判断数组中的元素值是否对称

判断某个数组是否是对称数组,即数组正序遍历和倒序遍历的结果是一样的。

开发提示:循环比较数组首尾对称位置元素是否相同,如果有不同,就不是对称数组,所有对称位置都相等才是对称数组。

Java基础练习题(三)_整除_04

public class Homework10 {
    public static void main(String[] args){
        int[] arr = {1,2,3,4,4,3,2,1};

        //(1)先假设它是对称的
        boolean flag = true;

        //(2)遍历,查看数组的元素是否首尾对称
        //left表示左边的下标
        //right表示右边的下标
        for(int left=0,right=arr.length-1; left<right; left++,right--){
            if(arr[left] != arr[right]){
                flag = false;
                break;
            }
        }

        System.out.println(flag?"对称":"不对称");
    }
}

11、模拟大乐透

大乐透(前区“35选5”+后区“12选2”),即前区在1-35之间的号码中随机选取5个,后区在1-12之间的号码中随机选取2个,组成一期的中奖号码,请用程序模拟产生一组大乐透中奖号码。

开发提示:

- 声明一个int类型的数组front,长度为35,默认值都是0;
- 声明一个int类型的数组after,长度为12,默认值都是0;
- 随机产生[0,35)之间的整数。如果随机产生的是0,那么就把front[0]修改为1,如果随机产生的是5,那么就把front[5]修改为1,如果随机产生的是10,就把front[10]修改为1。但是如果本次随机产生的是5,而front[5]已经是1了,那么需要重新随机产生一个整数。用这种方式把front数组的5个元素修改为1。
- 随机产生[0,12)之间的整数。使用同样的方式,把after数组的2个元素修改为1。
- 遍历front和after数组,输出大乐透中奖号码,判断front和after数组元素是否为1,如果为1,就显示它的下标+1值。
public class Homowork11 {
    public static void main(String[] args) {
        int[] front = new int[35];
        int[] after = new int[12];

        for (int i = 1; i <=5; i++) {
            /*
            Math.random():[0,1)的小数
            Math.random() * front.length:[0,front.length)的小数
             (int)(Math.random() * front.length):[0,front.length)的整数,[0,front.length-1]
             */
            int index;
            do{
                index = (int)(Math.random() * front.length);//0-35
            }while(front[index]==1); 
            front[index] = 1;
        }

        for (int i = 1; i <=2; i++) {
            int index;
            do{
                index = (int)(Math.random() * after.length);
            }while(after[index]==1);
            after[index] = 1;
        }

        System.out.println("本期大乐透中奖号码:");
        System.out.print("前区号码为:");
        for (int i = 0; i < front.length; i++) {
            if(front[i] == 1){
                System.out.print(i+1+"\t");
            }
        }
        System.out.print("\n后区号码为:");
        for (int i = 0; i < after.length; i++) {
            if(after[i] == 1){
                System.out.print(i+1+"\t");
            }
        }
        System.out.println();
    }
}

12、统计字符出现次数

英语中最长的单词是"pneumonoultramicroscopicsilicovolcanoconiosis",意思是“肺尘病,矽肺病”,一共有45个英文字母。现在要求统计这个单词中出现了哪些字母,以及它们出现的次数,并且找出出现次数最多的字母。

开发提示:

(1)使用String类型的变量words存储英语单词"pneumonoultramicroscopicsilicovolcanoconiosis"

(2)通过word.toCharArray()可以根据字符串word得到一个char[]类型的数组。

其中toCharArray()是String类型提供的系统函数,就像Math.random()等函数一样,后面会学到,这里先提前用一下。它的作用就是创建一个char[]数组,并把字符串中的每一个字符依次存储到这个char[]数组中。
//以"hello"为例
String word = "hello";
char[] wordCharArray = word.toCharArray();
//此时wordCharArray字符数组内容是 {‘h','e','l','l','o'}

(3)声明一个int类型的数组counts,长度为26,分别用来记录26个字母出现的次数,counts[0]记录的是'a'字母的次数,counts[1]记录的是'b'字母的次数,依次类推。
public class Homowork12 {
    public static void main(String[] args) {
        String word = "pneumonoultramicroscopicsilicovolcanoconiosis";
        char[] wordCharArray = word.toCharArray();
        //[p,n,e,u,m,o,n,o,u,l,t,r,a,m,i,c,r,o,s,c,o,p,i,c,s,i,l,i,c,o,v,o,l,c,a,n,o,c,o,n,i,o,s,i,s]

        int[] counts = new int[26];
        for (int i = 0; i < wordCharArray.length; i++) {
            counts[wordCharArray[i]-97]++;
        }

        int max = counts[0];
        for (int i = 1; i < counts.length; i++) {
            if(counts[i] > max){
                max = counts[i];
            }
        }

        System.out.println("单词中出现了如下字母:");
        for (int i = 0; i < counts.length; i++) {
            if(counts[i] != 0){
                System.out.println((char)(i+97) +":" + counts[i]);
            }
        }
        System.out.print("出现次数最多的字母是:");
        for (int i = 0; i < counts.length; i++) {
            if(max == counts[i]){
                System.out.print((char)(i+97) + "\t");
            }
        }
        System.out.println();
    }
}

13、统计低于平均分的学生人数

先从键盘输入本组学员的人数,再从键盘输入本组学员的姓名和成绩,最后统计:

  • 本组学员的平均分,
  • 低于平均分的学员人数,
  • 哪些学员低于平均分,
  • 最高分和最低分分别是谁。
import java.util.Scanner;

public class Homowork1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请录入本组学员人数:");
        int count = input.nextInt();

        int[] grades = new int[count];
        String[] names = new String[count];

        for (int i = 0; i < grades.length; i++) {
            System.out.print("第" + (i+1) + "个学员的姓名:");
            names[i] = input.next();

            System.out.print("第" + (i+1) + "个学员的成绩:");
            grades[i] = input.nextInt();
        }
        input.close();

        //学员姓名和成绩
        System.out.println("所有学员的成绩如下:");
        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i] + ":" + grades[i]);
        }

        //找出最高分、最低分、累加总分,计算平均分
        int max = grades[0];
        int min = grades[0];
        double sum = 0;
        for (int i = 1; i < grades.length; i++) {
            if(grades[i] > max){
                max = grades[i];
            }
            if(grades[i] < min){
                min = grades[i];
            }
            sum += grades[i];
        }
        double avg = sum/grades.length;

        //输出结果
        System.out.println("最高分成绩是:" + max);
        System.out.println("最第分成绩是:" + min);
        System.out.println("平均分成绩是:" + avg);
        System.out.println("获得最高分的有:");
        for (int i = 0; i < names.length; i++) {
            if(max == grades[i]){
                System.out.println(names[i]);
            }
        }
        System.out.println("获得最第分的有:");
        for (int i = 0; i < names.length; i++) {
            if(min == grades[i]){
                System.out.println(names[i]);
            }
        }
        System.out.println("低于平均分的有:");
        int total = 0;
        for (int i = 0; i < names.length; i++) {
            if(grades[i] < avg){
                System.out.println(names[i]);
                total++;
            }
        }
        System.out.println("低于平均分的一共有:" + total +"人");
    }
}