为宿舍管理人员编写一个宿舍管理查询软件。【基本要求】(1)采用交互工作方式;(2)按关键字(姓名、学号、房号)进行排序(冒泡、选择、插入排序等任选一种)。(3)建立查询菜单:(用二分查找实现以下操作)按姓名查询\按学号查询\按房号查询打印任一查询结果(可以连续操作:)
基于new bing加以修改的编写:
// 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);
}
不知道你这个问题是否已经解决, 如果还没有解决的话:数据加密解密的可以使用异或运算。
示例代码:
#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下有
通过一次异或运算,生成密文,密文没有可读性,与原文风马牛不相及,这就是加密;
密文再经过一次异或运算,就会还原成原文,这就是解密的过程;
加密和解密需要相同的密钥,如果密钥不对,是无法成功解密的。
上面的加密算法称为对称加密算法,加密和解密使用同一个密钥。
如果加密和解密的密钥不同,则称为非对称加密算法。在非对称算法中,加密的密钥称为公钥,解密的密钥称为私钥,只知道公钥是无法解密的,还必须知道私钥。
以下是一个简单的宿舍管理查询软件的代码,采用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("输入有误,请重新输入")