某超市门口的自动寄存柜有n个寄存箱,并且有一个投币控制器,顾客想要寄存小件物品时,只要在投币控制器中投入一个1元硬币,如果此时有空闲的箱子,寄存柜就会自动打开一个空的箱子,并且打印输出一张小小的密码纸条;如果没有空闲的箱子,则提示“本柜已满”。当顾客离开超市时,用密码纸条上指定的数字密码依次输入到开箱控制器,则顾客所存包的箱子门就会自动打开,顾客取走物品后,关上门。
输入数据时,可先输入寄存箱总数n, 再由用户选择是“投硬币”还是“输密码”。
如果选择“投硬币”,则只有硬币值是1时才开箱。如果有空闲的箱子,则输出箱子编号及密码(4位数字); 如果无空闲的箱子,则提示“本柜已满”。
如果选择“输密码”,若输入的密码与某一箱子密码相符,则显示打开的箱子编号,否则输出提示“密码错误”。
万能密码:假定有一个密码000086,该密码用于营业结束后整理寄存柜。先在菜单中输入隐藏的选项5,然后提示请输入万能密码,密码输入后,打开所有的箱子,如有箱子中客户没有取走东西,则提示:请重点检查某编号的箱子是否有物留存。
请编写开箱控制程序实现上述过程。
输入输出示例:
寄存箱总数:10
1.投硬币 2.输密码 0.退出 请选择:1
投币值:1
寄存箱编号:1 密码:9342
1.投硬币 2.输密码 0.退出 请选择:2
输入密码:9342
1号寄存箱已打开
1.投硬币 2.输密码 0.退出 请选择:5
请输入万能密码:000086
箱子已经全部打开,请重点检查编号1,编号7的箱子是否有物留存
1.投硬币 2.输密码 0.退出 请选择:0
结束
import java.util.Scanner; public class P4 { public static void main(String[] args) { boolean logical = true;//判定最外层循环是否结束 boolean logic = true;//判定内层各循环是否结束 int input = -1;//接受输入的数字 int coin = 0;//接受输入的钱币 int count = 0; int time = 0; String password;//接受输入的密码 Scanner sc = new Scanner(System.in); String[] cabinet = arr();//自定义箱子数量 //利用while循环实现程序健壮性 while (logical) { //选择请输出“请选择:” System.out.print("1.投硬币 2.输密码 0.退出 请选择:"); input = sc.nextInt(); //判断输入的数字判别实现哪个功能 if (input == 1) { System.out.print("投币值:"); coin = sc.nextInt(); if (coin == 1) { for (int i = 0; i < cabinet.length; i++) { if (cabinet[i] == null) { count = 0; System.out.println("寄存箱编号:" + (i + 1)); //实现随机生成四位密码 int num = intRandom(0, 9999); for (int k = 0; k < cabinet.length; k++) { time = 0; if (String.valueOf(num) == cabinet[k]) { i--; time = 1; break; } } if (time == 1) { continue; } cabinet[i] = String.valueOf(num); if (num < 10) { cabinet[i] = "000" + cabinet[i]; } else if (num < 100) { cabinet[i] = "00" + cabinet[i]; } else if (num < 1000) { cabinet[i] = "0" + cabinet[i]; } System.out.println("密码:" + cabinet[i]); break; } else { count++;//计数,若count = cabinet.length时输出箱位已满 } } if (count == cabinet.length) { System.out.println("箱位已满"); } } else {//若钱币输入不是1,则输出“输入错误”,并且进入下一次循环 System.out.println("投币错误,请重试"); continue; } //若输入的数字为2时 } else if (input == 2) { logic = true; while (logic) { System.out.print("输入密码:"); password = sc.next(); //遍历cabinet数组,若输入密码等于cabinet数组内的某一个值,则打开箱子,并且赋值为空 for (int i = 0; i < cabinet.length; i++) { if (password.equals(cabinet[i])) { System.out.println(i + 1 + "号寄存箱已打开"); cabinet[i] = null; logic = false; break; } } if (logic) { System.out.println("密码错误"); logic = false; } } } else if (input == 0) { System.out.println("结束"); logical = false; } else if (input == 5) { logic = true; while (logic) { System.out.print("输入万能密码:"); password = sc.next(); //判断输入字符串是否与000086匹配 if (password.equals("000086")) { System.out.println("箱子已经全部打开,请检查箱子是否有物留存"); count = 0; time = 0; for (int j = 0; j < cabinet.length; j++) { if (cabinet[j] == null) { count++; } else { if(time == 0) { System.out.print("请重点检查"); time++; } System.out.print((j + 1) + "、"); cabinet[j] = null;//取出货物后数组赋值为null } } if(time == 1) System.out.println("\b号的箱子是否有物留存"); if (count == cabinet.length) { System.out.println("已全部取出"); } logic = false;//若输入正确退出循环 } else { System.out.println("密码输入错误请重试"); } } }else{ System.out.println("不要瞎搞"); } } } //自定义数组长度 public static String[] arr() { int num = 0; Scanner sc = new Scanner(System.in); System.out.print("寄存箱总数:"); num = sc.nextInt(); if(num<=0){ System.out.println("不要瞎搞"); return arr(); }else { String[] cabinet = new String[num]; return cabinet; } } //取随机数 public static int intRandom(int n, int m) { int number = (int) (n + (Math.random() * (m - n + 1))); return number; } }