前言
这是我花了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