zoukankan      html  css  js  c++  java
  • C项目实践--图书管理系统(1)

    1.功能需求分析

    图书管理系统主要用于对大量的图书信息,包括书名、作者、出版社、出版日期、ISBN(书号)等进行增、删、改、查以及保存等操作。同时也包括对用户的管理,用户包括管理员和普通用户两种权限,管理员可以完成全部操作,而普通用户只能对图书进行浏览和查询操作。为保存信息,系统利用文件将图书信息和用户信息都存储在文件中,每次启动系统时,先将数据从文件中读取到单链表中,进行增、删、改、查等操作,在系统退出之前,再将单链表中的数据保存到文件中,有效地将数据进行保存。主要功能描述如下:

    (1)用户登录 , 首先提示用户输入用户名和密码,调用文件中存储的用户信息进行校对,只有用户名和密码都匹配时才充许用户使用该系统。用户登录到系统后能够使用的系统功能与用户的权限有关,管理员可以完成全部操作,而普通用户只能进行图书的浏览和查询操作,权限判定在登录模块中完成。

    (2)系统主控平台,不同权限的用户登录不同的系统主控平台,通过输入相应的序号来选择对应的操作。

    (3)新增图书信息,用户根据提示输入图书的书名、作者、出版社、出版日期、ISBN以及页数等数据。输入完一条图书信息,可根据提示继续输入下一条图书信息或继续其它操作,充许用户输入多条信息。输入完图书信息后,以单链表的形式暂时保存在单链表中,等待下一步操作。系统退出之前,将单链表中的全部图书信息保存到文件中。

    (4)浏览图书信息,在选择了浏览图书操作后,将图书信息从内存中调出来显示,最后提示是否再次浏览图书信息。如果没有查询到任何信息,则给出提示信息。

    (5)查询图书信息,进入查询子菜单,可以分别按书名、作者、出版社、出版日期、ISBN对单链表中的图书信息进行查询,其中按书名、作者、出版社和出版日期这四种查询实现的是模糊查询,按ISBN查询实现的是精确查询。

    (6)删除图书信息,首先提示用户输入要删除的图书的ISBN,根据输入的ISBN号在单链表中查找,如果该图书存在,则首先显示该图书的基本信息,并提示用户是否进行删除操作,用户确认删除后,直接删除,如果没有找到,系统给出提示信息。

    (7)保存图书信息,将单链表中的图书信息保存到文件中

    (8)新增用户信息,只有管理员可以处理这个模块,根据提示信息输入用户名和密码以及权限。输入完一个用户信息后直接返回到主菜单界面,进行其它操作。充许输入多个用户信息,但用户名不充许重复。输入完的信息,在系统退出之前,会保存到文件中。

    (9)查找用户,首先提示用户输入要查找的用户名,根据输入的用户名从单链表中查询,查询成功,显示该用户的信息,并提示是否对该用户进行删除后修改,根据用户输入的信息可以完成对用户信息的删除后修改操作。如果没有查询到相关信息,则给出提示信息。

    (10)保存用户信息,将单链表中的用户信息保存到文件中

    (11)退出系统,在系统退出之前,保存用户和图书的信息,并释放掉链表,防止内存泄露。

    管理员登录可以完成全部操作,但普通用户登录只能对图书进行浏览和查询操作。

    2.总体设计

    2.1功能模块设计

    image

    系统功能模块主要分为图书信息管理和用户管理两大部分。系统启动时,主函数首先调用init_user()函数对用户模块进行初始化操作,即设定最初的管理员的用户名(admin)和密码(123),并对文件进行初始设置,即用户文件不存在,则创建用户文件。再调用load_users()函数将用户文件中的用户信息加载到用户单链表中。接着调用init_book()函数对图书模块初始化操作,主要完成图书文件的初始设置,即图书文件不存在,则创建图书文件,再调用load_books()函数将图书文件的图书信息加载到图书单链表中。最后调用login()函数判断用户类型,如果是管理员权限,则调用show_admin_menu()函数进入管理员操作界面。如果是普通用户权限,则调用show_user_menu(),进入普通用户操作界面。接下来对模块的功能逐一介绍如下:

    1.登录系统

    系统调用login()函数完成登录操作。首先提示用户输入登录名和密码,调用find_user()函数查找输入的登录名是否存在,如果登录名不存在,则给出提示信息,如果存在,则接着判断密码是否正确,如果密码错误,则提示密码错误,否则就接着判断用户权限类型,并作为login函数的返回值。在主程序中完成权限的判断。

    2.增加图书信息

    系统调用add_book()函数以增加图书信息,调用input_book()函数完成图书信息的输入,将用户输入的信息添加到图书单链表中。输入完成之后提示用户是否继续增加图书的操作,如果用户输入"y"或"Y",则再次调用此函数,实现继续增加图书信息操作。否则返回主菜单界面。

    3.浏览图书信息

    系统调用view_book()函数来浏览图书信息,将图书链表中的图书信息按指定的格式显示出来。显示完成后,提示用户是否再次浏览,如果用户输入"y"或"Y",则再次调用此函数进行相关操作,否则返回主菜单界面。

    4.查找图书信息

    如果是管理员权限,调用show_search_book_menu()函数,进入管理员查询图书子菜单,可以分别按书名、作者、出版社、出版日期和国际标准书号(ISBN)进行查找,前四项支持模糊查询,只有按ISBN查找是精确查找。

    (1)按书名查找

    调用search_book_by_author()函数按书名查找图书信息。首先提示用户输入图书名称,然后调用findstr()函数在单链表中查找该图书信息,实现了模糊查找。如果查找到该图书,,则调用show_book()函数显示该图书信息,否则给出没有找到的提示信息。查询结束后提示用户是否再次查找,如果用户输入"y"或"Y",则再次调用此函数进行相关操作,否则返回查询子菜单界面。

    (2)按作者查找

    调用search_book_by_author()函数按作者进行查询图书信息,具体操作步骤与按书名查询类似。

    (3)按出版社查找

    调用search_book_by_publisher()函数按出版社查询图书信息,具体操作步骤与按书名查询类似。

    (4)按出版日期查询

    调用search_book_by_pubdate()函数按出版日期查询图书信息,具体操作步骤与按书名查询类似。

    (5)按ISBN查找

    调用search_book_by_isbn()函数按ISBN查询图书信息。首先提示用户输入ISBN号,然后根据输入的ISBN号在图书信息单链表中进行精确查找。调用strcmp()函数进行字符串对比,如果找到该图书则调用show_book函数显示该图书信息,否则提示没有找到。提示用户是否再次查找,如果用户输入"y"或"Y", 在再次调用本函数进行相关操作。否则返回查询界面。

    5.删除图书信息

    系统调用delete_book()函数完成图书信息的删除操作。首先提示用户输入要删除的图书的ISBN信息,然后查询是否存在该ISBN信息的图书,如果不成功,则给出提示信息,如果查询成功,则提示是否确认删除,如果用户输入"Y"或"y" ,则删除该图书信息,否则返回主菜单界面。

    6.保存图书信息

    系统调用save_books()函数来保存图书信息。调用save_books_to_file()函数,完成将图书单链表中的图书信息保存到图书文件中。

    7.新增用户信息

    系统调用add_user()函数来增加用户信息,调用input_user()函数完成用户信息的输入,将用户输入的信息添加到用户单链表中。输入完成后提示用户是否继续增加用户的操作,如果用户输入"Y"或"y" ,则再次调用该函数进行相关操作,否则返回主菜单界面。

    8.查找用户信息

    系统调用search_user(0函数完成用户信息的查找操作。首先提示用户输入要查找的用户名,然后调用find_user()函数,查找该用户是否存在,如果该用户不存在,给出相应的提示信息。如果存在,则调用show_suer()函数显示该用户的信息,并充许对该用户信息进行更新或删除操作。提示用户按d/D键删除该用户信息,按u/U键更新该用户信息。根据用户的输入进行相应的操作,调用delete_user()函数删除用户信息,调用update_user()函数更新用户信息。所以查找用户信息结束后可分别选择调用delete_user()函数或update_user()函数或者什么都不做。

    9.更新用户信息

    在查询用户之后,调用update_user(0函数对该用户进行更新操作,首先调用input_user()函数输入用户信息,接着调用find_user()函数查找输入的用户名是否已经存在。由于用户名不充许重复,如果用户输入的用户名已存在,则给出相应的提示信息,如不存在,则进行更新操作。

    10删除用户信息

    在查询用户信之后,充许调用delete_user()函数对该用户进行删除操作,首先提示用户是否确认删除,如果用户输入"Y"或"y”,则删除该用户信息,否则提示用户继续查找操作。

    11.保存用户信息

    系统调用save_users()函数保存用户信息,调用save_uses_to_file()函数,将用户单链表中数据保存到文件中。

    12.退出系统

    不同权限的用户退出系统调用不同的函数来完成。

    1.管理员退出系统

    管理员权限退出系统调用admin_exit()函数。首先提示用户是否确定退出,如果用户输入"Y"或"y",再调用save_users_to_file()函数,将用户链表中的数据保存到用户文件中,调用clear_users()函数清空用户链表,最后调用save_books_to_file()函数将图书链表中的数据保存到文件中,调用clear_books()函数清空图书链表,用户输入的不是"Y"或"y",则不退出。

    2.普通用户权限退出系统

    普通用户权限退出系统调用user_exit()函数。首先提示用户是否确定退出,如果用户输入"y"或"Y", 则调用clear_users()函数清空用户链表,调用clear_books()函数清空图书链表,如果不是输入的"Y'或"y"则不退出系统。

    2.2系统处理流程

    系统启动之后,首先加载图书文件信息和用户文件信息,充许用户登录。有管理员和普通用户两种权限。用户输入正确的登录名和密码才能登录成功。系统根据用户名的类型,分别进入不同权限的操作界面。

    1.进入管理员主菜单界面,充许用户输入1-9之间的数值进行相应的操作,如果输入其它字符,则提示输入有误,并提示重新输入。

    若输入1,则调用add_book()函数,进行新增图书信息操作。

    若输入2,则调用view_book()函数,浏览图书信息

    若输入3,则调用show_search_book_menu()函数进入查询子菜单界面,菜单充许用户输入1-6之间的数值进行相应的操作。如果输入1,则按书名查找,输入2,则按作者查找,输入3,则按出版社查找,输入4,则按出版日期查找,这四种查找方式支持模糊查找,如输入5则按ISBN号进行精确查找,输入6则返回主菜单界面。

    若输入4,则调用delete_book()函数,进行删除图书信息操作。

    若输入5,则调用save_books()函数,保存图书信息

    若输入6,则调用add_user()h函数,新增用户信息

    若输入7,则调用search_user()函数,进行查找用户信息操作,对于查找到的用户信息,充许进行更新(update_user()) 和删除(delete_user())操作。

    若输入8, 则调用save_users()函数,保存用户信息,

    若输入9, 则调用admin_exit()hans ,退出系统。

    图1.是管理员权限登录系统的处理流程图

    image

    若是普通用户登录到系统,则进入普通用户操作界面,该界面充许用户输入1-7之间的数值进行相应的操作,如果不是这些数值,则提示输入有误,并提示是否重新输入

    若输入1, 则调用view_book函数,浏览图书信息

    若输入2,则调用search_book_by_name()函数,按书名查询图书信息

    若输入3,则调用search_book_by_author()函数, 按作者查询图书信息

    若输入4,则调用search_book_by_publisher()函数,按出版社查询图书信息

    若输入5,则调用search_book_by_pubdate()函数,按出版日期查询图书信息

    若输入6,则调用search_book_by_isbn()函数,按ISBN号精确查找图书洗洗脑

    若输入7, 则调用user_exit()函数退出系统。

    图2.是普通用户权限登录系统的处理流程图。

    image

    2.3详细设计与系统实现

    本系统包括图书管理和用户管理两个方面,程序分为三大模块,共包含三个源程序文件(management.c , book.c 和 user.c )和三个对应的头文件(management.h, book.h ,user.h).其中book.c中完成图书信息的管理,包括新增图书,浏览图书,查询图书,以及删除和保存操作。user.c完成用户信息的管理,包括新增,查询,删除,修改和保存等操作。management.c中包括系统入口函数main, 主要负责完成用户登录和退出系统。book.h中的内容是图书信息的管理中涉及的常量,结构体的定义和相关函数的声明。user.h中的内容是用户信息的管理中涉及的常量、结构体定义及相关函数的声明。management.c中是对菜单及退出函数的声明。具体实现如下:

    首先通过vs 新建win32 Console Application, 然后选择Empty proj, 单击Finished 完成BookMng项目创建

    首先,在Header Files中新建management.h , book.h , user.h 三个头文件, 然后在Source Files中新建management.cpp , book.cpp , user.cpp 三个实现文件。系统的执行首先从主菜单开始,下面首先打开management.h 对菜单和management模块中的退出系统函数进行声明,具体如下:

    //Function Definitions
    //Display controller 
    void show_admin_menu();       //显示管理员操作的菜单
    void show_search_book_menu(); //显示管理员查询图书的菜单
    void show_user_menu();        //显示普通用户操作的菜单
    //system function definition 
    void admin_exit();  //管理员退出系统函数
    void user_exit();   //普通用户退出系统函数

    接下来打开book.h 在这里完成图书信息管理中涉及的常量,结构体和相关函数的定义和声明。

    首先定义5个常量,分别用来定义书名、出版社、出版日期、作者和ISBN的最大长度。具体定义如下:

    //Constant Macro Definition
    #define MAX_BOOK_NAME 20  //书名的最大长度
    #define MAX_PUBLISHER 20  //出版社的最大长度
    #define MAX_DATE 10       //出版日期的最大长度
    #define MAX_AUTHOR 20     //作者最大长度
    #define MAX_ISBN 20       //ISBN的最大长度

    为了统一管理和操作图书的基本信息,定义一个结构体类型book_info,使用typedef语句自定义一个新类型book_info, 其中成员包括图书的基本信息,如书名、作者、出版社、出版日期、ISBN 和页数等。具体实现如下:

    //Struct definition
    typedef struct _book_info
    {
        char book_name[MAX_BOOK_NAME];  //书名
        char author[MAX_AUTHOR];        //作者
        char publisher[MAX_PUBLISHER];  //出版社
        char pub_date[MAX_DATE];        //出版日期
        char ISBN[MAX_ISBN];            //ISBN
        int pages;                      //页数
    }book_info;

    上面为便于描述图书的基本信息,通过定义一个结构体来描述,现在为了便于管理一组图书信息,可以将图书信息串联起来构成一个单链表,这样就需要定一个单链表单元。下面来定义一个结构体类型_book, 使用typedef 定义一个新类型book, 其成员包括一个存储图书基本信息的结构体变量bi , 和指向下一本图书的指针变量。具体定义如下:

    typedef struct _book
    {
        book_info bi;       //图书基本信息
        struct _book* next; //指向下一本图书的指针
    }book;

    下面来声明图书管理中用到的主要处理函数,具体实现如下:

    //Function Definition
    void init_book();  //图书模块初始化用于创建存储图书信息的文件
    void load_books(); //从图书文件中加载图书信息
    void add_book();   //新增图书
    void view_book();  //浏览所有图书
    void delete_book();//删除图书
    void save_books(); //调用将图书信息保存到文件函数,给出提示信息
    void clear_books();//从内存中清除图书链表信息

    接下来对图书查询函数进行声明,具体实现如下:

    void search_book_by_name();     //按书名查询图书
    void search_book_by_author();   //按作者查询图书
    void search_book_by_publisher();//按出版社查询图书
    void search_book_by_pubdate();  //按出版日期查询图书
    void search_book_by_isbn();     //按ISBN查询图书

    为了完成图书管理功能,还需要一些辅助函数,它们的具体声明如下:

    void save_books_to_file();        //将图书信息保存到文件
    book* get_last_book();            //得到图书链表的最后一个节点
    book* get_previous_book(book* p); //取得图书节点p的前驱节点
    void input_book(book_info* info); //输入一本图书的信息
    void show_book(book_info* info);  //显示图书信息
     
    //在字符串source中查找字符串str, 如果没有找到,
    //则返回-1,找到则返回str的起始位置
    int findstr(char* source, char* str);
    到目前为止,我们把图书管理中涉及到的常量,结构体及相关函数都声明或定义好了。图书管理系统的另一个主要功能模块是对用户进行管理。下面打开user.h文件,对用户管理模块中可能会涉及到的常量,结构体以及相关函数进行声明定义。首先需要定义两个常量,分别用来定义用户名和密码的最大长度。具体实现如下:
    //constant defintion
    #define MAX_USERNAME 10  //用户名的最大长度
    #define MAX_PASSWORD 10  //密码的最大长度

    用户管理中分管理员和普通用户两种,没有第三种情况, 因此定义为用户类型的这个变量的取值只有可能是这两种之中的一种,那么为了防止出错,或者避免显示去编写判断这个变量是否就是这两个取值之一的函数,那么我们可以把这个管理员和普通用户这个数据集合定义为一个枚举类型, 这样就避免了不要的麻烦。所以现在来定义一个枚举类型 _USER_TYPE, 使用typedef自定义一个新枚举类型USER_TYPE。枚举类型可能取两种值,ADMIN对应0,管理员,USER对应1,为普通用户。具体实现如下:

    //Struct defintion
    typedef enum _USER_TYPE
    {
        ADMIN = 0,   //代表管理员
        USER         //普通用户
    }USER_TYPE;

    接下来需要定义一个结构体类型 _user_info 来描述用户的基本信息, 使用typedef 自定义一个新类型user_info。 新类型中共3个成员,即用户名,密码和用户权限。具体实现如下:

    typedef struct _user_info
    {
        char username[MAX_USERNAME];  //用户名
        char password[MAX_PASSWORD];  //密码
        USER_TYPE  user_type;         //用户类型,0为管理员,1为普通用户
    }user_info;

    为了将单个用户信息串联起来,下面再来定义一个单链表节点结构。即定义一个结构体类型 _user , 使用typedef自定义一个新类型user, 其成员为存储用户基本信息的结构体变量和指向下一个用户的指针变量,共2个成员。具体实现如下:

    typedef struct _user
    {
        user_info ui;        //用户基本信息
        struct _user* next;  //指向下一个用户的指针变量
    }user;

    下面来声明用户管理用要用到的主要处理函数,具体声明如下:

    //Function definition
    void init_user();    //初始化用户模块,创建用来存储用户信息的文件
    void load_users();   //从用户文件中加载信息到单链表红
    USER_TYPE login();   //用户登录,返回用户类型
    void add_user();     //新增用户
    void search_user();  //查找用户
    void save_users();   //调用将用户信息保存到文件函数,给出提示信息
    void clear_users();  //从内存中清空用户链表信息

    接下来要需要声明一些在用户管理中需要用到但非功能核心的函数,它们的具体声明如下:

    //Auxiliary Function
    void save_users_to_file();        //将用户信息保存到文件中
    user* get_last_user();            //取得用户链表的最后一个节点
    user* get_previous_user(user* p); //得到当前用户节点p的前驱节点
    user* find_user(char* name);      //从用户链表中按用户名查找一个用户信息
    void show_user(user_info* info);  //显示用户信息
    void input_user(user_info* info); //输入用户信息
    void delete_user(user* p);        //从链表中删除一个用户信息
    void update_user(user* p);        //更新用户信息
     
    char *getLine(char *buf, int len);//密码输入星号显示处理函数
    到目前为止,我们已经将图书管理系统中的三大模块 用户登录模块(management.c), 图书管理模块(book.c)以及用户管理模块(user.c)中可能涉及到的常量,结构体和相关函数进行了声明或定义。下面我们根据功能描述来具体实现它们。 功能实现部分请转入: <<C项目实践--图书管理系统(2)>>
  • 相关阅读:
    异常处理学习笔记
    android 测试
    android 创建快捷方式
    POJ 3320 尺取法(基础题)
    HDOJ 1260 DP
    数位DP练习
    P2727 Stringsobits
    poj 2229 DP
    Canada Cup 2016 C. Hidden Word
    hdoj 1231 最大连续子列和
  • 原文地址:https://www.cnblogs.com/AI-Algorithms/p/3395148.html
Copyright © 2011-2022 走看看