C语言实战三:图书管理系统

这个图书管理系统包括了添加、查找、删除、编辑、显示和保存书籍信息的功能。书籍信息被保存在一个文本文件中,在程序启动时从文件中加载,退出程序时保存到文件中。用户可以通过命令行界面操作图书管理系统,并进行相应的功能操作。

一、代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_BOOKS 100struct Book {char title[100];char author[100];int year;
};struct Library {struct Book books[MAX_BOOKS];int count;
};// 函数声明
void addBook(struct Library *library);
void searchBook(struct Library library);
void deleteBook(struct Library *library, char *title);
void editBook(struct Library *library, char *title);
void saveBooks(struct Library library, char *filename);
void loadBooks(struct Library *library, char *filename);
void displayBooks(struct Library library);int main() {struct Library library;library.count = 0;loadBooks(&library, "books.txt"); // 从文件加载书籍信息int choice;do {printf("\nLibrary Management System\n");printf("1. Add Book\n");printf("2. Search Book\n");printf("3. Delete Book\n");printf("4. Edit Book\n");printf("5. Display All Books\n");printf("6. Save Books\n");printf("7. Exit\n");printf("Enter your choice: ");scanf("%d", &choice);switch(choice) {case 1:addBook(&library); // 添加书籍break;case 2:searchBook(library); // 查找书籍break;case 3: {char title[100];printf("Enter title of book to delete: ");scanf("%s", title);deleteBook(&library, title); // 删除书籍break;}case 4: {char title[100];printf("Enter title of book to edit: ");scanf("%s", title);editBook(&library, title); // 编辑书籍信息break;}case 5:displayBooks(library); // 显示所有书籍break;case 6:saveBooks(library, "books.txt"); // 保存书籍信息到文件break;case 7:printf("Exiting program.\n");break;default:printf("Invalid choice! Please enter a number from 1 to 7.\n");}} while (choice != 7);return 0;
}// 添加书籍
void addBook(struct Library *library) {if (library->count >= MAX_BOOKS) {printf("Library is full. Cannot add more books.\n");return;}struct Book newBook;printf("Enter title of book: ");scanf("%s", newBook.title);printf("Enter author of book: ");scanf("%s", newBook.author);printf("Enter year of publication: ");scanf("%d", &newBook.year);library->books[library->count] = newBook;library->count++;printf("Book added successfully.\n");
}// 查找书籍
void searchBook(struct Library library) {char title[100];printf("Enter title of book to search: ");scanf("%s", title);int found = 0;for (int i = 0; i < library.count; i++) {if (strcmp(library.books[i].title, title) == 0) {printf("Book found:\n");printf("Title: %s\n", library.books[i].title);printf("Author: %s\n", library.books[i].author);printf("Year: %d\n", library.books[i].year);found = 1;break;}}if (!found) {printf("Book not found.\n");}
}// 删除书籍
void deleteBook(struct Library *library, char *title) {int found = 0;for (int i = 0; i < library->count; i++) {if (strcmp(library->books[i].title, title) == 0) {for (int j = i; j < library->count - 1; j++) {library->books[j] = library->books[j + 1];}library->count--;found = 1;printf("Book deleted successfully.\n");break;}}if (!found) {printf("Book not found.\n");}
}// 编辑书籍信息
void editBook(struct Library *library, char *title) {int found = 0;for (int i = 0; i < library->count; i++) {if (strcmp(library->books[i].title, title) == 0) {printf("Enter new title of book: ");scanf("%s", library->books[i].title);printf("Enter new author of book: ");scanf("%s", library->books[i].author);printf("Enter new year of publication: ");scanf("%d", &library->books[i].year);found = 1;printf("Book edited successfully.\n");break;}}if (!found) {printf("Book not found.\n");}
}// 保存书籍信息到文件
void saveBooks(struct Library library, char *filename) {FILE *file = fopen(filename, "w");if (file == NULL) {printf("Error opening file.\n");return;}for (int i = 0; i < library.count; i++) {fprintf(file, "%s %s %d\n", library.books[i].title, library.books[i].author, library.books[i].year);}fclose(file);printf("Books saved to file successfully.\n");
}// 从文件加载书籍信息
void loadBooks(struct Library *library, char *filename) {FILE *file = fopen(filename, "r");if (file == NULL) {printf("Error opening file.\n");return;}while (!feof(file) && library->count < MAX_BOOKS) {fscanf(file, "%s %s %d\n", library->books[library->count].title, library->books[library->count].author, &library->books[library->count].year);library->count++;}fclose(file);
}// 显示所有书籍
void displayBooks(struct Library library) {printf("Books in library:\n");for (int i = 0; i < library.count; i++) {printf("Title: %s, Author: %s, Year: %d\n", library.books[i].title, library.books[i].author, library.books[i].year);}
}

二、程序分析

数据结构定义

  1. Book 结构体: 包含书籍的标题、作者和出版年份等信息。
  2. Library 结构体: 包含一个 Book 结构体数组和一个计数器,用于跟踪图书馆中的书籍数量。

主函数 main()

  1. 初始化图书馆: 创建 Library 结构体变量,并将书籍数量计数器初始化为 0。
  2. 加载书籍信息: 调用 loadBooks() 函数从文件中加载之前保存的书籍信息。
  3. 用户界面: 使用 do-while 循环显示菜单,直到用户选择退出。
  4. 菜单选项: 用户可以选择添加书籍、查找书籍、删除书籍、编辑书籍、显示所有书籍、保存书籍到文件和退出程序。
  5. 根据用户选择调用相应函数: 根据用户选择调用不同的函数来执行相应的操作。

函数定义

  1. 添加书籍 (addBook()):用户输入书籍的标题、作者和出版年份,将新书籍添加到图书馆中。
  2. 查找书籍 (searchBook()):用户输入要查找的书籍标题,系统根据输入查找并显示书籍的详细信息。
  3. 删除书籍 (deleteBook()):用户输入要删除的书籍标题,系统根据输入删除相应的书籍。
  4. 编辑书籍 (editBook()):用户输入要编辑的书籍标题,系统根据输入允许用户编辑书籍的标题、作者和出版年份。
  5. 保存书籍 (saveBooks()):将图书馆中的书籍信息保存到文件中,以便下次程序启动时加载使用。
  6. 加载书籍 (loadBooks()):从文件中加载之前保存的书籍信息到图书馆中。
  7. 显示所有书籍 (displayBooks()):列出图书馆中所有书籍的详细信息。

文件操作

  1. 保存和加载书籍信息: 使用文件操作函数 (fopen(), fclose(), fprintf(), fscanf()) 将书籍信息保存到文件或从文件中加载。

三、练习

Library 结构体数组,改为链表来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/658984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pg数据库替换指定ip

pg数据库替换指定ip 配菜单是部署机ip发生变化&#xff0c;记录一下处理方法,先根据源ip查询出主键id&#xff0c;在将源ip替换成目标ip updatesys_menu sethref replace(href, 10.116.63.4, 10.116.58.23) whereid in(select*fromsys_menuwherehref like %10.116.58.23% )

信息学奥赛一本通1931:【05NOIP普及组】校门外的树

1931&#xff1a;【05NOIP普及组】校门外的树 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 9210 通过数: 6928 【题目描述】 某校大门外长度为L的马路上有一排树&#xff0c;每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴&#xff0c;马路的一…

24校招,快手测试开发工程师二面

前言 大家好&#xff0c;我是chowley&#xff0c;今天回顾一下&#xff0c;之前参加快手的校招面试 全程没有测试方向问题&#xff0c;一直拷打编程语言特性和数据底层结构 时间&#xff1a;50min 平台&#xff1a;轻雀&#xff08;请勿切屏&#xff09; 过程 自我介绍用…

如何使用wireshark解析二进制文件

目录 目录 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP packet b. Ethernet packet 2.用wiershark导入hex文件 3.设置对应的packet类型 a. Raw IP packet b. Ethernet packet 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP pac…

汽车燃油泵数据分析:全球市场的年复合增长率将达到10%左右

燃油泵是汽车配件行业的专业术语。是电喷汽车燃油喷射系统的基本组成之一&#xff0c;位于车辆油箱内部&#xff0c;燃油泵在启动和发动机运转时工作&#xff0c;如果发动机停止而点火开关仍处于ON时&#xff0c;HFM-SFI控制模块关闭燃油泵的电源&#xff0c;以避免意外点火。 …

OpenCV与机器学习:使用opencv实现KNN

使用opencv实现KNN 前言OpenCV实现KNN生成随机数据使用matplotlib绘制数据OpenCV用于KNN训练生成新数据并观察预测 前言 KNN算法&#xff0c;即K-Nearest Neighbor&#xff0c;是一种简单的机器学习算法。它的基本思想是&#xff1a;如果一个样本在特征空间中的K个最相似&…

标注数据集 --labelimg

前言&#xff1a;我们想要训练自己的数据集时&#xff0c;通常需要自己标注数据集。无论是标注成yolo可识别的txt格式还是voc数据集的xml格式。使用labelimg标注都是一个不错的选择。 下面我们就从创建环境&#xff0c;使用labelimg进行标注两个方面来说明。 1.创建labelimg环境…

ADI 配合 USRP 使用的相控阵天线 cn0566

相控阵天线 在这里插入图片描述

Python实战:爬取微博,获取南京地铁每日客流数据

在这篇文章中&#xff0c;我们将使用 Python 进行网络爬虫&#xff0c;爬取微博上的南京地铁每日客流数据。 一、分析网页 在“南京地铁”微博主页搜索“昨日客流”关键词&#xff0c;搜索到每天发布的昨日客流数据。 “南京地铁”微博主页地址https://weibo.com/u/26382762…

基于视觉的移载协作机器人机床上下料末端纠偏算法

摘 要 针对复合机器人在机床上下料中的定位方法,本文主要关注识别机床卡盘和末端作业面的定位。首先分 析了复合机器人在机床上下料过程中的工作原理及其基本结构,包括 AGV (自动导引车)和协作机器人 的功能及特点。然后,详细阐述了如何使用视觉系统和纠偏算法来…

京东采销急眼,隔空喊话“针对”拼多多,焦虑之下为哪般?

农历新年将至&#xff0c;无论是线下各大商超还是线上电商平台&#xff0c;皆为年终大促而“忙的不亦乐乎”&#xff0c;尤其是近期发生的京东采销人员在直播间向拼多多喊话&#xff0c;“恳请拼多多停止屏蔽&#xff0c;恳请拼多多直接比价”&#xff0c;更是将年底这场朴实无…

flink cdc,standalone模式下,任务运行一段时间taskmanager挂掉

在使用flink cdc&#xff0c;配置任务运行&#xff0c;过了几天后&#xff0c;任务无故取消&#xff0c;超时&#xff0c;导致taskmanager挂掉&#xff0c;相关异常如下&#xff1a; 异常1&#xff1a; did not react to cancelling signal interrupting; it is stuck for 30 s…

ElasticSearch基础用法

什么是ElasticSearch? Elasticsearch是一个开源的、分布式的、实时的搜索和分析引擎。它允许用户近乎实时地存储、检索大量数据&#xff0c;并能够高效地对其进行全文搜索、聚合和分析。 部署ES和Kibana 通常采用docker-compose部署ES&#xff08;ElasticSearch&#xff09;服…

react-jss书写样式 与 react-intl 国际化的使用 与 classnames 动态css的使用

目录 react-jss的使用react-intl 国际化的使用App.tsxIntlProvider 配置ConfigProvider组件/router/indexlocaleslocales / zh.json || en.json 组件中使用 国际化 classnames 动态css的使用 react-jss的使用 实现组件化样式、动态样式、避免样式冲突 npm install react-jss …

React 组件中怎么做事件代理

在 React 组件中使用事件代理可以使用以下方法&#xff1a; 使用 on 方法来绑定事件监听器&#xff1a; class MyComponent extends React.Component {handleClick(event) {if (event.target.tagName BUTTON) {console.log(Button clicked);}}render() {return (<div onC…

如何写好论文——(3)研究选题的三种途径

一、填补研究空白——创新 在前人的研究基础上发现问题、提出创新&#xff0c;在技术上具有挑战性 关键&#xff1a;提出我们在课题上创新的部分&#xff0c;它可能是新的解决方案&#xff0c;从其他领域借鉴过来的新的想法 因为它是老问题&#xff0c;所以需要研究前人已经…

速盾:服务器高防CDN能防御哪些网络攻击

摘要&#xff1a;本文将探讨服务器高防CDN的技术&#xff0c;以及它可以有效防御哪些网络攻击。我们将介绍DDoS攻击、CC攻击、恶意爬虫等常见网络攻击&#xff0c;并说明服务器高防CDN通过其强大的防御技术如高防IP、智能分流等如何应对这些攻击。此外&#xff0c;我们还将回答…

寒假思维训练day17 C. Equal Frequencies

不知不觉已经过了差不多一个月了&#xff0c;坚持一件事情还是有点收获的&#xff0c;今天更新一道1600的构造。 寒假训练计划day17 摘要&#xff1a; Part1 题意 Part2 题解 (有数学推导&#xff0c;latex形式) Part3 代码 (C版本&#xff0c;有详细注释) Part4 我对构造题…

基于YOLOv7算法的高精度实时安全帽和背心目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时安全帽和背心目标检测系统可用于日常生活中检测与定位安全帽和安全背心&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标…

SpringBoot2整合了Rabbitmq以后,有些情景不需要初始化和连接Rabbitmq,所以需要怎么处理呢?

问题提出&#xff0c;最近有个需求&#xff0c;有的场合项目需要连接Rabbitmq&#xff0c;有些场合项目就不需要连接&#xff0c;再不需要连接的时候&#xff0c;还必须的安装Rabbimq服务&#xff0c;徒增时间消耗&#xff0c;所以需要处理一下。 在yml中配置如下&#xff1a; …