利用C语言为宿舍管理人员编写一个宿舍管理查询软件。 要求 (1)采用交互工作方式;(2)按关键字(姓名、学号、房号)进行排序(冒泡、选择、插入排序等任选一种)。(3)建立查询菜单: (用二分查找实现以下操作) 按姓名查询 \按学号查询 \按房号查询 打印任一查询结果(可以连续操作
时间: 2023-12-23 21:02:35 浏览: 121
好的,下面是一个简单的宿舍管理查询软件的示例代码,其中使用了选择排序和二分查找算法:
```c
#include <stdio.h>
#include <string.h>
#define MAX_STUDENTS 100 // 最大学生人数
#define MAX_NAME_LEN 20 // 姓名最大长度
#define MAX_ROOM_LEN 10 // 房间号最大长度
// 学生信息结构体
typedef struct {
char name[MAX_NAME_LEN]; // 姓名
char id[10]; // 学号
char room[MAX_ROOM_LEN]; // 房间号
} Student;
// 学生信息数组
Student students[MAX_STUDENTS];
// 学生人数
int num_students = 0;
// 交换两个学生信息
void swap(Student *a, Student *b) {
Student temp = *a;
*a = *b;
*b = temp;
}
// 选择排序算法
void selection_sort(Student arr[], int n, int key) {
int i, j, min_index;
for (i = 0; i < n - 1; i++) {
min_index = i;
for (j = i + 1; j < n; j++) {
if (key == 1 && strcmp(arr[j].name, arr[min_index].name) < 0) {
min_index = j;
} else if (key == 2 && strcmp(arr[j].id, arr[min_index].id) < 0) {
min_index = j;
} else if (key == 3 && strcmp(arr[j].room, arr[min_index].room) < 0) {
min_index = j;
}
}
if (i != min_index) {
swap(&arr[i], &arr[min_index]);
}
}
}
// 二分查找算法
int binary_search(Student arr[], int n, char *key, int type) {
int left = 0, right = n - 1, mid;
while (left <= right) {
mid = left + (right - left) / 2;
if (type == 1 && strcmp(arr[mid].name, key) == 0) {
return mid;
} else if (type == 2 && strcmp(arr[mid].id, key) == 0) {
return mid;
} else if (type == 3 && strcmp(arr[mid].room, key) == 0) {
return mid;
} else if (type == 1 && strcmp(arr[mid].name, key) > 0) {
right = mid - 1;
} else if (type == 2 && strcmp(arr[mid].id, key) > 0) {
right = mid - 1;
} else if (type == 3 && strcmp(arr[mid].room, key) > 0) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
// 按姓名查询
void search_by_name() {
char name[MAX_NAME_LEN];
printf("请输入要查询的姓名:");
scanf("%s", name);
int index = binary_search(students, num_students, name, 1);
if (index == -1) {
printf("未找到该学生!\n");
} else {
printf("姓名:%s\t学号:%s\t房间号:%s\n", students[index].name, students[index].id, students[index].room);
}
}
// 按学号查询
void search_by_id() {
char id[10];
printf("请输入要查询的学号:");
scanf("%s", id);
int index = binary_search(students, num_students, id, 2);
if (index == -1) {
printf("未找到该学生!\n");
} else {
printf("姓名:%s\t学号:%s\t房间号:%s\n", students[index].name, students[index].id, students[index].room);
}
}
// 按房间号查询
void search_by_room() {
char room[MAX_ROOM_LEN];
printf("请输入要查询的房间号:");
scanf("%s", room);
int index = binary_search(students, num_students, room, 3);
if (index == -1) {
printf("未找到该学生!\n");
} else {
printf("姓名:%s\t学号:%s\t房间号:%s\n", students[index].name, students[index].id, students[index].room);
}
}
// 打印查询结果
void print_result() {
int i;
printf("姓名\t学号\t房间号\n");
for (i = 0; i < num_students; i++) {
printf("%s\t%s\t%s\n", students[i].name, students[i].id, students[i].room);
}
}
int main() {
int choice;
while (1) {
printf("\n宿舍管理查询菜单\n");
printf("1. 按姓名查询\n");
printf("2. 按学号查询\n");
printf("3. 按房间号查询\n");
printf("4. 打印查询结果\n");
printf("5. 退出程序\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
selection_sort(students, num_students, 1);
search_by_name();
break;
case 2:
selection_sort(students, num_students, 2);
search_by_id();
break;
case 3:
selection_sort(students, num_students, 3);
search_by_room();
break;
case 4:
print_result();
break;
case 5:
printf("程序已退出!\n");
return 0;
default:
printf("无效的选择!\n");
}
}
return 0;
}
```
该示例代码实现了按姓名、学号、房间号查询学生信息,并且支持通过选择排序算法按关键字排序。同时,用户可以选择打印任一查询结果,也可以连续操作。
阅读全文