c语言(不要c++和c#)宿舍管理系统项目工程(分项目头文件 main函数等 )

img

为宿舍管理人员编写一个宿舍管理查询软件。【基本要求】(1)采用交互工作方式;(2)按关键字(姓名、学号、房号)进行排序(冒泡、选择、插入排序等任选一种)。(3)建立查询菜单:(用二分查找实现以下操作)按姓名查询\按学号查询\按房号查询打印任一查询结果(可以连续操作:)

基于new bing加以修改的编写:

img

// head.h

#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED

#define N 100

typedef struct {
    char name[20];
    char id[10];
    char room[10];
} Student;

void bubbleSort(Student* stu, int n);
void selectionSort(Student* stu, int n);
void insertionSort(Student* stu, int n);
int binarySearchByName(char name[], Student* stu, int n);
int binarySearchById(char id[], Student* stu, int n);
int binarySearchByRoom(char room[], Student* stu, int n);
void printResult(int index, Student stu);

#endif // HEAD_H_INCLUDED


selectionSort.c

#include<stdio.h>
#include<string.h>
#include "head.h"

void selectionSort(Student* stu, int n) {
    int i, j, minIdx;
    for (i = 0; i < n - 1; i++) {
        minIdx = i;
        for (j = i + 1; j < n; j++) {
            if (strcmp(stu[j].id, stu[minIdx].id) < 0) {
                minIdx = j;
            }
        }
        Student temp = stu[i];
        stu[i] = stu[minIdx];
        stu[minIdx] = temp;
    }
}

printResult.c

#include<stdio.h>
#include<string.h>
#include "head.h"

void printResult(int index, Student stu) {
    if (index == -1) {
        printf("未查询到该学生信息\n");
    }
    else {
        printf("姓名:%s\n", stu.name);
        printf("学号:%s\n", stu.id);
        printf("房号:%s\n", stu.room);
    }
}

// main.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include "head.h"

int main(){
    Student stuArr[N] = {{"Lucy", "20211101", "101"}, {"Tom", "20211102", "102"}, {"Jack", "20211103", "103"}, {"Bob", "20211104", "104"}};
    int n = 4;
    int choice;
    char queryName[20], queryId[10], queryRoom[10];
    bubbleSort(stuArr, n);
    while(1){
        printf("\n请选择查询方式:\n");
        printf("1.按姓名查询\n");
        printf("2.按学号查询\n");
        printf("3.按房号查询\n");
        printf("4.退出程序\n");
        printf("请输入选项(1~4):");
        scanf("%d", &choice);
        switch(choice){
            case 1:
                printf("请输入要查询的学生姓名:");
                scanf("%s", queryName);
                int indexByName = binarySearchByName(queryName, stuArr, n);
                printResult(indexByName, stuArr[indexByName]);
                break;
            case 2:
                printf("请输入要查询的学生学号:");
                scanf("%s", queryId);
                selectionSort(stuArr, n);
                int indexById = binarySearchById(queryId, stuArr, n);
                printResult(indexById, stuArr[indexById]);
                break;
            case 3:
                printf("请输入要查询的房间号:");
                scanf("%s", queryRoom);
                insertionSort(stuArr, n);
                int indexByRoom = binarySearchByRoom(queryRoom, stuArr, n);
                printResult(indexByRoom, stuArr[indexByRoom]);
                break;
            case 4:
                printf("程序已退出。\n");
                return 0;
            default:
                printf("输入有误,请重新输入!\n");
        }
    }
    return 0;
}


insertionSort.c


#include<stdio.h>
#include<string.h>
#include "head.h"

void insertionSort(Student* stu, int n) {
    int i, j;
    for (i = 1; i < n; i++) {
        Student temp = stu[i];
        j = i - 1;
        while (j >= 0 && strcmp(stu[j].room, temp.room) > 0) {
            stu[j + 1] = stu[j];
            j--;
        }
        stu[j + 1] = temp;
    }
}

bubbleSort.c


#include<stdio.h>
#include<string.h>
#include "head.h"

void bubbleSort(Student* stu, int n) {
    int i, j;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j++) {
            if (strcmp(stu[j].name, stu[j + 1].name) > 0) {
                Student temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
            }
        }
    }
}


binarySearchByRoom.c

#include<stdio.h>
#include<string.h>
#include "head.h"
int binarySearchByRoom(char room[], Student* stu, int n) {
    int left = 0, right = n - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (strcmp(stu[mid].room, room) == 0) {
            return mid;
        }
        else if (strcmp(stu[mid].room, room) < 0) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }
    return -1;
}

binarySearchByName.c

#include<stdio.h>
#include<string.h>
#include "head.h"

int binarySearchByName(char name[], Student* stu, int n) {
    int left = 0, right = n - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (strcmp(stu[mid].name, name) == 0) {
            return mid;
        }
        else if (strcmp(stu[mid].name, name) < 0) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }
    return -1;
}

binarySearchById.c

#include<stdio.h>
#include<string.h>
#include "head.h"
int binarySearchById(char id[], Student* stu, int n) {
    int left = 0, right = n - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (strcmp(stu[mid].id, id) == 0) {
            return mid;
        }
        else if (strcmp(stu[mid].id, id) < 0) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }
    return -1;
}

在这个示例中,仅实现了按姓名查询的功能,你可以根据需求扩展代码以实现按学号和房号查询的功能。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义学生记录结构体
typedef struct {
    char name[50];
    int student_id;
    int room_number;
} StudentRecord;

// 定义宿舍管理记录数组
StudentRecord records[] = {
    {"Alice", 1001, 101},
    {"Bob", 1002, 102},
    {"Charlie", 1003, 103},
    // 添加更多记录...
};

int compare_records(const void *a, const void *b) {
    StudentRecord *recordA = (StudentRecord *)a;
    StudentRecord *recordB = (StudentRecord *)b;
    return strcmp(recordA->name, recordB->name);
}

void sort_records(StudentRecord *records, int count) {
    qsort(records, count, sizeof(StudentRecord), compare_records);
}

int binary_search(StudentRecord *records, int count, char *search_key) {
    int left = 0;
    int right = count - 1;

    while (left <= right) {
        int mid = (left + right) / 2;
        int compare_result = strcmp(records[mid].name, search_key);

        if (compare_result == 0) {
            return mid;
        } else if (compare_result < 0) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return -1;
}

void print_record(StudentRecord record) {
    printf("Name: %s\n", record.name);
    printf("Student ID: %d\n", record.student_id);
    printf("Room Number: %d\n", record.room_number);
    printf("\n");
}

int main() {
    int record_count = sizeof(records) / sizeof(records[0]);
    sort_records(records, record_count);

    int choice;
    char search_key[50];

    while (1) {
        printf("===============\n");
        printf("1. Search by Name\n");
        printf("2. Search by Student ID\n");
        printf("3. Search by Room Number\n");
        printf("4. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);

        if (choice == 4) {
            break;
        }

        printf("Enter the search key: ");
        scanf("%s", search_key);

        int index;

        switch (choice) {
            case 1:
                index = binary_search(records, record_count, search_key);
                break;
            case 2:
                // Perform search by Student ID
                // Implement your code here
                break;
            case 3:
                // Perform search by Room Number
                // Implement your code here
                break;
            default:
                printf("Invalid choice\n");
                continue;
        }

        if (index == -1) {
            printf("No record found\n");
        } else {
            print_record(records[index]);
        }
    }

    return 0;
}

以下是我刚实现的,你看下行不


#include <stdio.h>
#include <string.h>

#define MAX 100

struct student {
    char name[20];
    char id[20];
    char room[20];
} stu[MAX];

int n;

void input() {
    printf("请输入学生人数:");
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        printf("请输入第%d个学生的姓名:", i + 1);
        scanf("%s", stu[i].name);
        printf("请输入第%d个学生的学号:", i + 1);
        scanf("%s", stu[i].id);
        printf("请输入第%d个学生的房号:", i + 1);
        scanf("%s", stu[i].room);
    }
}

void sort() {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (strcmp(stu[j].name, stu[j + 1].name) > 0) {
                struct student temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
            }
        }
    }
}

void search() {
    int choice;
    char key[20];
    while (1) {
        printf("请选择查询方式:\n");
        printf("1.按姓名查询\n");
        printf("2.按学号查询\n");
        printf("3.按房号查询\n");
        printf("4.退出查询\n");
        scanf("%d", &choice);
        if (choice == 4) break;
        printf("请输入关键字:");
        scanf("%s", key);
        int flag = 0;
        for (int i = 0; i < n; i++) {
            if (choice == 1 && strcmp(key, stu[i].name) == 0) {
                printf("%s %s %s\n", stu[i].name, stu[i].id, stu[i].room);
                flag = 1;
            } else if (choice == 2 && strcmp(key, stu[i].id) == 0) {
                printf("%s %s %s\n", stu[i].name, stu[i].id, stu[i].room);
                flag = 1;
            } else if (choice == 3 && strcmp(key, stu[i].room) == 0) {
                printf("%s %s %s\n", stu[i].name, stu[i].id, stu[i].room);
                flag = 1;
            }
        }
        if (!flag) printf("未找到相关信息!\n");
    }
}

int main() {
    input();
    sort();
    search();
    return 0;
}

有用望采纳
我设计了下几个模块:
1、学生信息结构体:用于存储每个学生的姓名、学号、房号和电话号码等信息。
2、文件读取模块:从文件中读取学生信息到内存中,使用动态内存分配以应对不确定的学生数量。
3、学生信息处理模块:显示菜单,按姓名、学号或房号查询,对学生信息进行排序。
4、排序算法:选择一种排序算法实现按姓名、学号或房号排序。

将代码分成了多个项目文件,每个文件负责不同的功能。
在 main.c 文件中,首先读取学生信息文件,并显示菜单等待输入操作。后根据输入,调用相应的学生信息处理函数进行查询、排序或打印全部学生信息。在 student.c 文件中,实现各种学生信息处理函数和排序函数,并且使用标准库提供的字符串操作函数来简化代码实现。最后,在 student.h 文件中,定义了学生信息结构体和各种函数的声明。
以下是源码和注释:
1、main.c:主程序文件


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "student.h"

int main()
{
    int choice;
    char keyword[MAX_NAME_LEN + 1];
    Student *students = NULL;
    int count = read_students_file(&students);

    do {
        show_menu();
        scanf("%d", &choice);
        switch (choice) {
        case 1:
            printf("请输入姓名关键字:");
            scanf("%s", keyword);
            search_students_by_name(students, count, keyword);
            break;
        case 2:
            printf("请输入学号关键字:");
            scanf("%s", keyword);
            search_students_by_id(students, count, keyword);
            break;
        case 3:
            printf("请输入房号关键字:");
            scanf("%s", keyword);
            search_students_by_room(students, count, keyword);
            break;
        case 4:
            print_all_students(students, count);
            break;
        case 5:
            bubble_sort(students, count);
            printf("按姓名排序完成!\n");
            break;
        case 6:
            selection_sort(students, count);
            printf("按学号排序完成!\n");
            break;
        case 7:
            insertion_sort(students, count);
            printf("按房号排序完成!\n");
            break;
        case 8:
            printf("感谢使用宿舍管理查询软件!\n");
            break;
        default:
            printf("无效选择,请重新输入!\n");
            break;
        }
    } while (choice != 8);

    free(students);
    return 0;
}

2、student.h:学生信息相关的头文件


#ifndef STUDENT_H
#define STUDENT_H

#define MAX_NAME_LEN 20
#define MAX_ID_LEN 10
#define MAX_ROOM_NUM_LEN 5
#define MAX_BUFFER_SIZE 100

typedef struct {
    char name[MAX_NAME_LEN + 1];
    char id[MAX_ID_LEN + 1];
    char room_num[MAX_ROOM_NUM_LEN + 1];
    char phone_num[MAX_BUFFER_SIZE + 1];
} Student;

void show_menu();
int read_students_file(Student **students_ptr);
void print_student(const Student *stu);
void print_all_students(const Student *students, int count);
void search_students_by_name(const Student *students, int count, const char *keyword);
void search_students_by_id(const Student *students, int count, const char *keyword);
void search_students_by_room(const Student *students, int count, const char *keyword);
void bubble_sort(Student *students, int count);
void selection_sort(Student *students, int count);
void insertion_sort(Student *students, int count);

#endif

3、student.c:学生信息相关的函数实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "student.h"

static void strip_newline(char *str)
{
    size_t len = strlen(str);
    if (len > 0 && str[len - 1] == '\n') {
        str[len - 1] = '\0';
    }
}

void show_menu()
{
    printf("宿舍管理查询软件\n");
    printf("-----------------\n");
    printf("1. 按姓名查询\n");
    printf("2. 按学号查询\n");
    printf("3. 按房号查询\n");
    printf("4. 显示全部学生信息\n");
    printf("5. 按姓名排序\n");
    printf("6. 按学号排序\n");
    printf("7. 按房号排序\n");
    printf("8. 退出程序\n");
    printf("请选择操作:");
}

int read_students_file(Student **students_ptr)
{
    FILE *fp;
    char buffer[MAX_BUFFER_SIZE];
    int count = 0;

    fp = fopen("students.txt", "r");
    if (fp == NULL) {
        fprintf(stderr, "无法打开文件!\n");
        exit(EXIT_FAILURE);
    }

    while (fgets(buffer, MAX_BUFFER_SIZE, fp)) {
        strip_newline(buffer);
        count++;
        *students_ptr = realloc(*students_ptr, sizeof(Student) * count);
        if (*students_ptr == NULL) {
            fprintf(stderr, "内存分配失败!\n");
            exit(EXIT_FAILURE);
        }
        Student *stu = (*students_ptr) + count - 1;
        char *token = strtok(buffer, ",");
        strncpy(stu->name, token, MAX_NAME_LEN);
        token = strtok(NULL, ",");
        strncpy(stu->id, token, MAX_ID_LEN);
        token = strtok(NULL, ",");
        strncpy(stu->room_num, token, MAX_ROOM_NUM_LEN);
        token = strtok(NULL, ",");
        strncpy(stu->phone_num, token, MAX_BUFFER_SIZE);
    }

    fclose(fp);
    return count;
}

void print_student(const Student *stu)
{
    printf("%s\t%s\t%s\t%s\n", stu->name, stu->id, stu->room_num, stu->phone_num);
}

void print_all_students(const Student *students, int count)
{
    printf("姓名\t学号\t房号\t联系电话\n");
    printf("---------------------------------\n");
    for (int i = 0; i < count; i++) {
        print_student(students + i);
    }
}

void search_students_by_name(const Student *students, int count, const char *keyword)
{
    printf("姓名\t学号\t房号\t联系电话\n");
    printf("---------------------------------\n");
    for (int i = 0; i < count; i++) {
        if (strstr(students[i].name, keyword)) {
            print_student(students + i);
        }
    }
}

void search_students_by_id(const Student *students, int count, const char *keyword)
{
    printf("姓名\t学号\t房号\t联系电话\n");
    printf("---------------------------------\n");
    for (int i = 0; i < count; i++) {
        if (strstr(students[i].id, keyword)) {
            print_student(students + i);
        }
    }
}

void search_students_by_room(const Student *students, int count, const char *keyword)
{
    printf("姓名\t学号\t房号\t联系电话\n");
    printf("---------------------------------\n");
    for (int i = 0; i < count; i++) {
        if (strstr(students[i].room_num, keyword)) {
            print_student(students + i);
        }
    }
}

void bubble_sort(Student *students, int count)
{
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - i - 1; j++) {
            if (strcmp(students[j].name, students[j + 1].name) > 0) {
                Student temp = students[j];
                students[j] = students[j + 1];
                students[j + 1] = temp;
            }
        }
    }
}

void selection_sort(Student *students, int count)
{
    for (int i = 0; i < count - 1; i++) {
        int min_index = i;
        for (int j = i + 1; j < count; j++) {
            if (strcmp(students[j].id, students[min_index].id) < 0) {
                min_index = j;
            }
        }
        if (min_index != i) {
            Student temp = students[i];
            students[i] = students[min_index];
            students[min_index] = temp;
        }
    }
}

void insertion_sort(Student *students, int count)
{
    for (int i = 1; i < count; i++) {
        Student temp = students[i];
        int j = i - 1;
        while (j >= 0 && strcmp(students[j].room_num, temp.room_num) > 0) {
            students[j + 1] = students[j];
            j--;
        }
        students[j + 1] = temp;
    }
}

以下是一个简单的宿舍管理查询软件的C语言代码,包括头文件、结构体定义、函数声明和主函数。该程序采用交互式查询方式,支持按姓名、学号、房号排序,并使用二分查找算法进行快速查询。



头文件 dorm.h:

#ifndef _DORM_H_
#define _DORM_H_

#define MAX_NAME_LEN 20
#define MAX_ID_LEN 10
#define MAX_ROOM_NUM 999

// 学生信息结构体
struct Student {
    char name[MAX_NAME_LEN]; // 姓名
    char id[MAX_ID_LEN]; // 学号
    int room_num; // 房间号
};

// 函数声明
void input_student_info(struct Student students[], int num_students);
void sort_students_by_name(struct Student students[], int num_students);
void sort_students_by_id(struct Student students[], int num_students);
void sort_students_by_room(struct Student students[], int num_students);
int binary_search_by_name(struct Student students[], int num_students, char name[]);
int binary_search_by_id(struct Student students[], int num_students, char id[]);
int binary_search_by_room(struct Student students[], int num_students, int room_num);
void print_student_info(struct Student students[], int index);

#endif
源文件 dorm.c:

#include <stdio.h>
#include <string.h>
#include "dorm.h"

// 输入学生信息
void input_student_info(struct Student students[], int num_students) {
    int i;

    for (i = 0; i < num_students; i++) {
        printf("Enter student %d's name: ", i+1);
        scanf("%s", students[i].name);

        printf("Enter student %d's ID: ", i+1);
        scanf("%s", students[i].id);

        printf("Enter student %d's room number: ", i+1);
        scanf("%d", &students[i].room_num);
    }
}

// 按姓名进行冒泡排序
void sort_students_by_name(struct Student students[], int num_students) {
    int i, j;
    struct Student temp;

    for (i = 0; i < num_students - 1; i++) {
        for (j = 0; j < num_students - 1 - i; j++) {
            if (strcmp(students[j].name, students[j+1].name) > 0) {
                temp = students[j];
                students[j] = students[j+1];
                students[j+1] = temp;
            }
        }
    }
}

// 按学号进行选择排序
void sort_students_by_id(struct Student students[], int num_students) {
    int i, j, min_index;
    struct Student temp;

    for (i = 0; i < num_students - 1; i++) {
        min_index = i;
        for (j = i + 1; j < num_students; j++) {
            if (strcmp(students[j].id, students[min_index].id) < 0) {
                min_index = j;
            }
        }
        temp = students[i];
        students[i] = students[min_index];
        students[min_index] = temp;
    }
}

// 按房间号进行插入排序
void sort_students_by_room(struct Student students[], int num_students) {
    int i, j;
    struct Student temp;

    for (i = 1; i < num_students; i++) {
        temp = students[i];
        j = i - 1;
        while (j >= 0 && students[j].room_num > temp.room_num) {
            students[j+1] = students[j];
            j--;
        }
        students[j+1] = temp;
    }
}

// 按姓名二分查找
int binary_search_by_name(struct Student students[], int num_students, char name[]) {
    int left = 0;
    int right = num_students - 1;
    int mid;

    while (left <= right) {
        mid = (left + right) / 2;
        if (strcmp(students[mid].name, name) == 0) {
            return mid;
        } else if (strcmp(students[mid].name, name) < 0) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return -1; // 未找到
}

// 按学号二分查找
int binary_search_by_id(struct Student students[], int num_students, char id[]) {
    int left = 0;
    int right = num_students - 1;
// 按学号二分查找
int binary_search_by_id(struct Student students[], int num_students, char id[]) {
int left = 0;
int right = num_students - 1;
int mid;

while (left <= right) {
    mid = (left + right) / 2;
    if (strcmp(students[mid].id, id) == 0) {
        return mid;
    } else if (strcmp(students[mid].id, id) < 0) {
        left = mid + 1;
    } else {
        right = mid - 1;
    }
}

return -1; // 未找到
}

// 按房间号二分查找
int binary_search_by_room(struct Student students[], int num_students, int room_num) {
int left = 0;
int right = num_students - 1;
int mid;

while (left <= right) {
    mid = (left + right) / 2;
    if (students[mid].room_num == room_num) {
        return mid;
    } else if (students[mid].room_num < room_num) {
        left = mid + 1;
    } else {
        right = mid - 1;
    }
}

return -1; // 未找到
}

// 打印学生信息
void print_student_info(struct Student students[], int index) {
printf("Name: %s\n", students[index].name);
printf("ID: %s\n", students[index].id);
printf("Room number: %d\n", students[index].room_num);
}

// 主函数
int main() {
int num_students, i, choice;
char name[MAX_NAME_LEN], id[MAX_ID_LEN];
int room_num;
struct Student students[100];

printf("Enter the number of students: ");
scanf("%d", &num_students);

// 输入学生信息
input_student_info(students, num_students);

// 排序
printf("Choose a sorting method:\n");
printf("1. Sort by name\n");
printf("2. Sort by ID\n");
printf("3. Sort by room number\n");
scanf("%d", &choice);

switch (choice) {
    case 1:
        sort_students_by_name(students, num_students);
        break;
    case 2:
        sort_students_by_id(students, num_students);
        break;
    case 3:
        sort_students_by_room(students, num_students);
        break;
    default:
        printf("Invalid choice!\n");
        return 0;
}

// 查询菜单
while (1) {
    printf("\nSelect a search method:\n");
    printf("1. Search by name\n");
    printf("2. Search by ID\n");
    printf("3. Search by room number\n");
    printf("4. Exit\n");
    scanf("%d", &choice);

    if (choice == 4) {
        break;
    }

    switch (choice) {
        case 1:
            printf("Enter the name to search: ");
            scanf("%s", name);
            i = binary_search_by_name(students, num_students, name);
            break;
        case 2:
            printf("Enter the ID to search: ");
            scanf("%s", id);
            i = binary_search_by_id(students, num_students, id);
            break;
        case 3:
            printf("Enter the room number to search: ");
            scanf("%d", &room_num);
            i = binary_search_by_room(students, num_students, room_num);
            break;
        default:
            printf("Invalid choice!\n");
            continue;
    }

    if (i == -1) {
        printf("No matching student found.\n");
    } else {
        print_student_info(students, i);
    }
}

return 0;
}

以下是使用 C 语言实现宿舍管理查询软件的一个示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义学生结构体
typedef struct {
    char name[20];
    int id;
    int room;
} Student;

// 读取学生信息
int read_students(Student* students, int max_students, const char* filename)
{
    FILE* fp = fopen(filename, "r");
    if (!fp) {
        printf("无法打开文件:%s\n", filename);
        return -1;
    }

    char buffer[1024];
    int cnt = 0;

    while (fgets(buffer, sizeof(buffer), fp)) {
        char* name = strtok(buffer, ",");
        char* sid = strtok(NULL, ",");
        char* sroom = strtok(NULL, ",");
        if (!name || !sid || !sroom) {
            printf("文件格式错误:%s\n", buffer);
            continue;
        }
        int id = atoi(sid);
        int room = atoi(sroom);
        if (cnt < max_students) {
            Student* student = students + cnt;
            strncpy(student->name, name, sizeof(student->name)-1);
            student->id = id;
            student->room = room;
            cnt++;
        } else {
            printf("学生列表已满,忽略多余条目:%s\n", buffer);
        }
    }

    fclose(fp);
    return cnt;
}

// 冒泡排序
void bubble_sort(Student* students, int num_students, const char* key)
{
    for (int i = 0; i < num_students - 1; i++) {
        for (int j = 0; j < num_students - i - 1; j++) {
            int cmp = strcmp(key, "姓名") == 0 ? strcmp(students[j].name, students[j+1].name)
                : key == "学号" ? students[j].id - students[j+1].id
                : students[j].room - students[j+1].room;
            if (cmp > 0) {
                Student tmp = students[j];
                students[j] = students[j+1];
                students[j+1] = tmp;
            }
        }
    }
}

// 二分查找
Student* binary_search(Student* students, int num_students, const char* key, int value)
{
    int low = 0, high = num_students - 1;

    while (low <= high) {
        int mid = (low + high) / 2;

        int cmp = strcmp(key, "姓名") == 0 ? strcmp(students[mid].name, (char*)value)
                : key == "学号" ? students[mid].id - value
                : students[mid].room - value;
        if (cmp == 0) {
            return &students[mid];
        } else if (cmp > 0) {
            high = mid - 1;
        } else {
            low = mid + 1;
        }
    }

    return NULL;
}

// 打印学生信息
void print_student(const Student* student)
{
    if (student) {
        printf("%s %d %d\n", student->name, student->id, student->room);
    } else {
        printf("查询结果为空。\n");
    }
}

// 主函数
int main()
{
    // 读取学生信息
    Student students[256];
    int num_students = read_students(students, sizeof(students)/sizeof(*students), "students.txt");
    if (num_students < 0) {
        return 1;
    }

    // 排序
    char* keys[] = { "姓名", "学号", "房间号" };
    int key;
    printf("请选择排序的关键字:1.姓名 2.学号 3.房间号:");
    scanf("%d", &key);
    key -= 1;
    for (int i = 0; i < num_students - 1; i++) {
        for (int j = i+1; j < num_students; j++) {
            int cmp = strcmp(keys[key], "姓名") == 0 ? strcmp(students[i].name, students[j].name)
                : keys[key] == "学号" ? students[i].id - students[j].id
                : students[i].room - students[j].room;
            if (cmp > 0) {
                Student tmp = students[i];
                students[i] = students[j];
                students[j] = tmp;
            }
        }
    }

    // 查询
    int choice;
    int value;
    do {
        printf("=====================\n");
        printf("宿舍管理查询菜单\n");
        printf("1.按姓名查询\n");
        printf("2.按学号查询\n");
        printf("3.按房间号查询\n");
        printf("4.退出\n");
        printf("=====================\n");
        printf("请选择菜单项:");
        scanf("%d", &choice);
        switch (choice) {
        case 1:
            printf("请输入要查询的姓名:");
            scanf("%s", buffer);
            print_student(binary_search(students, num_students, "姓名", buffer));
            break;
        case 2:
            printf("请输入要查询的学号:");
            scanf("%d", &value);
            print_student(binary_search(students, num_students, "学号", value));
            break;
        case 3:
            printf("请输入要查询的房间号:");
            scanf("%d", &value);
            print_student(binary_search(students, num_students, "房间号", value));
            break;
        case 4:
            break;
        default:
            printf("无效的菜单项,请重新选择。\n");
            break;
        }
    } while (choice != 4);

    return 0;
}

这个程序首先从文件“students.txt”中读取学生的姓名、学号和房间号信息,并将其存储为一个Student结构体数组。然后根据用户选择的关键字对该数组进行排序。其中,排序算法选用了冒泡排序。
随后,用户可以从查询菜单中选择按姓名、学号或房间号查询学生信息。在查询过程中,程序使用二分查找算法在已经排序好的学生数组中进行快速查找,并返回查询结果。
为了使程序更加简单,本程序未实现对用户输入错误的处理和异常情况下的程序退出逻辑,读者可以根据自己的需要进行扩展和修改。


#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define M 100

int dirty=0;  //用来判断是否已保存操作

//定义一个存储学生相关信息的结构体

typedef struct

{

    char S_name[31];   //学生姓名

     char S_class[31];  //学生班级

    char S_number[16]; //学生学号

    int D_number;      //学生所在寝室的宿舍号

     char S_address[500]; //学生地址

     int S_phone[20];  //学生电话号码

    int Total;         //学生总数

}Student[M],St;

//判断学号是否与表中所存学号重复

void S_number_Judge(Student S,int t)

{

    int i;

    for(i=1;i<=(S->Total)-1;i++)

        while(strcmp(S[i].S_number,S[t].S_number)==0)

        {

            printf("学号输入失败,该学号已存在,请重新输入学号!\n");

            printf("请输入学生的学号(15个字符以内):");

            scanf("%s",S[t].S_number);

            getchar();

            i=1;

        }

}

//添加学生信息函数

void Add(Student S)

{

    printf("请输入学生姓名(30个字符以内):");

    scanf("%s",S[++(S->Total)].S_name);

    getchar();//获取换行符

     printf("请输入学生班级(30个字符以内):");

     scanf("%s",S[S->Total].S_class);

     getchar();

    printf("请输入学生的学号(15个字符以内):");

    scanf("%s",S[S->Total].S_number);

    getchar();

    S_number_Judge(S,S->Total);//判断输入的学号是否与表中所存在的学号重复

    printf("请输入宿舍号码:");

    scanf("%d",&S[S->Total].D_number);

     getchar();

     printf("请输入学生地址:");

     scanf("%s",S[S->Total].S_address);

     getchar();

     printf("请输入学生电话号码:");

     scanf("%s",&S[S->Total]. S_phone);

    getchar();

    dirty=1;

    printf("添加成功!\n\n");

}

//删除学生信息

void Delete(Student S)

{

    int i,j;

    int flag=0;  //用来判断表中是否存在所要删除的学生的信息

    char name[20];

    printf("请输入你要删除学生的姓名:");

    scanf("%s",name);

    getchar();

    for(i=1;i<=S->Total;i++)

        if(strcmp(S[i].S_name,name)==0)

            flag=i;

    if(!flag)

        printf("你所要删除的学生在表中不存在!");

    else

    {

        for(i=flag;i<S->Total;i++)

        {

            j=i+1;

            strcpy(S[i].S_name,S[j].S_name);

            strcpy(S[i].S_number,S[j].S_number);

            S[i].D_number=S[j].D_number;

        }

        (S->Total)--;

        dirty=1;

        printf("删除成功!");

    }

    printf("\n\n");

}

//排序函数按照寝室号从小到大排序(冒泡法)

void Sort_D_number(Student S)

{

    int i,j,t;

    char name[30];

    char number[15];

     char address[300];

     char Cnumber[30];

    for(i=1;i<=S->Total;i++)

        for(j=i;j<=S->Total;j++)

            if(S[i].D_number>S[j].D_number)

            {

                strcpy(name,S[i].S_name);

                strcpy(number,S[i].S_number);

                   strcpy(address,S[i].S_address);

                   strcpy(Cnumber,S[i].S_class);

                t=S[i].D_number;

                strcpy(S[i].S_name,S[j].S_name);

                strcpy(S[i].S_number,S[j].S_number);

                   strcpy(S[i].S_address,S[j].S_address);;

                   strcpy(S[i].S_class,S[j].S_class);

                S[i].D_number=S[j].D_number;

                strcpy(S[j].S_name,name);

                strcpy(S[j].S_number,number);

                   strcpy(S[j].S_address,address);

                   strcpy(S[j].S_class,Cnumber);

                S[j].D_number=t;

            }

}

//排序函数按照学号从小到大排序(冒泡法)

//排序函数按照班级号从小到大排序(冒泡法)

void Sort_S_class (Student S)

{

    int i,j,t;

    char name[30];

    char number[15];

     char address[300];

     char  Cnumber[30];

    for(i=1;i<=S->Total;i++)

        for(j=i;j<=S->Total;j++)

            if(strcmp(S[i].S_class,S[j].S_class)>0)

            {

                strcpy(name,S[i].S_name);

                strcpy(number,S[i].S_number);

                   strcpy(address,S[i].S_address);

                   strcpy(Cnumber,S[i].S_class);

                t=S[i]. D_number;

                strcpy(S[i].S_name,S[j].S_name);

                strcpy(S[i].S_number,S[j].S_number);

                   strcpy(S[i].S_address,S[j].S_address);;

                   strcpy(S[i].S_class,S[j].S_class);

                S[i]. D_number =S[j]. D_number;

                strcpy(S[j].S_name,name);

                strcpy(S[j].S_number,number);

                   strcpy(S[j].S_address,address);

                   strcpy(S[j].S_class,Cnumber);

                S[j]. D_number =t;

            }

}

//查询函数以班级为关键字进行查询(顺序查找)

void Query_S_class(Student S)

{

    int i,j=0;

    char classnumber[31];

    printf("请输入你要查找的班级号(30个字符以内):");

    scanf("%s",classnumber);

    getchar();

    printf("所查找学生信息如下:\n");

    printf("学生姓名     学生班级      学生学号      宿舍号      学生地址      学生电话号码\n");

    for(i=1;i<=S->Total;i++)

        if(strcmp(classnumber,S[i].S_class)==0)

        {

            printf("%-20s%-20s %-15s%-5d%s-10%s\n",S[i].S_name, S[i].S_class,S[i].S_number,S[i].D_number,S[i].S_address,S[i].S_phone);

            j=1;

        }

    if(!j)

        printf("\n查找失败,表中不存在该学生的信息!\n\n");

}

//查询函数以姓名为关键字进行查询(顺序查找)

void Query_S_name(Student S)

{

    int i,j=0;

    char name[31];

    printf("请输入你要查找的学生的姓名(30个字符以内):");

    scanf("%s",name);

    getchar();

    printf("所查找学生信息如下:\n");

    printf("学生姓名     学生班级      学生学号      宿舍号      学生地址      学生电话号码\n");

    for(i=1;i<=S->Total;i++)

        if(strcmp(name,S[i].S_name)==0)

        {

            printf("%-20s%-20s %-15s%-5d%s-10%s\n",S[i].S_name, S[i].S_class,S[i].S_number,S[i].D_number,S[i].S_address,S[i].S_phone);

            j=1;

        }

    if(!j)

        printf("\n查找失败,表中不存在该学生的信息!\n\n");

}

//查询函数以学号为关键字进行查询(折半查找)

void Query_S_number(Student S)

{

    int i,j,top,base,mid;

    char number[15];

    j=0;

    base=1;

    top=S->Total;

    printf("请输入你要查找学生的学号:");

    scanf("%s",number);

    getchar();

    Sort_S_number(S);  //将表中原数据按照学号从小到大排序

    printf("所查找学生信息如下:\n");

    printf("学生姓名     学生班级      学生学号      宿舍号      学生地址      学生电话号码\n");

    if(strcmp(number,S[1].S_number)>=0&&strcmp(number,S[S->Total].S_number)<=0)

    {

        while(base<=top)

        {

            mid=(base+top)/2;

            if(strcmp(number,S[mid].S_number)==0)

            {

                printf("%-20s%-20s%-15s%-5d%s-10%s\n",S[i].S_name, S[i].S_class,S[i].S_number,S[i].D_number,S[i].S_address,S[i].S_phone);

                putchar('\n');

                j=1;

                break;

            }

            else if(strcmp(number,S[mid].S_number)>0)

                base=mid+1;

            else

                top=mid-1;

        }

    }

    if(!j)

        printf("\n查找失败,表中不存在该学生的信息!\n\n");

}

//查询函数以寝室号为关键字进行查询(折半查找)

void Query_D_number(Student S)

{

    int i,j,m,n,base,top,mid;

    j=0;

    base=1;

    top=S->Total;

    printf("请输入你要查询的寝室号:");

    scanf("%d",&i);

    getchar();

    Sort_D_number(S);//将表中原数据按照寝室号从小到大排序

    printf("所查找寝室信息如下:\n");

    printf("学生姓名     学生班级      学生学号      宿舍号      学生地址      学生电话号码\n");

    if(i>=S[1].D_number&&i<=S[S->Total].D_number)

    {

        while(base<=top)

        {

            mid=(base+top)/2;

            if(i==S[mid].D_number)

            {

                m=mid;

                n=mid-1;

                while(S[m].D_number==i)

                {

                   printf("%-20s%-20s %-15s%-5d%s-10%s\n",S[m].S_name, S[i].S_class,S[m].S_number,S[m].D_number,S[i].S_address,S[i].S_phone);

                    m++;

                   if(m>S->Total)

                       break;

                }

                if(n>0)

                {

                   while(S[n].D_number==i)

                   {

                       printf("%-20s%-15s%-5d\n",S[n].S_name,S[n].S_number,S[n].D_number);

                        n--;

                       if(n<1)

                           break;

                   }

                }

                j=1;

                putchar('\n');

                break;

            }

            else if(i>S[mid].D_number)

                base=mid+1;    //折半查找

            else

                top=mid-1;

        }

    }

    if(!j)

        printf("\n查找失败,表中不存在该寝室的信息!\n\n");

}

//存储函数

void Save(Student S)

{

    St Std;

    int i;

    int flag1=0,flag2=0; //判断存储是否成功

    FILE *fp;

    if((fp=fopen("宿舍管理.txt","w"))==NULL)

    {

        printf("打开文件失败!\n\n");

        flag1=1;

        exit(0);  //结束程序

    }

    for(i=1;i<=S->Total;i++)

        if(fwrite(&S[i],sizeof(Std),1,fp)!=1)

        {

            printf("数据写入错误\n\n");

            flag2=1;

            exit(0);

        }

    if(!flag1&&!flag2)

    {

        printf("数据存储成功!\n\n");

        dirty=0;

    }

    fclose(fp);   //关闭一个流。关闭一个打开的文件, fp是此前通过调用fopen返回的文件指针。

}

//加载记录函数

void Load(Student S)

{

    St Std;

    FILE *fp;

    if((fp=fopen("宿舍管理.txt","r"))==NULL)

    {

        printf("打开文件失败!\n\n");

        exit(0);

    }

    while(!feof(fp))   // fp为文件句柄,feof为判断是否读到文件尾

        fread(&S[++(S->Total)],sizeof(Std),1,fp);

    fclose(fp);

    printf("加载数据成功!\n\n");

    (S->Total)--;   //由于读取问题,表中个数要减去

}

//退出程序时判断是否保存函数

void Judge_Save(int i,Student S)

{

    char ch;

    if(i)

    {

        printf("表中数据已改变,是否保存后再退出(Y/N)?:");

        ch=getchar();

        getchar();

        while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')

        {

            printf("请输入N(n)或者Y(y):");

            ch=getchar();

            getchar();

        }

        if(ch=='y'||ch=='Y')

            Save(S);

    }

}

//菜单

void Menu()

{

        //菜单

    printf("                                   宿舍管理\n\n");

    printf("*************************************菜单*************************************\n");

    printf("1.添加新入住学生信息                 |   8.按照班级号从小到大排序\n");

    printf("2.修改宿舍学生信息                   |   9.按照寝室号从小到大排序\n");

    printf("3.删除搬出宿舍学生信息               |   10.按照学号从小到大排序\n");

    printf("4.以姓名查询学生信息                 |   11.显示所有学生的相关信息\n");

    printf("5.以学号查询学生信息                 |   12.保存操作\n");

    printf("6.以宿舍号查询该宿舍中的全部学生信息 |   13.加载记录\n");

     printf("7.以班级号查询该班级中的全部学生信息 |   14.退出程序\n");

printf("******************************************************************************\n");

}

void main()

{

    int i;

    Student S;

    S->Total=0;

    do

    {

        Menu();

        printf("请选择所要实现的功能(请输入1~14中的任意一个数字):");

        scanf("%d",&i);

        getchar();  //获取换行符

        putchar('\n');

        switch(i)

        {

        case 1:Add(S);

               break;

        case 2:Alter(S);

               break;

        case 3:Delete(S);

               break;

        case 4:Query_S_name(S);

               break;

        case 5:Query_S_number(S);

               break;

        case 6:Query_D_number(S);

               break;

          case 7: Query_S_class (S);

               break;

          case 8: Sort_S_class (S);

               printf("排序完成!\n\n");

               break;

        case 9:Sort_D_number(S);

               printf("排序完成!\n\n");

               break;

        case 10:Sort_S_number(S);

               printf("排序完成!\n\n");

               break;

        case 11:Display_All(S);

               break;

        case 12:Save(S);

                break;

        case 13:Load(S);

                break;

        case 14:Judge_Save(dirty,S);

                exit(0);

                break;

        default:printf("选择错误:请在选项到之间选择!\n\n");

                break;

        }

    }while(i!=14);

}


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7739957
  • 除此之外, 这篇博客: C语言学习笔记-入门整合篇(十万字长文)中的 使用位运算对数据或文件内容进行加密 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    数据加密解密的可以使用异或运算。
    示例代码:

    #include <stdio.h>
    #include <stdlib.h>
    int main(){
        char plaintext = 'a';  // 明文
        char secretkey = '!';  // 密钥
        char ciphertext = plaintext ^ secretkey;  // 密文
        char decodetext = ciphertext ^ secretkey;  // 解密后的字符
        char buffer[9];
        printf("            char    ASCII\n");
        // itoa()用来将数字转换为字符串,可以设定转换时的进制(基数)
        // 这里将字符对应的ascii码转换为二进制
        printf(" plaintext   %c     %7s\n", plaintext, itoa(plaintext, buffer, 2));
        printf(" secretkey   %c     %7s\n", secretkey, itoa(secretkey, buffer, 2));
        printf("ciphertext   %c     %7s\n", ciphertext, itoa(ciphertext, buffer, 2));
        printf("decodetext   %c     %7s\n", decodetext, itoa(decodetext, buffer, 2));
        return 0;
    }
    
    plaintext 与 decodetext相同,也就是说,两次异或运算后还是原来的结果。
    // 注意:程序中的 itoa() 位于 stdlib.h 头文件,它并不是一个标准的C函数,只有Windows下有
    
    通过一次异或运算,生成密文,密文没有可读性,与原文风马牛不相及,这就是加密;
    密文再经过一次异或运算,就会还原成原文,这就是解密的过程;
    加密和解密需要相同的密钥,如果密钥不对,是无法成功解密的。
    
    

    上面的加密算法称为对称加密算法,加密和解密使用同一个密钥。

    如果加密和解密的密钥不同,则称为非对称加密算法。在非对称算法中,加密的密钥称为公钥,解密的密钥称为私钥,只知道公钥是无法解密的,还必须知道私钥。

  • 您还可以看一下 王进老师的跟着王进老师学开发之C#篇第五季:图书管理系统课程中的 实现登陆身份验证(1)小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

以下是一个简单的宿舍管理查询软件的代码,采用Python语言实现。这个程序利用冒泡排序对宿舍管理信息按关键字排序,使用二分查找算法查找信息。你需要根据自己的需求和具体情况进行适当的修改和调整。

student_info = [
    {"name": "Tom", "id": "1001", "room": "301"},
    {"name": "Jerry", "id": "1002", "room": "302"},
    {"name": "Lisa", "id": "1003", "room": "303"},
    {"name": "David", "id": "1004", "room": "304"},
    {"name": "Lucy", "id": "1005", "room": "305"},
]

def sort_by_key(key):
    for i in range(len(student_info)-1):
        for j in range(i+1, len(student_info)):
            if student_info[i][key] > student_info[j][key]:
                temp = student_info[i]
                student_info[i] = student_info[j]
                student_info[j] = temp

def binary_search(key, value):
    low = 0
    high = len(student_info) - 1
    while low <= high:
        mid = (low + high) // 2
        if student_info[mid][key] == value:
            return student_info[mid]
        elif student_info[mid][key] < value:
            low = mid + 1
        else:
            high = mid - 1
    return None

sort_by_key("name")

while True:
    print("1.按姓名查询")
    print("2.按学号查询")
    print("3.按房号查询")
    print("4.打印全部信息")
    print("0.退出系统")
    
    choice = int(input("请输入操作编号: "))
    if choice == 1:
        name = input("请输入姓名: ")
        sort_by_key("name")
        result = binary_search("name", name)
        if result:
            print("姓名:{} 学号:{} 房号:{}".format(result["name"], result["id"], result["room"]))
        else:
            print("未找到该学生信息")
    elif choice == 2:
        id = input("请输入学号: ")
        sort_by_key("id")
        result = binary_search("id", id)
        if result:
            print("学号:{} 姓名:{} 房号:{}".format(result["id"], result["name"], result["room"]))
        else:
            print("未找到该学生信息")
    elif choice == 3:
        room = input("请输入房号: ")
        sort_by_key("room")
        result = binary_search("room", room)
        if result:
            print("房号:{} 姓名:{} 学号:{}".format(result["room"], result["name"], result["id"]))
        else:
            print("未找到该学生信息")
    elif choice == 4:
        for info in student_info:
            print("姓名:{} 学号:{} 房号:{}".format(info["name"], info["id"], info["room"]))
    elif choice == 0:
        break
    else:
        print("输入有误,请重新输入")