图书管理系统开发实例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
需求分析
• 对于图书管理系统而言,其最重要的 功能是管理图书,包括增加书籍、删 除书籍和查询书籍。其中,删除书籍 和查询书籍的功能又可以细化为很多 功能,比如删除某一个时间段内增加 的书籍、删除某个作者的书籍、显示 某个作者的所有书籍、显示书名带某 个关键字的书籍等等。其次,需要提 供一个友好的交互界面,这是用户接 触到的最直接的东西,其设计必须人
• 数据管理模块的功能为本系统的核心 模块,提供所有对书籍数据的操作请 求的处理,包括增加书籍、删除书籍、 搜索书籍、批量删除书籍、高级搜索 书籍等等。 • 历史日志模块主要提供用户行为记录、 系统信息记录、异常信息记录等功能。 • 辅助模块:全局配置模块。在这个模
.1 系统架构
• 根据以上功能模块的划分,本系统的软 件结构设计如下图所示。
需求分析
• 整理以上的需求分析,可以得出本图 书管理系统需要实现的功能主要包括 以下三点: • 提供友好的用户交互界面; • 提供书籍的增加、删除、查询、批量 创建等操作; • 提供历史日志以记录操作信息。
系统设计
• 系统设计阶段可以理解为程序的概要设 计,需要完成对系统结构的分析和设计, 以及设计系统需要的主要数据结构。本 小节将基于需求分析的结果,依次讨论 了图书管理系统的系统架构和数据类型。
.5 编写menu_add函数: 打印增加书籍的二级菜单,
• menu_add函数提供了增加书籍的交互 命令,从标准输入获取书籍信息,并 调用数据管理模块中的书籍增加函数 book_add,最后调用日志模块中的记 录功能。进入menu_main函数后,当 出现图21-4后,如果选择选项1,则会 触发memu_add函数。由于该菜单函 数只在用户界面模块中调用,并只在 menu.c函数中调用,因此可以将其定 义为static函数。
21.5.1 打开和关闭文件
• C语言中对文件的操作必须通过文件指 针进行。处理文件时,程序需要知道 文件的属性信息,例如文件的性质、 文件的名字、文件的当前状态等。在C 程序中,这些信息以结构体的方式结 合在一起,每一个被操作的文件都会 拥有一块内存空间存放属于它的结构 体信息。这个结构体类型被定义为 FILE。基于FILE变量,C标准输入输 出函数库定义了fopen函数和fclose函
.2 数据结构
• 本图书管理系统的核心数据对象是书 籍。书籍信息中包含很多信息,包括: 书名、作者、出版社、出版日期、入 库日期、入库编号和页数等。因此, 处理书籍信息的数据类型必须为结构 体,将其命名为BookInfor。其中,书 名、作者和出版社的数据类型为字符 数组;入库编号和页数选择使用整型; 而出版日期和入库日期由于包含年、 月、日信息,因此需要使用另一个结
.1 系统架构
• 根据需求分析的结果,本系统至少要 分为以下几个模块:main函数模块、 用户界面管理模块、数据管理模块和 历史日志模块。其中:
• main函数模块的主要功能为提供程序 入口、前期环境设置、调用主要的执 行函数和程序结束前的数据处理。
• 用户界面管理模块主要提供用户交互
.1 系统架构
.1 程序流程
• 将以上本模块的功能具体化并整理为 如下: • (1)进入用户界面模块(其方式为在 main函数中调用该模块的主菜单)。 • (2)打印出主菜单,要求含有系统名 称和第一级菜单,该第一级菜单的内 容要求包括主要的功能选择:增加书 籍、删除书籍、搜索书籍、批量删除、 高级搜索和退出。
.7 编写menu_search函数: 输出搜索书籍的二级菜单
• menu_search函数与menu_delete函 数类似。它提供了搜索书籍的交互界 面。同样地,本系统提供了多种搜索 书籍的功能,包括按照书名搜索、按 作者搜索、按出版社搜索等,因此本 函数需要提供二级菜单,以供用户选 择;同样地,提供二级菜单后,需要 提供一个选择结构以触发数据管理模 块中的各种相应搜索操作;最后,同 样要提供日志记录和回到本级目录的
.9 编写menu_exit函数: 退出所有二级菜单
• 当菜单选择时,如果输入值超出范围, 将调用menu_exit函数。其功能为记 录日志并退出系统。代码实现如下所 示:
• 01 static void menu_exit(void) { /* 退出的菜单*/ • 02 LOG_ERROR("Quit the book management system.");
.2 代码实现
• menu_batch_del函数,输出批量 删除书籍的二级菜单,并选择下一 操作。 • menu_advanced_sear函数,输出 高级搜索书籍的二级菜单,并选择 下一操作。 • menu_reload函数,输出载入书籍 数据的二级菜单,并选择下一操作。 • menu_exit函数,退出操作所有二
.3 编写menu_main函数: 打印主界面和第一级菜单
• menu_main函数分为两部分,第一部分 为主菜单内容,第二部分为输入选择, 第三部分为根据选择触发对应的选项。
.4 编写menu_choice函数
• 此函数只在menu.c中使用,因此可声明 为static函数。其功能为从键盘输入一 个大于0并且小于指定数值的整数。
.8 编写menu_reload函数: 输出载入书籍数据的二级 菜单
• menu_reload函数提供了从文件中导入书 籍信息的交互界面,并触发导入数据的操 作,最后记录日志后返回上级目录。函数 实现如下: • 01 static void menu_reload(void) { /* 重载的菜单*/ • 02 char file_name[LEN_FILE_NAME] = "\0"; /* 定义文 件名字*/
.1 程序流程
• 根据以上功能要求的描述设计出本系统 的菜单导航示意图如下图所示。该图同 时也是本模块主要函数以及函数间调用 的程序流程图。
.2 代码实现
• 用户界面模块功能的代码实现都包含在 menu.c文件中,menu.h文件包含了 menu.c文件的接口信息。menu.c中需要 含有所有的菜单打印函数和选择命令后 触发下一操作的过程。
main模块
• main模块包含在main.c文件中,其主 题有三个函数:main函数、configure 函数和clean函数。main函数即为读者 早已熟悉的程序入口函数,其负责调 用系统执行时的各个主要函数。而 configure函数的功能为在程序开始时 初始化或配置各种必须的变量和环境。
main模块
21.5 日志模块
• 在所有的系统中,日志模块是必不可 少的。它使使用者可以查看操作记录, 还可以使管理者跟踪程序信息。在本 系统中,日志模块完成两个功能:一、 记录异常情况;二、记录用户的操作 记录。每次做记录时都输出到两个地 方:标准输出和日志文件。在介绍本 模块的实现之前,先简单介绍一下如 何在C程序中操作文件。
21.5.1 打开和关闭文件
• fopen函数的声明如下: • FILE * fopen(char * filename, char * mode); • 其中,filename字符串包含要打开的 文件路径及其文件名;mode字符串则 代表打开文件的方式:若为’r’,则为 只读;若为’w’,为只写;若为’+’, 则为可读也可写。如果打开成功,该 函数返回打开文件的文件指针,必须
21.5.2 文件的格式化读 写
• 2.fscanf函数
• fscanf函数的功能为以指定的格式从 文件中读取数值,声明如下: • int fscanf(FILE * fp, const char *char 字符串, 参数列表); • fscanf函数的功能与scanf函数也很相 似,scanf函数指定了输入为标准输入 文件,而fscanf函数可以指定输入位
.2 数据结构
• 年份的值可以处理为4位整数,可以存 储在16位二进制数中;月份和日子都 可以处理为2位整数,都可以存储在8 位二进制数中:因此,可以将时间数 据类型TimeInfor处理为位域类型, 声明如下: • 01 typedef struct { • 02 unsigned year : 16; /* 年*/ • 03 unsigned month : 8;
.2 代码实现
• 因此,menu.c文件需要包括以下函数: • menu_main函数,打印主界面和第一 级菜单,并选择下一操作。 • menu_add函数,打印增加书籍的二 级菜单,并选择下一操作。 • menu_delete函数,输出删除书籍的 二级菜单,并选择下一操作。 • menu_search函数,输出搜索书籍的 二级菜单,并选择下一操作。
• clean函数的作用与configure函数相对 应,其负责程序结束前的清理工作,比 如清除程序中分配的堆内存等。本模块 的程序流程图如下图所示,这也就是 main函数的程序流程图。
用户界面模块
• 用户界面模块的主要功能为图书管理 系统的使用提供一个命令选择和导航 的功能。现在流行的管理软件基本都 是基于图形界面的,C语言也可以实现 图形界面,但由于篇幅的限制,本系 统只提供一个基于命令行的交互界面。 具体地讲,本系统提供的交互方式与 现行的电话服务系统类似:先列出一 些以数字引导的命令选项,再由使用 者输入选项编号实现命令选择。
.2 代码实现
• 在这些函数中,除了menu_main函数 会被外部调用外,其他函数暂时都只 需要在本文件内使用,因此menu.h文 件中只需包含menu_main这个函数的 声明,同时其余函数都声明为static 函数。若在以后需要在其他文件中调 用这些static函数,再回来修改它的 声明即可。 • 注意:把所有不允许外部使用的函数
来自百度文库 .2 数据结构
• 本系统中的书籍数据是大批量数据, 因此需要选择使用数组或者链表保存 书籍数据。考虑到图书管理系统会很 频繁地访问书籍信息,而增加和删除 的操作相对较少,因此选择使用数组 来保存。而又由于书籍数目是不可预 期的,因此最好使用动态数组来处理 数据。 • 注意:数据结构要考虑时间复杂度和
.2 数据结构
• 因此,书籍信息类型可以声明如下: • 01 typedef struct { • 02 char name[LEN_BOOK_NAME]; /* 书名*/ • 03 char author[LEN_AUTHER_NAME]; /* 作者*/ • 04 char publisher[LEN_PUBLISHER_NAME
21.5.2 文件的格式化读 写
• 文件的格式化读写是以指定的格式对文 件进行数据读写。C语言也为文件格式化 读写提供了函数:fprintf函数和fscanf 函数。
21.5.2 文件的格式化读 写
• 1.fprintf函数
• fprintf函数的功能为将数值以指定的 格式输出到指定的文件中,声明如下: • int fprintf(FILE * fp, const char * 字符串, 参数列表); • fprintf函数的功能和printf函数很相 似,只是printf函数指定了输出为标准 输出文件,而fprintf可以指定输出位
.6 编写menu_delete函数: 输出删除书籍的二级菜单
• menu_delete函数提供了删除书籍的 交互界面。本系统提供了多种删除书 籍的功能,包括按照书名删除、按作 者删除、按出版社删除等,因此本函 数需要提供二级菜单,以供用户选择; 与menu_main函数类似,提供二级菜 单后,需要提供一个选择结构以触发 数据管理模块中的各种相应删除操作; 最后,同样要提供日志记录和回到本 级目录的功能。
21.5.3 打开和关闭日志 文件
• 在前面的功能分析中,已经知道日志 模块会将日志记录到一个文件中。由 于这个文件在程序从开始到结束都是 要使用的,因此将其定义为全局变量。 在使用日志模块前,g_logFile必须指 向一个有效文件;而在程序结束之前, 这个文件指针指向的文件必须被关闭。 为了达到这个目的,将文件打开操作 放在main模块的初始化操作函数 configure中进行,将关闭文件的操作
• 对于图书管理系统而言,其最重要的 功能是管理图书,包括增加书籍、删 除书籍和查询书籍。其中,删除书籍 和查询书籍的功能又可以细化为很多 功能,比如删除某一个时间段内增加 的书籍、删除某个作者的书籍、显示 某个作者的所有书籍、显示书名带某 个关键字的书籍等等。其次,需要提 供一个友好的交互界面,这是用户接 触到的最直接的东西,其设计必须人
• 数据管理模块的功能为本系统的核心 模块,提供所有对书籍数据的操作请 求的处理,包括增加书籍、删除书籍、 搜索书籍、批量删除书籍、高级搜索 书籍等等。 • 历史日志模块主要提供用户行为记录、 系统信息记录、异常信息记录等功能。 • 辅助模块:全局配置模块。在这个模
.1 系统架构
• 根据以上功能模块的划分,本系统的软 件结构设计如下图所示。
需求分析
• 整理以上的需求分析,可以得出本图 书管理系统需要实现的功能主要包括 以下三点: • 提供友好的用户交互界面; • 提供书籍的增加、删除、查询、批量 创建等操作; • 提供历史日志以记录操作信息。
系统设计
• 系统设计阶段可以理解为程序的概要设 计,需要完成对系统结构的分析和设计, 以及设计系统需要的主要数据结构。本 小节将基于需求分析的结果,依次讨论 了图书管理系统的系统架构和数据类型。
.5 编写menu_add函数: 打印增加书籍的二级菜单,
• menu_add函数提供了增加书籍的交互 命令,从标准输入获取书籍信息,并 调用数据管理模块中的书籍增加函数 book_add,最后调用日志模块中的记 录功能。进入menu_main函数后,当 出现图21-4后,如果选择选项1,则会 触发memu_add函数。由于该菜单函 数只在用户界面模块中调用,并只在 menu.c函数中调用,因此可以将其定 义为static函数。
21.5.1 打开和关闭文件
• C语言中对文件的操作必须通过文件指 针进行。处理文件时,程序需要知道 文件的属性信息,例如文件的性质、 文件的名字、文件的当前状态等。在C 程序中,这些信息以结构体的方式结 合在一起,每一个被操作的文件都会 拥有一块内存空间存放属于它的结构 体信息。这个结构体类型被定义为 FILE。基于FILE变量,C标准输入输 出函数库定义了fopen函数和fclose函
.2 数据结构
• 本图书管理系统的核心数据对象是书 籍。书籍信息中包含很多信息,包括: 书名、作者、出版社、出版日期、入 库日期、入库编号和页数等。因此, 处理书籍信息的数据类型必须为结构 体,将其命名为BookInfor。其中,书 名、作者和出版社的数据类型为字符 数组;入库编号和页数选择使用整型; 而出版日期和入库日期由于包含年、 月、日信息,因此需要使用另一个结
.1 系统架构
• 根据需求分析的结果,本系统至少要 分为以下几个模块:main函数模块、 用户界面管理模块、数据管理模块和 历史日志模块。其中:
• main函数模块的主要功能为提供程序 入口、前期环境设置、调用主要的执 行函数和程序结束前的数据处理。
• 用户界面管理模块主要提供用户交互
.1 系统架构
.1 程序流程
• 将以上本模块的功能具体化并整理为 如下: • (1)进入用户界面模块(其方式为在 main函数中调用该模块的主菜单)。 • (2)打印出主菜单,要求含有系统名 称和第一级菜单,该第一级菜单的内 容要求包括主要的功能选择:增加书 籍、删除书籍、搜索书籍、批量删除、 高级搜索和退出。
.7 编写menu_search函数: 输出搜索书籍的二级菜单
• menu_search函数与menu_delete函 数类似。它提供了搜索书籍的交互界 面。同样地,本系统提供了多种搜索 书籍的功能,包括按照书名搜索、按 作者搜索、按出版社搜索等,因此本 函数需要提供二级菜单,以供用户选 择;同样地,提供二级菜单后,需要 提供一个选择结构以触发数据管理模 块中的各种相应搜索操作;最后,同 样要提供日志记录和回到本级目录的
.9 编写menu_exit函数: 退出所有二级菜单
• 当菜单选择时,如果输入值超出范围, 将调用menu_exit函数。其功能为记 录日志并退出系统。代码实现如下所 示:
• 01 static void menu_exit(void) { /* 退出的菜单*/ • 02 LOG_ERROR("Quit the book management system.");
.2 代码实现
• menu_batch_del函数,输出批量 删除书籍的二级菜单,并选择下一 操作。 • menu_advanced_sear函数,输出 高级搜索书籍的二级菜单,并选择 下一操作。 • menu_reload函数,输出载入书籍 数据的二级菜单,并选择下一操作。 • menu_exit函数,退出操作所有二
.3 编写menu_main函数: 打印主界面和第一级菜单
• menu_main函数分为两部分,第一部分 为主菜单内容,第二部分为输入选择, 第三部分为根据选择触发对应的选项。
.4 编写menu_choice函数
• 此函数只在menu.c中使用,因此可声明 为static函数。其功能为从键盘输入一 个大于0并且小于指定数值的整数。
.8 编写menu_reload函数: 输出载入书籍数据的二级 菜单
• menu_reload函数提供了从文件中导入书 籍信息的交互界面,并触发导入数据的操 作,最后记录日志后返回上级目录。函数 实现如下: • 01 static void menu_reload(void) { /* 重载的菜单*/ • 02 char file_name[LEN_FILE_NAME] = "\0"; /* 定义文 件名字*/
.1 程序流程
• 根据以上功能要求的描述设计出本系统 的菜单导航示意图如下图所示。该图同 时也是本模块主要函数以及函数间调用 的程序流程图。
.2 代码实现
• 用户界面模块功能的代码实现都包含在 menu.c文件中,menu.h文件包含了 menu.c文件的接口信息。menu.c中需要 含有所有的菜单打印函数和选择命令后 触发下一操作的过程。
main模块
• main模块包含在main.c文件中,其主 题有三个函数:main函数、configure 函数和clean函数。main函数即为读者 早已熟悉的程序入口函数,其负责调 用系统执行时的各个主要函数。而 configure函数的功能为在程序开始时 初始化或配置各种必须的变量和环境。
main模块
21.5 日志模块
• 在所有的系统中,日志模块是必不可 少的。它使使用者可以查看操作记录, 还可以使管理者跟踪程序信息。在本 系统中,日志模块完成两个功能:一、 记录异常情况;二、记录用户的操作 记录。每次做记录时都输出到两个地 方:标准输出和日志文件。在介绍本 模块的实现之前,先简单介绍一下如 何在C程序中操作文件。
21.5.1 打开和关闭文件
• fopen函数的声明如下: • FILE * fopen(char * filename, char * mode); • 其中,filename字符串包含要打开的 文件路径及其文件名;mode字符串则 代表打开文件的方式:若为’r’,则为 只读;若为’w’,为只写;若为’+’, 则为可读也可写。如果打开成功,该 函数返回打开文件的文件指针,必须
21.5.2 文件的格式化读 写
• 2.fscanf函数
• fscanf函数的功能为以指定的格式从 文件中读取数值,声明如下: • int fscanf(FILE * fp, const char *char 字符串, 参数列表); • fscanf函数的功能与scanf函数也很相 似,scanf函数指定了输入为标准输入 文件,而fscanf函数可以指定输入位
.2 数据结构
• 年份的值可以处理为4位整数,可以存 储在16位二进制数中;月份和日子都 可以处理为2位整数,都可以存储在8 位二进制数中:因此,可以将时间数 据类型TimeInfor处理为位域类型, 声明如下: • 01 typedef struct { • 02 unsigned year : 16; /* 年*/ • 03 unsigned month : 8;
.2 代码实现
• 因此,menu.c文件需要包括以下函数: • menu_main函数,打印主界面和第一 级菜单,并选择下一操作。 • menu_add函数,打印增加书籍的二 级菜单,并选择下一操作。 • menu_delete函数,输出删除书籍的 二级菜单,并选择下一操作。 • menu_search函数,输出搜索书籍的 二级菜单,并选择下一操作。
• clean函数的作用与configure函数相对 应,其负责程序结束前的清理工作,比 如清除程序中分配的堆内存等。本模块 的程序流程图如下图所示,这也就是 main函数的程序流程图。
用户界面模块
• 用户界面模块的主要功能为图书管理 系统的使用提供一个命令选择和导航 的功能。现在流行的管理软件基本都 是基于图形界面的,C语言也可以实现 图形界面,但由于篇幅的限制,本系 统只提供一个基于命令行的交互界面。 具体地讲,本系统提供的交互方式与 现行的电话服务系统类似:先列出一 些以数字引导的命令选项,再由使用 者输入选项编号实现命令选择。
.2 代码实现
• 在这些函数中,除了menu_main函数 会被外部调用外,其他函数暂时都只 需要在本文件内使用,因此menu.h文 件中只需包含menu_main这个函数的 声明,同时其余函数都声明为static 函数。若在以后需要在其他文件中调 用这些static函数,再回来修改它的 声明即可。 • 注意:把所有不允许外部使用的函数
来自百度文库 .2 数据结构
• 本系统中的书籍数据是大批量数据, 因此需要选择使用数组或者链表保存 书籍数据。考虑到图书管理系统会很 频繁地访问书籍信息,而增加和删除 的操作相对较少,因此选择使用数组 来保存。而又由于书籍数目是不可预 期的,因此最好使用动态数组来处理 数据。 • 注意:数据结构要考虑时间复杂度和
.2 数据结构
• 因此,书籍信息类型可以声明如下: • 01 typedef struct { • 02 char name[LEN_BOOK_NAME]; /* 书名*/ • 03 char author[LEN_AUTHER_NAME]; /* 作者*/ • 04 char publisher[LEN_PUBLISHER_NAME
21.5.2 文件的格式化读 写
• 文件的格式化读写是以指定的格式对文 件进行数据读写。C语言也为文件格式化 读写提供了函数:fprintf函数和fscanf 函数。
21.5.2 文件的格式化读 写
• 1.fprintf函数
• fprintf函数的功能为将数值以指定的 格式输出到指定的文件中,声明如下: • int fprintf(FILE * fp, const char * 字符串, 参数列表); • fprintf函数的功能和printf函数很相 似,只是printf函数指定了输出为标准 输出文件,而fprintf可以指定输出位
.6 编写menu_delete函数: 输出删除书籍的二级菜单
• menu_delete函数提供了删除书籍的 交互界面。本系统提供了多种删除书 籍的功能,包括按照书名删除、按作 者删除、按出版社删除等,因此本函 数需要提供二级菜单,以供用户选择; 与menu_main函数类似,提供二级菜 单后,需要提供一个选择结构以触发 数据管理模块中的各种相应删除操作; 最后,同样要提供日志记录和回到本 级目录的功能。
21.5.3 打开和关闭日志 文件
• 在前面的功能分析中,已经知道日志 模块会将日志记录到一个文件中。由 于这个文件在程序从开始到结束都是 要使用的,因此将其定义为全局变量。 在使用日志模块前,g_logFile必须指 向一个有效文件;而在程序结束之前, 这个文件指针指向的文件必须被关闭。 为了达到这个目的,将文件打开操作 放在main模块的初始化操作函数 configure中进行,将关闭文件的操作