01-java学生成绩管理系统(单链表+java的GUI)

学生成绩管理系统(单链表+java的GUI)

说明:
1.我所说的保存到数据库并没有保存到数据库。保存数据的生命周期仅仅是运行到关闭之间时间。
2.用的是单链表,所涉及的功能有:增加,删除,修改,查看
3.无论你之前输入或者之后修改的学号怎样,查看的时候数据始终会是按照学号从小到大排列。
4.修改数据一项,因为我设置了先要确定要修改数据是否存在然后才能进入修改,所以有个修改前的检测。
4.这是我第一次写博客,写得不好还请包涵。

一.主要代码块的展示

  1. 增加数据
// 增加学生信息
	public void AddStudent(StudentInfo studentInfo) {
		StudentInfo temp = head;// 这样辅助指针temp就指向了头结点
		list = new ArrayList<>();
		boolean bool = false;
		while (true) {
			if (temp.next == null) {
				break;
			}
			if (temp.next.studentnumber > studentInfo.studentnumber) {
				break;
			} else if (temp.next.studentnumber == studentInfo.studentnumber) {
				bool = true;
				break;
			}
			list.add("学号:" + Integer.toString(temp.studentnumber) + "\t姓名:" + temp.name + "\t专业:" + temp.major + "\t分数:"
					+ temp.score + "\n");
			temp = temp.next;
		}
		if (bool) {
			JOptionPane.showMessageDialog(JOptionPane.getRootFrame(),
					"学号" + studentInfo.studentnumber + "重复,本次输入无效!请重新输入!");
		} else {
			JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "恭喜!!!该数据已录入成功", "成功捷报",
					JOptionPane.PLAIN_MESSAGE);
			studentInfo.next = temp.next;
			temp.next = studentInfo;
		}
	}

2.删除数据

// 删除学生信息
	public void DeleteStudent(int studentnumber) {
		StudentInfo temp = head;// 辅助指针
		boolean bool = false;
		while (true) {
			if (temp.next == null) {
				JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "数据库中没有数据", "删除提醒框",
						JOptionPane.PLAIN_MESSAGE);
				break;
			}
			if (temp.next.studentnumber == studentnumber) {
				JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "恭喜您,成功删除学号为" + studentnumber + "的信息!",
						"删除成功框", JOptionPane.PLAIN_MESSAGE);
				// set=new HashSet<>();//每次容器要刷新一下
				list = new ArrayList<>();
				bool = true;
				break;
			}
			temp = temp.next;
			// set.add("学号:"+Integer.toString(temp.studentnumber)+" 姓名:"+temp.name+"
			// 专业:"+temp.major+" 分数:"+temp.score+"\n");
			list.add("学号:" + Integer.toString(temp.studentnumber) + "\t姓名:" + temp.name + "\t专业:" + temp.major + "\t分数:"
					+ temp.score + "\n");
		}
		if (bool) {
			temp.next = temp.next.next;
		}
	}

3.修改前的检测

// 修改前检测输入学生学号是否存在该列表中的方法
	public int BeforModStudentMessageNumber;// 存储打开修改的页面显示内容的学号部分
	public String BeforModStudentMessageName;// 存储打开修改的页面显示内容的姓名部分
	public String BeforModStudentMessageMajor;// 存储打开修改的页面显示内容的专业部分
	public double BeforModStudentMessageScore;// 存储打开修改的页面显示内容的分数部分

	public boolean BeforModStudent(int ChackStudentNumber) {
		try {
			if (ChackStudentNumber > 0 && !Integer.toString(ChackStudentNumber).equals("")) {
				StudentInfo temp = head.next;// 指针,用来找该学生学号
				boolean flag = false;
				while (true) {
					if (temp == null) {
						break;
					} else if (temp.studentnumber == ChackStudentNumber) {
						flag = true;
						break;
					} else {
						temp = temp.next;
					}
				}
				if (flag) {
					BeforModStudentMessageNumber = temp.studentnumber;
					BeforModStudentMessageName = temp.name;
					BeforModStudentMessageMajor = temp.major;
					BeforModStudentMessageScore = temp.score;
					return true;// 如果真的存在就返回true
				}
			}
			return false;
		} catch (Exception e) {
			JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "输入出错,您输入的可能不是数字", "修改失败",
					JOptionPane.PLAIN_MESSAGE);
		}
		return false;// 其他情况返回false
	}

4.修改数据

// 修改学生的信息
	public void ModStudent(int WantModStudentNumber, StudentInfo studentInfo) {
		StudentInfo temp = head.next;// 辅助指针
		boolean bool = false;
		while (true) {
			if (temp == null) {
				JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "数据库中没有数据", "修改提醒框",
						JOptionPane.PLAIN_MESSAGE);
				break;
			}
			if (temp.studentnumber == WantModStudentNumber) {
				list = new ArrayList<>();
				bool = true;
				break;
			}
			temp = temp.next;
		}

		if (bool) {
			list = new ArrayList<>();

			// 先看看会不会学生学号不变的基础上修改
			StudentInfo NowLikeBefore = head.next;
			if (studentInfo.studentnumber == WantModStudentNumber) {
				while (true) {
					if (NowLikeBefore == null) {
						break;
					}
					if (NowLikeBefore.studentnumber == WantModStudentNumber) {
						NowLikeBefore.studentnumber = studentInfo.studentnumber;
						NowLikeBefore.name = studentInfo.name;
						NowLikeBefore.major = studentInfo.major;
						NowLikeBefore.score = studentInfo.score;
						JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "数据库已更新!!!", "修改提醒框",
								JOptionPane.PLAIN_MESSAGE);
						break;
					}
					NowLikeBefore = NowLikeBefore.next;
				}
			} else {
				StudentInfo NowDeleteBefore = head;
				StudentInfo pDelete = head;
				boolean IsDelete = false;
				list = new ArrayList<>();
				while (true) {
					if (pDelete.next == null) {
						break;
					}
					if (pDelete.next.studentnumber == studentInfo.studentnumber) {
						JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "更新失败,您输入的学号可以已存在数据库中。", "修改失败警告",
								JOptionPane.PLAIN_MESSAGE);
						break;
					}
					if (pDelete.next.studentnumber > studentInfo.studentnumber) {
						studentInfo.next = pDelete.next;
						pDelete.next = studentInfo;
						IsDelete = true;
						JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "恭喜!!!该数据已更新", "成功捷报",
								JOptionPane.PLAIN_MESSAGE);
						list = new ArrayList<>();
						break;
					}
					if (pDelete.next.studentnumber < studentInfo.studentnumber && pDelete.next.next == null) {
						studentInfo.next = pDelete.next.next;
						pDelete.next.next = studentInfo;
						IsDelete = true;
						JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "恭喜!!!该数据已更新", "成功捷报",
								JOptionPane.PLAIN_MESSAGE);
						list = new ArrayList<>();
						break;
					}
					list.add("学号:" + Integer.toString(pDelete.next.studentnumber) + "\t姓名:" + pDelete.next.name
							+ "\t专业:" + pDelete.next.major + "\t分数:" + pDelete.next.score + "\n");
					pDelete = pDelete.next;
				}
				if (IsDelete) {
					list = new ArrayList<>();
					while (true) {
						if (NowDeleteBefore.next == null) {
							break;
						}
						if (NowDeleteBefore.next.studentnumber == WantModStudentNumber) {
							NowDeleteBefore.next = NowDeleteBefore.next.next;
							break;
						}
						NowDeleteBefore = NowDeleteBefore.next;
					}
					list = new ArrayList<>();
				}
			}

		}
	}

5.查看数据

// 显示学生信息
	public void ShowStudent() {
		StudentInfo temp = head.next;// 辅助指针
		list = new ArrayList<String>();
		if (head.next == null) {
			int value = JOptionPane.showConfirmDialog(JOptionPane.getRootFrame(), "数据库为空,是否去添加学生信息?", "系统提醒",
					JOptionPane.OK_OPTION);
			if (value == 0) {
				new AddStudentFace();
			}
			return;
		}

		while (true) {
			if (temp == null) {
				break;
			}
			list.add("学号:" + Integer.toString(temp.studentnumber) + "\t姓名:" + temp.name + "\t专业:" + temp.major + "\t分数:"
					+ temp.score + "\n");
			temp = temp.next;
		}
		int size = list.size();
		strings = new String[size];
		for (int i = 0; i < size; i++) {
			strings[i] = list.get(i);
		}
		Arrays.sort(strings);
		new ShowStudentFace().jTextArea.append("当前数据库中有" + list.size() + "个学生数据\n" + list.toString());

	}

二.实现效果图如下

1.主界面
在这里插入图片描述

2.录入界面

在这里插入图片描述

3.删除界面
在这里插入图片描述

4.修改前的检测

在这里插入图片描述

5.这时我们可以去“查看学生信息”看看有哪些数据。(因为当前未输入数据所以有下面显示出现)
在这里插入图片描述

6.我们点击是,这时会出现录入信息界面,现在我就在该界面输入几个学生信息(注意:学号为int,分数为float,如果输入其他字符不能录入成功,假如录入不全,会出现错误弹框)。

7.录入完几个同学的信息以后,我们现在就能点击“查看学生信息”了,这时查看界面就会弹出来,如下图。
在这里插入图片描述

8.这时如果要求修改张三的信息,将学号改为20170464。你在修改弹窗中输入20171111,然后按下确定,会出现如下修改界面。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.假如现在要删除王五的信息,我们可以在删除界面输入王五的学号,如果存在就能删除成功,如果不存在就会出现“数据库中没有数据”提示。

在这里插入图片描述
在这里插入图片描述

三.总结

最近在学习算法,觉得链表挺有意思的,于是就想结合java的GUI设计一个图形化的学生成绩管理系统。单纯就是觉得图形化显示出来“高大上”。一开始我先用画图工具画出了大概一个效果,然后我开始写五个界面的代码。分别是
主界面(StudentFace),
录入学生信息界面(AddStudentFace)
删除学生信息界面(DeleteStudentFace)
修改学生信息界面(ModStudentFace)
查看学生信息界面(ShowStudentFace)
这五个类写好之后,写链表代码,链表的增删改查和修改前检测的代码都放在Student的类里面。
怎样使得他们之间能关联起来,我先明确了StudentFace这个大总管的地位,但是大总管只是负责显示用户点击的相关界面,而各个界面的信息是提供给Student的增删改查和修改前的检测去用的。
总之,虽然原理简单,但是让我明白了一个道理,如果你想实现某个效果或者是一时间思路脑子转不过来,你就赶紧去打开画图工具,将自己的想法“画出来”,就像是做几何题,因为画出来远比你想的更了然。

下载链接:点击下载,链接永久有效!

  • 28
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
第一个模块——主函数main()的功能是:根据选的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选。 
   第三个模块——Quit()的功能是:退出选。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的第一个模块——主函数main()的功能是:根据选的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选。 
   第三个模块——Quit()的功能是:退出选。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的男女比例。 男女比例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值