数据结构实验—宿舍管理系统(C,Python,Java三种代码版本)

news2024/11/26 0:52:50

目录

 实验课程

实验内容

数据结构类型定义

模块划分

(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("无效选项,请重新输入。");
            }
        }
    }
}

测试数据及结果

 

 实验总结

哈哈,到了这里就得你们自己写喽 

喜欢的小伙伴记得点个关注,给个三连呐~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1288531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C-11练习题

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 1,在C语言中,合法的长整型常数是(&#xff09; A. OxOL B. 4962710M C. 324562& D. 216D 2,设有定义: int a[10],*pa6,*q…

封装PoiExcelUtils

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 为什么要封装PoiExcelU…

Python实现FA萤火虫优化算法优化卷积神经网络回归模型(CNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

基于c++版本的数据结构改-python栈和队列思维总结

##栈部分-&#xff08;叠猫猫&#xff09; ##抽象数据类型栈的定义&#xff1a;是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子&#xff0c;我们首先要把最上面的盘子依次拿走&#xff0c;才可以继续拿下面的盘子&…

python+django企业物流配送管理系统a3t2w

本物流管理系统采用python技术&#xff0c;Mysql数据库开发&#xff0c;充分保证了系统稳定性、完整性。 物流管理系统的设计与实现的设计思想如下&#xff1a; 1、操作简单方便、系统界面安全良、简单明了的页面布局、方便查询物流管理系统相关信息。 2、即时可见&#xff1…

Ubuntu18.04 本地安装CVAT标注工具

写在前面&#xff1a; 1、如果直接clone最新版本的cvat&#xff0c;python版本最好安装3.8的&#xff0c;因为其中部分代码的语法只有高版本的python才可以支持。 2、安装完成以后本地登陆可能出现"cannot connect to cvat server"的错误&#xff0c;可以从Cannot …

全面解决Error: Uncaught SyntaxError: Invalid Unicode escape sequence

是因为.js文件中的路径转义&#xff08;\&#xff09;错误&#xff0c;可能是windows内的相对路径放到linux中有问题 直接看图&#xff1a; (上面是修改后的&#xff0c;下面的则是原来的) 解决方式&#xff1a; 先在报错浏览器按f12打开调试&#xff0c;选择console窗口查看…

c++函数模板STL详解

函数模板 函数模板语法 所谓函数模板&#xff0c;实际上是建立一个通用函数&#xff0c;其函数类型和形参类型不具体指定&#xff0c;用一个虚拟的类型来代表。这个通用函数就称为函数模板。 凡是函数体相同的函数都可以用这个模板来代替&#xff0c;不必定义多个函数&#xf…

pre标签展示代码块

pre样式 添加背景色、边框、以及调整了字体大小。 pre { border: 1px solid #999; page-break-inside: avoid; display: block; padding: 3px 3px 2px; margin: 0 0 10px; font-size: 13px; line-height: 20px; word-break: break-all; word-wrap: break-word; /* white-space:…

​HTML代码混淆技术:原理、应用和实现方法详解

​HTML代码混淆技术&#xff1a;原理、应用和实现方法详解 HTML代码混淆是一种常用的反爬虫技术&#xff0c;它可以有效地防止爬虫对网站数据的抓取。本文将详细介绍HTML代码混淆技术的原理、应用以及实现方法&#xff0c;帮助大家更好地了解和运用这一技术。 一、HTML代码混淆…

C++ 指针进阶

目录 一、字符指针 二、指针数组 三、数组指针 数组指针的定义 &数组名 与 数组名 数组指针的使用 四、数组参数 一维数组传参 二维数组传参 五、指针参数 一级指针传参 二级指针传参 六、函数指针 七、函数指针数组 八、指向函数指针数组的指针 九、回调函…

stm32项目(11)——基于stm32的俄罗斯方块游戏机

1.功能设计 使用stm32f103zet6平台&#xff0c;以及一块LCD屏幕&#xff0c;实现了一个俄罗斯方块游戏机。可以用按键调整方块的位置、还可以控制方块下降的速度&#xff01; 2.视频演示 俄罗斯方块 3.俄罗斯方块发展史 俄罗斯方块是一种经典的拼图游戏&#xff0c;由苏联俄罗…

隧道施工废水工艺设备需要哪些

隧道施工废水工艺设备是保障隧道施工过程中废水处理的关键装备。它们能够有效处理施工废水中的悬浮物、悬浮油、重金属等污染物&#xff0c;确保废水排放符合相关环保标准。以下是隧道施工废水工艺设备常见的几种类型&#xff1a; 1. 隧道施工废水沉淀池&#xff1a;沉淀池是废…

销售经理应该具备哪些能力?

销售经理应该具备哪些能力&#xff1f; 俗话说火车跑的快&#xff0c;全靠车头带&#xff0c;这句话虽然有些片面&#xff0c;但是也说明作为团队直接领导的销售经理担当者重要的角色&#xff0c;他们不仅要学会管理自我&#xff0c;更重要的是要管理团队&#xff0c;激发他人…

【开源】基于Vue和SpringBoot的衣物搭配系统

项目编号&#xff1a; S 016 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S016&#xff0c;文末获取源码。} 项目编号&#xff1a;S016&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣…

数字孪生 LNG 终端,海上液化天然气三维可视化

液化天然气 (Liquefied Natural Gas&#xff0c;简称 LNG) 在能源转型过程中被广泛认可为相对较清洁的能源选择。相对于传统的煤炭和石油燃料&#xff0c;LNG 的燃烧过程产生的二氧化碳 (CO2) 排放较低。LNG 的燃烧释放的二氧化碳排放较少&#xff0c;因此对应对气候变化和减少…

深度学习在单线性回归方程中的应用--TensorFlow实战详解

深度学习在单线性回归方程中的应用–TensorFlow实战详解 文章目录 深度学习在单线性回归方程中的应用--TensorFlow实战详解1、人工智能<-->机器学习<-->深度学习2、线性回归方程3、TensorFlow实战解决单线性回归问题人工数据集生成构建模型训练模型定义损失函数定义…

制作木制纹理的黄鹤楼3D模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 黄鹤楼主楼为四边套八边形体、钢筋混凝土框架仿木结构&#xff0c;从…

react新旧生命周期钩子

以下的内容根据尚硅谷整理。 旧生命钩子 辅助理解&#xff1a; 红色框&#xff1a;挂载时生命钩子蓝色框&#xff1a;更新时生命钩子绿色框&#xff1a;卸载时生命钩子 挂载时 如图所示&#xff0c;我们可以看到&#xff0c;在组件第一次挂载时会经历&#xff1a; 构造器&a…

智能优化算法应用:基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.堆优化算法4.实验参数设定5.算法结果6.参考文献7.…