目录
一、前言
在经过变量,流程控制,数组这三部分知识的学习,现在我们足以通过这些知识点完成一版简易的,基于控制台版本的快递 E 栈。通过后续的不断学习,博主还会对该快递E栈系统的功能、实现方法进行改进,记得关注博主后续的文章哟。
1.1、功能介绍:
系统角色的切换(快递员,普通用户)
- 快递员功能 : ①存快递,②删除快递,③修改快递,④查看所有快递
- 普通用户功能 : ①取快递
根据选择的角色不同,切换出相应的功能菜单;再根据功能菜单的提示,选择相应的功能,对快递信息进行操作。
1.2、项目分析:
本次项目快递 E 栈系统(控制台简易版),主要是针对快递的存取问题;
而快递的信息有: (可以根据自己的需求,添加删除其它信息,如姓名等)
- 取件码
- 快递单号
- 快递公司
而本次项目是比较初级的,涉及的知识只有变量,流程控制,数组;所以可以我们可以把上述三个快递的信息,分别存储到三个数组里。
然后相同下标,对应的数组元素,就是一个快递的全部信息。如下面代码所示:
static int[] packageCode = new int[100]; //定义 快递单号 数组 :packageCode static String[] company = new String[100]; //定义 快递公司 数组 :company static int[] takePartsCode = new int[100]; //定义 取件码 数组 :takePartsCode static int sum = 0; //定义 快递E栈 快递总数
后面 ①存快递,②删除快递,③修改快递,④查看所有快递 、 ⑤取快递的功能,也就是针对数组里面的元素进行增删改查的操作,即可。
二、角色切换
2.1、主界面
首先,就是设计出该系统角色选择的界面,选择之后调用出相应的功能菜单。
角色代码:
- 1---快递员
- 2---普通用户
为了模拟,该系统一直处于在线状态,我们可以利用do—while + switch语句实现,这样我们就一直可以在控制台里面,输入角色代码,进行不同的操作。
public static void main(String[] args) { /** * 利用 do_while + switch 语句,实现 快递E栈系统 死循环 执行 */ do { print(); int idCode = input.nextInt(); //输入身份识别码 switch (idCode) { case 1 : //代号1,进入快递员系统 choice(); //调用 choice 方法,快递员功能菜单 break; case 2 : //代号2,进入 用户取件系统 System.out.println("请输入取件码:"); int takeCode = input.nextInt(); //定义 用户取件码 :takeCode int codeIndex = findPackage(takeCode ,1); //先调用 查找快递findPackage()方法, 返回的是 其下标,没有则返回-1 takePackage(codeIndex); break; default : //输入其他,打印提醒 System.out.println("输入错误!请重新输入!"); break; } }while(true); }
choice()方法,是调用出快递员的功能菜单
findPackage(takeCode ,1)方法,表示用户取件时,先根据取件码查找一下数组里面,有没有存储该快递,有则取出,无则提醒“取件码有误”。
“1”:表示findPackage()方法,是根据取件码,来查找快递,
“0”:表示findPackage()方法,是根据快递单号,来查找快递。 findPackage()方法 后面会介绍的。
其中switch语句里的 default,是输入除上述以外的角色代码时,进行提醒,重新输入正确的角色代码。
2.2、choice()方法
choice()方法:快递员的功能菜单展示、调用各个功能方法。
功能代码:
1---存快递 :addPackage(); 2---删除快递 : delPackage() 3---查看所有快递 :readPackage();
4---修改快递信息 :changePackage() 5---退出快递员系统
public static void choice() { //利用 do_while + switch 语句,实现 快递E栈系统 死循环 执行;并且为do_while取名为 aa,方便后续结束 do_while循环 aa:do { System.out.println("请选择操作:1-存快递 2-删除快递 3-查看所有快递 4-修改快递信息 0-退出快递员系统"); switch (input.nextInt()) { case 1 : // 1 表示 选择了 “存快递” 功能!!! addPackage(); break; case 2 : // 2 表示 选择了 “删除快递” 功能!!! System.out.println("请输入要要删除的快递单号:"); int delCode = input.nextInt(); //定义 需要删除的快递单号 :delCode int codeIndex = findPackage(delCode,0); //先调用 查找快递findPackage()方法, 返回的是 其下标,没有则返回-1 delPackage(codeIndex); //将 findPackage()方法 返回值 传入 删除方法delPackage(); break; case 3 : // 3 表示 选择了 “查看快递” 功能!!! readPackage(); break; case 4 : // 2 表示 选择了 “修改快递信息功能” 功能!!! changePackage(); break; case 0 : // 0 表示 退出 快递员系统 break aa; default : System.out.println("亲爱的快递员,您的操作选择有误"); break; } }while(true); }
2.3、findPackage()方法
findPackage(int code , int flage)方法 ,主要是为了 :
- 快递员在存储快递时,检测输入的快递单号是否重复。
- 普通用户在取快递时,输入的取件码是否存在。
- flage 表示选取 “快递单号”查找、还是选取“取件码”查找;当然flag ,是不用我们输入的,在选择系统角色时,就已经定好了flag。
- 若查找到,就返回下标; 未查找到则返回“-1”,根据返回值进行下一步的操作
public static int findPackage(int code ,int flag) { //接收需要查找的 快递单号!!! if (flag == 0) { for (int i = 0; i < sum; i++) { if (packageCode[i] == code) { //如果在 存放快递的数组中,找到,就return 其下标; return i; } } }else if (flag == 1) { for (int i = 0; i < sum; i++) { if (takePartsCode[i] == code) { //如果在 存放快递的数组中,找到,就return 其下标; return i; } } } return -1 ; //没查找到 则return -1; }
三、快递员功能实现
快递员功能 : ①存快递,②删除快递,③修改快递,④查看所有快递
3.1、存快递 addPackage()方法
由前面代码可知,在选择“存快递”功能之后,我们下一步就需要输入“快递单号”、“快递公司”,然后随机生成“取件码”;而“快递单号”、“取件码”,是不能有重复的。
(但当时,没考虑到“取件码”不能重复,所以编写的代码里,只针对“快递单号”的重复问题做出了代码编写。这是一个小bug。)
(还有就是选择了该功能,就必须存入一个快递,该功能才能结束,这也算是bug!!!~~~~(>_<)~~~~)。
(不过,针对于前面提到的知识,用这个代码来练习,还是可以的。也算是一种经验分享,小伙伴们慎重获取!!!)
言归正传,在输入一个完整的快递信息之后,通过相同下标存入快递信息的不同数组。然后sum++,这表示该系统的快递总数加1。
public static void addPackage(){ System.out.println("请输入快递单号:"); /** * 调用 查找快递 findPackage()方法,传入 输入的快递单号和0,0表示按照 快递单号查找 ;1表示按照 取件码查找; * 调用 该方法 主要是为了 放置快递单号 重复!!!! */ bb:do { int num = input.nextInt(); //从键盘 输入 新的快递单号 switch (findPackage(num,0)) { //switch 先调用findPackage()函数,参数0,表示该函数 以快递单号来 查找 case -1 : // -1 表示,输入的快递单号,还未存在 ,下一步可以写进 packageCode[]数组里 packageCode[sum] = num; break bb; //结束 该 do_while循环!!! default: System.out.println("此快递单号已存在!!! 请重新输入!!!"); } }while(true); System.out.println("请输入快递公司:"); company[sum] = input.next(); //输入 快递公司名称 takePartsCode[sum] = random.nextInt(900)+100; //随机产生 取件码 System.out.println("快递存入成功! 取件码为:"+takePartsCode[sum]); sum++; }
3.2、删除快递delPackage()方法
在选择删除功能后,输入要删除快递的“快递单号”,也是先查找该“快递单号”是否存在:
- 不存在,打印提示信息。
- 存在,则删除三个数组里面,对应该快递 的元素。(这根据findPackage()方法,返回的下标,进行删除)
public static void delPackage(int codeIndex) { switch (codeIndex) { case -1 : //根据 ndPackage()方法 的返回值 -1 则表示没有该快递 无法删除! System.out.println("没有找到快递!!!"); break; default : // 根据 ndPackage()方法 的返回值 ,得到该快递 在packageCode[]里面 的下标,然后进行 删除操作!!! if (codeIndex != sum-1){ for (int i = codeIndex; i < sum-1; i++){ packageCode[i] = packageCode[i+1]; company[i] = company[i+1]; takePartsCode[i] =takePartsCode[i+1]; } } System.out.println("删除成功!!!"); sum--; // 删除成功 packageCode[]数组 大小 减一!!! break; } }
3.3、 查看快递信息readPackage()方法
选择查看快递信息功能,比较简单,就是把三个数组对应 在控制台打印出来。当然也要判断,数组里面有没有存入快递,如果数组为空,表示没有快递,则打印提示信息。
public static void readPackage() { System.out.println("QJX快递E栈——快递信息:"); System.out.println("=================================\n"); System.out.print("快递单号"+"\t"); System.out.print("快递公司"+"\t"); System.out.println("取件码"); if (sum!=0) { // 首先 判断,数组里面 有没有存入快递,有,则打印信息 for (int i = 0; i < sum; i++){ System.out.print(packageCode[i]+"\t"+"\t"); System.out.print(company[i]+"\t"+"\t"); System.out.println(takePartsCode[i]); } }else { // 没有,则打印 ”空空如也“的 提醒信息 System.out.println("------- ╮(╯▽╰)╭ 空空如也 -------"); } System.out.println("\n================================="); }
3.4、修改快递信息changePackage() 方法
修改快递信息功能,再选择之后,也是要输入需要修改快递的“快递单号”,然后判断是否存在,然后根据findPackage()方法返回的下标,对数组进行相应的重新赋值操作。
其实,这几个功能的实现,大同小异,理解了一个,其余就差不多了。
public static void changePackage() { System.out.println("请输入要修改的快递单号:"); int chCode = input.nextInt(); //定义 需要修改的快递单号 :chCode int codeIndex = findPackage(chCode,0);//先调用 查找快递findPackage()方法, 返回的是 其下标,没有则返回-1 switch (codeIndex) { case -1 : //根据 findPackage()方法 的返回值。 -1 表示没找到,无法修改快递信息 System.out.println("没有找到快递!!!"); break; default : // 根据 findPackage()方法 的返回值,得到 快递对应的下标 ,然后对数组 进行重新赋值;已达到修改的目的!!! System.out.println("请输入新的快递单号:"); packageCode[codeIndex] = input.nextInt(); System.out.println("请输入新的公司名称:"); company[codeIndex] = input.next(); System.out.println("修改成功!!!"); break; } }
四、用户取件功能
用户取件功能,根据用户输入的“取件码”,先判断是否存在。
- 不存在,则打印提醒信息。
- 存在,则删除三个数组里面,对应的快递信息。
public static void takePackage(int codeIndex) { switch (codeIndex) { case -1 : System.out.println("没有找到这个快递!!!请核对取件码"); break; default : if (codeIndex != sum-1){ for (int i = codeIndex; i < sum-1; i++){ packageCode[i] = packageCode[i+1]; company[i] = company[i+1]; takePartsCode[i] =takePartsCode[i+1]; } } System.out.println("取件成功!!!"); sum--; break; } }
五、总结
这一次快递 E 栈系统(控制台简易版),总体来说还是比较简单的,主要还是针对博主前段时间学习变量,流程控制,数组这三部分知识的一次融合整理与应用。所以,这个代码还是很多不足之处,比如说:
①数组存满之后,快递员接着存储快递,代码就会出现错误。
②没考虑到“取件码”不能重复。
③存快递功能,必须存入一个快递,才能结束该功能。
可能还有许多不足,请小伙伴们加以指正。通过后面不断的学习,我也会不断完善该系统的,这只是最初级的版本!
六、源码
这里,我奉上自己编写的源代码,希望对小伙伴们有所帮助。
package task; /** * 快递 E 栈训练任务(控制台简易版) * @author Q */ import java.util.Random; import java.util.Scanner; public class Task_010105 { static Scanner input = new Scanner(System.in); //定义输入 input; static表加载 主函数时,同时加载 static int[] packageCode = new int[100]; //定义 快递单号 数组 :packageCode static String[] company = new String[100]; //定义 快递公司 数组 :company static int[] takePartsCode = new int[100]; //定义 取件码 数组 :takePartsCode static int sum = 0; //定义 快递E栈 快递总数 static Random random = new Random(); //随机数 public static void main(String[] args) { /** * 利用 do_while + switch 语句,实现 快递E栈系统 死循环 执行 */ do { print(); int idCode = input.nextInt(); //输入身份识别码 switch (idCode) { case 1 : //代号1,进入快递员系统 choice(); //调用 choice 方法,快递员功能菜单 break; case 2 : //代号2,进入 用户取件系统 System.out.println("请输入取件码:"); int takeCode = input.nextInt(); //定义 用户取件码 :takeCode int codeIndex = findPackage(takeCode ,1); //先调用 查找快递findPackage()方法, 返回的是 其下标,没有则返回-1 takePackage(codeIndex); break; default : //输入其他,打印提醒 System.out.println("输入错误!请重新输入!"); break; } }while(true); } /** * 打印 输入身份识别码 的提示 print()方法! */ public static void print(){ System.out.println("===========欢迎使用QJX快递E栈==========="); System.out.println("请输入您的身份: 1-快递员 2-用户"); } /** *快递员 操作选择函数 */ public static void choice() { //利用 do_while + switch 语句,实现 快递E栈系统 死循环 执行;并且为do_while取名为 aa,方便后续结束 do_while循环 aa:do { System.out.println("请选择操作:1-存快递 2-删除快递 3-查看所有快递 4-修改快递信息 0-退出快递员系统"); switch (input.nextInt()) { case 1 : // 1 表示 选择了 “存快递” 功能!!! addPackage(); break; case 2 : // 2 表示 选择了 “删除快递” 功能!!! System.out.println("请输入要要删除的快递单号:"); int delCode = input.nextInt(); //定义 需要删除的快递单号 :delCode int codeIndex = findPackage(delCode,0); //先调用 查找快递findPackage()方法, 返回的是 其下标,没有则返回-1 delPackage(codeIndex); //将 findPackage()方法 返回值 传入 删除方法delPackage(); break; case 3 : // 3 表示 选择了 “查看快递” 功能!!! readPackage(); break; case 4 : // 2 表示 选择了 “修改快递信息功能” 功能!!! changePackage(); break; case 0 : // 0 表示 退出 快递员系统 break aa; default : System.out.println("亲爱的快递员,您的操作选择有误"); break; } }while(true); } /** * 存快递 addPackage()方法 */ public static void addPackage(){ System.out.println("请输入快递单号:"); /** * 调用 查找快递 findPackage()方法,传入 输入的快递单号和0,0表示按照 快递单号查找 ;1表示按照 取件码查找; * 调用 该方法 主要是为了 放置快递单号 重复!!!! */ bb:do { int num = input.nextInt(); //从键盘 输入 新的快递单号 switch (findPackage(num,0)) { //switch 先调用findPackage()函数,参数0,表示该函数 以快递单号来 查找 case -1 : // -1 表示,输入的快递单号,还未存在 ,下一步可以写进 packageCode[]数组里 packageCode[sum] = num; break bb; //结束 该 do_while循环!!! default: System.out.println("此快递单号已存在!!! 请重新输入!!!"); } }while(true); System.out.println("请输入快递公司:"); company[sum] = input.next(); //输入 快递公司名称 takePartsCode[sum] = random.nextInt(900)+100; //随机产生 取件码 System.out.println("快递存入成功! 取件码为:"+takePartsCode[sum]); sum++; } /** * 查找快递 是否存在 findPackage()方法 */ public static int findPackage(int code ,int flag) { //接收需要查找的 快递单号!!! if (flag == 0) { for (int i = 0; i < sum; i++) { if (packageCode[i] == code) { //如果在 存放快递的数组中,找到,就return 其下标; return i; } } }else if (flag == 1) { for (int i = 0; i < sum; i++) { if (takePartsCode[i] == code) { //如果在 存放快递的数组中,找到,就return 其下标; return i; } } } return -1 ; //没查找到 则return -1; } /** * 删除快递 delPackage()方法 */ public static void delPackage(int codeIndex) { switch (codeIndex) { case -1 : //根据 ndPackage()方法 的返回值 -1 则表示没有该快递 无法删除! System.out.println("没有找到快递!!!"); break; default : // 根据 ndPackage()方法 的返回值 ,得到该快递 在packageCode[]里面 的下标,然后进行 删除操作!!! if (codeIndex != sum-1){ for (int i = codeIndex; i < sum-1; i++){ packageCode[i] = packageCode[i+1]; company[i] = company[i+1]; takePartsCode[i] =takePartsCode[i+1]; } } System.out.println("删除成功!!!"); sum--; // 删除成功 packageCode[]数组 大小 减一!!! break; } } /** * 查看快递 ,打印所有快递信息 ,readPackage()方法 */ public static void readPackage() { System.out.println("QJX快递E栈——快递信息:"); System.out.println("=================================\n"); System.out.print("快递单号"+"\t"); System.out.print("快递公司"+"\t"); System.out.println("取件码"); if (sum!=0) { // 首先 判断,数组里面 有没有存入快递,有,则打印信息 for (int i = 0; i < sum; i++){ System.out.print(packageCode[i]+"\t"+"\t"); System.out.print(company[i]+"\t"+"\t"); System.out.println(takePartsCode[i]); } }else { // 没有,则打印 ”空空如也“的 提醒信息 System.out.println("------- ╮(╯▽╰)╭ 空空如也 -------"); } System.out.println("\n================================="); } /** * 修改快递信息 changePackage() 方法 */ public static void changePackage() { System.out.println("请输入要修改的快递单号:"); int chCode = input.nextInt(); //定义 需要修改的快递单号 :chCode int codeIndex = findPackage(chCode,0);//先调用 查找快递findPackage()方法, 返回的是 其下标,没有则返回-1 switch (codeIndex) { case -1 : //根据 findPackage()方法 的返回值。 -1 表示没找到,无法修改快递信息 System.out.println("没有找到快递!!!"); break; default : // 根据 findPackage()方法 的返回值,得到 快递对应的下标 ,然后对数组 进行重新赋值;已达到修改的目的!!! System.out.println("请输入新的快递单号:"); packageCode[codeIndex] = input.nextInt(); System.out.println("请输入新的公司名称:"); company[codeIndex] = input.next(); System.out.println("修改成功!!!"); break; } } /** * 用户取件 ,takePackage() */ public static void takePackage(int codeIndex) { switch (codeIndex) { case -1 : System.out.println("没有找到这个快递!!!请核对取件码"); break; default : if (codeIndex != sum-1){ for (int i = codeIndex; i < sum-1; i++){ packageCode[i] = packageCode[i+1]; company[i] = company[i+1]; takePartsCode[i] =takePartsCode[i+1]; } } System.out.println("取件成功!!!"); sum--; break; } } }
七、实验结果
存快递功能:
删除快递功能
修改快递功能:
查看快递功能:
用户取件功能: