文章目录
- 题目二:图书信息管理系统设计
- bookManagement.h
- bookManagement.c
- test.c
- 终端测试截图
题目二:图书信息管理系统设计
图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。
设计图书信息管理系统,功能包括:
- 系统以菜单方式工作。
- 图书信息录入功能(图书信息用文件保存)--输入。
- 图书信息浏览功能--输出。
- 图书信息查询功能--算法。
查询方式- 按书名查询。
- 按作者名查询。
- 图书信息的删除与修改(可选项)。
bookManagement.h
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_BOOKS 100 // 最大图书数量
#define FILE_NAME "books.txt" // 文件名// 定义图书结构体
typedef struct {int loginNo; // 登录号char title[100]; // 书名char author[100]; // 作者名char category[50]; // 分类号char publisher[100]; // 出版单位char publicationDate[20]; // 出版时间double price; // 价格
} Book;// 函数声明
void showMenu();
void menu(Book* books, int* count);
void printBook(Book book);
void addBook(Book* books, int* count);
void displayBooks(Book* books, int count);
void searchByTitle(Book* books, int count);
void searchByAuthor(Book* books, int count);
void deleteByTitle(Book* books, int* count);
void deleteByAuthor(Book* books, int* count);
void deleteByLoginNo(Book* books, int* count);
void modifyByLoginNoAndTitle(Book* books, int count);
void saveToFile(Book* books, int count);
void loadFromFile(Book* books, int* count);
bookManagement.c
#include"bookManagement.h"
void showMenu() {printf("\n");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("| 8. 按登录号修改图书信息 |\n");printf("| 9. 保存并退出 |\n");printf("+----------------------------------+ \n");printf("请选择操作: ");
}
void menu(Book* books, int* count) {int choice;loadFromFile(books, count); // 初始化时从文件加载图书信息while (1) {showMenu();scanf("%d", &choice);switch (choice) {case 1:addBook(books, count); // 添加图书信息break;case 2:displayBooks(books, *count); // 显示所有图书信息break;case 3:searchByTitle(books, *count); // 按书名查询图书信息break;case 4:searchByAuthor(books, *count); // 按作者名查询图书信息break;case 5:deleteByLoginNo(books, count); // 按登录号删除图书信息break;case 6:deleteByTitle(books, count); // 按书名删除图书信息break;case 7:deleteByAuthor(books, count); // 按作者名删除图书信息break;case 8:modifyByLoginNoAndTitle(books, *count); // 按登录号书名修改图书信息break;case 9:saveToFile(books, *count); // 保存图书信息并退出return;default:printf("无效的选择,请重新输入。\n");}}
}
void printBook(Book book) {printf("登录号: %d\n", book.loginNo);printf("书名: %s\n", book.title);printf("作者名: %s\n", book.author);printf("分类号: %s\n", book.category);printf("出版单位: %s\n", book.publisher);printf("出版时间: %s\n", book.publicationDate);printf("价格: %.2f\n", book.price);printf("\n");
}
void addBook(Book* books, int* count) {if (*count >= MAX_BOOKS) {printf("已达到最大容量,无法添加更多图书。\n");return;}Book* book = &books[*count];printf("请输入登录号: ");scanf("%d", &book->loginNo);printf("请输入书名: ");scanf("%s", book->title);printf("请输入作者名: ");scanf("%s", book->author);printf("请输入分类号: ");scanf("%s", book->category);printf("请输入出版单位: ");scanf("%s", book->publisher);printf("请输入出版时间: ");scanf("%s", book->publicationDate);printf("请输入价格: ");scanf("%lf", &book->price);(*count)++;printf("图书信息录入成功\n");
}
void displayBooks(Book* books, int count) {for (int i = 0; i < count; i++) {printBook(books[i]);}
}
void searchByTitle(Book* books, int count) {char title[100];printf("请输入书名进行查询: ");scanf("%s", title);int found = 0;for (int i = 0; i < count; i++) {if (strcmp(books[i].title, title) == 0) {printBook(books[i]);found = 1;}}if (!found) {printf("没有找到符合条件的图书。\n");}
}
void searchByAuthor(Book* books, int count) {char author[100];printf("请输入作者名进行查询: ");scanf("%s", author);int found = 0;for (int i = 0; i < count; i++) {if (strcmp(books[i].author, author) == 0) {printBook(books[i]);found = 1;}}if (!found) {printf("没有找到符合条件的图书。\n");}
}
void deleteByTitle(Book* books, int* count) {char title[100];printf("请输入要删除的书名: ");scanf("%s", title);int deleted = 0;for (int i = 0; i < *count; i++) {if (strcmp(books[i].title, title) == 0) {for (int j = i; j < *count - 1; j++) {books[j] = books[j + 1];}(*count)--;printf("书名 %s 的图书信息已经删除。\n", title);deleted = 1;break;}}if (!deleted) {printf("没有找到符合条件的图书信息。\n");}
}
void deleteByAuthor(Book* books, int* count) {char author[100];printf("请输入要删除的作者名: ");scanf("%s", author);int deleted = 0;int newCount = 0;Book tempBooks[MAX_BOOKS];for (int i = 0; i < *count; i++) {if (strcmp(books[i].author, author) != 0) {tempBooks[newCount++] = books[i];}else {printf("作者名 %s 的图书信息已经删除。\n", author);deleted = 1;}}if (!deleted) {printf("没有找到符合条件的图书信息。\n");}// 更新书籍数组for (int i = 0; i < newCount; i++) {books[i] = tempBooks[i];}*count = newCount;
}
void deleteByLoginNo(Book* books, int* count) {int loginNo;printf("请输入要删除的登录号: ");scanf("%d", &loginNo);int newCount = 0;int deleted = 0;// 创建一个临时数组来存储未被删除的图书信息Book tempBooks[MAX_BOOKS];for (int i = 0; i < *count; i++) {if (books[i].loginNo != loginNo) {tempBooks[newCount++] = books[i];}else {deleted = 1;}}// 将未被删除的图书信息复制回原数组for (int i = 0; i < newCount; i++) {books[i] = tempBooks[i];}*count = newCount;if (deleted) {printf("登录号 %d 的所有图书信息已经删除。\n", loginNo);}else {printf("没有找到符合条件的图书信息。\n");}
}void modifyByLoginNoAndTitle(Book* books, int count) {int loginNo;printf("请输入要修改的登录号: ");scanf("%d", &loginNo);int found = 0;for (int i = 0; i < count; i++) {if (books[i].loginNo == loginNo) {printf("当前信息:\n");printBook(books[i]);char confirm;printf("确认修改此图书信息吗?(y/n): ");scanf(" %c", &confirm);if (confirm == 'y' || confirm == 'Y') {char title[100];printf("请输入要修改的书名: ");scanf("%s", title);int modified = 0;for (int j = 0; j < count; j++) {if (books[j].loginNo == loginNo && strcmp(books[j].title, title) == 0) {printf("请输入新的书名: ");scanf("%s", books[j].title);printf("请输入新的作者名: ");scanf("%s", books[j].author);printf("请输入新的分类号: ");scanf("%s", books[j].category);printf("请输入新的出版单位: ");scanf("%s", books[j].publisher);printf("请输入新的出版时间: ");scanf("%s", books[j].publicationDate);printf("请输入新的价格: ");scanf("%lf", &books[j].price);printf("图书信息已更新。\n");modified = 1;}}if (!modified) {printf("没有找到指定书名的图书信息。\n");}found = 1;break;}else {printf("取消修改。\n");break;}}}if (!found) {printf("没有找到指定登录号的图书信息。\n");}
}
void saveToFile(Book* books, int count) {FILE* fp = fopen(FILE_NAME, "w");if (fp == NULL) {printf("无法打开文件 '%s' 进行写入。\n", FILE_NAME);return;}for (int i = 0; i < count; i++) {fprintf(fp, "%d,%s,%s,%s,%s,%s,%.2f\n",books[i].loginNo,books[i].title,books[i].author,books[i].category,books[i].publisher,books[i].publicationDate,books[i].price);}fclose(fp);printf("图书信息保存成功。\n");
}
void loadFromFile(Book* books, int* count) {FILE* fp = fopen(FILE_NAME, "r");if (fp == NULL) {printf("文件 '%s' 不存在,创建新文件。\n", FILE_NAME);fp = fopen(FILE_NAME, "w");fclose(fp);return;}*count = 0;while (fscanf(fp, "%d,%[^,],%[^,],%[^,],%[^,],%[^,],%lf",&books[*count].loginNo,books[*count].title,books[*count].author,books[*count].category,books[*count].publisher,books[*count].publicationDate,&books[*count].price) != EOF) {(*count)++;}fclose(fp);printf("图书信息加载成功。\n");
}
test.c
#include"bookManagement.h"int main() {Book books[MAX_BOOKS];int count = 0;menu(books, &count);return 0;
}
终端测试截图
添加图书
按下9 保存退出后,再次启动,按下2,浏览,没有问题
继续添加图书
199,西游记,吴承恩,I242.4,浙江古籍出版社,2010,35.00
199,鲁迅全集,鲁迅,略,略,略,900.00
199,呐喊,鲁迅,略,略,略,56.00
199,三国演义,罗贯中,略,略,略,79.00
89,红楼梦,曹雪芹,略,略,略,89.00
89,水浒传,施耐庵,略,略,略,99.00
19,测试,测试,测试,测试,测试,55.00
19,测试,测试,测试,测试,测试,35.00
根据书名查询图书
根据作者查询图书
一次性删除所有该登录号信息
199,西游记,吴承恩,I242.4,浙江古籍出版社,2010,35.00
199,鲁迅全集,鲁迅,略,略,略,900.00
199,呐喊,鲁迅,略,略,略,56.00
199,三国演义,罗贯中,略,略,略,79.00
89,红楼梦,曹雪芹,略,略,略,89.00
89,水浒传,施耐庵,略,略,略,99.00
没有登录号19的图书
删除图书
删除作者的图书
修改登录号下的图书