这是小生第一次发表博客,比较紧张哈哈哈。
小生是一名Java初学者,经过一两个月的学习,对Java基础和Java面向对象的思想有一定的掌握,并使用数组的方式,结合所学知识,写出来这一款Java版学生管理系统,可能写的不是特别好,之前也写过C、Python版本的学生管理系统,可能受到了前者影响,所以就能快速的写出来一款Java版,如果写的不好,还希望大家能够指点指点,我会改进,哈哈哈。
这边小生采用的是Jetbrians中的Intellij IDEA和Clion,Clion我们知道主要是用来C/C++开发的,那这里主要使用它来完成由Java通过JNI技术之后传过来的.h的头文件,对头文件里面需要由C完成的函数功能实现进行处理,因为我们知道Java是与平台无关的语言,加上Java本身也无法操作底层,当初小生在寻找Java的某部分函数时因找不到,所以顺便学习了JNI技术的使用,不过JNI技术确实挺好用的,还顺便巩固了C。
那么总体项目目录大致就是这样。
看起来Development_Student_System包下看起来确实有点杂,但是为了类与类之间能够快速引用,小生也是不得已哈哈哈,那大家可以看到Development_Student_System包下有两个.dll文件,这两个就是由C完成的函数功能,然后通过动态链接库的方式进行封装到.dll文件给Java使用,而Development_Student_System_Development.h头文件就是由JNI技术生成的,并在Clion里面进行处理。
那么Test_Development_Student包下的Test类,则是程序开始的主类。
package Test_Development_Student;
import Development_Student_System.Development;
public class Test {
@SuppressWarnings("all")
public static void main(String... args) {
while (true){
Development.start();
}
}
}
然后通过循环进入到Development类的函数start,那么就是直接进入到Development类中。
package Development_Student_System;
import System_Student.Student;
import java.util.Scanner;
public class Development {
static {
// 使用JNI技术调用C
/*
因小生的文件目录跟大家是不一样的,所以若使用的话,
请将Java_Project包及包下的所有文件,一起放在一个目录下
并使用System.getProperty("user.id"),获取当前文件的目录
并与Java_Project包拼接,例:
System.load(System.getProperty("user.id") + "\\Java_Project\\" +
"src\\Development_Student_System\\clear.dll");
System.load(System.getProperty("user.id") + "\\Java_Project\\" +
"src\\Development_Student_System\\time.dll");
如果不行,直接将文件全路径写在System.load()函数中
System.load("某盘:\\xx\\xx\\...\\Java_Project\\" +
"src\\Development_Student_System\\clear.dll");
System.load("某盘:\\xx\\xx\\...\\Java_Project\\" +
"src\\Development_Student_System\\time.dll");
*/
System.load(System.getProperty("user.id") + "\\Java_Project\\" +
"src\\Development_Student_System\\clear.dll");
System.load(System.getProperty("user.id") + "\\Java_Project\\" +
"src\\Development_Student_System\\time.dll");
}
public final native void clear(); // 调用C程序的清除
public final native void time(); // 调用C程序的时间
protected Development(){} // 除了本包中的本类和子类、其他类可以创建,其他不允许
protected static Student[] student = null; // 静态数组
public static final Scanner
scanner = new Scanner(System.in); // 静态常量输入流
private static final Development development = new Development(); // 私有的静态常量对象
// 使用创建学生类对象
private final Creat_Student creat_student_at = new Creat_Student();
// 使用修改学生类对象
private final Update_Student update_student_at = new Update_Student();
public boolean number_flag = false;
public boolean creat_flag = false;
public int index = 0; // 学生当前个数
boolean delete_index_zero = false; // 当删除学生全部信息后,索引为0时
boolean delete_function_execution = false; // 当删除函数执行时
@SuppressWarnings("all")
public static final void enter_exit(){
while (true){
System.out.println();
System.out.print("输入0退出:");
if (scanner.hasNextInt()){
if (scanner.nextInt() == 0){
development.time();
development.clear();
break;
}
}else {
scanner.next();
}
}
}
@SuppressWarnings("all")
private static int print_main(){
// 打印主菜单
development.clear();
System.out.println("-----------Welcome To The Student Management System-----------");
System.out.println("1. Create Student");
System.out.println("2. Update Student");
System.out.println("3. Delete Student");
System.out.println("4. Select Student");
System.out.println("5. Number Of Students");
System.out.println("6. Exit System");
System.out.print("input:");
if (scanner.hasNextInt()){
int number = scanner.nextInt();
int zero_false_or_true = number != 0 ? number : 0;
return zero_false_or_true;
}else {
String next = scanner.next();
return -1;
}
}
public static void start(){
int number = print_main();
if (number != -1){
if (!(number < 1) && !(number >= 7)){
switch (number){
case 1:
development.creat_flag = development.creat_student();
break;
case 2:
development.update_student();
break;
case 3:
development.delete_student();
break;
case 4:
development.select_student();
break;
case 5:
development.number_flag = development.number_of_students();
break;
default:
System.out.println("感谢您的使用,再见!");
development.time();
System.out.println("两秒后退出系统");
development.time();
development.clear();
scanner.close(); // 关闭输入流
System.exit(0); // 退出系统
}
}else {
System.err.println(String.format("%d 不在(1 - 6)的范围内", number));
development.time();
development.clear();
}
}else {
System.err.println("请检查输入的是否不是整数!");
System.out.println("请重新输入(两秒后刷新)");
development.time();
development.clear();
}
}
// 创建学生信息
public boolean creat_student(){
development.clear();
if (development.number_flag){
// 全部信息被删除后
if (development.delete_index_zero){
for (int i = 0; i < development.index; i++)
student[i] = new Student();
System.out.println("因数据为空,正在为您重新创建信息录入表");
System.out.println("正在创建...");
development.time();
System.out.println("创建成功!正在退出....");
development.time();
development.clear();
development.delete_index_zero = false;
return false;
}
if (development.delete_function_execution)
for (int i = 0; i < development.index + 1; ++i)
if (student[i] == null)
student[i] = new Student();
while (true) {
if (development.index < student.length) {
this.creat_student_at.creat_student_applet(development.index, scanner,
student, development);
development.index++;
System.out.print("是否继续 (1.是 2.否):");
String next = scanner.next();
if ("2".equals(next)){
System.out.println("正在退出....");
development.time();
break;
}
development.clear();
} else {
development.time();
System.out.println("无法录入,原因如下:");
System.out.println();
System.out.println(String.format("学生总数为:%d", student.length));
System.err.println(String.format("当前学生个数为:%d", development.index));
System.out.println("已经达到您最开始输入的学生个数,若需要删除个别学生可转到3选项中" +
",若需要重新录取学生个数,可选择5选项中");
enter_exit();
break;
}
}
return true;
}else {
System.err.print("请先输入要录入的学生个数");
enter_exit();
return false;
}
}
// 修改学生信息
public void update_student(){
development.clear();
if (development.creat_flag)
{
this.update_student_at.update_student_applet
(development.index, scanner, development, student);
}else {
System.err.print("请先创建学生");
enter_exit();
}
}
@SuppressWarnings("all")
// 删除学生信息
public void delete_student(){
development.clear();
if (development.creat_flag){
System.out.print("请输入要删除的学生序号:");
if (scanner.hasNextInt()){
int number = scanner.nextInt();
if (number <= 0){
System.out.println("请重新进入....");
}else {
if (number <= development.index) {
number -= 1;
System.out.print("一旦删除,就无法恢复!是否删除?(y / 其他字符):");
String yes_no = scanner.next();
if ("y".equalsIgnoreCase(yes_no)) {
for (int i = number; i < development.index; i++) {
if (i == development.index - 1)
student[i] = null;
else
student[i] = student[i + 1];
}
development.delete_function_execution = true;
System.out.println("正在删除....");
development.time();
System.out.println("删除成功!正在为您跳转....");
development.index--;
if (development.index == 0)
development.delete_index_zero = true;
}else
System.out.println("正在返回....");
}else {
System.out.println(String.format(
"无法删除序号为:%d, 该序号的数据为空~", number
));
enter_exit();
return;
}
}
}else {
String next = scanner.next();
if ("exit".equalsIgnoreCase(next))
System.out.println("正在退出....");
else
System.out.println(next + " 非数字的序号, 请重新进入....");
}
development.time();
development.clear();
}else {
System.err.print("请先创建学生");
enter_exit();
}
}
// 查询学生信息
public void select_student(){
development.clear();
if (development.creat_flag){
for (int i = 0; i < development.index; ++i){
if (student[i] != null)
System.out.println(
String.format("序号: %d 学号: %d 姓名: %s 年龄: %d 年级: %s " +
"班级: %s 座位号: %d", i + 1,
student[i].getID(), student[i].getName(), student[i].getAge(),
student[i].getGrade(), student[i].getClass_grade(),
student[i].getSeat())
);
}
}
else {
if (development.index == 0 && development.delete_index_zero){
System.out.println("数据空啦~");
System.out.println("请重新录入学生信息或者重新录入学生人数哦~");
}else {
System.err.print("请先创建学生");
}
}
enter_exit();
}
// 创建学生个数
public boolean number_of_students(){
development.clear();
if (student == null) {
System.out.print("input students number:");
if (scanner.hasNextInt()) {
int number = scanner.nextInt();
if (number > 0) {
student = new Student[number];
for (int i = 0; i < student.length; i++){
student[i] = new Student();
}
System.out.println("输入成功!");
development.time();
development.clear();
return true;
}else {
System.err.println("不能输入小于等于0的数字");
development.time();
development.clear();
}
} else {
System.err.println("输入的不是整数");
scanner.next();
development.time();
development.clear();
}
return false;
}
System.out.println(String.format("当前学生个数为:%d, 录入学生信息的个数为:%d", student.length, development.index));
System.err.print("是否将学生个数全部清除?并重新录取?(y / 其他字符):");
String yes_no = scanner.next();
if ("y".equalsIgnoreCase(yes_no)){
student = null;
development.index = 0;
System.out.println("数据已清空");
development.time();
System.out.println("两秒后返回");
development.time();
development.clear();
development.creat_flag = false;
return false;
}else {
System.out.println("两秒后返回");
development.time();
development.clear();
}
return true;
}
}
那么接下来就是通过start函数进入到主界面,然后通过用户输入的数字,进入到增删改查任意一个函数中进行对学生信息的处理。
那么学生信息就在Student类中。
package System_Student;
public class Student {
public Student(){}
private int ID; // 学生学号
private String name; // 学生姓名
private int age; // 学生年龄
private String grade; // 学生年级
private String class_grade; // 学生班级
private int seat; // 学生座位号
public void setID(int ID){
this.ID = ID;
}
public int getID(){
return this.ID;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age = age;
}
public int getAge() {
return this.age;
}
public void setGrade(String grade) {
this.grade = grade;
}
public String getGrade(){
return this.grade;
}
public void setClass_grade(String class_grade){
this.class_grade = class_grade;
}
public String getClass_grade(){
return this.class_grade;
}
public void setSeat(int seat){
this.seat = seat;
}
public int getSeat(){
return this.seat;
}
}
但是小生在写创建学生函数的时候,由于小生考虑了多个因素的发生,所以我把创建学生函数里面的内容写到一个新的类:Creat_Student类,然后写一个创建学生信息内部的程序函数,然后将学生信息再次分支写入各个函数之中,主要是应对录取学生信息时会发生的一些问题。
package Development_Student_System;
import System_Student.Student;
import java.util.Scanner;
public class Creat_Student {
protected Creat_Student(){}
/**
函数名根据大小写判断功能实现的是什么,比如: ID就是学号
*/
public void set_student_ID_name_age_grade_class_seat
(Scanner scanner, Student[] student, int index)
{
while (true) {
System.out.print("请输入学生学号:");
if (scanner.hasNextInt()) {
int number = scanner.nextInt();
boolean flag = true;
for (Student num : student){
if (num.getID() == number) {
flag = false;
break;
}
}
if (flag) {
student[index].setID(number);
break;
}else {
System.out.println(String.format("%d 已经存在", number));
}
}else {
String next = scanner.next();
System.out.println(String.format(
"%s 不是一个合法的id", next
));
}
}
}
public void set_student_id_NAME_age_grade_class_seat
(Scanner scanner, int index, Student[] student)
{
while (true) {
System.out.print("请输入学生姓名:");
String name = scanner.next();
boolean flag = true;
for (Student stu : student){
if (name.equalsIgnoreCase(stu.getName())){
flag = false;
break;
}
}
if (flag) {
student[index].setName(name);
break;
}else {
System.out.println(String.format("%s 已存在", name));
}
}
}
public void set_student_id_name_AGE_grade_class_seat
(int index, Scanner scanner, Student[] student)
{
while (true) {
System.out.print("请输入学生年龄:");
if (scanner.hasNextInt()) {
int age = scanner.nextInt();
if (age > 0 && age < 101) {
student[index].setAge(age);
break;
}else {
System.err.println(String.format("%d 不是合法的年龄", age));
}
}else {
String next = scanner.next();
System.out.println(String.format(
"%s 不是一个合法的年龄", next
));
}
}
}
public void set_student_id_name_age_GRADE_class_seat
(int index, Student[] student, Scanner scanner)
{
System.out.print("请输入学生年级:");
String grade = scanner.next();
student[index].setGrade(grade);
}
public void set_student_id_name_age_grade_CLASS_seat
(Student[] student, int index, Scanner scanner)
{
System.out.print("请输入学生班级:");
String class_grade = scanner.next();
student[index].setClass_grade(class_grade);
}
public void set_student_id_name_age_grade_class_SEAT
(Student[] student, Scanner scanner, int index)
{
while (true) {
System.out.print("请输入学生座位号:");
if (scanner.hasNextInt()) {
int seat = scanner.nextInt();
boolean flag = true;
for (Student num : student){
if (num.getSeat() == seat) {
flag = false;
break;
}
}
if (flag) {
student[index].setSeat(seat);
break;
}else {
System.out.println(String.format("%d 已经存在", seat));
}
}else {
String next = scanner.next();
System.out.println(String.format(
"%s 不是一个合法的数字", next
));
}
}
}
// 创建学生信息的内部小程序
public void creat_student_applet(int index, Scanner scanner,
Student[] student, Development development)
{
// 学号
this.set_student_ID_name_age_grade_class_seat(scanner, student, index);
// 姓名
this.set_student_id_NAME_age_grade_class_seat(scanner, index, student);
//年龄
this.set_student_id_name_AGE_grade_class_seat(index, scanner, student);
// 年级
this.set_student_id_name_age_GRADE_class_seat(index, student, scanner);
// 班级
this.set_student_id_name_age_grade_CLASS_seat(student, index, scanner);
// 座位号
this.set_student_id_name_age_grade_class_SEAT(student, scanner, index);
System.out.println("录入成功");
}
}
同样的道理,修改信息的函数,我也创建了一个Update_Student类,因为小生在写的时候发现,修改信息函数的功能很多与创建学生函数的功能很类似,所以为了不重复写多余的代码,小生为此做了很多的代码优化,在修改信息时因为会遇到修改名字什么的,所以为此我在修改信息类中创建了一个Creat_Student类的对象,由此来调用里面的一些函数,从而实现代码的不重复性,
package Development_Student_System;
import java.util.Scanner;
import System_Student.Student;
public class Update_Student {
private final Creat_Student creat_student = new Creat_Student();
protected Update_Student(){}
public void update_student_context(int number, Development development,
Scanner scanner, Student[] student)
{
development.clear();
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.print("请选择:");
if (scanner.hasNextInt()){
int student_select = scanner.nextInt();
if (!(student_select <= 0) && !(student_select >= 7)){
System.out.print("是否修改?1.y 2.n (一旦选择修改就必须修改, 无法回头):");
String yes_no = scanner.next();
if ("y".equalsIgnoreCase(yes_no)) {
System.out.println("正在为您跳转....");
development.time();
development.clear();
switch (student_select) {
case 1:
System.out.println("当前学生学号:" + student[number].getID());
this.creat_student.set_student_ID_name_age_grade_class_seat(
scanner, student, number
);
break;
case 2:
System.out.println("当前学生姓名:" + student[number].getName());
this.creat_student.set_student_id_NAME_age_grade_class_seat(
scanner, number, student
);
break;
case 3:
System.out.println("当前学生的年龄:" + student[number].getAge());
this.creat_student.set_student_id_name_AGE_grade_class_seat(
number, scanner, student
);
break;
case 4:
System.out.println("当前学生的年级:" + student[number].getGrade());
this.creat_student.set_student_id_name_age_GRADE_class_seat(
number, student, scanner
);
break;
case 5:
System.out.println("当前学生的班级:" + student[number].getClass_grade());
this.creat_student.set_student_id_name_age_grade_CLASS_seat(
student, number, scanner
);
break;
case 6:
System.out.println("当前学生的座位号:" + student[number].getSeat());
this.creat_student.set_student_id_name_age_grade_class_SEAT(
student, scanner, number
);
break;
}
System.out.println("修改成功!(两秒自动返回).....");
}else {
System.out.println("正在返回....");
}
}else {
System.err.println("请重新进入....");
}
}else {
String next = scanner.next();
System.err.println(next + " 不是数字,请重新进入...");
}
}
// 修改学生信息的内部小程序
public void update_student_applet(int index, Scanner scanner,
Development development, Student[] student)
{
while (true) {
System.out.print("请输入要修改的序号(若不修改输入exit退出信息修改模式):");
if (scanner.hasNextInt()) {
int number = scanner.nextInt();
if (number == 0)continue;
if (number <= index){
number -= 1; // 数组的索引值
this.update_student_context(number, development, scanner, student);
}else {
System.err.println("当前录取学生信息人数为:" + index +
"而您输入的已经超过了范围,请重新输入");
Development.enter_exit();
return;
}
} else {
String next = scanner.next();
if ("exit".equalsIgnoreCase(next)){
System.out.println("正在退出....");
development.time();
development.clear();
break;
}
System.err.println(next + " 不是合法的序号");
}
development.time();
development.clear();
}
}
}
然后写完代码,整理项目和包管理之后,通过控制台运行Java程序(PS:这里的控制台是指Windows下的控制台,就是通过win+R键之后,输入cmd进入的控制台),就可以完成的运行出一个学生管理系统了,那么在文件中里面也包含了两个.dll文件,那么若需要完整的项目,可以点击下方链接获取Java学生管理系统的完整项目。
百度网盘:
链接:https://pan.baidu.com/s/1lBkxk10Mahb7djk79LAhfA
提取码:4acb
GitHub: