案例一、卖飞机票
需求:机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。
按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折,淡季〔11月到来年4月)头等舱7折,经济舱6.5折。
//快捷键Ctrl+Alt+M 自动抽取方法
package cn.nwafu;
import java.util.Scanner;
public class test01 {
public static void main(String[] args) {
//卖飞机票
//需求:机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。
//按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折
// 淡季〔11月到来年4月)头等舱7折,经济舱6.5折。
//分析:
//键盘录入机票的原价,月份,舱型
Scanner sc = new Scanner(System.in);
System.out.println("请输入机票的原价");
int ticket = sc.nextInt();
System.out.println("请输入当前的月份");
int month = sc.nextInt();
System.out.println("请输入当前购买的舱位0头等舱1经济舱");
int seat = sc.nextInt();
//判断淡季还是旺季if语句
if (month >= 5 && month <= 10) {//旺季
// if(seat == 0){//判断舱型
// //头等舱
// ticket = (int)(ticket*0.9);
// }else if(seat == 1){
// //经济舱
// ticket = (int)(ticket*0.85);
// }else{//没有这个舱型
// System.out.println("没有这个舱位");
// }以上注释正常初学者写法,下面用方法改进代码
ticket = getPrice(ticket, seat, 0.9, 0.85);
} else if ((month >= 1 && month <= 4) || (month >= 11 && month <= 12)) {//淡季
// if(seat == 0){//判断舱型
// //头等舱
// ticket = (int)(ticket*0.7);
// }else if(seat == 1){
// //经济舱
// ticket = (int)(ticket*0.65);
// }else{//没有这个舱型
// System.out.println("没有这个舱位");
// }
ticket = getPrice(ticket, seat, 0.7, 0.65);
} else {//月份不合法
System.out.println("键盘录入的月份不合法");
}
System.out.println(ticket);//打印机票
}
//1.我要干嘛?根据舱位和折扣来计算最终的票价
//2.我干这件事,需要什么才能完成?原价 舱位 头等舱的折扣 经济舱的折扣
// 3.方法的调用处是否需要继续使用这个结果 需要
public static int getPrice(int ticket,int seat,double v0,double v1){
if(seat == 0){//判断舱型
//头等舱
ticket = (int)(ticket*v0);
}else if(seat == 1){
//经济舱
ticket = (int)(ticket*v1);
}else{//没有这个舱型
System.out.println("没有这个舱位");
}
return ticket;
}
}
案例二、找质数
需求:判断101-200之间有多少个素数,并输出所有素数。
package cn.nwafu;
public class test02 {
public static void main(String[] args) {
//找质数
//需求:判断101-200之间有多少个素数,并输出所有素数。
//变量统计个数
int count = 0;
for (int i = 101; i <= 200; i++) {//范围101~200
boolean flag = true;
for(int j = 2;j < i;j++){//判断质数
if(i % j == 0){
flag = false;
//跳出单层循环,内循环
break;
}
}
if(flag){
System.out.println("当前数字"+i+"是质数");
count ++;
}
}
System.out.println("共有"+count+"个质数");
}
}
案例三、开发验证码
需求:定义方法实现随机产生一个5位的验证码
验证码格式: 长度为5
前四位是大写字母或者小写字母
最后一位是数字
package cn.nwafu;
import java.util.Random;
public class test03 {
public static void main(String[] args) {
//开发验证码
// 需求:定义方法实现随机产生一个5位的验证码
// 验证码格式: 长度为5
// 前四位是大写字母或者小写字母
// 最后一位是数字
//分析
//大写字母与小写字母放在一个数组中
char[] chs = new char[52];
for (int i = 0; i < chs.length; i++) {
if(i <=25){
chs[i] =(char)(97+i);
}else{
chs[i] =(char)(65+i-26);
}
}
// for (int i = 0; i < chs.length; i++) {
// System.out.println(chs[i]);
// }
//随机抽取四次
String result = "";//拼接
Random r =new Random();
for (int i = 0; i < 4; i++) {
int randomIndex = r.nextInt(chs.length);
//System.out.println(chs[randomIndex]);
result = result + chs[randomIndex];
}
// System.out.println(result);
//随机抽取一个数字0~9
int number = r.nextInt(10);
result += number;
//打印结果
System.out.println(result);
}
}
案例四、数组元素的复制
需求:把一个数组中的元素复制到另一个新数组中去。
package cn.nwafu;
public class test04 {
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.println(newarr[i]);
}
}
}
案例五、评委打分
需求:在唱歌比赛中,有6名评委给选手打分,分数范围是[0-100]之间的整数。选手的最后得分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分。
package cn.nwafu;
import java.util.Scanner;
public class test05 {
public static void main(String[] args) {
//评委打分
//需求:在唱歌比赛中,有6名评委给选手打分,分数范围是[0-100]之间的整数。
// 选手的最后得分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分。
//建立数组
int[] scoreArr = getScores();
// for (int i = 0; i < scoreArr.length; i++) {
// System.out.println(scoreArr[i]);
// }
//求最大值
int max = getMax(scoreArr);
//求最小值
int min = getMin(scoreArr);
//求总和
int sum = getSum(scoreArr);
//求(总和-最大值-最小值)/4
//int result = (sum-max-min) / 4 ;
int result = (sum -max -min) / (scoreArr.length-2);//这样写代码更灵活
//打印结果
System.out.println("选手最终的得分是:"+ result);
}
//新建一个方法 将老师打的分数键盘录入,并且存入数组中,返回数组以便后续操作
public static int[] getScores(){
int[] scores = new int [6];
Scanner sc = new Scanner(System.in);
for (int i = 0; i < scores.length; ) {//没有i++,在下面
System.out.println("请输入评委的打分");
int score = sc.nextInt();
if(score>=0&&score<=100) {
scores[i] = score;
i++;//成绩有效i才加1,否则不加1,注意i++位置
}else{
System.out.println("成绩超出了范围,继续录入,当前的i为:" + i);
}
}
return scores;
}
//求最大值
public static int getMax( int[] scoreArr){
int max = scoreArr[0];
for (int i = 1; i < scoreArr.length; i++) {
if (scoreArr[i]>max){
max = scoreArr[i];
}
}
return max;
}
//求最小值
public static int getMin( int[] scoreArr){
int min = scoreArr[0];
for (int i = 1; i < scoreArr.length; i++) {
if (scoreArr[i]<min){
min = scoreArr[i];
}
}
return min;
}
//求总和
public static int getSum(int[] scoreArr){
int sum = 0;
for (int i = 0; i < scoreArr.length; i++) {
sum += scoreArr[i];
}
return sum;
}
}
案例六:数字加密
需求:某系统的数字密码(大于0),比如1983,采用加密方式进行传输。
规则如下:
先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数。
package cn.nwafu;
public class test06 {
public static void main(String[] args) {
//数字加密
//需求:某系统的数字密码(大于0),比如1983,采用加密方式进行传输。
//规则如下:
//先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数。
//分析
//1.把整数里面的数字放入数组中
//没有思路时:
//方法:反向推导
//计算数组的长度
int inputNumber = 123456;
//定义一个变量临时记录inputNumber的值,为了第三步能够再次使用
int temp0 = inputNumber;
int count = 0;
while(inputNumber != 0){
inputNumber = inputNumber /10;
count ++;
}
//System.out.println(count);
//需要一个数组容器,动态数组需要长度值
int[] arr = new int[count];
//把数字依次放入数组中,需要拆分数字
int index = arr.length-1;
while(temp0 != 0){
int ge = temp0 % 10;
arr[index] = ge;
temp0 = temp0 / 10;
index --;
}
//for (int i = 0; i < arr.length; i++) {
// System.out.print(arr[i]+" ");
//}
// int[] arr ={1,9,8,3};
//2.加密
//每位数加5
for (int i = 0; i < arr.length; i++) {
arr[i] += 5;
}
//对10取余
for (int i = 0; i < arr.length; i++) {
arr[i] %= 10;
}
//反转
for (int i = 0,j = arr.length-1; i < j; i++,j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// for (int i = 0; i < arr.length; i++) {
// System.out.print(arr[i]+" ");
// }
//3.拼接
int number = 0;
for (int i = 0; i < arr.length; i++) {
number = number *10 + arr[i];
}
System.out.println(number);
}
}
练习 、数字解密
将加密后的数据解密出来
package cn.nwafu;
public class test07 {
public static void main(String[] args) {
//数字解密
//1.定义一个数组记录解密之后的结果
int arr[] = {8, 3, 4, 6};
//2.反转
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//3.由于加密是通过对10取余的方式获取的
//所以在解密的时候需要判断:0~4之间+10,5~9数字不变
//与最大值最小值有关
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= 0 && arr[i] <= 4) {
arr[i] += 10;
}
}
//4.减5
for (int i = 0; i < arr.length; i++) {
arr[i] -= 5;
}
//5.拼接
int number = 0;
for (int i = 0; i < arr.length; i++) {
number = number * 10 + arr[i];
}
System.out.println(number);
// for (int i = 0; i < arr.length; i++) {
// System.out.print(arr[i] + " ");
// }
}
}
案例七、抢红包
需求:
一个大V直播抽奖,奖品是现金红包,分别有{2,588 ,888,1000,10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。打印效果如下︰(随机顺序,不一定是下面的顺序)
package cn.nwafu;
import java.util.Random;
public class test08 {
public static void main(String[] args) {
//抢红包
//需求:一个大V直播抽奖,奖品是现金红包,分别有{2,588 ,888,1000,10000}五个奖金。
//请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。
//定义一个数组作为奖池
int[] arr = {2, 588, 888, 1000, 10000};
//定义一个数组存放抽奖结果
int[] newArr = new int[arr.length];
//抽奖
Random r = new Random();
//因为有5个奖项,所以循环5次
for (int i = 0; i < 5; ) {
//获取随机索引
int randomIndex = r.nextInt(arr.length);
//获取奖项
int prize = arr[randomIndex];
//判断当前的奖项是否存在,如果存在重新抽取,如果不存在则有效
boolean flag = contains(newArr,prize);
if(!flag){
newArr[i] = prize;
i++;
}
}
for (int i = 0; i < newArr.length; i++) {
System.out.println(newArr[i]+"的奖金被抽出");
}
}
//判断奖项是否存在
//存在:true
//不存在:false
public static boolean contains(int[] newArr,int prize){
for (int i = 0; i < newArr.length; i++) {
if (prize == newArr[i]){
return true;
}
}
return false;
}
}
上面的代码有点复杂,效率较低,下面进行了一次优化,思想是奖金池打乱顺序再遍历即可。
package cn.nwafu;
import java.util.Random;
public class testOptimize08 {
public static void main(String[] args) {
//抢红包
//需求:一个大V直播抽奖,奖品是现金红包,分别有{2,588 ,888,1000,10000}五个奖金。
//请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。
//定义一个数组作为奖池
int[] arr = {2, 588, 888, 1000, 10000};
//打乱顺序,避免重复问题且效率更高
Random r =new Random();
for (int i = 0; i < arr.length; i++) {
//获取随即索引
int randomIndex = r.nextInt(arr.length);
//拿着i与randomIndex的值进行交换
int temp = arr[i];
arr[i] = arr[randomIndex];
arr[randomIndex] = temp;
}
//遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]+"的奖金被抽出");
}
}
}
案例八、模拟双色球
package cn.nwafu;
import java.util.Random;
import java.util.Scanner;
public class test09 {
public static void main(String[] args) {
//双色球系统
//红1~33 蓝1~16
//投注号码 6红1蓝 中将条件和奖金表略,可以上网查
//随机生成中奖号码
int[] arr = creatNumber();
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println("");
//用户输入购买号码
int[] userInputArr = userInputNumber();
// for (int i = 0; i < userInputArr.length; i++) {
// System.out.print(userInputArr[i] + " ");
// }
//判断中奖情况
int redCount = 0;
int blueCount = 0;
//判断红球
for (int i = 0; i < userInputArr.length-1; i++) {
int redNumber = userInputArr[i];
for (int j = 0; j < arr.length-1; j++) {
if(redNumber == arr[j]){
//如果找到了,那么后面的数字就不用比较了
//退出内循环进行下一步即可
redCount++;
break;
}
}
}
//判断蓝球
int blueNumber = userInputArr[userInputArr.length-1];
if(blueNumber == arr[arr.length-1]){
blueCount++;
}
//System.out.println("");
//System.out.println(redCount);
//System.out.println(blueCount);
//根据蓝球和红球的中奖情况来判断几等奖
if (redCount == 6 && blueCount == 1){
System.out.println("恭喜你中一等奖,最高1000万!");
}else if (redCount == 6 && blueCount == 0){
System.out.println("恭喜你中二等奖,最高500万!");
}else if (redCount == 5 && blueCount == 1){
System.out.println("恭喜你中三等奖,3000元!");
}else if ((redCount == 5 && blueCount == 0)||(redCount == 4 && blueCount == 1)){
System.out.println("恭喜你中四等奖,200元!");
}else if ((redCount == 4 && blueCount == 0)||(redCount == 3 && blueCount == 1)){
System.out.println("恭喜你中五等奖,100元!");
}else if ((redCount == 2 && blueCount == 1)||(redCount == 1 && blueCount == 1)||(redCount == 0 && blueCount == 1)){
System.out.println("恭喜你中六等奖,5元!");
}else {
System.out.println("谢谢参与!");
}
}
//生成中奖号码
public static int[] creatNumber(){
//定义一个数组存储投注号码
int[] arr = new int[7];
//生成六个红球和1个蓝球
//红球不能重复,需要判断
//蓝球可以与红球重复
Random r = new Random();
for (int i = 0; i < 6; ) {
//获取红球号码
int redNumber = r.nextInt(33)+1;
boolean flag = contain(arr,redNumber);
if(!flag){
arr[i] = redNumber;
i++;
}
}
//获取蓝球号码
int blueNumber = r.nextInt(16)+1;
arr[arr.length-1] = blueNumber;
return arr;
}
//判断红球号码是否重复
public static boolean contain(int[] arr,int redNumber){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == redNumber){
return true;
}
}
return false;
}
//用户输入购买的彩票号码
public static int[] userInputNumber(){
int[] arr = new int[7];
Scanner sc = new Scanner(System.in);
//输入红球号码
for (int i = 0; i < 6; ) {
System.out.println("请输入第"+(i+1)+"个红球号码");
int redNumber = sc.nextInt();
if(redNumber >= 1 && redNumber <= 33){//判断红球是否唯一
boolean flag = contain(arr,redNumber);//判断红球是否在范围中
if (!flag){
arr[i] = redNumber;
i++;
}else{
System.out.println("当前红球号码已存在,请重新输入");
}
}else{
System.out.println("当前红球号码超出范围");
}
}
//输入蓝球号码
System.out.println("请输入蓝球号码");
while (true) {//快捷键ctrl+alt+t
int blueNumber = sc.nextInt();
if(blueNumber >= 1 && blueNumber <=16){
arr[arr.length-1] = blueNumber;
break;
}else{
System.out.println("当前蓝球超出范围");
}
}
return arr;
}
}
最后一个案例比较综合,对初学者不太友好,有兴趣的可以试一试,贴合生活实际!