当前位置: 首页 > news >正文

C语言课程设计题目二:图书信息管理系统设计

文章目录

    • 题目二:图书信息管理系统设计
      • bookManagement.h
      • bookManagement.c
      • test.c
      • 终端测试截图

题目二:图书信息管理系统设计

图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。
设计图书信息管理系统,功能包括:

  1. 系统以菜单方式工作。
  2. 图书信息录入功能(图书信息用文件保存)--输入。
  3. 图书信息浏览功能--输出。
  4. 图书信息查询功能--算法。
    查询方式
    • 按书名查询。
    • 按作者名查询。
  5. 图书信息的删除与修改(可选项)。

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的图书
在这里插入图片描述
删除图书

在这里插入图片描述
删除作者的图书
在这里插入图片描述
修改登录号下的图书
在这里插入图片描述

在这里插入图片描述


http://www.mrgr.cn/news/35813.html

相关文章:

  • vulnhub靶场Matrix-win全流程
  • 【设计模式-策略】
  • 双十一有哪些好物值得入手?五款超值数码好物分享!
  • C# 用统一代码动态查询数据库并显示数据
  • 芒果TV《航海少年团》强强联合,优质少儿动画乘风起航
  • W39-02-jmeter中如何实现:下一个请求是需要根据前一个请求返回值进行循环请求
  • Latex学习
  • 【每天学点AI】五个阶段带你了解人工智能大模型发展史!
  • PLC控制系统应用的抗干扰问题
  • 可变剪接分析一步到位,这个 R 包够猛!
  • 表观项目文章速递,平均IF=9.7
  • 【tbNick专享】虚拟机域控、成员服务器、降级等管理
  • oracle 分表代码示例
  • Jetpack02-LiveData 数据驱动UI更新(类似EventBus)
  • 《AI设计类工具系列之三——Magic Design》
  • 7大网络安全机构真实测评:零基础转行网安这么选就对了~
  • 【记录】在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示
  • 邦芒干货:职场上快速适应工作新环境的十大举措
  • 表单多个输入框校验
  • 外网SpringBoot项目迁移到内网无法加载maven依赖