当前位置:首页> 管理系统> C语言课程设计图书管理系统的实现与思考

C语言课程设计图书管理系统的实现与思考

在C语言课程设计中,图书管理系统是一个经典题目。它涵盖了结构体、指针、动态内存分配、文件读写等核心知识点,完成该系统能够帮助我们熟悉C语言的实际应用。我设计的系统以单链表为数据基础,每个节点对应一本图书,节点内除了书号、书名、作者、出版社、出版日期外,还单独记录总藏量和当前可借数量。系统启动时从book.dat文件载入全部记录,退出时保存,保证数据不丢失。

系统运行后显示主菜单,包含录入图书、删除图书、修改信息、查询图书、借书、还书、显示全部和退出八个操作。主菜单由while循环控制,每次执行完一个操作后都回到菜单,直到用户选择退出。录入图书时先检查书号是否重复,如果重复则提示并返回。每本书的书号用七位数字表示,如1001234,这样在文件里占据固定长度,便于处理。图书信息用结构体定义,字段包括isbn、title、author、publisher、total和available,其中可借数量初始等于总量。修改功能允许用户重新输入书名、作者、出版社和总藏量,但书号保持不变,以避免借阅记录混乱。

为了实现借书和还书,系统里另外维护了一个借阅记录链表。每条记录包含七位学号、七位书号以及借阅日期,日期用结构体中的year、month、day三个整数表示。借书时先按书号定位到图书节点,再检查available是否大于零,大于零时允许借阅,并创建一条新的记录。为了避免同一读者重复借同一本书,创建记录前要遍历借阅链表,如果发现已有相同学号加相同书号的记录,则拒绝。还书时由读者输入学号和书号,在借阅链表里查找匹配项,找到后删除该节点,同时对应图书的available加一。如果找不到,说明没有借书记录,给出相应提示。这个设计保证了库存数量的准确性,也方便在界面上显示当前借阅情况。

图书链表和借阅链表都采用单链表结构。文件保存时,图书和借阅记录分别存储在book.dat和borrow.dat文件中。保存图书链表时,用fwrite把每个节点的数据字段写入文件。读取时用fread循环,当返回值等于结构体大小时创建节点追加到链表尾部。为了简化追加操作,加载时使用了尾指针,避免每次从头遍历到末尾。保存和读取借阅记录的做法完全相同。如果打开文件失败,程序会提示并自动创建空文件。

在开发过程中,我遇到一个比较隐蔽的问题。删除图书时,如果该书正处于借出状态,直接删除会导致借阅记录中的书号无法对应,后续还书会产生错误。因此我规定删除前必须检查该书的available是否等于total,只有全部在馆时才能删除,否则提示该书尚有借出记录无法删除。这个改动虽然简单,却让我意识到数据一致性的重要性。另一个问题是链表节点的释放。删除节点时,必须先用一个临时指针保存下一个节点的地址,然后释放当前节点,否则会丢失后续节点。最初我漏掉了临时指针,结果程序在运行到下一次遍历时崩溃,排查了很久才找到原因。

查询功能提供三种方式,按书号、按书名和按作者。按书号查询使用strcmp直接比较isbn字段,找到后打印全部信息。按书名查询需要遍历整个图书链表,用strstr进行子串匹配,这样输入部分书名也能找到。按作者查询同样支持子串匹配。考虑到控制台显示宽度,每行显示一本书,字段之间用制表符分隔。显示全部图书时,我要求按书号从小到大排列。链表排序不便,我选择先用一个指针数组保存所有节点地址,再对数组元素按照strcmp函数排序,最后按顺序输出指针数组指向的内容。这样没有改动链表本身,代码也更简洁。

测试阶段,我准备了三十本测试数据,书号从1000001到1000030,前五本设置了不同的借阅状态。运行录入功能添加一本新书,书号1000031,书名C程序设计,作者谭浩强,出版社清华大学出版社,总藏量五本。查询功能按作者搜索谭浩强能正确找到三本相关图书。用学号20190001借出其中一本,系统提示借阅成功,该书的available从5变为4。重复借同一本时,系统拒绝,提示该读者已借阅此书。还书后库存恢复为5。删除测试时,选择一本仍有借出记录的图书,系统给出拒绝提示,符合预期。随后删除一本无借出记录的书,删除成功并确认文件中不再包含该书。整个测试过程中没有出现崩溃或数据丢失。

关于用户界面,由于控制台程序无法使用图形窗口,我用printf输出一个简单菜单。每行显示一个操作选项,输入选项后,用switch语句进入对应函数。菜单上方会显示当前系统日期,用系统函数获取。这个界面虽然简陋,但各项功能一目了然,在课程设计答辩时容易讲解。通过这次课程设计,我感受到C语言的价值在于精确控制内存和数据结构。原先对指针和链表只停留在课本上,真正写代码时才明白空指针的判断和动态内存分配的重要性。图书管理系统虽小,却包含了增删改查、文件持久化和数据一致性处理等软件开发的要素。写代码不只是敲击键盘,更是用逻辑解决实际问题的过程。

九游体育 满贯体育 满贯体育 九游体育 九游体育 九游体育 九游体育 满贯体育 九游体育 九游体育