题目
小作业 - 员工财务数据系统Java程序设计
设计并开发一个Java程序,需要实现以下核心功能:
1. 数据系统录入功能
1) 用户可从键盘录入:一个员工的名字、工号、职位、基本工资和绩效,并将该员工的信息存储好;
2) 用户也可从一个含上述信息的10个员工的财务数据文件中,录入所有员工的信息并存储好。
2. 数据系统存储功能
用户录入数据后,应由指定的数据结构 - 单向链表,实现员工财务数据的存储。
3. 数据系统管理功能
用户可使用创建、插入、删除、查找、打印和排序(按工资加绩效的总和来排序)的基本系统操作,来管理员工财务数据。
4. 数据系统日志功能
随着员工财务数据系统的运行,应将每次系统操作和操作后更新的数据写到一个单独的文件中。
5. 数据系统人机交互功能
用户可通过键盘输入选项,实现相应功能
代码
Worker类
public class Worker{
//名字
private String name;
//工号(注意类型
private String num;
//职位
private String place;
//基本工资
private int wage;
//绩效
private int grade;
//工资+绩效
private int wplusg;
public Worker next;
public Worker(){}
public Worker(String name , String num , String place , int wage , int grade){
this.name=name;
this.num=num;
this.place=place;
this.wage=wage;
this.grade=grade;
this.setWplusg();
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getNum(){
return num;
}
public void setNum(String num){
this.num=num;
}
public String getPlace(){
return place;
}
public void setPlace(String place){
this.place=place;
}
public int getWage(){
return wage;
}
public void setWage(int wage){
this.wage = wage;
this.setWplusg();
}
public int getGrade(){
return grade;
}
public void setGrade(int grade){
this.grade = grade;
this.setWplusg();
}
public int getWplusg(){
return wplusg;
}
public void setWplusg(){
this.wplusg = this.wage+this.grade;
}
/*更新结点信息
* 一个结点包含一个员工的全部信息
*/
public void setMessage(String name , String num , String place , int wage , int grade , int wplusg){
this.name=name;
this.num=num;
this.place=place;
this.wage=wage;
this.grade=grade;
this.setWplusg();
}
public String toString(){
return "姓名:" + this.name + "\t工号:" + this.num + "\t职位:" + this.place + "\t基本工资:" + this.wage + "\t绩效:" + this.grade + "\t工资+绩效" + this.wplusg;
}//toString()返回此对象的字符串表示形式
}
类内其他参数、构造函数
//链表大小
private int size;
//头节点
private Worker head;
public int size(){
return this.size;
}
//构造代码,每次创建对象调用一次,优于构造函数执行
{
this.size = 0;
this.head = null;
}
//无参构造函数,实例化头、尾结点
public lh4(){
this.head = new Worker();
}
函数:
插入员工数据
//插入(从尾部
public void insertTailer(Worker w){
Worker front = this.head;
if(this.size == 0){
this.head = w;
this.size++;
}else{
while(front != null){
if(front.next == null){
front.next = w;
this.size++;
return;
}
front = front.next;
}
}
}
检测是否录入
//录入与否(根据工号
public boolean isExist (String num){
Worker front = this.head;
while(front!=null){
if(num.equals(front.getNum())){
return true;
}
front = front.next;
}
return false;
}
删除员工数据
//删除(根据工号
public boolean delete(String num){
Worker front = this.head;
//判断是否删除头结点
if(num.equals(front.getNum())){
this.head = this.head.next;
this.size--;
return true;
}
while(!num.equals(front.next.getNum())){
front = front.next;
}
if(front.next != null){
front.next = front.next.next;
this.size--;
return true;
}
return false;
}
查询员工信息
//查询信息(根据工号
public Worker search(String num){
Worker front = this.head;
// System.out.println(num);
// System.out.println(front.getNum());
//头节点时
if(num.equals(front.getNum())){
Worker w = new Worker(front.getName() , num , front.getPlace() , front.getWage() , front.getGrade());
return w;
}
while(front.next != null){
// System.out.println(front.getNum());
front = front.next;
if(num.equals(front.getNum())){
Worker w = new Worker(front.getName() , num , front.getPlace() , front.getWage() , front.getGrade());
return w;
}
}
return null;
}
降序排序
//降序排序
public void sortTotal(){
Worker front = this.head;
Worker p = front.next;
while(front.next != null &&p.next !=null){
while(p != null){
if(front.getWplusg() < p.getWplusg()){
String name = front.getName();
String num = front.getNum();
String place = front.getPlace();
int wage = front.getWage();
int grade = front.getGrade();
int wplusg = front.getWplusg();
front.setMessage(p.getName(), p.getNum(), p.getPlace(), p.getWage(), p.getGrade(), p.getWplusg());
p.setMessage(name, num, place, wage, grade, wplusg);
}
p=p.next;
}
front = front.next;
p=front.next;
}
if(p.next ==null &&front.getWplusg() < p.getWplusg()){//写在外面,不然两个人的时候排不了序
String name = front.getName();
String num = front.getNum();
String place = front.getPlace();
int wage = front.getWage();
int grade = front.getGrade();
int wplusg = front.getWplusg();
front.setMessage(p.getName(), p.getNum(), p.getPlace(), p.getWage(), p.getGrade(), p.getWplusg());
p.setMessage(name, num, place, wage, grade, wplusg);
}
}
打印员工数据(全部)
//打印
public void display(){
System.out.println("姓名\t工号\t职位\t基本工资\t绩效\t工资+绩效");
Worker front = this.head;
while(front != null && front.getNum() != null){
System.out.println(front.toString());
front = front.next;
}
if(this.head == null || this.head.getNum() == null){
System.out.println("无员工财务数据!");
}
}
主函数
public static void main(String[] args) {
lh4 sm = new lh4();
// sFile.R1("H:\\worker", sm);
Scanner in = new Scanner(System.in);
boolean open = true;
while (open) {
printMenu();
int menu = -1;
try {
menu = in.nextInt();
} catch (Exception e) {
// Scanner声明在while循环外时,当第一次出现异常后没有清空Scanner中的数据,会造成无限死循环,因此需要重新在catch里声明Scanner
in = new Scanner(System.in);
}
/*
*
*/
switch (menu) {
case 1:
System.out.println("请输入工号(回车结束)");
String num = in.next();
if (sm.isExist(num)) {
System.out.println("该工号已存在!");
break;
}
System.out.println("请输入姓名、职位、基本工资、绩效(空格结束,回车确认插入)");
try {
String name = in.next();
String place = in.next();
int wage = in.nextInt();
int grade = in.nextInt();
Worker newS = sm.new Worker(name, num, place, wage,grade);
sm.insertTailer(newS);
System.out.println("添加成功!");
System.out.println("***********************************");
System.out.println();
} catch (Exception e) {
System.out.println("数据输入错误!请确认是否是整数!");
in = new Scanner(System.in);
}
break;
case 3:
System.out.println("请输入要删除的员工工号");
String num2 = in.next();
if (sm.delete(num2)) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
System.out.println("***********************************");
System.out.println();
sm.display();
System.out.println("***********************************");
System.out.println();
break;
case 4:
System.out.println("请输入要查询的员工工号");
String num4 = in.next();
Worker selectW = sm.search(num4);
// System.out.println("姓名\t工号\t职位\t基本工资\t绩效\t工资+绩效");
System.out.println(sm.search(num4));
if (selectW == null) {
System.out.println("无此员工!");
} else {
// sm.R1();
// System.out.println(selectW.toString());
}
System.out.println("***********************************");
System.out.println();
break;
case 2:
System.out.println("请输入要插入的员工工号");
String num3 = in.next();
if (sm.isExist(num3)) {
System.out.println("该工号已存在!");
break;
}
System.out.println("请输入姓名、职位、基本工资、绩效(空格结束,回车确认插入)");
String name = in.next();
String place = in.next();
int wage = in.nextInt();
int grade = in.nextInt();
Worker newS = sm.new Worker(name, num3, place, wage,grade);
sm.insertTailer(newS);
System.out.println("添加成功!");
System.out.println("***********************************");
System.out.println();
case 5:
sm.display();
break;
case 6:
sm.sortTotal();
sm.display();
break;
case 0:
System.out.println("系统已退出!");
System.exit(0);
break;
default:
System.out.println("输入超出范围,请重新输入");
// menu = in.nextInt();
}
/*
*
*/
}
in.close();
}
}
菜单函数
//菜单
public static void printMenu(){
System.out.println("你好!");
System.out.println("1. 创建");
System.out.println("2. 插入");
System.out.println("3. 删除");
System.out.println("4. 查找");
System.out.println("5. 打印");
System.out.println("6. 排序");
System.out.println("0. 退出");
System.out.println("请根据您的需要,输入0~6中相应的数字");
}
文件读取函数出了问题,不会解决,注释着了,目前的程序依然是在编译器内输入数据
public static class sFile{
public static void W1(Worker m) {
String text = "Java:)";
try {
FileWriter fw = new FileWriter("c://worker.txt");
fw.write(m+"\n");
// fw.write(m);
fw.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
//读取函数
public static void R1(String filename , lh4 w) {
try {
Scanner sc = new Scanner(new File (filename));//平行src
while(sc.hasNextLine()) {//读取txt文件的一行,一行内容为一个员工的信息,再用split分割
String str = sc.nextLine();
String ss[] = str.split(" ");
String name = ss[0];
String num = ss[1];
String place = ss[2];
int wage = Integer.parseInt(ss[3]);
int grade = Integer.parseInt(ss[4]);
Worker dw = new Worker(name,num,place,wage,grade);//是静态的就new不了
// System.out.println(str);
w.insertTailer(dw);
}
sc.close();
}
catch(FileNotFoundException e) {
e.printStackTrace();
}
}
}
在主函数中的调用还需要学一下
完整代码
import java.util.Scanner;
public class lh4 {
public class Worker{
//名字
private String name;
//工号(注意类型
private String num;
//职位
private String place;
//基本工资
private int wage;
//绩效
private int grade;
//工资+绩效
private int wplusg;
public Worker next;
public Worker(){}
public Worker(String name , String num , String place , int wage , int grade){
this.name=name;
this.num=num;
this.place=place;
this.wage=wage;
this.grade=grade;
this.setWplusg();
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getNum(){
return num;
}
public void setNum(String num){
this.num=num;
}
public String getPlace(){
return place;
}
public void setPlace(String place){
this.place=place;
}
public int getWage(){
return wage;
}
public void setWage(int wage){
this.wage = wage;
this.setWplusg();
}
public int getGrade(){
return grade;
}
public void setGrade(int grade){
this.grade = grade;
this.setWplusg();
}
public int getWplusg(){
return wplusg;
}
public void setWplusg(){
this.wplusg = this.wage+this.grade;
}
/*更新结点信息
* 一个结点包含一个员工的全部信息
*/
public void setMessage(String name , String num , String place , int wage , int grade , int wplusg){
this.name=name;
this.num=num;
this.place=place;
this.wage=wage;
this.grade=grade;
this.setWplusg();
}
public String toString(){
return "姓名:" + this.name + "\t工号:" + this.num + "\t职位:" + this.place + "\t基本工资:" + this.wage + "\t绩效:" + this.grade + "\t工资+绩效" + this.wplusg;
}//toString()返回此对象的字符串表示形式
}
//链表大小
private int size;
//头节点
private Worker head;
public int size(){
return this.size;
}
//构造代码,每次创建对象调用一次,优于构造函数执行
{
this.size = 0;
this.head = null;
}
//无参构造函数,实例化头、尾结点
public lh4(){
this.head = new Worker();
}
//插入(从尾部
public void insertTailer(Worker w){
Worker front = this.head;
if(this.size == 0){
this.head = w;
this.size++;
}else{
while(front != null){
if(front.next == null){
front.next = w;
this.size++;
return;
}
front = front.next;
}
}
}
//录入与否(根据工号
public boolean isExist (String num){
Worker front = this.head;
while(front!=null){
if(num.equals(front.getNum())){
return true;
}
front = front.next;
}
return false;
}
//删除(根据工号
public boolean delete(String num){
Worker front = this.head;
//判断是否删除头结点
if(num.equals(front.getNum())){
this.head = this.head.next;
this.size--;
return true;
}
while(!num.equals(front.next.getNum())){
front = front.next;
}
if(front.next != null){
front.next = front.next.next;
this.size--;
return true;
}
return false;
}
//查询信息(根据工号
public Worker search(String num){
Worker front = this.head;
// System.out.println(num);
// System.out.println(front.getNum());
//头节点时
if(num.equals(front.getNum())){
Worker w = new Worker(front.getName() , num , front.getPlace() , front.getWage() , front.getGrade());
return w;
}
while(front.next != null){
// System.out.println(front.getNum());
front = front.next;
if(num.equals(front.getNum())){
Worker w = new Worker(front.getName() , num , front.getPlace() , front.getWage() , front.getGrade());
return w;
}
}
return null;
}
//降序排序
public void sortTotal(){
Worker front = this.head;
Worker p = front.next;
while(front.next != null &&p.next !=null){
while(p != null){
if(front.getWplusg() < p.getWplusg()){
String name = front.getName();
String num = front.getNum();
String place = front.getPlace();
int wage = front.getWage();
int grade = front.getGrade();
int wplusg = front.getWplusg();
front.setMessage(p.getName(), p.getNum(), p.getPlace(), p.getWage(), p.getGrade(), p.getWplusg());
p.setMessage(name, num, place, wage, grade, wplusg);
}
p=p.next;
}
front = front.next;
p=front.next;
}
if(p.next ==null &&front.getWplusg() < p.getWplusg()){//写在外面,不然两个人的时候排不了序
String name = front.getName();
String num = front.getNum();
String place = front.getPlace();
int wage = front.getWage();
int grade = front.getGrade();
int wplusg = front.getWplusg();
front.setMessage(p.getName(), p.getNum(), p.getPlace(), p.getWage(), p.getGrade(), p.getWplusg());
p.setMessage(name, num, place, wage, grade, wplusg);
}
}
//打印
public void display(){
System.out.println("姓名\t工号\t职位\t基本工资\t绩效\t工资+绩效");
Worker front = this.head;
while(front != null && front.getNum() != null){
System.out.println(front.toString());
front = front.next;
}
if(this.head == null || this.head.getNum() == null){
System.out.println("无员工财务数据!");
}
}
public static void main(String[] args) {
lh4 sm = new lh4();
Scanner in = new Scanner(System.in);
boolean open = true;
while (open) {
printMenu();
int menu = -1;
try {
menu = in.nextInt();
} catch (Exception e) {
// Scanner声明在while循环外时,当第一次出现异常后没有清空Scanner中的数据,会造成无限死循环,因此需要重新在catch里声明Scanner
in = new Scanner(System.in);
}
switch (menu) {
case 1:
System.out.println("请输入工号(回车结束)");
String num = in.next();
if (sm.isExist(num)) {
System.out.println("该工号已存在!");
break;
}
System.out.println("请输入姓名、职位、基本工资、绩效(空格结束,回车确认插入)");
try {
String name = in.next();
String place = in.next();
int wage = in.nextInt();
int grade = in.nextInt();
Worker newS = sm.new Worker(name, num, place, wage,grade);
sm.insertTailer(newS);
System.out.println("添加成功!");
System.out.println("***********************************");
System.out.println();
} catch (Exception e) {
System.out.println("数据输入错误!请确认是否是整数!");
in = new Scanner(System.in);
}
break;
case 3:
System.out.println("请输入要删除的员工工号");
String num2 = in.next();
if (sm.delete(num2)) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
System.out.println("***********************************");
System.out.println();
sm.display();
System.out.println("***********************************");
System.out.println();
break;
case 4:
System.out.println("请输入要查询的员工工号");
String num4 = in.next();
Worker selectW = sm.search(num4);
// System.out.println("姓名\t工号\t职位\t基本工资\t绩效\t工资+绩效");
System.out.println(sm.search(num4));
if (selectW == null) {
System.out.println("无此员工!");
} else {
// sm.R1();
// System.out.println(selectW.toString());
}
System.out.println("***********************************");
System.out.println();
break;
case 2:
System.out.println("请输入要插入的员工工号");
String num3 = in.next();
if (sm.isExist(num3)) {
System.out.println("该工号已存在!");
break;
}
System.out.println("请输入姓名、职位、基本工资、绩效(空格结束,回车确认插入)");
String name = in.next();
String place = in.next();
int wage = in.nextInt();
int grade = in.nextInt();
Worker newS = sm.new Worker(name, num3, place, wage,grade);
sm.insertTailer(newS);
System.out.println("添加成功!");
System.out.println("***********************************");
System.out.println();
case 5:
sm.display();
break;
case 6:
sm.sortTotal();
sm.display();
break;
case 0:
System.out.println("系统已退出!");
System.exit(0);
break;
default:
System.out.println("输入超出范围,请重新输入");
// menu = in.nextInt();
}
/*
*
*/
}
in.close();
}
//菜单
public static void printMenu(){
System.out.println("你好!");
System.out.println("1. 创建");
System.out.println("2. 插入");
System.out.println("3. 删除");
System.out.println("4. 查找");
System.out.println("5. 打印");
System.out.println("6. 排序");
System.out.println("0. 退出");
System.out.println("请根据您的需要,输入0~6中相应的数字");
}
}
参考:https://blog.youkuaiyun.com/mr_zql/article/details/102471977?spm=1001.2014.3001.5506
原文为学生成绩管理系统,并且有部分函数出现问题,在本文章代码中已修改和调整