linuxc练习 图书管理系统总结

图书管理系统代码

先设两个指针数组分别用于存放书本的信息与借书学生的信息。由于书本和学生的信息多多方面的,就设了结构体变量。书本的结构体变量的成员包括书名、作者、本数、以及是否可借,学生信息的结构体变量的成员包括学生的姓名、学号、借书的本数以及借的书名,上限为五本,所以我又在结构体变量内部设了一个指针数组表示借的书信息。

首先先初始化,即先添加几本图书进去,打印出功能菜单供选择。共有个7个功能模块,分别为添加图书、查看图书、删除图书、修改图书、借书、还书、查看借书情况。

  • 添加图书
    图书的结构体变量中有书名、作者、本数和是否可借。分别定义数组或变量用于存放。由于用于存放图书信息的指针数组被初始化后的指针是不能直接使用的,所以需要分配空间,使用malloc函数分配后将信息写入即可。最后将图书计数变量加一。

  • 查看图书
    功能为查看目前已有书的信息,只要一个for循环,将书本的信息打印出来即可。

  • 删除图书
    输入要删除的书名,先与书库中已有的书名比较,看是否有这本书。该功能涉及内存的释放以及指针数组元素的移位。
    当找到这本书后,我的做法是把指针数组(存放书本信息的)中在这本书之后的元素向前移位一个,将要删除的覆盖掉。不过这样一来最后一个空间就多出来了,因为它里面的信息移到了前一个。就要进行空间释放,free函数并初始化。这么做最重要的一点是因为这个功能会影响到其他模块,例如在添加图书时不能把信息写到已有信息的空间中,就通过指针是否为0来判断。

  • 修改图书
    还是先输入书本信息判断是否输入正确,然后给出修改的选项。用if语句判断所要修改的内容
    需要注意的是,如果把书籍的本数改为零时,是否可借那个信息就要变成不可借,因为没书了。所以这里还有添加一个if判断语句,看本数是否为0.

  • 借书
    个人感觉借书模块是这些功能模块中最麻烦的。首先输入学生信息,判断该学生是否借过书。
    如果借过书,则判断他的可借的本数是否已经达到上限,若没有就输入书名,先判断书名输入是否正确,再判断该书是否为可借状态。这一系列判断结束后开始往指针数组(存放借书学生信息)中录入信息。和书本指针数组一样,由于都是初始化过的指针,先申请内存,将信息填入,字符串用strcpy函数,数值直接赋值。录入借书后将书的本数减一,学生信息中借的书本数加一。在存放书本信息(就是在结构体内部定义的一个指针数组)时寻找空指针,在遇见空指针后给它分配空间。不能顺着往后存,因为前面借的书会有还书,书的信息被删除。
    如果没有借过书,直接输入姓名学号,相当于一个注册的过程。再输入书名,判断是否存在。后面再进行书本是否可借的判断。接着就是分配内存,存入信息。比上面的情况简单点,因为是新开辟的空间,直接往首地址录入就行。不过这里有一个重点,在最初定义学生信息的结构体变量时,在里面定义了一个指针数组用于存放书名,由于在结构体内部只能定义不能初始化,所以那些指针都还是野指针,因为在这里上一级指针数组分配了空间我在这一步将他们初始化,方便后续存入信息时的判断。

    这里的注意点还是关于书本借出后可借状态的变化,对flag(可借状态)进行判断修改。
    最重要的还是关于指针内存,指针指向的必须是一个有效的地址,在这里很容易出现段错误。我在写关于指针的代码部分也是十分小心翼翼,最后查代码也是指针的段错误最多。

  • 还书
    先输入学生姓名,查看是否借过书,再要求输入书名,看输入书名是否存在,是否正确。 若都正确,则把这本书的结构体变量中的可借数量加一,然后再把学生的已经借的这本书记录删除。

  • 查看图书
    将指针指向已借同学的信息并打印出来。起初在调试时打印书名时,如果借了书后面又还了回去,在已借书本名哪儿会显示null,原因是在输出存放学生所借的书的指针数组的循环中没有进行判断,有的书还回去释放空间后初始化了就是null,所以应该写一个判断语句,跳过null,不是直接顺着往后输出。

sleep函数:在vim编译器中表示停顿一秒,sleep(1)

(以下是在调试过程中写的一个小总结,上面的是在总体全部调试完毕后的总结,有点后悔没有在调试时候把遇到的问题都总结一下,现在都有点记不清了,,,,,,)

解决问题的方式:在编译器指出的错误语句的区域,在程序中写找断点的代码,就是可以找一些关键性的语句比如循环语句中,写上一个printf函数打印出文字(随便是什么),看程序是否进行到了这一步。可以多打几个断点。

我的问题出现在判断是否借过书后,在判断到如果借过书,将再一次借的书存入存放学生借书信息的指针数组中时,出现了段错误。首先问题肯定是在指针指向得时候出现问题。我的判断是可能没有分配空间或者是用野指针指向了内存。
错误原因:我在最初的结构体变量中定义了一个指针数组,用于存放学生借书的信息,但定义结构体变量的时候不能初始化,所以该指针数组一直就是野指针。第一次可以存放是因为在判断为第一次借书时给第一个数组元素分配了空间和内存,而在判断为借过书的函数中,后续的元素都是野指针,所以会出现段错误。
做法:可以在判断完这人第一次借书后,对指针数组进行初始化,保证在后面判断借过书后存放信息时,循环中判断0指针就存放并分配空间。

图书管理系统是目前写的最长一个程序,我觉得重点还是指针指针指针,对内存空间的理解。还有就是程序本身的思路,要考虑的东西太多了,都是互相串联互相影响的,有点费脑子,感觉以后可以考虑保护头发了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值