diff --git a/daima b/daima new file mode 100644 index 0000000..b714bf2 --- /dev/null +++ b/daima @@ -0,0 +1,413 @@ +#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"); +} \ No newline at end of file