"#include <stdio.h>\n#include <string.h>\n\n#define MAX_NUM 1000\n\nstruct Book {\n int id; // 序号\n char name[20]; // 书名\n char author[20]; // 作者\n char publisher[20]; // 出版社\n char type[20]; // 图书类型\n char code[20]; // 图书分类编码\n double price; // 价格\n};\n\nstruct BorrowRecord {\n int student_id;\n char student_name[20];\n int book_id;\n char borrow_date[20];\n};\n\nint binary_search(struct Book books[], int count, int key) {\n int low = 0, high = count - 1;\n\n while (low <= high) {\n int mid = (low + high) / 2;\n if (books[mid].id == key) {\n return mid;\n } else if (books[mid].id < key) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n return -1;\n}\n\nint main() {\n struct Book books[MAX_NUM];\n int count = 0;\n\n // 读取图书信息\n FILE *fp = fopen("book_storage.txt", "r");\n while (fscanf(fp, "%d\n%s\n%s\n%s\n%s\n%s\n%lf", &books[count].id, books[count].name, books[count].author, books[count].publisher, books[count].type, books[count].code, &books[count].price) != EOF) {\n count++;\n }\n\n fclose(fp);\n\n struct BorrowRecord records[MAX_NUM];\n int record_count = 0;\n\n int choice;\n do {\n printf("1. 读取图书信息\n");\n printf("2. 折半查找图书信息\n");\n printf("3. 借阅图书\n");\n printf("4. 保存借阅记录\n");\n printf("5. 读取借阅记录\n");\n printf("0. 退出程序\n");\n printf("请输入您的选择:");\n scanf("%d", &choice);\n\n switch (choice) {\n case 1:\n // 读取图书信息,已在上方实现\n break;\n case 2: {\n // 折半查找图书信息\n int key;\n printf("请输入要查找的图书序号:");\n scanf("%d", &key);\n\n int idx = binary_search(books, count, key);\n if (idx == -1) {\n printf("未找到序号为%d的图书\n", key);\n } else {\n printf("序号:%d\n书名:%s\n作者:%s\n出版社:%s\n图书类型:%s\n图书分类编码:%s\n价格:%.2f\n",\n books[idx].id, books[idx].name, books[idx].author, books[idx].publisher, books[idx].type, books[idx].code, books[idx].price);\n }\n break;\n }\n case 3: {\n // 借阅图书\n int student_id, book_id;\n char student_name[20];\n printf("请输入借阅者的学号和姓名:");\n scanf("%d %s", &student_id, student_name);\n printf("请输入要借阅的图书序号:");\n scanf("%d", &book_id);\n\n int book_idx = binary_search(books, count, book_id);\n if (book_idx == -1) {\n printf("未找到序号为%d的图书\n", book_id);\n } else {\n strcpy(records[record_count].student_name, student_name);\n records[record_count].student_id = student_id;\n records[record_count].book_id = book_id;\n strcpy(records[record_count].borrow_date, "2022-01-01");\n record_count++;\n printf("借阅成功\n");\n }\n break;\n }\n case 4: {\n // 保存借阅记录\n FILE *fp = fopen("borrow_records.txt", "w");\n for (int i = 0; i < record_count; i++) {\n fprintf(fp, "%d %s %d %s\n", records[i].student_id, records[i].student_name, records[i].book_id, records[i].borrow_date);\n }\n fclose(fp);\n printf("借阅记录已保存到文件borrow_records.txt\n");\n break;\n }\n case 5: {\n // 读取借阅记录\n FILE *fp = fopen("borrow_records.txt", "r");\n struct BorrowRecord records[MAX_NUM];\n int count = 0;\n\n while (fscanf(fp, "%d %s %d %s", &records[count].student_id, records[count].student_name, &records[count].book_id, records[count].borrow_date) != EOF) {\n count++;\n }\n\n fclose(fp);\n\n printf("读取到%d条借阅记录\n", count);\n printf("借阅记录如下:\n");\n for (int i = 0; i < count; i++) {\n printf("学号:%d\n姓名:%s\n图书序号:%d\n借阅日期:%s\n", records[i].student_id, records[i].student_name, records[i].book_id, records[i].borrow_date);\n }\n break;\n }\n case 0:\n // 退出程序\n printf("程序已退出\n");\n break;\n default:\n printf("无效的选择,请重新输入\n");\n break;\n }\n } while (choice != 0);\n\n return 0;\n}\n\n// binary_search函数的数据需求定义和功能定义如下:\n\n// 数据需求定义:\n// - books: 一个包含图书信息的结构体数组,表示图书馆的图书馆藏。数组中的每个元素是一个Book结构体,包含图书的序号、书名、作者、出版社、图书类型、图书分类编码和价格。\n// - count: 整数变量,表示图书馆藏中图书的数量。\n// - key: 整数变量,表示要查找的图书的序号。\n\n// 功能定义:\n// - 使用折半查找算法在books数组中查找序号为key的图书。\n// - 返回找到的图书在books数组中的索引,如果未找到则返回-1。\n\n// main函数中的子函数的数据需求定义和功能定义如下:\n\n// 1. 读取图书信息:\n// 数据需求定义:\n// - books: 一个包含图书信息的结构体数组,表示图书馆的图书馆藏。数组中的每个元素是一个Book结构体,包含图书的序号、书名、作者、出版社、图书类型、图书分类编码和价格。\n// - count: 整数变量,表示图书馆藏中图书的数量。\n\n// 功能定义:\n// - 从文件"book_storage.txt"中读取图书信息,并将其存储在books数组中。\n// - 更新count变量,记录读取到的图书数量。\n\n// 2. 折半查找图书信息:\n// 数据需求定义:\n// - books: 一个包含图书信息的结构体数组,表示图书馆的图书馆藏。数组中的每个元素是一个Book结构体,包含图书的序号、书名、作者、出版社、图书类型、图书分类编码和价格。\n// - count: 整数变量,表示图书馆藏中图书的数量。\n\n// 功能定义:\n// - 获取用户输入的要查找的图书序号。\n// - 使用binary_search函数在books数组中查找序号为key的图书。\n// - 如果找到图书,则输出图书的详细信息;如果未找到,则输出相应的提示信息。\n\n// 3. 借阅图书:\n// 数据需求定义:\n// - books: 一个包含图书信息的结构体数组,表示图书馆的图书馆藏。数组中的每个元素是一个Book结构体,包含图书的序号、书名、作者、出版社、图书类型、图书分类编码和价格。\n// - count: 整数变量,表示图书馆藏中图书的数量。\n// - records: 一个包含借阅记录的结构体数组,每个元素是一个BorrowRecord结构体,包含学生的学号、姓名、借阅的图书序号和借阅日期。\n// - record_count: 整数变量,表示借阅记录的数量。\n\n// 功能定义:\n// - 获取用户输入的借阅者的学号、姓名和要借阅的图书序号。\n// - 使用binary_search函数在books数组中查找序号为book_id的图书。\n// - 如果找到图书,则将借阅者的信息和借阅日期添加到records数组中,并更新record_count;如果未找到,则输出相应的提示信息。\n\n// 4. 保存借阅记录:\n// 数据需求定义:\n// - records: 一个包含借阅记录的结构体数组,每个元素是一个BorrowRecord结构体,包含学生的学号、姓名、借阅的图书序号和借阅日期。\n// - record_count: 整数变量,表示借阅记录的数量。\n\n// 功能定义:\n// - 将records数组中的借阅记录保存到文件"borrow_records.txt"中。\n\n// 5. 读取借阅记录:\n// 数据需求定义:\n// - records: 一个包含借阅记录的结构体数组,每个元素是一个BorrowRecord结构体,包含学生的学号、姓名、借阅的图书序号和借阅日期。\n// - record_count: 整数变量,表示借阅记录的数量。\n\n// 功能定义:\n// - 从文件"borrow_records.txt"中读取借阅记录,并将其存储在records数组中。\n// - 更新record_count变量,记录读取到的借阅记录数量。\n// - 输出读取到的借阅记录的数量和详细信息。\n\n// 注意:在读取借阅记录的功能中,子函数使用了与主函数相同名称的结构体数组和变量。为了避免命名冲突,应该将子函数中的结构体数组和变量改为不同的名称。


原文地址: https://www.cveoy.top/t/topic/pnxm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录