员工管理系统
都要实现什么功能?
添加员工、查询员工、修改信息、删除员工、退出程序
主菜单分析
当打开程序后,先提示操作方式 即
information
告诉用户如何使用此程序 再考虑如何制作功能
利用switch()
语句,case scanner.next():
来 get 输入的值,需要注意的是 是否会存在其他数值
即default
的可能性,且需要保持"人性化"提示"你输入的有误,请重新输入你要进行的操作!"
利用标签给予while()
,类似judge:while()
,当输入有错时
使用continue judge;
返回至重新输入选项 而不是主菜单
主菜单伪代码
输入一个数并存值;
switch(值){
case "选项1":
code;
break;
case "选项2":
code;
break;
default:
输入错误提示;
code;
// 其中如果 case "5": 直接使用
// System.exit(0); 退出程序即可
}
添加员工
添加员工本质上很简单,即提示输入信息
将信息存入数组username[]
中
idIndex来记录"编号",也就是所谓的UUID
当存入信息完成后,idIndex++
来保证编号自增
添加成功后提示:[◎] 操作成功!你添加了员工: "username" (编号: "id").
这样写看起来更加直观,也更方便用户的体验
String userName = scanner.next(); // 输入
username[username.length-1] = userName; // 记录姓名
id[username.length-1] = idIndex; // 记录编号
inCompany[username.length-1] = true; // 记录在职状态
idIndex++; // 编号自增
添加员工额外功能
当添加员工时,
username[]
和id[]
会进行扩容
数组的长短和存入数据的多少关联,省下空间
同时会有一个额外的数组inCompany[]
来记录状态
这个状态代表的是 他是否"在职"
添加这个额外的状态是为了方便以后查询信息以及删除的操作"人性化"操作,人性化一直是我喜欢做的东西
在添加员工这个功能中,我把人性化放在了添加结束后,提示以下内容[!] 是否要继续添加员工?若否将返回至主菜单!
[!] (yes/no):
如果为yes
,直接输入员工名字即可
如果为no
,返回至主菜单,利用标签continue start;
当然,在这个选项中,我也做了default
即输入有误的状态提示,与主菜单选项错误一样
查询员工
查询员工应该是花费我时间最久的功能
先简单分析一下,查询员工,通过 ID 查询很容易
但我制作了可以通过 username 查询的功能
主要流程如下:
进入查询员工菜单后
有三个选项 1.查询某个员工信息 2.查询员工列表 3.返回主菜单查询某个员工信息中,里面有 通过ID查询、通过名字查询以及返回上一级
返回上一级 即返回至查询员工菜单界面 而非主菜单 (人性化体验)
首先要明白,ID是唯一的,所以在循环遍历查找中
只要找到了,则直接输出内容 或 记录index
角标 在循环结束后输出
紧接着就要break;
没必要全部都要查找,提高程序效率
System.out.print("# [!] 请输入你要查询员工的编号: ");
int tempID = scanner.nextInt();
boolean isFound = false; // 用来记录是否找到了
int searchIndex; // 用来存下角标
for (int i=0; i<id.length;i++) {
if (id[i]==tempID) {
isFound = true; // 如果找到了 那么为true
searchIndex = i; // 然后记录角标
break;
}
}
if(isFound) {
code;
} else {
code;
}
思路和ID查询一样
不同的是,姓名可能会存在"相同"的情况,即重名,但ID(UUID)是唯一的
建立一个新系列数组FoundXx[]
,当找到名字符合的,就存入
最后通过FoundXx[]
将数据打印出来,与"查询员工列表"方式一样
查询员工列表的方式可以往下看
为什么要做员工列表这个功能?
考虑到了用户的体验,显示列表可以更直观的观察数据
遍历数组中,若id[index]==0
则说明数据不存在或有误
将会跳过本次输出,仅输出正确的数据
for遍历username[]{
if(id[index]!=0) {
// 输出的时候还有一列数据关于 在职还是离职
// 所以要判断他是否在职,然后赋值给临时的变量 status
// 最后输出的时候 字符串拼接 status
inCompany[index]==true?status="在职":status="已离职";
输出;
code;
}
}
查询员工额外功能
查询员工列表将会打印所有员工的信息 按照顺序(在职 > 已离职)
这就运用到了当时的inCompany[]
数组的作用
在职的员工排序会在已离职员工的前面
其实就是先输出在职的,把已离职的存入新数组,最后输出即使是已离职的状态,依旧可以查找到该员工的信息
类似一个档案或存档,只是在最后面的状态显示已离职
个人感觉,如果删除员工就无法查询到信息太牵强
// 查询员工列表时,如何 在职 > 已离职
for遍历username[]{
if(inCompany[index]==true) { // 代表的是在职
code;
} else { // 代表的是已离职
将数据存入另外一个新数组内;
}
}
for遍历新数据[]{
输出已离职的员工信息;
}
当查询完毕一个数据后,可以选择继续查询还是返回至主菜单
即使没有查询到数据,也可以继续查询
各种回复错误的状态,例如不按照要求输入内容的提示
// 当使用**查询员工列表**功能时 但列表中没有数据
System.out.println("# [!] 看起来你的公司目前好像没有员工,现在就来添加一个员工吗?");
System.out.println("# [!] 是否要现在添加员工?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
// 如果选择添加员工 直接会跳到条件员工的程序内
修改员工信息
首先上来直接开始分析,什么是修改员工信息?
当输入一个编号ID后,查询是否有这个人的信息,再修改username[index]
所以,在修改前要引入一个查询
由于目前并没有学到函数,所以在switch
直接把查询的复制粘贴过来了
当通过编号ID找到了这个人,才开始进行修改,所以整个修改很简单
if (isFoundID) {
username[index] = scanner.next();
// 这里的index 是在for做id遍历的时候 额外存的值
code;
} else {
sout("提示: 没有查询到这个人");
code;
}
当然,还是加了那些额外的小功能
查询不到人的时候,提示以下内容,并可以继续使用修改功能
[❌] 看起来你的公司并没有此编号的员工!你仍然可以继续使用修改功能!
修改成功后,提示以下内容,并可以进行选择
[◎] 刚刚的操作已经结束!是否要继续修改?若否将返回至主菜单!
删除员工
与其说是删除功能,不如说成修改功能
还是先通过编号ID查找,然后再进行修改最后的状态
本质上并没有真正的删除,只是用到了之前定义的inCompany[]
数组
通过更改里面的值,改为false
,即可做到已离职
的状态
if (isFoundID) {
inCompany[index] = scanner.next();
code;
} else {
sout("提示: 没有查询到这个人");
code;
}
我直接修改
inCompany[]
内的值,是因为我在查询员工的时候后边有一个关于员工状态的项
而且我想做到的是留存记录、留存档案,并不是真正意义上的删除
若要做到真正的删除,需要将此位置记录角标index
将index
后面的所有数据往前移动,最后将数组减容
数组减容和数组扩容一样,为了省下更多的空间
整体代码
public static void main(String[] args) {
int idIndex = 1001;
int primary = 0;
String [] username = new String[1];
int [] id = new int[1];
boolean [] inCompany = new boolean[1];
start:while (true) {
Scanner scanner = new Scanner(System.in);
System.out.println("#############################");
System.out.println("# 欢迎使用员工管理系统 ");
System.out.println("#############################");
System.out.println("# 1.添加员工 2.查询员工");
System.out.println("# 3.修改信息 4.删除员工");
System.out.println("# 5.退出程序");
System.out.println("#############################");
System.out.print("# [!] 请选择你要进行的操作: ");
String flag = scanner.next();
judge:while(true) {
switch (flag) {
case "1":
// 这里进行了自增 防止数组超出界限
String [] tempUsername = new String[username.length+1];
int [] tempId = new int[username.length+1];
boolean [] tempInCompany = new boolean[username.length+1];
for (int i = 0; i < username.length; i++) {
tempUsername[i]=username[i];
tempId[i]=id[i];
tempInCompany[i]=inCompany[i];
}
username=tempUsername;
id=tempId;
inCompany=tempInCompany;
System.out.print("# [!] 请输入你要添加的员工姓名:");
username[primary] = scanner.next();
id[primary] = idIndex;
inCompany[primary] = true;
System.out.println("# [◎] 操作成功!你添加了员工: "+username[primary] + " (编号: "+idIndex+").");
idIndex++;
primary++;
System.out.println("# [!] 是否要继续添加员工?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
String yesNo = scanner.next();
yesOrNo:while(true) {
switch (yesNo) {
case "yes":
continue judge;
case "no":
continue start;
default:
System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
System.out.println("# [!] 是否要继续添加员工?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
yesNo = scanner.next();
continue yesOrNo;
}
}
// 需要保存的信息
// 工号 不能输入 自动生成的
// 员工姓名
// 员工和工号的姓名都是保存到数组里的
case "2":
search:while(true) {
System.out.println("# [!] 1. 查询某个员工信息 2. 查询员工列表 3.返回主菜单");
System.out.print("# [◎] 请选择你要进行的操作: ");
String searchNumStr = scanner.next();
searchNumber:while(true) {
switch (searchNumStr) {
case "1":
whichSearch:while (true) {
System.out.println("# [!] 1. 通过ID进行查询 2. 通过名字进行查询 3.返回上一级");
System.out.print("# [◎] 请选择你要进行的操作: ");
String whichSearchStr = scanner.next();
switch (whichSearchStr) {
case "1":
System.out.print("# [!] 请输入你要查询员工的编号: ");
int tempID = scanner.nextInt();
boolean isFound = false;
int searchIndex=0;
for (int i=0; i<id.length;i++) {
if (id[i]==tempID) {
isFound = true;
searchIndex = i;
break;
}
}
if (isFound) {
System.out.println("# [◎] 已经为你查询到以下信息: ");
System.out.println("# 编号\t | 员工姓名\t | 状态");
String status;
if (inCompany[searchIndex]) {
status="在职";
} else {
status="已离职";
}
System.out.println("# "+id[searchIndex]+"\t|"+username[searchIndex]+"\t\t|"+status);
System.out.println();
} else {
System.out.println("# [❌] 看起来你的公司并没有此编号的员工!你仍然可以继续查询!");
}
System.out.println("# [◎] 查询已经结束!是否要继续查询?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
String yesNo4 = scanner.next();
yesOrNo4:while(true) {
switch (yesNo4) {
case "yes":
continue whichSearch;
case "no":
continue start;
default:
System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
System.out.println("# [!] 是否要继续查询?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
yesNo4 = scanner.next();
continue yesOrNo4;
}
}
case "2":
System.out.print("# [!] 请输入你要查询员工的姓名: ");
Scanner sc = new Scanner(System.in);
String tempUserName = sc.next();
boolean isFoundUserName = false;
String [] FoundUserNameStr = new String[username.length];
int [] FoundUserIDStr = new int[id.length];
boolean [] FoundUserInCompany = new boolean[inCompany.length];
int searchUserIndex=0;
for (int i=0; i<username.length;i++) {
if (Objects.equals(username[i], tempUserName)) {
isFoundUserName = true;
FoundUserIDStr[searchUserIndex] = id[i];
FoundUserNameStr[searchUserIndex] = username[i];
FoundUserInCompany[searchUserIndex] = inCompany[i];
searchUserIndex++;
}
}
if (isFoundUserName) {
System.out.println("# [◎] 已经为你查询到以下信息: ");
System.out.println("# [!] 员工列表: ");
System.out.println("# 编号\t | 员工姓名\t | 状态");
for (int i=0;i<FoundUserIDStr.length;i++) {
String status;
if (FoundUserInCompany[i]) {
status="在职";
} else {
status="已离职";
}
if (FoundUserIDStr[i]!=0) {
System.out.println("# "+FoundUserIDStr[i]+"\t|"+FoundUserNameStr[i]+"\t\t|"+status);
}
}
} else {
System.out.println("# [❌] 看起来你的公司并没有此名字的员工!你仍然可以继续查询!");
}
System.out.println("# [◎] 查询已经结束!是否要继续查询?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
String yesNo5 = scanner.next();
yesOrNo5:while(true) {
switch (yesNo5) {
case "yes":
continue whichSearch;
case "no":
continue start;
default:
System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
System.out.println("# [!] 是否要继续查询?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
yesNo5 = scanner.next();
continue yesOrNo5;
}
}
case "3":
continue search;
default:
System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
continue whichSearch;
}
}
case "2":
if (username[0]!=null) {
System.out.println();
System.out.println("# [!] 员工列表: ");
System.out.println("# 编号\t | 员工姓名\t | 状态");
int deleteIndexPos=0;
String [] deleteUsernameStr = new String[username.length];
int [] deleteUserid = new int[username.length];
for (int i=0;i<username.length;i++) {
String status;
if (inCompany[i]) {
status="在职";
if (id[i]!=0) {
System.out.println("# "+id[i]+"\t|"+username[i]+"\t\t|"+status);
}
} else {
status = "已离职";
deleteUsernameStr[deleteIndexPos] = username[i];
deleteUserid[deleteIndexPos] = id[i];
deleteIndexPos++;
}
if (i == username.length) {
System.out.println();
}
}
for (int i = 0; i < deleteUsernameStr.length; i++) {
if (deleteUserid[i]!=0) {
System.out.println("# " + deleteUserid[i] + "\t|" + deleteUsernameStr[i] + "\t\t|" + "已离职");
}
}
System.out.println();
System.out.println("# [◎] 查询已经结束!是否要继续查询?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
String yesNo3 = scanner.next();
yesOrNo3:while(true) {
switch (yesNo3) {
case "yes":
continue search;
case "no":
continue start;
default:
System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
System.out.println("# [!] 是否要继续查询?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
yesNo3 = scanner.next();
continue yesOrNo3;
}
}
} else {
System.out.println("# [!] 看起来你的公司目前好像没有员工,现在就来添加一个员工吗?");
System.out.println("# [!] 是否要现在添加员工?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
String yesNo2 = scanner.next();
yesOrNo2:while(true) {
switch (yesNo2) {
case "yes":
flag = "1";
continue judge;
case "no":
continue start;
default:
System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
System.out.println("# [!] 是否要现在添加员工?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
yesNo2 = scanner.next();
continue yesOrNo2;
}
}
}
case "3":
continue start;
default:
System.out.println("# [!] 1. 查询某个员工信息 2. 查询员工列表 3.返回主菜单");
System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
System.out.println("# [◎] 请选择你要进行的操作: ");
searchNumStr = scanner.next();
continue searchNumber;
}
}
}
// 根据工号查询
// 可以做姓名查询
// 加一个子菜单
// 排序 根据工号倒叙排序
case "3":
revise:while(true) {
System.out.print("# [!] 请输入你要修改员工的编号: ");
int reviseId = scanner.nextInt();
boolean isFoundRevised = false;
int reviseIndex=0;
for (int i=0; i<id.length;i++) {
if (id[i]==reviseId) {
isFoundRevised = true;
reviseIndex = i;
break;
}
}
if (isFoundRevised) {
System.out.println("# [◎] 已经为你找到了该员工: ");
System.out.println("# 编号\t | 员工姓名\t | 状态");
String status="";
if (inCompany[reviseIndex]) {
status="在职";
} else {
status="已离职";
}
System.out.println("# "+id[reviseIndex]+"\t|"+username[reviseIndex]+"\t\t|"+status);
System.out.println();
System.out.print("# [!] 请输入你要修改的名字: ");
String backUserName = username[reviseIndex];
username[reviseIndex] = scanner.next();
System.out.println("# [◎] 修改成功!原员工: "+backUserName+",已经改名为: "+username[reviseIndex]+" (编号"+id[reviseIndex]+")");
} else {
System.out.println("# [❌] 看起来你的公司并没有此编号的员工!你仍然可以继续使用修改功能!");
}
System.out.println("# [◎] 刚刚的操作已经结束!是否要继续修改?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
String yesNo6 = scanner.next();
yesOrNo6:while(true) {
switch (yesNo6) {
case "yes":
continue revise;
case "no":
continue start;
default:
System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
System.out.println("# [!] 是否要继续修改?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
yesNo6 = scanner.next();
continue yesOrNo6;
}
}
}
// 先输入员工号
// 先查询这个员工是否存在
// 如果不在,输出 员工号输入有误
// 如果在,先显示出原有信息,再提示输入新的名字
// 修改信息
case "4":
delete:while (true) {
System.out.print("# [!] 请输入你要删除员工的编号: ");
int deleteId = scanner.nextInt();
boolean isFoundDeleteId = false;
int deleteIndex=0;
for (int i=0; i<id.length;i++) {
if (id[i]==deleteId) {
isFoundDeleteId = true;
deleteIndex = i;
inCompany[i]=false;
break;
}
}
if (isFoundDeleteId) {
System.out.println("# [◎] 已经为你删除了该员工: ");
System.out.println("# 编号\t | 员工姓名\t | 状态");
String status;
if (inCompany[deleteIndex]) {
status="在职";
} else {
status="已离职";
}
System.out.println("# "+id[deleteIndex]+"\t|"+username[deleteIndex]+"\t\t|"+status);
System.out.println();
} else {
System.out.println("# [❌] 看起来你的公司并没有此编号的员工!你仍然可以继续使用删除功能!");
}
System.out.println("# [◎] 刚刚的操作已经结束!是否要继续删除?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
String yesNo5 = scanner.next();
yesOrNo5:while(true) {
switch (yesNo5) {
case "yes":
continue delete;
case "no":
continue start;
default:
System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
System.out.println("# [!] 是否要继续删除?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");
yesNo5 = scanner.next();
continue yesOrNo5;
}
}
}
// 数组删除元素
// int[] = 0;
// String [] = null;
case "5":
System.exit(0);
default:
// 是否继续?
System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
System.out.print("# [!] 请选择你要进行的操作: ");
flag = scanner.next();
continue judge;
}
}
}
}
总结
做这个员工管理系统,最需要考虑的是各种可能性与用户体验性
需要从代码层面考虑,这个选项都有哪些可能性,有些选择可能会报错,查询不到,抑或是查到了,要做什么事情
需要从用户层面考虑,这个系统是否实用,从人为实用的角度上来说,使用完每一个功能,是否可以继续使用功能?如果输入了错的选项,是否可以重新输入,而不是每一次死板的返回至主菜单,选择了某个子功能,是否要制作返回上一级,这些都是我们需要考虑的,不能简单、粗心、大条的考虑整个系统规模,否则程序用起来会很麻烦
比较麻烦的点
每次的选项,都要写返回至上一级或主菜单的功能,这是繁琐的
要考虑每一个输入错误的情况,然后提示重新输入比较难的点
整个系统考验的是你的逻辑,各种index
、角标
和switch()
的运用
逻辑层面要很清晰,知道要做什么,要干什么
只要足够用心、细心,“难”的点,也就不难了
6 条评论
帝国叛忍来袭
ok 有大叔,那我不只能小叔了么
永远爱你,昂口航~
你真的适合作需求分析师,自己提出问题,自己解决问题,这就是思考的魅力,坚持,你会获得高薪的
我要给你生猴子我的宝
航宝 嘿嘿
航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你 航宝是我的你不许抢,我撒了你