前言
许多初学者刚接触java,觉得最好能做几个小系统,一方面巩固所学,另一方面增强信心。今天学习一个学生管理系统,采用不同的实现方式反复实现,这样符合“复杂的事情简单做,简单的事情重复做,重复的事情用心做 ”原则(参考:http://www.iqiyi.com/w_19s1ui4bfh.html)。
为了化繁为简,这里的学生管理系统包括只涉及三个类:学生类、界面类、方法类。
现在规化为五个版本。
第一版本用数组实现,方法类通过数组实现对学生的增删查改排序统计等操作。
第二版本用java动态数组(这里采用最常用的ArrayList)实现,方法类通过数组实现对学生的增删查改排序统计等操作。
第三版本采用文件实现,,方法类通过对文件读写实现对学生的增删查改排序统计等操作。
第四版本采用数据库实现,方法类通过对数据库语句的调用实现对学生的增删查改排序统计等操作。
第五版本基于第四版本,在第四版本基础上,采用java swing重新构建界面,对命令行界面进行升级。
第一版本到第四版本,学生类、界面类不变,仅工具类有改变。
第五版本与第四版本,学生类、工具类不变,界面类改变。
第一版本
分为三个类:
学生类:属性为学号、姓名、性别、年龄、分数,每个属性生成setter、getter方法。
主界面:采用命令行Scanner类来接收数据,如添加一个学生命令行提示,为学生分配一个数组位置,Stu[number] = new Stu();“添加时要输入学生的学号,姓名,性别,年龄,成绩”,"请输入该学生的学号:"、"请输入该学生的姓名:"、"请输入该学生的性别:"、"请输入该学生的年龄:"、"请输入该学生的成绩:",”Scanner.next()接收字符串,Scanner.nextInt()接收整形数据。
工具类:定义一个数组Stu,初始化长度为100,添加数据时,数组下标加1,删除数据时,数据下标减1,修改数据时,找到数组中相应索引对应的这个学生,修改学生的属性,因为这为对象引应,只需要直接修改。
代码如下:
学生类(stu.java):
package com.jxyy.edu;
public class Stu {
private String stuNum;//学号
private String name;//姓名
private String gender;//性别
private int age;//年龄
private int score;//分数
public Stu() {
super();
}
public String getStuNum() {
return stuNum;
}
public void setStuNum(String stuNum) {
this.stuNum = stuNum;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
界面类(Main.java):
package com.jxyy.edu;
import java.util.*;
public class Main {
/**
* main方法是程序的入口
* @param args
*/
public static void main(String args[]) {
int choice;
System.out.println("这是一个学生信息管理系统,最大容量为100,欢迎您对本系统的使用");
while (true) {
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("7.退出");
System.out.println("请输入你要进行的操作");
Scanner scanner = new Scanner(System.in);
choice = scanner.nextInt();
if (choice == 7)
break;
switch (choice) {
case 1:
Tools.add();
break;// 添加学生信息
case 2:
Tools.show();
break;// 查询学生信息
case 3:
Tools.change();
break;// 修改学生信息
case 4:
Tools.delete();
break;// 删除学生信息
case 5:
Tools.paixu();
break;// 对学生信息排序
case 6:
Tools.query();
break;// 查询学生信息
case 7:
break;// 表示正常程序的关闭,执行的是以下操作:System.exit(0);
}
}
System.out.println("感谢您对本系统的使用,欢迎下次继续使用");
}
}
工具类(Tools.java):
package com.jxyy.edu;
import java.util.Scanner;
public class Tools {
// 定义学生数组,容量为100
static Stu[] Stu = new Stu[100];
// 数据中实际添加学生的下标,每添加一个下标加1,删除时减1,留意下面的add(),delete()
static int number = 0;
static Scanner scanner = new Scanner(System.in);
static void add() {// 添加学生信息
System.out.println("添加时要输入学生的学号,姓名,性别,年龄,成绩");
Stu[number] = new Stu();
System.out.println("请输入该学生的学号:");
Stu[number].setStuNum(scanner.next());
System.out.println("请输入该学生的姓名:");
Stu[number].setName(scanner.next());
System.out.println("请输入该学生的性别:");
Stu[number].setGender(scanner.next());
System.out.println("请输入该学生的年龄:");
Stu[number].setAge(scanner.nextInt());
System.out.println("请输入该学生的成绩:");
Stu[number].setScore(scanner.nextInt());
// 添加成功,下标加1
number++;
System.out.println("添加成功");
}
static void show() {// 展示学生信息
System.out.println("*******************************************");
System.out.println(" 学号 姓名 性别 年龄 成绩");
for (int i = 0; i < number; i++)
System.out.println(Stu[i].getStuNum() + "\t" + Stu[i].getName() + "\t" + "\t" + Stu[i].getGender() + "\t"
+ Stu[i].getAge() + "\t" + Stu[i].getScore());
System.out.println("*******************************************");
System.out.println();
}
// 这里排序用的是冒泡排序,在练习时,可以使用十大排序的任意一种替换。
static void paixu() {// 对学生信息进行排序
int j;
Stu temp = new Stu();
for (int i = 0; i < number; i++) {
for (j = i + 1; j < number; j++)
if (Stu[i].getScore() > Stu[j].getScore()) {
temp = Stu[i];
Stu[i] = Stu[j];
Stu[j] = temp;
}
}
System.out.println("排序完成,选择”学生信息查看“进行查看");
}
static void change() {// 改变学生信息
System.out.println("请输入要修改信息的学生学号");
String Stunumber = scanner.next();
for (int i = 0; i < number; i++) {
if (Stunumber.equals(Stu[i].getStuNum())) {
System.out.println("请输入要修改的学生的信息,学号,姓名,性别,年龄,分数");
Stu[i].setStuNum(scanner.next());
Stu[i].setName(scanner.next());
Stu[i].setGender(scanner.next());
Stu[i].setAge(scanner.nextInt());
Stu[i].setScore(scanner.nextInt());
break;
}
if (number == i)
System.out.println("对不起查无此人");
}
}
static void query() {// 查询
System.out.println("请输入要查询的学生学号");
String Stunumber = scanner.next();
int i;
for (i = 0; i < number; i++) {
if (Stunumber.equals(Stu[i].getStuNum())) {
System.out.println("*******************************************");
System.out.println(" 学号 姓名 性别 年龄 成绩");
System.out.println(Stu[i].getStuNum() + "\t" + Stu[i].getName() + "\t" + "\t" + Stu[i].getGender()
+ "\t" + Stu[i].getAge() + "\t" + Stu[i].getScore());
System.out.println("*******************************************");
}
}
if (number == i)
System.out.println("对不起查无此人");
}
static void delete() {// 删除学生信息
System.out.println("请输入要删除信息的学生学号");
String Stunumber = scanner.next();
int i;
for (i = 0; i < number; i++) {
if (Stunumber.equals(Stu[i].getStuNum()))
break;
if (number == i)
System.out.println("对不起查无此人");
}
for (; i < number - 1; i++) {
Stu[i] = Stu[i + 1];
}
number--;
System.out.println("删除完成");
}
}
难点讲解:
可以看出学生类非常简单,只要写出相应的属性,可以用工具自动生成setter、getter方法。
界面类使用到循环语句while-true ,选择语句switch-case,非常简单。
工具类定义了一个数据,初始化了数组的长度,用了一个下标记录数组中实际学生实例的个数,当添加学生(add()方法)时,下标加1,当删除学生(delete()方法)时,下标减1。删除学生时,注意:
for (; i < number - 1; i++) {
Stu[i] = Stu[i + 1];
}
这几行代码的意思是,当删除指定下标的数据时,删除的下标不能空着,指向新的学生实例,而这个新的学生实例就是Stu[i+1],以此类推,i之后每一个下标都推向它的下一个学生实例,故用到循环语句表示。
在排序方法(paixu()方法)中,这里排序用的是冒泡排序,在练习时,可以使用十大排序的任意一种替换。参考:十大经典排序算法最强总结(含JAVA代码实现),https://www.cnblogs.com/guoyaohua/p/8600214.html。