(1)主体要求:为宿舍管理人员编写一个宿舍管理软件,程序设计要求为:
A. 采用交互工作方式,功能菜单下可连续操作,直至选择退出
B.建立数据文件 ,数据文件按关键宇(姓名、学号、房号)进行排序(冒泡、选择、插入
排序等任诜一种)
(2)查询菜单:用二分查找实现以下查询功能:
A.按姓名查询
B.按学号杳询
C.按房号查询
(3)其它功能:插入、删除、修改学生信息,每个操作都需打印操作结果
首先,我们需要定义一个类来存储学生信息,包括姓名、学号、房号。
public class Student {
private String name;
private String studentId;
private String dormitoryId;
public Student(String name, String studentId, String dormitoryId) {
this.name = name;
this.studentId = studentId;
this.dormitoryId = dormitoryId;
}
public String getName() {
return name;
}
public String getStudentId() {
return studentId;
}
public String getDormitoryId() {
return dormitoryId;
}
}
然后,我们可以创建一个类来管理宿舍信息,并实现插入、删除、修改学生信息的功能。
import java.util.ArrayList;
import java.util.List;
public class DormitoryManager {
private List<Student> students;
public DormitoryManager() {
students = new ArrayList<>();
}
public void addStudent(Student student) {
students.add(student);
}
public void deleteStudent(String studentId) {
for (int i = 0; i < students.size(); i++) {
if (students.get(i).getStudentId().equals(studentId)) {
students.remove(i);
return;
}
}
}
public void updateStudent(String studentId, Student newStudent) {
for (int i = 0; i < students.size(); i++) {
if (students.get(i).getStudentId().equals(studentId)) {
students.set(i, newStudent);
return;
}
}
}
}
接下来,我们可以创建一个类来实现查询功能,包括按姓名、学号、房号查询。
在这里,我们使用二分查找来实现查询功能,时间复杂度为 $O(\log n)$,其中 $n$ 为学生总数。
import java.util.List;
public class QueryManager {
public static int binarySearch(List<Student> students, String key, int l, int r, Getter getter) {
while (l <= r) {
int mid = l + (r - l) / 2;
int cmp = getter.get(students.get(mid)).compareTo(key);
if (cmp == 0) {
return mid;
} else if (cmp < 0) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return -1;
}
public static Student searchByName(List<Student> students, String name) {
int index = binarySearch(students, name, 0, students.size() - 1, new Getter() {
@Override
public String get(Student student) {
return student.getName();
}
});
return index == -1 ? null : students.get(index);
}
public static Student searchByStudentId(List<Student> students, String studentId) {
int index = binarySearch(students, studentId, 0, students.size() - 1, new Getter() {
@Override
public String get(Student student) {
return student.getStudentId();
}
});
return index == -1 ? null : students.get(index);
}
public static Student searchByDormitoryId(List<Student> students, String dormitoryId) {
int index = binarySearch(students, dormitoryId, 0, students.size() - 1, new Getter() {
@Override
public String get(Student student) {
return student.getDormitoryId();
}
});
return index == -1 ? null : students.get(index);
}
public interface Getter {
String get(Student student);
}
}
最后,我们可以创建一个类来实现交互工作方式,并通过菜单连续操作。
为了方便,我们可以使用 Scanner 类来读取用户的输入。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
DormitoryManager dormitoryManager = new DormitoryManager();
QueryManager queryManager = new QueryManager();
while (true) {
System.out.println("1. 查询");
System.out.println("2. 插入");
System.out.println("3. 删除");
System.out.println("4. 修改");
System.out.println("5. 退出");
System.out.print("请输入你的选择:");
int choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println("1. 按姓名查询");
System.out.println("2. 按学号查询");
System.out.println("3. 按房号查询");
System.out.print("请输入你的选择:");
int queryChoice = scanner.nextInt();
switch (queryChoice) {
case 1:
System.out.print("请输入姓名:");
String name = scanner.next();
Student student = queryManager.searchByName(dormitoryManager.getStudents(), name);
if (student == null) {
System.out.println("未找到学生信息。");
} else {
System.out.println("学生信息如下:");
System.out.println("姓名:" + student.getName());
System.out.println("学号:" + student.getStudentId());
System.out.println("房号:" + student.getDormitoryId());
}
break;
case 2:
System.out.print("请输入学号:");
String studentId = scanner.next();
student = queryManager.searchByStudentId(dormitoryManager.getStudents(), studentId);
if (student == null) {
System.out.println("未找到学生信息。");
} else {
System.out.println("学生信息如下:");
System.out.println("姓名:" + student.getName());
System.out.println("学号:" + student.getStudentId());
System.out.println("房号:" + student.getDormitoryId());
}
break;
case 3:
System.out.print("请输入房号:");
String dormitoryId = scanner.next();
student = queryManager.searchByDormitoryId(dormitoryManager.getStudents(), dormitoryId);
if (student == null) {
System.out.println("未找到学生信息。");
} else {
System.out.println("学生信息如下:");
System.out.println("姓名:" + student.getName());
System.out.println("学号:" + student.getStudentId());
System.out.println("房号:" + student.getDormitoryId());
}
break;
default:
System.out.println("输入无效,请重新输入。");
break;
}
break;
case 2:
System.out.println("请输入学生信息:");
System.out.print("姓名:");
String name = scanner.next();
System.out.print("学号:");
String studentId = scanner.next();
System.out.print("房号:");
String dormitoryId = scanner.next();
dormitoryManager.addStudent(new Student(name, studentId, dormitoryId));
System.out.println("插入成功。");
break;
case 3:
System.out.print("请输入学号:");
studentId = scanner.next();
dormitoryManager.deleteStudent(studentId);
System.out.println("删除成功。");
break;
case 4:
System.out.println("请输入学生信息:");
System.out.print("学号:");
studentId = scanner.next();
System.out.print("姓名:");
name = scanner.next();
System.out.print("房号:");
dormitoryId = scanner.next();
dormitoryManager.updateStudent(studentId, new Student(name, studentId, dormitoryId));
System.out.println("修改成功。");
break;
case 5:
System.out.println("退出系统。");
return;
default:
System.out.println("输入无效,请重新输入。");
break;
}
}
}
}
这样,我们就完成了使用 Java 编写的宿舍管理查询系统。
import java.util.Scanner;
public class DormitoryManager {
// 定义学生信息的结构体
static class Student {
String name;
String id;
String room;
Student(String name, String id, String room) {
this.name = name;
this.id = id;
this.room = room;
}
}
static final int MAX_STUDENT_COUNT = 100;
static Student[] students = new Student[MAX_STUDENT_COUNT];
static int studentCount = 0;
static void addStudent(Student student) {
students[studentCount++] = student;
}
static void deleteStudent(int index) {
// 将要删除的学生信息后面的学生信息往前移动一位
for (int i = index; i < studentCount - 1; i++) {
students[i] = students[i + 1];
}
studentCount--;
}
static void updateStudent(int index, Student student) {
students[index] = student;
}
static int searchStudentByName(String name) {
// 采用二分查找实现
int low = 0;
int high = studentCount - 1;
while (low <= high) {
int mid = (low + high) / 2;
int compareResult = name.compareTo(students[mid].name);
if (compareResult == 0) {
return mid;
} else if (compareResult < 0) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
static int searchStudentById(String id) {
// 采用二分查找实现
int low = 0;
int high = studentCount - 1;
while (low <= high) {
int mid = (low + high) / 2;
int compareResult = id.compareTo(students[mid].id);
if (compareResult == 0) {
return mid;
} else if (compareResult < 0) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
static int searchStudentByRoom(String room) {
// 采用二分查找实现
int low = 0;
int high = studentCount - 1;
while (low <= high) {
int mid = (low + high) / 2;
int compareResult = room.compareTo(students[mid].room);
if (compareResult == 0) {
return mid;
} else if (compareResult < 0) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
static void sortStudents(int sortType) {
// sortType: 0 - 冒泡排序,1 - 选择排序,2 - 插入排序
switch (sortType) {
case 0:
for (int i = 0; i < studentCount; i++) {
for (int j = 0; j < studentCount - i - 1; j++) {
// 按姓名排序
if (students[j].name.compareTo(students[j + 1].name) > 0) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
break;
case 1:
for (int i = 0; i < studentCount; i++) {
int minIndex = i;
for (int j = i + 1; j < studentCount; j++) {
// 按姓名排序
if (students[j].name.compareTo(students[minIndex].name) < 0) {
minIndex = j;
}
}
Student temp = students[i];
students[i] = students[minIndex];
students[minIndex] = temp;
}
break;
case 2:
for (int i = 1; i < studentCount; i++) {
Student temp = students[i];
int j = i - 1;
// 按姓名排序
while (j >= 0 && temp.name.compareTo(students[j].name) < 0) {
students[j + 1] = students[j];
j--;
}
students[j + 1] = temp;
}
break;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
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("0. 退出系统");
int choice = scanner.nextInt();
if (choice == 0) {
break;
}
switch (choice) {
case 1:
System.out.print("请输入学生姓名:");
String name = scanner.next();
System.out.print("请输入学生学号:");
String id = scanner.next();
System.out.print("请输入学生房号:");
String room = scanner.next();
addStudent(new Student(name, id, room));
System.out.println("添加学生信息成功");
break;
case 2:
System.out.print("请输入要删除的学生的序号:");
int index = scanner.nextInt();
if (index >= 0 && index < studentCount) {
deleteStudent(index);
System.out.println("删除学生信息成功");
} else {
System.out.println("无效的序号");
}
break;
case 3:
System.out.print("请输入要修改的学生的序号:");
index = scanner.nextInt();
if (index >= 0 && index < studentCount) {
System.out.print("请输入学生姓名:");
name = scanner.next();
System.out.print("请输入学生学号:");
id = scanner.next();
System.out.print("请输入学生房号:");
room = scanner.next();
updateStudent(index, new Student(name, id, room));
System.out.println("修改学生信息成功");
} else {
System.out.println("无效的序号");
}
break;
case 4:
System.out.print("请输入要查询的学生姓名:");
name = scanner.next();
index = searchStudentByName(name);
if (index >= 0) {
System.out.println("学生信息如下:");
System.out.println("姓名:" + students[index].name);
System.out.println("学号:" + students[index].id);
System.out.println("房号:" + students[index].room);
} else {
System.out.println("没有找到该学生信息");
case 5:
System.out.print("请输入要查询的学生学号:");
id = scanner.next();
index = searchStudentById(id);
if (index >= 0) {
System.out.println("学生信息如下:");
System.out.println("姓名:" + students[index].name);
System.out.println("学号:" + students[index].id);
System.out.println("房号:" + students[index].room);
} else {
System.out.println("没有找到该学生信息");
}
break;
case 6:
System.out.print("请输入要查询的学生房号:");
room = scanner.next();
index = searchStudentByRoom(room);
if (index >= 0) {
System.out.println("学生信息如下:");
System.out.println("姓名:" + students[index].name);
System.out.println("学号:" + students[index].id);
System.out.println("房号:" + students[index].room);
} else {
System.out.println("没有找到该学生信息");
}
break;
case 7:
System.out.print("请输入排序方式(0 - 冒泡排序,1 - 选择排序,2 - 插入排序):");
int sortType = scanner.nextInt();
sortStudents(sortType);
System.out.println("学生信息排序成功");
break;
default:
System.out.println("无效的输入");
break;
}
}
scanner.close();
}
}
import java.io.*;
import java.util.*;
// Student class to represent a student
class Student implements Serializable {
private String name;
private int id;
private int room;
public Student(String name, int id, int room) {
this.name = name;
this.id = id;
this.room = room;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
public int getRoom() {
return room;
}
public void setName(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public void setRoom(int room) {
this.room = room;
}
}
// StudentList class to store a list of students
class StudentList implements Serializable {
private List<Student> students;
public StudentList() {
students = new ArrayList<>();
}
public void addStudent(Student student) {
students.add(student);
}
public void removeStudent(int index) {
students.remove(index);
}
public void modifyStudent(int index, Student student) {
students.set(index, student);
}
public List<Student> getStudents() {
return students;
}
}
// DormitoryManagement class to represent the main program
class DormitoryManagement {
// Method to load the student list from the file
private static StudentList loadStudentList() throws Exception {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("students.dat"))) {
return (StudentList) ois.readObject();
}
}
// Method to save the student list to the file
private static void saveStudentList(StudentList studentList) throws Exception {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("students.dat"))) {
oos.writeObject(studentList);
}
}
// Method to sort the student list by name
private static void sortByName(StudentList studentList) {
studentList.getStudents().sort(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return s1.getName().compareTo(s2.getName());
}
});
}
// Method to sort the student list by id
public void sortById()
{
for (int i=0; i<count-1; i++)
for (int j=i+1; j<count; j++)
if (students[i].getId() > students[j].getId())
{
Student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!