版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第21章 图书管理系统开发实例,前面的章节系统地介绍了C语言的基本概念和重要知识点,并通过大量的范例来实现演示它们的使用方法和特性。为了使读者能够掌握C语言开发的基本步骤和熟练使用C语言的一些特性,下面以图书管理系统为例来介绍的应用程序开发过程。,21.1 需求分析,对于图书管理系统而言,其最重要的功能是管理图书,包括增加书籍、删除书籍和查询书籍。其中,删除书籍和查询书籍的功能又可以细化为很多功能,比如删除某一个时间段内增加的书籍、删除某个作者的书籍、显示某个作者的所有书籍、显示书名带某个关键字的书籍等等。其次,需要提供一个友好的交互界面,这是用户接触到的最直接的东西,其设计必须人性化;然后还
2、需要一些辅助功能,比如日志功能,它可以将所有的操作都记录在案。实际上,一个完整的图书系统还需要包括另外两个重要的功能:用户管理和数据库系统。由于篇幅有限,本系统将不考虑这两个功能。,21.1 需求分析,整理以上的需求分析,可以得出本图书管理系统需要实现的功能主要包括以下三点: 提供友好的用户交互界面; 提供书籍的增加、删除、查询、批量创建等操作; 提供历史日志以记录操作信息。,21.2 系统设计,系统设计阶段可以理解为程序的概要设计,需要完成对系统结构的分析和设计,以及设计系统需要的主要数据结构。本小节将基于需求分析的结果,依次讨论了图书管理系统的系统架构和数据类型。,21.2.1 系统架构,
3、根据需求分析的结果,本系统至少要分为以下几个模块:main函数模块、用户界面管理模块、数据管理模块和历史日志模块。其中: main函数模块的主要功能为提供程序入口、前期环境设置、调用主要的执行函数和程序结束前的数据处理。 用户界面管理模块主要提供用户交互界面,并在用户选择命令后触发相应模块。,21.2.1 系统架构,数据管理模块的功能为本系统的核心模块,提供所有对书籍数据的操作请求的处理,包括增加书籍、删除书籍、搜索书籍、批量删除书籍、高级搜索书籍等等。 历史日志模块主要提供用户行为记录、系统信息记录、异常信息记录等功能。 辅助模块:全局配置模块。在这个模块中,会包含一些全局使用的信息,比如全
4、局变量的定义,const变量、具名常量、枚举常量的定义等。,21.2.1 系统架构,根据以上功能模块的划分,本系统的软件结构设计如下图所示。,21.2.2 数据结构,本图书管理系统的核心数据对象是书籍。书籍信息中包含很多信息,包括:书名、作者、出版社、出版日期、入库日期、入库编号和页数等。因此,处理书籍信息的数据类型必须为结构体,将其命名为BookInfor。其中,书名、作者和出版社的数据类型为字符数组;入库编号和页数选择使用整型;而出版日期和入库日期由于包含年、月、日信息,因此需要使用另一个结构体,将其命名为TimeInfor。,21.2.2 数据结构,因此,书籍信息类型可以声明如下: 01
5、typedef struct 02char nameLEN_BOOK_NAME;/* 书名*/ 03char authorLEN_AUTHER_NAME;/* 作者*/ 04char publisherLEN_PUBLISHER_NAME;/* 出版社*/ 05int serial;/* 编号*/ 06int page;/* 页数*/ 07TimeInfor time_pub;/* 出版日期*/ 08TimeInfor time_in;/* 入库日期*/ 09 BookInfor;/* 书籍信息类型 */,21.2.2 数据结构,年份的值可以处理为4位整数,可以存储在16位二进制数中;月份和日
6、子都可以处理为2位整数,都可以存储在8位二进制数中:因此,可以将时间数据类型TimeInfor处理为位域类型,声明如下: 01typedef struct 02unsigned year : 16;/* 年*/ 03unsigned month : 8;/* 月*/ 04unsigned day : 8;/* 日*/ 05 TimeInfor;/* 时间信息类型*/,21.2.2 数据结构,本系统中的书籍数据是大批量数据,因此需要选择使用数组或者链表保存书籍数据。考虑到图书管理系统会很频繁地访问书籍信息,而增加和删除的操作相对较少,因此选择使用数组来保存。而又由于书籍数目是不可预期的,因此最好
7、使用动态数组来处理数据。 注意:数据结构要考虑时间复杂度和空间复杂度,同时还要考虑实现的复杂度。,21.3 main模块,main模块包含在main.c文件中,其主题有三个函数:main函数、configure函数和clean函数。main函数即为读者早已熟悉的程序入口函数,其负责调用系统执行时的各个主要函数。而configure函数的功能为在程序开始时初始化或配置各种必须的变量和环境。,21.3 main模块,clean函数的作用与configure函数相对应,其负责程序结束前的清理工作,比如清除程序中分配的堆内存等。本模块的程序流程图如下图所示,这也就是main函数的程序流程图。,21.4
8、 用户界面模块,用户界面模块的主要功能为图书管理系统的使用提供一个命令选择和导航的功能。现在流行的管理软件基本都是基于图形界面的,C语言也可以实现图形界面,但由于篇幅的限制,本系统只提供一个基于命令行的交互界面。具体地讲,本系统提供的交互方式与现行的电话服务系统类似:先列出一些以数字引导的命令选项,再由使用者输入选项编号实现命令选择。,21.4.1 程序流程,将以上本模块的功能具体化并整理为如下: (1)进入用户界面模块(其方式为在main函数中调用该模块的主菜单)。 (2)打印出主菜单,要求含有系统名称和第一级菜单,该第一级菜单的内容要求包括主要的功能选择:增加书籍、删除书籍、搜索书籍、批量
9、删除、高级搜索和退出。 (3)提示用户根据菜单选择要执行的功能。 (4)进入选择的功能模块;如果该功能模块又含有多个选择,要求输出下一级菜单。所有的下层菜单选项中,要求都含有返回上级菜单的选项。,21.4.1 程序流程,根据以上功能要求的描述设计出本系统的菜单导航示意图如下图所示。该图同时也是本模块主要函数以及函数间调用的程序流程图。,21.4.2 代码实现,用户界面模块功能的代码实现都包含在menu.c文件中,menu.h文件包含了menu.c文件的接口信息。menu.c中需要含有所有的菜单打印函数和选择命令后触发下一操作的过程。,21.4.2 代码实现,因此,menu.c文件需要包括以下函
10、数: menu_main函数,打印主界面和第一级菜单,并选择下一操作。 menu_add函数,打印增加书籍的二级菜单,并选择下一操作。 menu_delete函数,输出删除书籍的二级菜单,并选择下一操作。 menu_search函数,输出搜索书籍的二级菜单,并选择下一操作。,21.4.2 代码实现,menu_batch_del函数,输出批量删除书籍的二级菜单,并选择下一操作。 menu_advanced_sear函数,输出高级搜索书籍的二级菜单,并选择下一操作。 menu_reload函数,输出载入书籍数据的二级菜单,并选择下一操作。 menu_exit函数,退出操作所有二级菜单,在这里给出提
11、示信息,并退出程序。 menu_error函数,提示错误信息,并触发下一操作。,21.4.2 代码实现,在这些函数中,除了menu_main函数会被外部调用外,其他函数暂时都只需要在本文件内使用,因此menu.h文件中只需包含menu_main这个函数的声明,同时其余函数都声明为static函数。若在以后需要在其他文件中调用这些static函数,再回来修改它的声明即可。 注意:把所有不允许外部使用的函数都定义为static函数,以增强模块封装性。,21.4.3 编写menu_main函数:打印主界面和第一级菜单,menu_main函数分为两部分,第一部分为主菜单内容,第二部分为输入选择,第三部
12、分为根据选择触发对应的选项。,21.4.4 编写menu_choice函数,此函数只在menu.c中使用,因此可声明为static函数。其功能为从键盘输入一个大于0并且小于指定数值的整数。,21.4.5 编写menu_add函数:打印增加书籍的二级菜单,,menu_add函数提供了增加书籍的交互命令,从标准输入获取书籍信息,并调用数据管理模块中的书籍增加函数book_add,最后调用日志模块中的记录功能。进入menu_main函数后,当出现图21-4后,如果选择选项1,则会触发memu_add函数。由于该菜单函数只在用户界面模块中调用,并只在menu.c函数中调用,因此可以将其定义为stati
13、c函数。,21.4.6 编写menu_delete函数:输出删除书籍的二级菜单,menu_delete函数提供了删除书籍的交互界面。本系统提供了多种删除书籍的功能,包括按照书名删除、按作者删除、按出版社删除等,因此本函数需要提供二级菜单,以供用户选择;与menu_main函数类似,提供二级菜单后,需要提供一个选择结构以触发数据管理模块中的各种相应删除操作;最后,同样要提供日志记录和回到本级目录的功能。,21.4.7 编写menu_search函数:输出搜索书籍的二级菜单,menu_search函数与menu_delete函数类似。它提供了搜索书籍的交互界面。同样地,本系统提供了多种搜索书籍的功
14、能,包括按照书名搜索、按作者搜索、按出版社搜索等,因此本函数需要提供二级菜单,以供用户选择;同样地,提供二级菜单后,需要提供一个选择结构以触发数据管理模块中的各种相应搜索操作;最后,同样要提供日志记录和回到本级目录的功能。由于本函数功能和逻辑都与menu_search类似,由于篇幅限制,在此不多做介绍。,21.4.8 编写menu_reload函数:输出载入书籍数据的二级菜单,menu_reload函数提供了从文件中导入书籍信息的交互界面,并触发导入数据的操作,最后记录日志后返回上级目录。函数实现如下: 01static void menu_reload(void) /* 重载的菜单*/ 02
15、char file_nameLEN_FILE_NAME = 0;/* 定义文件名字*/ 03printf(Reload which file:);/* 提示信息*/ 04scanf(%s, file_name);/* 输入文件名*/ 05book_reload(file_name);/* 重载数据*/ 06 07LOG_ACTIVITY(End to reload books.);/* 记录日志*/ 08menu_main();/* 返回上级菜单*/ 09,21.4.9 编写menu_exit函数:退出所有二级菜单,当菜单选择时,如果输入值超出范围,将调用menu_exit函数。其功能为记录日
16、志并退出系统。代码实现如下所示: 01static void menu_exit(void) /* 退出的菜单*/ 02LOG_ERROR(Quit the book management system.);/* 记录日志 */ 03exit(1);/* 退出系统 */ 04,21.5 日志模块,在所有的系统中,日志模块是必不可少的。它使使用者可以查看操作记录,还可以使管理者跟踪程序信息。在本系统中,日志模块完成两个功能:一、记录异常情况;二、记录用户的操作记录。每次做记录时都输出到两个地方:标准输出和日志文件。在介绍本模块的实现之前,先简单介绍一下如何在C程序中操作文件。,21.5.1 打开
17、和关闭文件,C语言中对文件的操作必须通过文件指针进行。处理文件时,程序需要知道文件的属性信息,例如文件的性质、文件的名字、文件的当前状态等。在C程序中,这些信息以结构体的方式结合在一起,每一个被操作的文件都会拥有一块内存空间存放属于它的结构体信息。这个结构体类型被定义为FILE。基于FILE变量,C标准输入输出函数库定义了fopen函数和fclose函数来实现文件的打开关闭操作。,21.5.1 打开和关闭文件,fopen函数的声明如下: FILE * fopen(char * filename, char * mode); 其中,filename字符串包含要打开的文件路径及其文件名;mode字
18、符串则代表打开文件的方式:若为r,则为只读;若为w,为只写;若为+,则为可读也可写。如果打开成功,该函数返回打开文件的文件指针,必须通过该指针才能对文件进行操作;否则,函数返回NULL。 fclose函数声明为: int fclose(FILE * fp); 警告:该函数必须与fopen函数配对使用,如果对一个不指向任何文件的文件指针变量调用该函数,将导致严重错误。,21.5.2 文件的格式化读写,文件的格式化读写是以指定的格式对文件进行数据读写。C语言也为文件格式化读写提供了函数:fprintf函数和fscanf函数。,21.5.2 文件的格式化读写,1fprintf函数 fprintf函数
19、的功能为将数值以指定的格式输出到指定的文件中,声明如下: int fprintf(FILE * fp, const char * 字符串, 参数列表); fprintf函数的功能和printf函数很相似,只是printf函数指定了输出为标准输出文件,而fprintf可以指定输出位置。该函数中的字符串和参数列表的执行方式和printf函数中的完全一样,在此不多做介绍。如果执行成功,fprintf函数将返回其输出的字符个数;如果执行失败,返回一个负数。,21.5.2 文件的格式化读写,2fscanf函数 fscanf函数的功能为以指定的格式从文件中读取数值,声明如下: int fscanf(FIL
20、E * fp, const char *char 字符串, 参数列表); fscanf函数的功能与scanf函数也很相似,scanf函数指定了输入为标准输入文件,而fscanf函数可以指定输入位置。同样,该函数中的字符串和参数列表的执行方式也与scanf函数一样。如果函数执行成功,返回值为读取的字符个数;如果执行失败,返回EOF。,21.5.3 打开和关闭日志文件,在前面的功能分析中,已经知道日志模块会将日志记录到一个文件中。由于这个文件在程序从开始到结束都是要使用的,因此将其定义为全局变量。在使用日志模块前,g_logFile必须指向一个有效文件;而在程序结束之前,这个文件指针指向的文件必须
21、被关闭。为了达到这个目的,将文件打开操作放在main模块的初始化操作函数configure中进行,将关闭文件的操作放在清除操作函数clean中进行。,21.5.4 log_error函数和log_activity函数,日志模块的两个功能分别在log_error函数和log_activity函数中实现。log_error函数用于记录错误信息,log_activity函数用于记录历史行为。,21.6 数据管理模块,数据管理模块是程序的核心部分,其主要功能为提供书籍管理操作,包括增加、删除和搜索等;同时还需要提供为了实现这些功能需要的辅助函数,主要有TimeInfor数据的处理、BookInfor数据的处理。本小节将先介绍这些基本功能的实现。,21.6.1 处理TimeInfor数据,TimeInfor数据用以存储时间,需要实现的处理函数有3个:set_time_infor函数、compare_time函数和print_time_infor函数。 1set_time_for函数 2compare_time函数 3print_time_infor函数,21.6.2 处理BookInfor数据,BookInfor数据类型是本系统的最重要的数据,在data_manage.c中定义了3个函数操作该数据类型。 1s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河南省沈丘县重点达标名校2026届下学期初三年级3月第五次调研考试英语试题含解析
- 内蒙古自治区根河市2026届初三一轮复习:三角函数与解三角形检测试题含答案含解析
- 浙江省杭州市英特外国语学校2025-2026学年初三5月联考化学试题含解析
- 河北省石家庄市裕华区实验中学2025-2026学年中考八模英语试题试卷含解析
- 重庆市北碚区西南大附属中学2026年初三开年第一考物理试题含解析
- 2026年拍卖产品合同(1篇)
- DB46-T 730-2025《智慧消防信息平台技术规范》
- MT-T 1257-2025 矿区道路煤基固废(煤矸石、气化渣)路基质量控制技术规范
- 计算基础技术及导论 14
- 教学设计 引领时代的思考
- 法律咨询服务方案模板
- 血液透析患者心力衰竭的诊断与治疗
- 出狱贫困申请书
- 2025年度松江区卫生健康委下属部分事业单位公开招聘卫生专业技术人才考试参考试题及答案解析
- YDT 5102-2024 通信线路工程技术规范
- 医疗废物培训课件
- 2025年智能焊接机器人产业发展蓝皮书-GGII高工咨询
- 安装工业空调合同协议书
- 2025年酸洗工考试题库
- 胃肠外科大病历规范
- 2025新中式烹调师高级技师理论知识试卷及答案
评论
0/150
提交评论