1.功能需求分析

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

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

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

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

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

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

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

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

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

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

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

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

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

2.总体设计

2.1功能模块设计

系统功能模块主要分为图书信息管理和用户管理两大部分。系统启动时,主函数首先调用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.是管理员权限登录系统的处理流程图

若是普通用户登录到系统,则进入普通用户操作界面,该界面充许用户输入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.是普通用户权限登录系统的处理流程图。

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模块中的退出系统函数进行声明,具体如下:

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

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

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

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

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }为了统一管理和操作图书的基本信息,定义一个结构体类型book_info,使用typedef语句自定义一个新类型book_info, 其中成员包括图书的基本信息,如书名、作者、出版社、出版日期、ISBN 和页数等。具体实现如下:

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

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

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

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

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

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

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

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }为了完成图书管理功能,还需要一些辅助函数,它们的具体声明如下:

  1. void save_books_to_file(); //将图书信息保存到文件
  1. book* get_last_book(); //得到图书链表的最后一个节点
  1. book* get_previous_book(book* p); //取得图书节点p的前驱节点
  1. void input_book(book_info* info); //输入一本图书的信息
  1. void show_book(book_info* info); //显示图书信息
  1.  
  1. //在字符串source中查找字符串str, 如果没有找到,
  1. //则返回-1,找到则返回str的起始位置
  1. int findstr(char* source, char* str);

到目前为止,我们把图书管理中涉及到的常量,结构体及相关函数都声明或定义好了。图书管理系统的另一个主要功能模块是对用户进行管理。下面打开user.h文件,对用户管理模块中可能会涉及到的常量,结构体以及相关函数进行声明定义。首先需要定义两个常量,分别用来定义用户名和密码的最大长度。具体实现如下:

  1. //constant defintion
  1. #define MAX_USERNAME 10 //用户名的最大长度
  1. #define MAX_PASSWORD 10 //密码的最大长度

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

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

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

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

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

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

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

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

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

  1. //Auxiliary Function
  1. void save_users_to_file(); //将用户信息保存到文件中
  1. user* get_last_user(); //取得用户链表的最后一个节点
  1. user* get_previous_user(user* p); //得到当前用户节点p的前驱节点
  1. user* find_user(char* name); //从用户链表中按用户名查找一个用户信息
  1. void show_user(user_info* info); //显示用户信息
  1. void input_user(user_info* info); //输入用户信息
  1. void delete_user(user* p); //从链表中删除一个用户信息
  1. void update_user(user* p); //更新用户信息
  1.  
  1. char *getLine(char *buf, int len);//密码输入星号显示处理函数

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }到目前为止,我们已经将图书管理系统中的三大模块 用户登录模块(management.c), 图书管理模块(book.c)以及用户管理模块(user.c)中可能涉及到的常量,结构体和相关函数进行了声明或定义。下面我们根据功能描述来具体实现它们。 功能实现部分请转入: <<C项目实践--图书管理系统(2)>>

C项目实践--图书管理系统(1)的更多相关文章

  1. C项目实践--图书管理系统(3)

    接下来将要实现用户管理模块的相关功能,用户管理模块的主要功能包括增加用户,查找用户以及保存用户等功能,查找用户时,如果查找成功,充许对查找到用户进行更新或删除操作.如果查找不成功,则给出相应的提示信息 ...

  2. C项目实践--图书管理系统(2)

    前面在<<C项目实践-图书管理系统(1)>>中把系统中的三大功能模块中可能涉及到的常量,结构体及相关函数进行了声明定义,下来就来实现它们. 执行系统首先从登录到系统开始,所以首 ...

  3. C项目实践--图书管理系统(4)

    前面已经把图书管理系统的所有功能模块都已实现完毕了,下面通过运行来分析该系统的操作流程并检验是否符合逻辑设计要求. 3.系统操作过程 F5 运行 1.登录系统 系统运行之后,提示输入用户名和密码,系统 ...

  4. javaWeb项目之图书管理系统(附视频讲解)

    视频播放地址:javaWeb图书系统 本系统为"Swing项目之图书管理系统"(此源码已共享)的Web版,网页框架用采用EasyUI 数据库为MysqL,写Web项目摒弃了火狐浏览 ...

  5. 新建Django项目示例--图书管理系统

    知识点: Django 1. 安装 1. Django版本 1.11.xx 2. 安装方式 1. 命令行 --> Python环境(双版本,pip的使用) 2. PyCharm安装 2. 创建D ...

  6. Java小项目迷你图书管理系统

    package 迷你图书管理系统; import java.util.Scanner; public class BookMgr { public static void main(String[] ...

  7. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(3) - 使用Conductor切换页面

    前两章中, 我们已经实现了这个图书管理系统的登录窗口, 并实施了完善的单元测试. 该是时候回过头来关注我们的主窗口了. 一个功能丰富的系统一般会有多个页面, 我们图书管理系统虽然是"简易&q ...

  8. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(1)

    .NET Core 3.0已经发布了,除了一大堆令人激动的功能以外,也增加了对WPF的正式支持, 那么WPF在.NET Core 3.0下的开发体验如何呢? 本文利用了Stylet框架开发.NET C ...

  9. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(4) - 图书列表界面

    在前三章中我们完成了登录窗口, 并掌握了使用Conductor来切换窗口, 但这些其实都是在为我们的系统打基础. 而本章中我们就要开始开发系统的核心功能, 即图书管理功能了. 通过本章, 我们会接触到 ...

随机推荐

  1. css选择器(2)——属性选择器和基于元素结构关系的选择器

    在有些标记语言中,不能使用类名和id选择器,于是css2引入了属性选择器. 3.属性选择器 a)根据是否存在该属性来选择 如果希望选择有某个属性的元素,例如要选择有class属性的所有h1元素,使其文 ...

  2. Vutrl 自己搞SS的些问题

    虽然是第二次搞这玩意但还是搞了我三天,有些东西还是想要记录一下的,以下是我犯的错误 至于如何开始搭建Vutrl上面的服务器,下面有两个链接自己搞,我就讲讲我自己碰到的问题 https://segmen ...

  3. 根据不同的产品id获得不同的下拉选项 (option传多值)

    <td> 没有 value 所以要在<td>里面加上input  同时text 为hidden这样就不会显示value的值 <td><select id='g ...

  4. 将树莓派3B+变成WiFi热点

    我有一个树莓派3B+,安装的是官方的Raspbian Stretch操作系统,该系统和Debian 9很类似,很多命令都是通用的. 接下来我将演示如何利用树莓派搭建WiFi热点,此热点就和家里的无线路 ...

  5. Android开发——GPS定位

    1.LocationManager LocationManager系统服务是位置服务的核心组件,它提供了一系列方法来处理与位置相关的问题. 与LocationManager相关的两个知识点: 1.1 ...

  6. Android开发——Accessibility机制实现模拟点击(微信自动抢红包实现)

    1. 何为Accessibility机制 许多Android使用者因为各种情况导致他们要以不同的方式与手机交互.对于那些由于视力.听力或其它身体原因导致不能方便使用Android智能手机的用户,And ...

  7. scrapy_redis使用介绍

    scrapy_redis是一个基于redis的scrapy组件,通过它可以快速实现简单的分布式爬虫程序,该组件主要提供三大功能: (1)dupefilter——URL去重规则(被调度器使用) (2)s ...

  8. 【03】使用 Firebug 调试 JavaScript

    [03] 使用 Firebug 调试 JavaScript 描述 Firebug是一个非常强大的工具,可以帮助您发现代码发现错误的错误并解决错误. 在此我们使用Firebug来处理Javascript ...

  9. hdu4115:Eliminate the Conflict

    n<=10000局剪刀石头布,对面第i局出Ai,m<=10000种对你出什么提出的要求:Xi Yi Wi 表示第Xi局和第Yi局,Wi=1:必须不同:Wi=0:必须相同,问是否存在你一局都 ...

  10. msp430入门编程41

    msp430中C语言的软件工程--状态机建模