基于C语言的图书管理系统,初学者的最佳选择

前言

这是我花了3天时间写的一个基于C语言的图书管理系统,里面包含了超级管理员,普通管理员,图书,读者4个模块。该管理系统使用了多文件的方式进行设计编写的,具有保存存储功能,也可以批量导入,批量导出,使用了动态内存分配,对于初学者入门,该文章是最好的选择了!!

下面展示一下流程图

在这里插入图片描述

展示一下我的文件分类

在这里插入图片描述

一些结构体的定义我都是放在一个peopleInfo.h中的
 #ifndef _PEOPLEINFO_H__
  2 #define _PEOPLEINFO_H__
  3 
  4 #include<stdio.h>
  5 #include<string.h>
  6 #include<stdlib.h>
  7 #define FILE_MNAME "mana.bin"
  8 #define FILE_RNAME "reader.bin"
  9 #define FILE_BNAME "book.bin"
 10 #define NAME_LEN 40
 11 #define PASS_LEN 40
 12 #define USER_LEN 40
 13 #define BOOK_LEN 150
enum SEX{
   MAN,WOMAN};
 16 enum RET_CODE{
   
 17     SUCCESS = 0,
 18     ARG_ERR,
 19     ALLOC_ERR,
 20     FAIL,
 21     OPEN_ERR,
 22     FILE_NOT_EXISTS,
 23     WRITE_ERR
 24     };
 25 typedef struct SuperInfo{
   //超级管理员
 26     int id;//工号
 27     char name[NAME_LEN];//名字
 28     int age;//年龄
 29     enum SEX sex;//性别 
 30 }Super;
 31 
 32 typedef struct ManaInfo{
   //普通管理员
 33     int id;//工号
 34     char name[NAME_LEN];//名字
 35     int age;//年龄
 36     enum SEX sex;//性别
 37     char user[USER_LEN];//用户名
 38     char pass[PASS_LEN];//密码
 39 }Mana;
 40 
 41 typedef struct BookInfo{
   //图书结构体
 42     int id;//书号
 43     char name[NAME_LEN];//书名
 44     char author[NAME_LEN];//作者
 45     double price;//价格
 46     int state;//状态,可借or不可借or被预约
 47     int lender;//借这本书的人
 48 }Book;
typedef struct ReaderInfo{
   //读者
 51     int id;//读者号
 52     char name[NAME_LEN];//名字
 53     int age;//年龄
 54     enum SEX sex;//性别
 55     double balance;//余额
 56     char borrowBook[10][BOOK_LEN];//所借的书
 57     char orderBook[10][BOOK_LEN];//预约书
 58     char user[USER_LEN];//用户名
 59     char pass[PASS_LEN];//密码
 60 }Reader;
 61 
 62 
 63 extern Mana *pmana;//记录普通管理员信息 需要申请动态内存
 64 extern size_t msize;//申请动态内存能够存储管理员信息的数量
 65 extern size_t mcnt;//当前动态内存中管理员信息数量
 66 extern int makeId;//自动生成管理员工号
 67 
 68 extern Book *pbook;//记录图书信息 要申请动态内存
 69 extern size_t bsize;//申请动态内存能够存储图书信息的数量
 70 extern size_t bcnt;//当前动态内存中图书信息数量
 71 extern int bookId;//自动生成书号
 72 
 73 extern Reader *preader;//记录读者信息 需要申请动态内存
 74 extern size_t rsize;//申请动态内存能够存储读者信息的数量
 75 extern size_t rcnt;//当前动态内存中读者信息数量
 76 extern int readerId;//自动生成读者号
 77 
 78 
 79 #endif //_PEOPLEINFO_H__

主界面的3个登录界面

多文件的好处就是可以使代码更好的分类,做项目的时候它不可能把所有的东西都写在一个文件中,我一个view.c文件中要编写功能代码,那么我要在view.h文件中去声明好这些函数,做好一一对应,那么在调用的时候只要调用view.h文件就行了

  1 #include "view.h"
  2 #include "oper.h"
  3 #include "viewMana.h"
  4 #include "viewSuper.h"
  5 #include "viewReader.h"
  6 
  7 void showPeopleType(){
   //第一个界面,显示人员的类型
  8     printf("指针图书信息管理\n");
  9     printf("1 超级管理员\n");
 10     printf("2 普通管理员\n");
 11     printf("3 普通会员\n");
 12     printf("0 退出\n");
 13 }
 14 
 15 void run(){
   // 
 16         showPeopleType();
 17         int oper = 0;
 18         scanf("%d",&oper);
 19         switch(oper){
   
 20             case 0:
 21                 manaSave(FILE_MNAME);
 22                 readerSave(FILE_RNAME);
 23                 bookSave(FILE_BNAME);
 24                 exit(0);
 25             case 1:
 26                 superLogin();//调用超级管理员
 27                 break;
 28             case 2:
 29                 manaLogin(pmana);//调用普通管理员,这里的指针传全局的指针pmana
 30                 break;
 31             case 3:
 32                 readerLogin(preader);
 33                 break;
 34         }
 35 }

在这里插入图片描述
在这里插入图片描述
增删改查的功能在oper.c中,这里是他们函数的逻辑功能实现代码

  1 #include "oper.h"
  2 
  3 int addMana(Mana *pm){
   //添加一个管理员
  4     if(pm == NULL){
   //指针为空
  5         return ARG_ERR;
  6     }
  7     if(pmana == NULL){
   //第一次申请
  8         pmana = malloc(sizeof(Mana)*msize);
  9     }
 10     if(pmana != NULL && msize == mcnt){
   //满了
 11         msize *= 2;//扩容
 12         pmana = realloc(pmana,sizeof(Mana)*msize);
 13     }
 14     if(pmana == NULL){
   //如果申请动态内存失败了
 15         return ALLOC_ERR;
 16     }
 17     pmana[mcnt] = *pm;//把该管理员放进去
 18     ++mcnt;
 19     return SUCCESS;
 20 }
 21 
 22 int delMana(int id){
   //删除管理员
 23     int i;
 24     for(i = 0; i < mcnt; i++){
   
 25         if(pmana[i].id == id){
   
 26             pmana[i] = pmana[mcnt-1];
 27             mcnt--;
 28             return SUCCESS;
 29         }
 30     }
 31     return;
 32 }
Mana* findMana(int id){
   //查找管理员
 35     int i;
 36     for(i 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值