#include #include #include //图书存储结构 struct book{ int id;//图书编号 char name[20];//图书名称 char author[20];//图书作者 float price;//图书价格 struct book *next; // 指向下一图书 }*books; /////////////////// // 用户界面模块 // // 系统初始化,读取数据文件到内存 void init(); // 显示主菜单 void display_menu(); // 选择菜单命令,调用相应的功能函数 void make_choice(); // 确认操作 void confirm(); // 退出系统,释放内存,保存数据到文件 void quit(); /////////////////// // 数据处理模块 // // 从文件读取数据到内存 void read_data(); // 保存内存数据到文件 void save_data(); // 打印图书信息 void print_data(); // 根据图书编号查询图书信息 book *find(int id); // 查询图书信息 void query_data(); // 添加新图书信息 void add_data(); // 更新图书信息 void update_data(); // 删除图书信息 void delete_data(); // 对图书信息进行排序 void sort_data(); // 生成图表报表 void make_chart(); ///////////// int main() { display_menu(); make_choice(); return 0; } // 用户界面模块 // // 系统初始化,读取数据文件到内存 void init() { read_data(); } // 显示主菜单 void display_menu() { printf("*************************\n"); 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("0. 退出系统\n"); printf("请选择:"); } // 选择菜单命令,调用相应的功能函数 void make_choice() { int choice; scanf("%d", &choice); confirm(); switch(choice) { case 1: print_data(); // 打印图书信息 break; case 2: query_data(); // 查询图书信息 break; case 3: add_data(); // 添加新图书 break; case 4: update_data();// 更新图书信息 break; case 5: delete_data();// 删除图书信息 break; case 6: sort_data(); // 对图书排序 break; case 7: make_chart(); // 生成图表报表 break; case 0: quit(); // 退出系统 break; default: printf("无效选择,请重新选择:"); break; } } // 确认操作 void confirm() { char choice; printf("您确定要执行该操作吗?(Y/N):"); scanf(" %c", &choice); if(choice == 'Y' || choice == 'y') { printf("操作成功执行!\n"); } else if(choice == 'N' || choice == 'n') { printf("操作已取消!\n"); } else { printf("输入错误,请重新输入(Y/N):"); confirm(); // 递归调用自己 } } // 退出系统,释放内存,保存数据到文件 void quit() { char choice; printf("您确定要退出系统吗?(Y/N):"); scanf(" %c", &choice); if(choice == 'Y' || choice == 'y') { save_data(); // 保存数据到文件 printf("数据已保存,系统退出!\n"); exit(0); // 退出系统 } else if(choice == 'N' || choice == 'n') { printf("退出操作已取消!\n"); } else { printf("输入错误,请重新输入(Y/N):"); quit(); // 递归调用自己 } } // 数据处理模块// // 从文件读取数据到内存 void read_data() { FILE *fp; struct book *head, *p; if((fp = fopen("books.dat", "rb")) == NULL) { printf("打开数据文件失败!\n"); exit(0); } head = NULL; while(!feof(fp)) { p = (struct book*)malloc(sizeof(struct book)); fread(p, sizeof(struct book), 1, fp); p->next = head; head = p; } fclose(fp); // 关闭文件 // 将链表的头指针作为全局变量,供其他函数使用 books = head; } // 保存内存数据到文件 void save_data() { FILE *fp; struct book *p; if((fp = fopen("books.dat", "wb")) == NULL) { printf("打开数据文件失败!\n"); exit(0); } p = books; // 从全局链表头开始 while(p != NULL) { fwrite(p, sizeof(struct book), 1, fp); p = p->next; } fclose(fp); } // 打印图书信息 void print_data() { struct book *p; p = books; // 从全局链表头开始 while(p != NULL) { printf("图书编号:%d\n", p->id); printf("图书名称:%s\n", p->name); printf("图书作者:%s\n", p->author); printf("图书价格:%.2f\n", p->price); printf("----------------------\n"); p = p->next; } } // 根据图书编号查询图书信息 book *find(int id) { struct book *p; p = books; // 从全局链表头开始 while(p != NULL) { if(p->id == id) return p; // 返回找到的图书指针 p = p->next; } return NULL; // 未找到返回空指针 *p; } // 查询图书信息 void query_data() { int id; struct book *p; printf("请输入要查询的图书编号:"); scanf("%d", &id); p = find(id); // 查找编号为id的图书 if(p != NULL) { printf("图书信息如下:\n"); printf("图书编号:%d\n", p->id); printf("图书名称:%s\n", p->name); printf("图书作者:%s\n", p->author); printf("图书价格:%.2f\n", p->price); } else { printf("没有找到编号为%d的图书!\n", id); } } // 添加新图书信息 void add_data() { struct book *p, *q; p = (struct book*)malloc(sizeof(struct book)); printf("请依次输入图书信息:\n"); printf("图书编号:"); scanf("%d", &p->id); printf("图书名称:"); scanf("%s", p->name); printf("图书作者:"); scanf("%s", p->author); printf("图书价格:"); scanf("%f", &p->price); q = books; while(q != NULL && p->id > q->id) q = q->next; p->next = q; // 指向下一个节点 books = p; // 新节点成为链表头 printf("图书信息添加成功!\n"); } // 更新图书信息 void update_data() { int id; struct book *p; printf("请输入要修改的图书编号:"); scanf("%d", &id); p = find(id); // 查找编号为id的图书 if(p != NULL) { printf("请依次输入修改后的图书信息:\n"); printf("图书名称:"); scanf("%s", p->name); printf("图书作者:"); scanf("%s", p->author); printf("图书价格:"); scanf("%f", &p->price); printf("图书信息修改成功!\n"); } else { printf("没有找到编号为%d的图书!\n", id); } } // 删除图书信息 void delete_data() { int id; struct book *p, *q; printf("请输入要删除的图书编号:"); scanf("%d", &id); p = books; q = NULL; while(p != NULL && p->id != id) { q = p; p = p->next; } if(p != NULL) // 找到该节点 { if(q == NULL) // 第一个节点 books = p->next; else q->next = p->next; free(p); printf("图书信息删除成功!\n"); } else { printf("没有找到编号为%d的图书!\n", id); } } // 对图书信息进行排序 void sort_data() { struct book *p, *q; // 两节点指针 struct book temp; // 临时图书结构体 p = books; while(p != NULL) { q = p->next; while(q != NULL) { if(p->id > q->id) // 交换节点 { temp = *p; *p = *q; *q = temp; } q = q->next; } p = p->next; } printf("图书信息排序成功!\n"); } // 生成图表报表 void make_chart() { struct book *p; char name[20]; int i, n; float price; printf("请输入要生成的图书数量:"); scanf("%d", &n); for(i=1; i<=n; i++) { p = (struct book*)malloc(sizeof(struct book)); sprintf(name, "图书%d", i); // 生成图书名称 p->id = i; // 图书编号 strcpy(p->name, name); // 图书名称 strcpy(p->author, "作者"); // 作者 price = (i+1)*10.0; // 价格 p->price = price; // 图书价格 p->next = books; // 新节点指向原链表头 books = p; // 新节点成为链表头 } printf("随机图书信息生成成功!\n"); }