Java 基础综合练习:经典编程题详解
Java 基础语法学完后,很多人会陷入“看得懂、写不出”的困境:知识点都认识,真正拿到需求却不知从何下手。本文整理了九道经典综合练习题,涵盖条件判断、循环、数组、方法封装和随机数应用,每题都给出需求与完整可运行代码,建议先自己动手写一遍,再对照参考实现。
题目一:卖飞机票
需求:
- 机票价格按照淡季旺季、头等舱和经济舱收费。
- 按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来年4月)头等舱7折,经济舱6.5折。
package com.example; import java.util.Scanner; public class Demo{ public static void main(String[] args) { //输入机票原价、月份和头等舱或经济舱 Scanner s=new Scanner(System.in); System.out.println("输入机票原价:"); double price=s.nextDouble(); System.out.println("输入月份:"); int month=s.nextInt(); System.out.println("请选择:0头等舱1经济舱"); int seat=s.nextInt(); //分季节计算机票价格 if(month>=5&&month<=10){ //旺季 price=getPrice(price,seat,0.9,0.85); }else if(month>=1&&month<=4 ||month>=1&&month<=12){ //淡季 price=getPrice(price,seat,0.7,0.65); } System.out.println("打折之后票价为:" + price); } //根据舱位计算飞机价格 public static double getPrice(double price,int seat,double v0,double v1){ if(seat==0){ price*=v0; }else{ price*=v1; } return price; } }题目二:找质数
需求:
判断 101-200 之间有多少个素数,并输出所有素数。
package com.example; public class Demo{ public static void main(String[] args) { int count=0; //列出所有需要判断的数 for (int num = 101; num <= 200; num++) { //判断是否是素数 boolean flag=true; for (int i = 2; i <=Math.sqrt(num) ; i++) { if(num%i==0){ flag=false; break; } } //打印所有素数 if(flag){ count++; System.out.print(num+" "); } } System.out.println("\n素数个数为:"+count); } }题目三:开发验证码
需求:
- 定义方法实现随机产生一个5位的验证码
- 验证码格式:
- 长度为5
- 前四位是大写字母或者小写字母
- 最后一位是数字
package com.example; import java.util.Random; public class Demo{ public static void main(String[] args) { String result=""; //用数组存储52个大小写英文字母 char[] chs=new char[52]; for (int i = 0; i < chs.length; i++) { if(i<=25){ chs[i]=(char)(65+i); }else{ chs[i]=(char)(97+i-26); } } //拼出前四位验证码 Random r = new Random(); for (int i = 0; i < 4; i++) { int randomIndex = r.nextInt(chs.length); result += chs[randomIndex]; } //拼出最后一位验证码 result += r.nextInt(10); System.out.println(result); } }题目四:数组元素的复制
需求:
- 把一个数组中的元素赋值到另一个新数组中去
package com.example; public class Demo{ public static void main(String[] args) { int[] arr={1,2,3,4,5}; int[] newArr=new int[arr.length]; for (int i = 0; i < arr.length; i++) { newArr[i]=arr[i]; } for (int i = 0; i < newArr.length; i++) { System.out.print(newArr[i]+" "); } } }题目五:评委打分
需求:
在唱歌比赛中,有6名评委给选手打分,分数范围是[0 - 100]之间的整数。选手的最后得分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分。
package com.example; import java.util.Scanner; public class Demo{ public static void main(String[] args) { int[] scoresArr=getScores(); int max=getMax(scoresArr); int min=getMin(scoresArr); int sum=getSum(scoresArr); int result=(sum-max-min)/(scoresArr.length-2); System.out.println("最终得分:"+result); } //获取总分 public static int getSum(int[] scoresArr){ int sum=0; for (int i = 0; i < scoresArr.length; i++) { sum+=scoresArr[i]; } return sum; } //获取最小值 public static int getMin(int[] scoresArr) { int min = scoresArr[0]; for (int i = 1; i < scoresArr.length; i++) { if (scoresArr[i] < min) { min = scoresArr[i]; } } return min; } //获取最大值 public static int getMax(int[] scoresArr){ int max=scoresArr[0]; for (int i = 1; i < scoresArr.length; i++) { if(scoresArr[i]>max){ max=scoresArr[i]; } } return max; } //输入评委给选手打的分数 public static int[] getScores(){ Scanner s=new Scanner(System.in); int[] scores=new int[6]; for (int i = 0; i < scores.length; ) { System.out.println("请输入评委的打分:"); int score=s.nextInt(); if(scores[i]>=0&&scores[i]<=100){ scores[i]=score; i++; }else{ System.out.println("超出打分范围,请重新输入"); } } return scores; } }题目六:数字加密
需求:
- 某系统的数字密码(大于 0), 比如 1983,采用加密方式进行传输。
- 规则如下:
先得到每位数,然后每位数都加上 5 再对10求余,最后将所有数字反转,得到一串新数。
1 9 8 3 +5 6 14 13 8 %10 6 4 3 8 反转 8 3 4 6 加密后的结果就是: 8346package com.example; import java.util.Scanner; public class Demo{ public static void main(String[] args) { /*整数转化为数组*/ Scanner s=new Scanner(System.in); System.out.println("输入要加密的数字:"); int num=s.nextInt(); //1.看num是几位数 int temp=num; int count=0; while(num!=0){ num/=10; count++; } //2.把整数里面的每一数字放到数组当中 int[] arr=new int[count]; for (int i = arr.length-1; i >= 0; i--) { int ge=temp%10; temp=temp/10; arr[i]=ge; } /*加密处理*/ //1.每位数+5 for (int i = 0; i < arr.length; i++) { arr[i]+=5; } //2.每位数取余 for (int i = 0; i < arr.length; i++) { arr[i]=arr[i]%10; } //3.反转数组 for (int i = 0,j=arr.length-1; i<j; i++,j--) { temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } //4.把数组转为数字 for (int i = 0; i < arr.length; i++) { num=num*10+arr[i]; } System.out.println("加密之后的结果是:\n"+num); } }题目七:数字解密
8 3 4 6 反转 6 4 3 8 ??? 6 14 13 8 -5 1 9 8 3 解密后的结果就是: 19835 6 7 8 9 10 11 12 13 14
5 6 7 8 9 0 1 2 3 4
package com.example; public class Demo{ public static void main(String[] args) { int[] arr={8,3,4,6}; //反转数组 for (int i = 0,j=arr.length-1; i < j; i++,j--) { int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } //加密时取余,解密时寻找规律 //0-4要+10,5-9不做任何处理 for (int i = 0; i < arr.length; i++) { if (arr[i]>=0&&arr[i]<=4){ arr[i]+=10; } } //-5 for (int i = 0; i < arr.length; i++) { arr[i]-=5; } //将数组变成数字 int num=0; for (int i = 0; i < arr.length; i++) { num = num * 10 + arr[i]; } //输出打印 System.out.println(num); } }题目八:抢红包
需求:
一个大V直播抽奖,奖品是现金红包,分别有{2, 588, 888, 1000, 10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。
方法一:在本数组中随机打乱
package com.example; import java.util.Arrays; import java.util.Random; public class Demo{ public static void main(String[] args) { int[] arr={2,588,1000,10000}; Random r=new Random(); for (int i = 0; i < arr.length; i++) { int randomIndex = r.nextInt(arr.length); int temp=arr[i]; arr[i]=arr[randomIndex]; arr[randomIndex]=temp; } System.out.println(Arrays.toString(arr)); } }方法二:随机打乱到一个新数组里
package com.example; import java.util.Arrays; import java.util.Random; public class Demo{ public static void main(String[] args) { int[] arr={2,588,1000,10000}; int[] newArr=new int[arr.length]; Random r=new Random(); for (int i = 0; i < arr.length;) { int randomIndex=r.nextInt(arr.length); int prize=arr[randomIndex]; boolean flag=contains(prize,newArr); if(flag){ newArr[i]=prize; i++; } } System.out.println(Arrays.toString(newArr)); } public static boolean contains(int prize,int[] newArr){ for (int i = 0; i < newArr.length; i++) { if (prize==newArr[i]){ return false; } } return true; } }题目九:双色球系统
投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1—33中选择;蓝色球号码从1—16中选择。
双色球中奖条件和奖金表
| 奖等 | 中奖条件(红球) | 中奖条件(蓝球) | 中奖说明 | 单注奖金分配 |
|---|---|---|---|---|
| 一等奖 | ●●●●●● (6个) | ● (1个) | 中6+1 | 最高1000万 |
| 二等奖 | ●●●●●● (6个) | 中6+0 | 最高500万 | |
| 三等奖 | ●●●●● (5个) | ● (1个) | 中5+1 | 3000元 |
| 四等奖 | ●●●●● (5个) | 中5+0 | 200元 | |
| ●●●● (4个) | ● (1个) | 中4+1 | ||
| 五等奖 | ●●●● (4个) | 中4+0 | 10元 | |
| ●●● (3个) | ● (1个) | 中3+1 | ||
| 六等奖 | ●● (2个) | ● (1个) | 中2+1 | 5元 |
| ● (1个) | ● (1个) | 中1+1 | ||
| ● (1个) | 中0+1 |
package com.example; import java.util.Arrays; import java.util.Random; import java.util.Scanner; public class Demo{ public static void main(String[] args) { System.out.println("中奖号码为:"); int[] arr=winNum(); System.out.println(Arrays.toString(arr)); int[] newArr=selectNum(); System.out.println(Arrays.toString(newArr)); int redCount=getRed(arr,newArr); boolean blueFlag= isBlue(arr,newArr); if(blueFlag){ if(redCount>=0&&redCount<=2){ System.out.println("恭喜你,获得六等奖,奖金5元"); } else if (redCount==3) { System.out.println("恭喜你,获得五等奖,奖金10元"); } else if (redCount==4) { System.out.println("恭喜你,获得四等奖,奖金200元"); } else if (redCount==5) { System.out.println("恭喜你,获得三等奖,奖金3000元"); } else if (redCount==6) { System.out.println("恭喜你,获得一等奖,奖金1000万元"); } }else{ if(redCount==6){ System.out.println("恭喜你,获得二等奖,奖金500万元"); } else if (redCount==5) { System.out.println("恭喜你,获得四等奖,奖金200元"); } else if (redCount==4) { System.out.println("恭喜你,获得五等奖,奖金10元"); } } } //蓝球是否中奖 private static boolean isBlue(int[] arr, int[] newArr){ if(arr[arr.length-1]!=newArr[arr.length-1]){ return false; } return true; } //红球中奖个数 private static int getRed(int[] arr,int[] newArr){ int redCount=0; for (int i = 0; i < newArr.length-1; i++) { for (int j = 0; j < arr.length-1; j++) { if(newArr[i]== arr[j]){ redCount++; } } } return redCount; } //用户进行输入双色球号码 private static int[] selectNum() { int[] newArr=new int[7]; Scanner s=new Scanner(System.in); for (int i = 0; i < newArr.length-1; ) { System.out.println("请输入六个红球号码(1-33):"); int num=s.nextInt(); boolean flag=notContains(num,newArr); if(num>=1&&num<=33&&flag){ newArr[i]=num; i++; }else{ System.out.println("输入的号码错误,请重新输入"); } } System.out.println("请输入一个蓝球号码(1-16):"); int num=s.nextInt(); if (num>=1&&num<=16){ newArr[6]=num; }else{ System.out.println("输入的号码错误,请重新输入"); } return newArr; } //中奖号码 private static int[] winNum() { int[] arr=new int[7]; Random r=new Random(); for (int i = 0; i < arr.length-1; ) { int red = r.nextInt(33)+1; boolean flag = notContains(red, arr); if(flag){ arr[i]=red; i++; } } int blue=r.nextInt(16)+1; arr[6]=blue; return arr; } public static boolean notContains(int num,int[] arr){ for (int i = 0; i < arr.length; i++) { if(num==arr[i]){ return false; } } return true; } }总结
九道题从条件判断、循环控制,到数组操作、方法封装,再到随机数应用和业务逻辑模拟,基本覆盖了 Java 基础阶段的核心能力。做完之后可以回头对照:卖飞机票和找质数练的是分支与循环,验证码和抢红包练的是随机数与去重,评委打分和双色球练的是方法拆分与数组综合运用,数字加解密则考验对取余、反转等细节的把握。
建议把每道题都独立写一遍,再尝试改造需求,比如把验证码长度改成可配置、把双色球改成多注投注,这样才算真正把基础打牢。