本文是大二时期所写,在我的博客上发布,现在在语雀上再次整理一下,我的博客地址:用JAVA写一个学生管理系统

1.知识铺垫:(非常非常基础的知识)

1.1我们先创建一个Student类

  1. public class Student {
  2. //属性私有是为了保护数据安全
  3. private int sno;
  4. private String name;
  5. private int age;
  6. private String gender;
  7. private int score;
  8. }

1.2然后我们再建立一个HelloStudent的类

  1. public class HelloStudent {
  2. public static void main(String[] args) {
  3. // 根据类创建对象(创建一个叫studentXM的学生对象)
  4. Student studentXm=new Student();
  5. // 当我们Student中private int sno写出public int sno的时候,我们才能通过studentXm.sno属性来使用
  6. studentXm.sno=100;
  7. }
  8. }

2.1我们在Student类中加入Geter() and Seter()方法,使我们用方法来访问这些私有属性

  1. //创建getName()和setName()方法,使我们用方法来访问这些私有属性
  2. public String getName() {
  3. return name;
  4. }
  5. public void setName(String name) {
  6. this.name = name;
  7. }
  8. public int getAge() {
  9. return age;
  10. }
  11. public void setAge(int age) {
  12. this.age = age;
  13. }
  14. public String getGender() {
  15. return gender;
  16. }
  17. public void setGender(String gender) {
  18. this.gender = gender;
  19. }
  20. public int getSno() {
  21. return sno;
  22. }
  23. public void setSno(int sno) {
  24. this.sno = sno;
  25. }
  26. public int getScore() {
  27. return score;
  28. }
  29. public void setScore(int score) {
  30. this.score = score;
  31. }

2.2在HelloStudent的类中,我们就可以通过方法的方式对私有属性的访问

  1. //我们这是通过方法的方式对私有属性的访问
  2. studentXm.setSno(100);
  3. System.out.print(studentXm.getSno());

3.1在Students类中设置toString 方法,使可以直接使用对象

  1. //设置toString 方法,使可以直接使用对象
  2. @Override
  3. public String toString() {
  4. return "Student{" +
  5. "name='" + name + '\'' +
  6. ", age=" + age +
  7. ", gender='" + gender + '\'' +
  8. ", sno=" + sno +
  9. ", score=" + score +
  10. '}';
  11. }
  1. //toString()底层代码如下
  2. public String toString() {
  3. return getClass().getName() + "@" + Integer.toHexString(hashCode());
  4. }

3.2在HelloStudent的类中

  1. // 我们使用了toString方法,可以直接输出studentXm这个对象
  2. studentXm.setSno(100);
  3. studentXm.setName("小明");
  4. System.out.print(studentXm);

2.写学生管理系统

1.Student类如下

  1. public class Student {
  2. // 属性私有是为了数据安全
  3. private String name;
  4. private int age;
  5. private String gender;
  6. private int sno;
  7. private int score;
  8. /**
  9. * 构造器
  10. * 使用有参构造器之前必须生成一个无参构造器
  11. * @param
  12. */
  13. public Student() {
  14. }
  15. // public Student(String name, int age, String gender, int sno, int score) {
  16. public Student(int sno,String name,int age,String gender,int score){
  17. this.sno=sno;
  18. this.name=name;
  19. this.age=age;
  20. this.gender=gender;
  21. this.score=score;
  22. }
  23. public Student(String name, int sno, int score) {
  24. this.name = name;
  25. this.sno = sno;
  26. this.score = score;
  27. }
  28. //设置toString 方法,使可以直接使用对象
  29. @Override
  30. public String toString() {
  31. return "Student{" +
  32. "name='" + name + '\'' +
  33. ", age=" + age +
  34. ", gender='" + gender + '\'' +
  35. ", sno=" + sno +
  36. ", score=" + score +
  37. '}';
  38. }
  39. //创建getName()和setName()方法,使我们用方法来访问这些私有属性
  40. public String getName() {
  41. return name;
  42. }
  43. public void setName(String name) {
  44. this.name = name;
  45. }
  46. public int getAge() {
  47. return age;
  48. }
  49. public void setAge(int age) {
  50. this.age = age;
  51. }
  52. public String getGender() {
  53. return gender;
  54. }
  55. public void setGender(String gender) {
  56. this.gender = gender;
  57. }
  58. public int getSno() {
  59. return sno;
  60. }
  61. public void setSno(int sno) {
  62. this.sno = sno;
  63. }
  64. public int getScore() {
  65. return score;
  66. }
  67. public void setScore(int score) {
  68. this.score = score;
  69. }
  70. }

2.StudentOS类如下

  1. /**
  2. * 这是一个学生的管理系统
  3. * 对学生的管理包括
  4. * 1.添加学生信息
  5. * 2.删除学生信息
  6. * 3.修改学生信息
  7. * 4.查询学生信息
  8. * 5.按照学生分数排序,然后展示学生信息
  9. * 6.展示学生信息
  10. */
  11. public class StudentOs {
  12. //学生数组的最大容量
  13. private int capacity = 10;
  14. //存放学生信息
  15. private Student[] students = new Student[capacity];
  16. //实际存放学生数量
  17. private int size = 0;
  18. //声明当前可用的学生编号
  19. private int nextSno = 10000;
  20. /**
  21. * 动态获取下一个学号
  22. *
  23. * @return
  24. */
  25. public int getNextSno() {
  26. nextSno++;
  27. return nextSno;
  28. }
  29. /**
  30. * 添加学生信息
  31. *
  32. * @param student
  33. */
  34. public void add(Student student) {
  35. //确定容量是否足够
  36. ensureEnough();
  37. //将学生信息添加到系统
  38. students[size] = student;
  39. size++;
  40. }
  41. /**
  42. * 根据索引获取学生信息
  43. *
  44. * @param index
  45. * @return
  46. */
  47. public Student get(int index) {
  48. if (index < 0 || index > size - 1) {
  49. System.out.println("您输入的索引有误,请重新输入");
  50. return null;
  51. }
  52. return students[index];
  53. }
  54. /**
  55. * 确定数组的容量是足够的
  56. */
  57. private void ensureEnough() {
  58. //判断是否已经装满,对数组进行扩容
  59. if (size == capacity) {
  60. //计算扩容后的大小
  61. capacity += capacity / 2;
  62. //创建新的数组
  63. Student[] newStudents = new Student[capacity];
  64. //将原来数组的数据拷贝到新数组
  65. for (int i = 0; i < students.length; i++) {
  66. newStudents[i] = students[i];
  67. }
  68. //将学生数组的地址指向新的数组
  69. students = newStudents;
  70. System.out.println("数组扩容成功,扩容后的大小为[" + capacity + "]");
  71. }
  72. }
  73. /**
  74. * 根据学生删除学生信息
  75. *
  76. * @param sno
  77. */
  78. public void deleteBySno(int sno) {
  79. //首先遍历学生数组(已有)
  80. for (int i = 0; i < size; i++) {
  81. //判断是否学号相等
  82. if (students[i].getSno() == sno) {
  83. //获取被删除学生信息
  84. Student student = students[i];
  85. //学号相同,可以删除数据
  86. for (int j = i; j < size - 1; j++) {
  87. students[j] = students[j + 1];
  88. }
  89. //删除最后一个数据
  90. students[size - 1] = null;
  91. size--;
  92. //打印信息
  93. System.out.println("学生[" + student + "]删除成功");
  94. //删除成功,直接退出循环
  95. return;
  96. }
  97. }
  98. }
  99. /**
  100. * 根据学号修改学生的成绩
  101. *
  102. * @param sno
  103. * @param score
  104. */
  105. public void updateScoreBySno(int sno, int score) {
  106. //首先遍历学生数组(已有)
  107. for (int i = 0; i < size; i++) {
  108. //判断是否学号相等
  109. if (students[i].getSno() == sno) {
  110. //开始修改分数
  111. students[i].setScore(score);
  112. //打印信息
  113. System.out.println("学生[" + students[i] + "]分数修改成功");
  114. //修改成功,直接退出循环
  115. return;
  116. }
  117. }
  118. }
  119. /**
  120. * 根据学生学号查询对应的学生信息
  121. *
  122. * @param sno
  123. * @return
  124. */
  125. public int queryBySno(int sno) {
  126. //首先遍历学生数组(已有)
  127. for (int i = 0; i < size; i++) {
  128. //判断是否学号相等
  129. if (students[i].getSno() == sno) {
  130. //根据学号查询到索引,直接返回
  131. return i;
  132. }
  133. }
  134. return -1;
  135. }
  136. /**
  137. * 展示现有全部学生的信息
  138. */
  139. public void showAll() {
  140. System.out.println("============当前系统学生信息为:============");
  141. //遍历学生信息
  142. for (int i = 0; i < size; i++) {
  143. System.out.println(students[i]);
  144. }
  145. }
  146. /**
  147. * 根据用户输入的用户名和密码验证是否登录成功
  148. *
  149. * @param username
  150. * @param password
  151. * @return
  152. */
  153. public boolean login(String username, String password) {
  154. //假设用户名是admin 密码是123456 就算成功
  155. //“equals()”比较字符串中所包含的内容是否相同。
  156. if ("admin".equals(username) && "123456".equals(password)) {
  157. return true;
  158. }
  159. return false;
  160. }
  161. /**
  162. * 根据学生的分数进行排序
  163. */
  164. public void sortByScore() {
  165. }
  166. }

3.StudentOsMenu类如下:

  1. import java.util.Scanner;
  2. //简单来说Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,他判断读取结束的标示是 空白符;比如空格,比如回车,比如tab…
  3. //next()方法读取到空白符就结束;nextLin()读取到回车结束也就是“\r”
  4. /**
  5. * 学生管理系统
  6. */
  7. public class StudentOsMenu {
  8. public static void main(String[] args) {
  9. //创建一个学生系统对象
  10. StudentOs studentOs = new StudentOs();
  11. //声明一个Scanner 常用于控制台的输入,当需要使用控制台输入时即可调用这个类
  12. Scanner scanner = new Scanner(System.in);
  13. //声明一个变量判断是否退出系统
  14. boolean quitFlag = true;
  15. //声明一个变量存放管理员的登录状态
  16. boolean loginFlag = false;
  17. //死循环进入待机状态
  18. for (; quitFlag; ) {
  19. //显示菜单
  20. System.out.println("-------------学生管理系统-------------");
  21. System.out.println("|1.登录系统");
  22. System.out.println("|2.添加学生信息");
  23. System.out.println("|3.删除学生信息");
  24. System.out.println("|4.修改学生信息-成绩");
  25. System.out.println("|5.查询学生信息-学号");
  26. System.out.println("|6.显示所有学生信息");
  27. System.out.println("|0.退出系统");
  28. System.out.println("------------(请输入要执行的菜单编号)-----------");
  29. //获取用户的输入的菜单
  30. int menu = scanner.nextInt();
  31. if (menu == 1) {
  32. System.out.println("|1.登录系统");
  33. System.out.println("请输入您的用户名!");
  34. String username = scanner.next();
  35. System.out.println("请输入您的密码!");
  36. String password = scanner.next();
  37. //判断用户名和密码是否正确
  38. loginFlag = studentOs.login(username, password);
  39. if (loginFlag) {
  40. System.out.println("恭喜您登录成功!");
  41. } else {
  42. System.out.println("您输入的用户名和密码不匹配,请重新输入【" + username + "】【" + password + "】!");
  43. }
  44. } else if (menu == 0) {
  45. System.out.println("|0.退出系统");
  46. quitFlag = false;
  47. } else if (!loginFlag) {
  48. System.out.println("|警告:您还没有登录学生管理系统,请执行菜单[1]");
  49. } else if (menu == 2) {
  50. addMenu(studentOs, scanner);
  51. } else if (menu == 3) {
  52. deleteMenu(studentOs, scanner);
  53. } else if (menu == 4) {
  54. updateMenu(studentOs, scanner);
  55. } else if (menu == 5) {
  56. queryMenu(studentOs, scanner);
  57. } else if (menu == 6) {
  58. showMenu(studentOs);
  59. } else if (menu == 0) {
  60. System.out.println("|0.退出系统");
  61. quitFlag = false;
  62. } else {
  63. System.out.println("您输入的菜单编号有误,请重新输入!");
  64. }
  65. }
  66. }
  67. /**
  68. * 显示所有的学生信息
  69. *
  70. * @param studentOs
  71. */
  72. private static void showMenu(StudentOs studentOs) {
  73. System.out.println("|6.显示所有学生信息");
  74. studentOs.showAll();
  75. }
  76. /**
  77. * 查询学生信息
  78. *
  79. * @param studentOs
  80. * @param scanner
  81. */
  82. private static void queryMenu(StudentOs studentOs, Scanner scanner) {
  83. System.out.println("|5.查询学生信息-学号");
  84. System.out.println("请输入学生学号!");
  85. int sno = scanner.nextInt();
  86. int index = studentOs.queryBySno(sno);
  87. System.out.println("学号为【" + sno + "】的学生信息为:" + studentOs.get(index));
  88. }
  89. /**
  90. * 修改学生分数
  91. *
  92. * @param studentOs
  93. * @param scanner
  94. */
  95. private static void updateMenu(StudentOs studentOs, Scanner scanner) {
  96. System.out.println("|4.修改学生信息-成绩");
  97. System.out.println("请输入学生学号!");
  98. int sno = scanner.nextInt();
  99. System.out.println("请输入学生成绩!");
  100. int score = scanner.nextInt();
  101. //调用方法
  102. studentOs.updateScoreBySno(sno, score);
  103. }
  104. /**
  105. * 删除学生信息
  106. *
  107. * @param studentOs
  108. * @param scanner
  109. */
  110. private static void deleteMenu(StudentOs studentOs, Scanner scanner) {
  111. System.out.println("|3.删除学生信息");
  112. System.out.println("请输入你要删除的学生学号!");
  113. int sno = scanner.nextInt();
  114. studentOs.deleteBySno(sno);
  115. }
  116. /**
  117. * |2.添加学生信息
  118. *
  119. * @param studentOs
  120. * @param scanner
  121. */
  122. private static void addMenu(StudentOs studentOs, Scanner scanner) {
  123. System.out.println("|2.添加学生信息");
  124. int sno = studentOs.getNextSno();
  125. // java.lang.Math.random()
  126. // 返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。
  127. int score = (int) (Math.random() * 101);
  128. System.out.println("请输入学生姓名!");
  129. String name = scanner.next();
  130. System.out.println("请输入学生年龄!");
  131. int age = scanner.nextInt();
  132. System.out.println("请输入学生性别!");
  133. String gender = scanner.next();
  134. //创建一个新的学生对象
  135. Student student = new Student(sno, name, age, gender, score);
  136. //将学生信息存放到系统
  137. studentOs.add(student);
  138. //开发阶段,每次添加后都显示全部学生信息
  139. studentOs.showAll();
  140. }
  141. }