(上一节练习,基于Tcp协议的复杂多线程Socket通信模型)
Java项目练习:第10期
实现一个简单的学生成绩管理系统(60分钟)
需求描述:
基于命令行模拟实现一个简单的学生成绩信息管理系统,要求实现以下功能:
- 设计学生信息类,要求信息包括学号、姓名、成绩等属性;
- 涉及主功能菜单,要求功能涵盖:
- 输入学生信息
- 由姓名查询
- 由学号查询
- 由学号排序(升序)
- 由分数排序(降序)
- 保存学生数据
- 加载学生数据
- 将内存中的集合框架对象进行持久化,下一次运行系统时可直接调用
考察知识点:
- 文件IO操作基础
- 命令行输出控制
- Java集合基础
- 网络编程socket通信
package d20181216;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
class Student implements Serializable {
/**
* 实体类:
*/
private static final long serialVersionUID = 4888503192302777566L;
private String id; // 学号字段
private String name; // 名称
private String age; // 年龄
private String adderss; // 地址
private String score; // 分数
public Student() {
}
// 为了方便封装数据提供了有参构造
public Student(String id, String name, String age, String adderss, String score) {
super();
this.id = id;
this.name = name;
this.age = age;
this.adderss = adderss;
this.score = score;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAdderss() {
return adderss;
}
public void setAdderss(String adderss) {
this.adderss = adderss;
}
}
public class StudentManager {
public static void main(String[] args) throws ClassNotFoundException, IOException {
// 程序开始加载本地数据
ArrayList<Student> array = new ArrayList<Student>();
File file = new File("Date.txt");
if (file.exists() && file.length() > 0) {
// 本地数据存在则加载数据(判断大小是因为,如果空文件会报空指针异常)
ArrayList<Student> list = load();
array = list;
} else {
// 如果本地不存在数据,则创建文件
file.createNewFile();
}
while (true) {
// 主界面 1.打印表头 2.输入信息 3.
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退出");
// 录入信息
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要选择的功能:");
String choice = sc.nextLine();
// 选择
switch (choice) {
case "1":
// 1查询所有学生
findAllStudent(array);
break;
case "2":
// 2增加学生
addStudent(array);
store(array);
break;
case "3":
// 3根据学号查询
selectById(array);
break;
case "4":
// 按学号排序查询
orderById(array);
break;
case "5":
// 5按照分数排序查询
orderByScore(array);
break;
case "6":
// 退出
store(array);
System.out.println("谢谢你的使用");
System.exit(0);
break;
default:
System.out.println("此功能暂未开放");
break;
}
}
}
// 根据分数排序
private static void orderByScore(ArrayList<Student> array) {
if (array.size() <= 0) {
System.out.println("数据库为空!!");
return;
}
// 为了保护原始数据,采用克隆副本进行排序
List<Student> cList = (ArrayList<Student>) array.clone();
// 排序按照分数
Collections.sort(cList, new Comparator<Student>() {
public int compare(Student s1, Student s2) {
Double id1 = new Double(s1.getScore());
Double id2 = new Double(s2.getScore());
Integer result = id1 > id2 ? 1 : id1 < id2 ? -1 : 0;
return result;
}
});
// 打印输出分数
System.out.println("学号\t\t姓名\t年龄\t地址\t成绩");
for (int i = 0; i < cList.size(); i++) {
Student st = cList.get(i);
System.out.println(st.getId() + "\t\t" + st.getName() + "\t" + st.getAge() + "\t" + st.getAdderss() + "\t"
+ st.getScore());
}
}
// 根据学号排序
private static void orderById(ArrayList<Student> array) {
if (array.size() <= 0) {
System.out.println("数据库为空!!");
return;
}
List<Student> cList = (ArrayList<Student>) array.clone();
// Collections.copy(array, cList);
Collections.sort(cList, new Comparator<Student>() {
public int compare(Student s1, Student s2) {
Integer id1 = Integer.parseInt(s1.getId());
Integer id2 = Integer.parseInt(s2.getId());
Integer result = id1 > id2 ? 1 : id1 < id2 ? -1 : 0;
return result;
}
});
System.out.println("学号\t\t姓名\t年龄\t地址\t成绩");
for (int i = 0; i < cList.size(); i++) {
Student st = cList.get(i);
System.out.println(st.getId() + "\t\t" + st.getName() + "\t" + st.getAge() + "\t" + st.getAdderss() + "\t"
+ st.getScore());
}
}
// 根据学号查询
private static void selectById(ArrayList<Student> array) {
System.out.println("请输入要查询的学号");
Scanner sc = new Scanner(System.in);
String id = sc.nextLine();
if (id == null) {
System.out.println("输入为空!");
return;
}
if (array.size() <= 0) {
System.out.println("数据库为空!!");
return;
}
boolean flag = false;
Student st = null;
for (int i = 0; i < array.size(); i++) {
st = array.get(i);
if (id.equals(st.getId())) {
flag = true;
break;
}
}
if (flag) {
System.out.println(st.getId() + "\t\t" + st.getName() + "\t" + st.getAge() + "\t" + st.getAdderss());
} else {
System.out.println("数据库中未查询到数据!请修改学号");
}
}
// 存储数据
public static void store(ArrayList<Student> array) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Date.txt"));
oos.writeObject(array);
oos.flush();
oos.close();
}
// 加载数据:
public static ArrayList<Student> load() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Date.txt"));
Object obj = ois.readObject();
ois.close();
ArrayList<Student> list = (ArrayList<Student>) obj;
return list;
}
// 查询所有学生信息方法
public static void findAllStudent(ArrayList<Student> array) {
if (array.size() <= 0) {
System.out.println("当前管理系统暂时没有信息");
} else {
System.out.println("学号\t\t姓名\t年龄\t地址\t成绩");
for (int i = 0; i < array.size(); i++) {
Student st = array.get(i);
System.out.println(st.getId() + "\t\t" + st.getName() + "\t" + st.getAge() + "\t" + st.getAdderss()
+ "\t" + st.getScore());
}
}
}
// 添加学生信息的方法
public static void addStudent(ArrayList<Student> array) {
// 键盘录入信息
Scanner sc = new Scanner(System.in);
String id;
while (true) {
System.out.println("请输入学号");
boolean flag = false;
id = sc.nextLine();
// 添加判断是否已经有了这个学号
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
String userId = s.getName();
if (userId.equals(id)) {
flag = true;
break;
}
}
if (flag == true) {
System.out.println("当前学号已经被占用,请重新输入");
// continue;
} else {
break;
}
}
System.out.println("请输入姓名");
String name = sc.nextLine();
System.out.println("请输入年龄");
String age = sc.nextLine();
System.out.println("请输入住址");
String adderss = sc.nextLine();
System.out.println("请输入成绩");
String score = sc.nextLine();
// 创建学生对象
Student st = new Student(id, name, age, adderss, score);
// 添加到集合中
array.add(st);
}
}
(完结)