用C语言数据结构写一个学生宿舍管理系统1.学生宿舍管理查询系统 问题描述:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求: 1) 建立数据文件 ,数据文件按关键字(姓名、学号、专业、楼号、房号)进行排序(冒泡、选择、插入排序等任选一种) 2)查询功能: 分别按姓名查询、按学号查询、按专业查询、按房号查询或以上条件的复合查询等。
时间: 2023-07-31 15:06:16 浏览: 190
数据结构课程设计——宿舍管理查询软件.doc
以下是一个简单的基于C语言的学生宿舍管理系统,实现了数据文件的建立和排序,以及按照关键字进行查询的功能。
代码如下:
```c
#include <stdio.h>
#include <string.h>
#define MAX_STUDENT 100 // 最大学生数
#define MAX_NAME 20 // 姓名最大长度
#define MAX_ID 10 // 学号最大长度
#define MAX_MAJOR 20 // 专业最大长度
#define MAX_ROOM 5 // 房间号最大长度
// 学生结构体
typedef struct {
char name[MAX_NAME];
char id[MAX_ID];
char major[MAX_MAJOR];
char building[MAX_ROOM];
char room[MAX_ROOM];
} Student;
// 学生数组
Student students[MAX_STUDENT];
// 当前学生数量
int num_students = 0;
// 比较函数,按照姓名排序
int cmp_name(const void *a, const void *b) {
return strcmp(((Student *)a)->name, ((Student *)b)->name);
}
// 比较函数,按照学号排序
int cmp_id(const void *a, const void *b) {
return strcmp(((Student *)a)->id, ((Student *)b)->id);
}
// 比较函数,按照专业排序
int cmp_major(const void *a, const void *b) {
return strcmp(((Student *)a)->major, ((Student *)b)->major);
}
// 比较函数,按照楼号排序
int cmp_building(const void *a, const void *b) {
return strcmp(((Student *)a)->building, ((Student *)b)->building);
}
// 比较函数,按照房间号排序
int cmp_room(const void *a, const void *b) {
return strcmp(((Student *)a)->room, ((Student *)b)->room);
}
// 冒泡排序
void bubble_sort(Student *arr, int len, int (*cmp)(const void *, const void *)) {
int i, j;
for (i = 0; i < len - 1; i++) {
for (j = 0; j < len - i - 1; j++) {
if (cmp(&arr[j], &arr[j + 1]) > 0) {
Student temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 选择排序
void selection_sort(Student *arr, int len, int (*cmp)(const void *, const void *)) {
int i, j, min_index;
for (i = 0; i < len - 1; i++) {
min_index = i;
for (j = i + 1; j < len; j++) {
if (cmp(&arr[j], &arr[min_index]) < 0) {
min_index = j;
}
}
if (min_index != i) {
Student temp = arr[i];
arr[i] = arr[min_index];
arr[min_index] = temp;
}
}
}
// 插入排序
void insertion_sort(Student *arr, int len, int (*cmp)(const void *, const void *)) {
int i, j;
for (i = 1; i < len; i++) {
Student temp = arr[i];
for (j = i; j > 0 && cmp(&temp, &arr[j - 1]) < 0; j--) {
arr[j] = arr[j - 1];
}
arr[j] = temp;
}
}
// 打印学生信息
void print_student(Student *s) {
printf("%s\t%s\t%s\t%s\t%s\n", s->name, s->id, s->major, s->building, s->room);
}
// 添加学生信息
void add_student() {
if (num_students >= MAX_STUDENT) {
printf("无法添加更多学生信息!\n");
return;
}
printf("请输入学生姓名:");
scanf("%s", students[num_students].name);
printf("请输入学生学号:");
scanf("%s", students[num_students].id);
printf("请输入学生专业:");
scanf("%s", students[num_students].major);
printf("请输入学生所在楼号:");
scanf("%s", students[num_students].building);
printf("请输入学生所在房间号:");
scanf("%s", students[num_students].room);
num_students++;
printf("学生信息添加成功!\n");
}
// 查询学生信息
void query_student() {
int i;
char keyword[MAX_NAME];
int option;
printf("请选择查询条件:\n");
printf("1. 姓名\n");
printf("2. 学号\n");
printf("3. 专业\n");
printf("4. 楼号\n");
printf("5. 房间号\n");
printf("请选择(1-5):");
scanf("%d", &option);
printf("请输入关键字:");
scanf("%s", keyword);
printf("查询结果:\n");
switch (option) {
case 1:
for (i = 0; i < num_students; i++) {
if (strcmp(students[i].name, keyword) == 0) {
print_student(&students[i]);
}
}
break;
case 2:
for (i = 0; i < num_students; i++) {
if (strcmp(students[i].id, keyword) == 0) {
print_student(&students[i]);
}
}
break;
case 3:
for (i = 0; i < num_students; i++) {
if (strcmp(students[i].major, keyword) == 0) {
print_student(&students[i]);
}
}
break;
case 4:
for (i = 0; i < num_students; i++) {
if (strcmp(students[i].building, keyword) == 0) {
print_student(&students[i]);
}
}
break;
case 5:
for (i = 0; i < num_students; i++) {
if (strcmp(students[i].room, keyword) == 0) {
print_student(&students[i]);
}
}
break;
default:
printf("无效的选项!\n");
break;
}
}
int main() {
int option;
int i;
while (1) {
printf("请选择操作:\n");
printf("1. 添加学生信息\n");
printf("2. 查询学生信息\n");
printf("3. 退出程序\n");
printf("请选择(1-3):");
scanf("%d", &option);
switch (option) {
case 1:
add_student();
break;
case 2:
if (num_students == 0) {
printf("暂无学生信息,请先添加学生信息!\n");
break;
}
printf("请选择排序方式:\n");
printf("1. 按姓名排序\n");
printf("2. 按学号排序\n");
printf("3. 按专业排序\n");
printf("4. 按楼号排序\n");
printf("5. 按房间号排序\n");
printf("请选择(1-5):");
scanf("%d", &option);
switch (option) {
case 1:
bubble_sort(students, num_students, cmp_name);
break;
case 2:
selection_sort(students, num_students, cmp_id);
break;
case 3:
insertion_sort(students, num_students, cmp_major);
break;
case 4:
bubble_sort(students, num_students, cmp_building);
break;
case 5:
insertion_sort(students, num_students, cmp_room);
break;
default:
printf("无效的选项!\n");
break;
}
printf("排序结果:\n");
for (i = 0; i < num_students; i++) {
print_student(&students[i]);
}
query_student();
break;
case 3:
printf("程序已退出!\n");
return 0;
default:
printf("无效的选项!\n");
break;
}
printf("\n");
}
}
```
该程序使用了一个 `Student` 结构体来存储每个学生的信息,包括姓名、学号、专业、楼号和房间号。使用一个静态数组 `students` 来存储所有学生信息,并且记录了当前学生数量 `num_students`。
程序实现了两个主要的功能:添加学生信息和查询学生信息。添加学生信息需要用户从键盘输入每个字段的值,并将新的学生信息添加到 `students` 数组中。查询学生信息时,用户需要选择查询条件和输入关键字,程序将根据选择的排序方式对 `students` 数组进行排序,并根据关键字查询符合条件的学生信息。
该程序使用了三种排序算法:冒泡排序、选择排序和插入排序。将排序算法和比较函数作为参数传递给排序函数,可以方便地实现不同的排序方式。
该程序还使用了一些基本的控制流程语句,如循环语句、条件语句和函数调用语句等。
阅读全文