目录
实验课程
实验内容
数据结构类型定义
模块划分
(C语言)详细代码设计
(python)详细代码设计
(Java)详细代码设计
测试数据及结果
实验总结
实验课程
课程名称:数据结构
实验名称:宿舍管理查询系统
实验目的:掌握数据结构的两种基本技术:查找和排序,根据实际情况选择效率较高的算法解决应用问题。
实验条件:计算机一台,Visual C++6.0
实验内容
问题描述
为宿舍管理人员设计一个宿舍管理查询系统, 程序采用交互工作方式,完成下列功能:
(1)建立合适的数据结构作为查找表并输入数据;
数据分别按关键字姓名、学号、房号进行排序(所学排序算法任选一种效率较高的算法);
(2)设计查询菜单,按指定关键字姓名、学号、房号进行查询并输出结果,要求查询采用效率较高的算法实现;
(3)可以连续查询;
数据结构类型定义
struct student{
char name[20]; //姓名
char num[20]; //学号
char room[20]; //宿舍号
};
struct RoomSystem{
struct student allStudentdata[60]; //存储学生信息的数组
int size; //系统中学生信息的数量
};
模块划分
void addStudent(struct RoomSystem* system);//添加学生信息,存进管理系统结构体
void quickSort(struct student student[],int low, int high,const char* key);//快排
int binarySearch(struct student student[],int low, int high,const char* key,const char* value);//二分查找
void searchstudent(struct RoomSystem* RoomSystem,const char* key,const char* value);//查找学生
int main()//主函数
(C语言)详细代码设计
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//学生结构体
struct student
{
//都使用char,后续用strcmp比较
char name[20]; //姓名
char num[20]; //学号
char room[20]; //宿舍号
};
//宿舍管理系统结构体
struct RoomSystem
{
//系统所有学生的数据
struct student allStudentdata[60]; //存储学生信息的数组
int size; //系统中学生信息的数量
};
//添加学生信息,存进管理系统结构体
void addStudent(struct RoomSystem* system){
printf("输入需要添加学生信息的数量:");
int number;
scanf("%d",&number);
for (int i = 1; i <=number; i++){
if(system->size < 60){
struct student* student = &system->allStudentdata[system->size++];
printf("输入第%d名学生信息\n姓名:",i);
scanf("%s", student->name);
printf("学号:");
scanf("%s", student->num);
printf("房号:");
scanf("%s", student->room);
printf("学生信息添加成功\n");
}else{
printf("学生人数已满,无法添加\n");
}
}
}
//查询学生信息
//快排,传入学生数组,0和长度,还有查询值key
void quickSort(struct student student[],int low, int high,const char* key){
if(low<high){
//选取中间点
char dot[30];
int i = low-1;
strcpy(dot,student[high].name);
for(int j = low;j<=high-1;j++){
//比较值,前者小于后者时返回小于0的输
if (strcmp(student[j].name, dot) < 0) {
i++;
// 交换元素
struct student temp = student[i];
student[i] = student[j];
student[j] = temp;
}
}
struct student temp = student[i + 1];
student[i + 1] = student[high];
student[high] = temp;
// 对左右两部分进行递归排序
quickSort(student, low, i, key);
quickSort(student, i + 2, high, key);
}
}
//对学生查询,已经进行了快排,可以使用二分查找提高效率
int binarySearch(struct student student[],int low, int high,const char* key,const char* value){
while (low <= high){
int mid = low +(high-low)/2;
int compare;
if(strcmp(key, "name") == 0){
compare = strcmp(student[mid].name, value);
}else if (strcmp(key, "num") == 0) {
compare = strcmp(student[mid].num, value);
} else if (strcmp(key, "room") == 0) {
compare = strcmp(student[mid].room, value);
}
// 如果关键字值与中间元素的值匹配,则返回中间元素的索引
if (compare == 0) {
return mid;
}
// 如果关键字值小于中间元素的值,则在左半部分继续搜索
if (compare > 0) {
high = mid - 1;
} else {
// 如果关键字值大于中间元素的值,则在右半部分继续搜索
low = mid + 1;
}
}
//未找到,返回-1
return -1;
}
void searchstudent(struct RoomSystem* RoomSystem,const char* key,const char* value){
int result = binarySearch(RoomSystem->allStudentdata, 0, RoomSystem->size - 1, key, value);
if (result != -1) {
// 输出查询结果
printf("\n查询结果:\n姓名: %s\n学号: %s\n房号: %s\n", RoomSystem->allStudentdata[result].name,
RoomSystem->allStudentdata[result].num, RoomSystem->allStudentdata[result].room);
} else {
// 提示未找到匹配结果
printf("未找到该学生信息。\n");
}
}
int main(){
struct RoomSystem roomsystem;
roomsystem.size = 0;
//菜单
while (1) {
// 显示菜单选项
printf("\n1. 添加学生信息\n");
printf("2. 查询学生信息\n");
printf("3. 退出\n");
int choice,num;
// 获取用户选择
printf("请输入选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
addStudent(&roomsystem); // 添加学生信息
break;
case 2: {
printf("\n1. 姓名查询\n2. 学号查询\n3. 房号查询\n"); // 显示查询菜单
printf("输入查询学生的个数:");
scanf("%d",&num);
for (int i = 0; i < num; i++){
int searchChoice; // 获取查询关键字选择
printf("请输入查询关键字:");
scanf("%d", &searchChoice);
char searchValue[50]; // 获取查询值
printf("请输入查询值:");
scanf("%s", searchValue);
// 根据用户选择设置查询关键字
const char* key;
if (searchChoice == 1){
key = "name";
}else if (searchChoice == 2){
key = "num";
} else if (searchChoice == 3){
key = "room";
}else {
// 处理无效的查询关键字
printf("\n无效的查询关键字。\n");
continue;
}
// 使用快速排序算法对数据进行排序
quickSort(roomsystem.allStudentdata, 0,roomsystem.size - 1, key);
// 查询数据,注意传入的是整个结构体,而不是里面的数组
searchstudent(&roomsystem,key,searchValue);
}
break;
}
case 3:
// 退出程序
printf("已退出系统\n");
system("pause");
return 0;
default:
// 处理无效的选项
printf("无效选项,请重新输入。\n");
}
}
system("pause");
return 0;
}
(python)详细代码设计
class Student:
def __init__(self, name, num, room):
self.name = name
self.num = num
self.room = room
class RoomSystem:
def __init__(self):
self.all_student_data = []
self.size = 0
def add_student(room_system):
print("输入需要添加学生信息的数量:")
number = int(input())
for i in range(1, number + 1):
if room_system.size < 60:
name = input(f"输入第{i}名学生信息\n姓名:")
num = input("学号:")
room = input("房号:")
student = Student(name, num, room)
room_system.all_student_data.append(student)
room_system.size += 1
print("学生信息添加成功")
else:
print("学生人数已满,无法添加")
def quick_sort(student_list, key):
if len(student_list) <= 1:
return student_list
pivot_index = len(student_list) // 2
pivot = getattr(student_list[pivot_index], key)
left = [student for student in student_list if getattr(student, key) < pivot]
middle = [student for student in student_list if getattr(student, key) == pivot]
right = [student for student in student_list if getattr(student, key) > pivot]
return quick_sort(left, key) + middle + quick_sort(right, key)
def binary_search(student_list, key, value):
low, high = 0, len(student_list) - 1
while low <= high:
mid = (low + high) // 2
compare_result = getattr(student_list[mid], key) - value
if compare_result == 0:
return mid
elif compare_result > 0:
high = mid - 1
else:
low = mid + 1
return -1
def search_student(room_system, key, value):
sorted_students = quick_sort(room_system.all_student_data, key)
result = binary_search(sorted_students, key, value)
if result != -1:
print("\n查询结果:\n姓名: {}\n学号: {}\n房号: {}".format(
sorted_students[result].name,
sorted_students[result].num,
sorted_students[result].room
))
else:
print("未找到该学生信息。")
def main():
room_system = RoomSystem()
while True:
print("\n1. 添加学生信息")
print("2. 查询学生信息")
print("3. 退出")
choice = int(input("请输入选项:"))
if choice == 1:
add_student(room_system)
elif choice == 2:
print("\n1. 姓名查询\n2. 学号查询\n3. 房号查询")
num = int(input("输入查询学生的个数:"))
for _ in range(num):
search_choice = int(input("请输入查询关键字:"))
search_value = input("请输入查询值:")
key = ""
if search_choice == 1:
key = "name"
elif search_choice == 2:
key = "num"
elif search_choice == 3:
key = "room"
else:
print("\n无效的查询关键字。")
continue
room_system.all_student_data = quick_sort(room_system.all_student_data, key)
search_student(room_system, key, search_value)
elif choice == 3:
print("已退出系统")
break
else:
print("无效选项,请重新输入。")
if __name__ == "__main__":
main()
(Java)详细代码设计
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
class Student {
String name;
String num;
String room;
public Student(String name, String num, String room) {
this.name = name;
this.num = num;
this.room = room;
}
}
class RoomSystem {
ArrayList<Student> allStudentData = new ArrayList<>();
int size = 0;
}
public class DormitoryManagementSystem {
public static void addStudent(RoomSystem roomSystem) {
Scanner scanner = new Scanner(System.in);
System.out.print("输入需要添加学生信息的数量:");
int number = scanner.nextInt();
for (int i = 1; i <= number; i++) {
if (roomSystem.size < 60) {
System.out.printf("输入第%d名学生信息\n姓名:", i);
String name = scanner.next();
System.out.print("学号:");
String num = scanner.next();
System.out.print("房号:");
String room = scanner.next();
Student student = new Student(name, num, room);
roomSystem.allStudentData.add(student);
roomSystem.size++;
System.out.println("学生信息添加成功");
} else {
System.out.println("学生人数已满,无法添加");
}
}
}
public static void quickSort(ArrayList<Student> studentList, final String key) {
Collections.sort(studentList, Comparator.comparing(s -> {
switch (key) {
case "name":
return s.name;
case "num":
return s.num;
case "room":
return s.room;
default:
return "";
}
}));
}
public static int binarySearch(ArrayList<Student> studentList, String key, String value) {
int low = 0;
int high = studentList.size() - 1;
while (low <= high) {
int mid = (low + high) / 2;
int compareResult = switch (key) {
case "name" -> studentList.get(mid).name.compareTo(value);
case "num" -> studentList.get(mid).num.compareTo(value);
case "room" -> studentList.get(mid).room.compareTo(value);
default -> 0;
};
if (compareResult == 0) {
return mid;
} else if (compareResult > 0) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
public static void searchStudent(RoomSystem roomSystem, String key, String value) {
quickSort(roomSystem.allStudentData, key);
int result = binarySearch(roomSystem.allStudentData, key, value);
if (result != -1) {
System.out.printf("\n查询结果:\n姓名: %s\n学号: %s\n房号: %s\n",
roomSystem.allStudentData.get(result).name,
roomSystem.allStudentData.get(result).num,
roomSystem.allStudentData.get(result).room);
} else {
System.out.println("未找到该学生信息。");
}
}
public static void main(String[] args) {
RoomSystem roomSystem = new RoomSystem();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("\n1. 添加学生信息");
System.out.println("2. 查询学生信息");
System.out.println("3. 退出");
System.out.print("请输入选项:");
int choice = scanner.nextInt();
if (choice == 1) {
addStudent(roomSystem);
} else if (choice == 2) {
System.out.println("\n1. 姓名查询\n2. 学号查询\n3. 房号查询");
System.out.print("输入查询学生的个数:");
int num = scanner.nextInt();
for (int i = 0; i < num; i++) {
System.out.print("请输入查询关键字:");
int searchChoice = scanner.nextInt();
System.out.print("请输入查询值:");
String searchValue = scanner.next();
String key;
switch (searchChoice) {
case 1 -> key = "name";
case 2 -> key = "num";
case 3 -> key = "room";
default -> {
System.out.println("\n无效的查询关键字。");
continue;
}
}
searchStudent(roomSystem, key, searchValue);
}
} else if (choice == 3) {
System.out.println("已退出系统");
break;
} else {
System.out.println("无效选项,请重新输入。");
}
}
}
}
测试数据及结果
实验总结
哈哈,到了这里就得你们自己写喽
喜欢的小伙伴记得点个关注,给个三连呐~