华科C语言课程设计报告.docx
华中科技大学计算机科学与技术学院C语言课程设计报告题目:菜市场商品销售管理系统专业:计算机科学与技术专业班级:学号:姓名:成绩:指导教师:完成日期:2016年10月7日目录一、系统需求分析11.1 数据维护功能11.2 数据查询功能11.3 数据统计功能11.4 数据存取功能21.5 辅助功能2二、总体设计22.1 文件模块22.2 数据维护模块32.3 数据查询模块42.4 数据统计模块52.5 帮助6三、数据结构设计6四、详细设计与系统实现114.1 主程序114.1 数据维护114.1.1 分类信息维护124.1.2 基本信息维护154.1.3 销售信息维护194.2 数据查询224.2.1 分类信息查询224.2.2 基本信息查询:234.2.3 销售信息查询254.3 数据统计284.3.1 按类别统计:284.3.2 按品种统计314.3.3 按客户名称统计36五、运行测试与结果分析405.1 输入数据405.2 初始化界面425.3 系统主界面425.4 数据维护界面435.5 数据查询界面:525.6 数据统计界面575.7帮助模块界面62六、总结64七、参考文献65附录1程序源代码66头文件:market.h66main.c 文件:74一、系统需求分析菜市场商品销售管理系统用于管理人员对于菜市场的各类商品销售信息进行管理,主要包括商品分类信息,商品基本信息,商品销售信息等三类信息,以帮助商场管理人员及时了解产品销售情况和变化。菜市场商品销售管理系统要求实现以下几方面的基本功能:1.1 数据维护功能菜市场商品销售管理系统的基本信息主要包括以下三类:(1)商品分类信息:分类编码、分类名称等数据项。(2)商品基本信息:商品编号、商品名称、分类码、产地、单价、售出数量等数据项。(3)商品销售信息:销售编号、商品编号、销售重量、销售金额、销售日期、客户名称等数据项。系统应实现以上三种数据的录入、修改、和删除功能。信息录入时,系统应提供快捷方便的数据录入方式;同时应进行自动数据校验,满足数据的正确性,合理性,有效性和依赖性要求。1.2 数据查询功能系统应实现对三种基础数据的查询功能,提供按多种条件进行查询的方式,具体包括:(1)以分类编码为条件来查找并显示满足条件的商品分类信息。(2)商品名称中文字符子串为条件查找,并显示商品中包含指定子串的商品基本信息。(3)以分类码和单价为条件查找并显示满足条件的商品基本信息。(4)客户名称和销售日期为条件查找并显示满足条件的所有商品销售信息。(5)以商品名称为条件查找并显示满足条件的商品销售信息。上述查询结果中,如果有多条信息被查中,查询结果应生成表格并逐条显示。1.3 数据统计功能在以上三种基础信息的基础上,提供多方面的数据统计功能,并生成表格输出,具体包括:(1)按类别统计各类商品某年(如肉类、鱼类等)销售总重量、销售总额、按销售总额降序排序后、输出分类名称、销售总重量、销售总额。(2)以所输入的年份为条件、按商品名称(如猪肉、大豆等)统计该年度内所售各种商品销售总重量、销售金额、按售总重量降序排序后、输出商品名称、分类名称、售出总重量、销售金额。(3)按客户名称统计所购某类商品(如肉类、鱼类等)的总重量、消费总金额、输出客户名称、所购各类商品总重量、消费总金额。(4)按客户名称统计所购某种商品(如猪肉、豆角等)的总重量、消费总金额、输出客户名称、所购各种商品总重量、消费总金额。(5)按商品类别统计某客户购买情况、输出分类名称、购买总重量、消费总金额。(6)按商品品种统计某客户购买情况、输出分类名称、商品名称、购买总重量、消费总金额。1.4 数据存取功能以上三种信息在程序运行时,以链表结构形式存在于内存中,并且数据的存储采用动态存储的分配方式。同时,在外存上以数据文件形式对数据进行存储,且保证数据在内存和外存两种存储介质上内容的一致性。1.5 辅助功能帮助功能,主要是对系统的操作方式进行介绍,以及一些方便操作,提供良好人机交互界面的辅助功能。二、总体设计菜市场商品销售管理系统由五大功能模块组成:文件模块,数据维护,数据查询,数据统计,帮助系统。功能结构如图2.0。文件上 计图2.0菜市场商品销售管理系统的功熊模块下面为这五个模块及其子模块的功能的介绍。2.1 文件模块文件模块的功能包括一系列与系统启动和系统既然的话运行相关的环境维护和数据保障操作,它包括六个子模块:界面初始化、数据保存、数据备份、数据恢复、退出系统。功能结构如图2.1。文件图2.1文件模块的子模块划分(1)界面初始化子模块:用于设置控制台窗口显示模式,将屏幕窗口设置为80列和25行文本字符界面,设置窗口标题栏,清屏并显示系统菜单栏和系统状态栏。(2)数据加载子模块:用于将分别放在多个数据文件中的基础数据读入内存,并构造数据链表,同时输出数据加载相关提示信息。(3)数据保存模块:用于将链表数据按缺省路径分别保存到各个数据文件。(4)数据备份子模块:用于将存放在多个数据文件中的基础数据按缺省路径转储到一个数据文件中,供用户在系统数据被破坏或丢失后用来恢复系统。(5)数据恢复子模块:与数据备份子模块在功能上相对应,能从一个备份数据文件恢复得到备份时间点的系统数据,并将恢复出来的数据加载到内存中,用于提高系统的安全性和可靠性。(6)退出系统子模块:释放程序运行过程中申请的动态存储区,关闭控制台标准输入和输出设备句柄。清除屏幕窗口信息,结束系统运行。2.2 数据维护模块数据维护模块完成对三种基础数据信息的录入、修改和删除功能,保证数据的准确性,完整性华为有效性。该模块按信息种类划分为分类信息维护、基本信息维护、销售信息维护三个子模块。如图2.2。数据维护图2.2数据维护模块的子模块划分分类信息维护、基本信息维护、销售信息维护三个子模块分别用于录入、删除和修改分类信息、基本信息和销售信息。同时,系统将这三种数据存入数据链表,并在子模块结束运行时分别保存到分类信息数据文件,商品基本信息数据文件和商品销售信息数据文件,以保持在内存和外存上两种存储介质上数据内容的一致性。2.3 数据查询模块数据查询模块提供对系统三类基础数据信息按多种条件查询的功能,按信息种类分为分类信息查询,基础信息查询和销售信息查询三个子模块。如图2.3。(1)分类信息查询:可分为两个子模块,提供按分类编码查询分类信息的功能和输出全部分类信息的功能。(2)基础信息查询:可分为三个子模块,提供按商品名称中的关键字模糊查询商品基本信息的功能,按分类码与单价查询基本信息的功能和输出全部基本信息的功能。(3)销售信息查询:可分为三个子模块,提供按客户名称和销售日期查询销售信息的功能,按商品名称精确查询销售信息的功能和输出全部销售信息的功能。其中,输出全部分类信息,基本信息和销售信息的功能主要用于测试系统运行是否正确。数据查询分类信息查询输出全部 按编码查询按客户名称和销售日期1销售信息杳.南按商品名称查询输出全部图2. 3数据查询模块的子模块划分2.4 数据统计模块图2. 4数据统计模块的子模块划分数据统计数据统计模块提供对三种基础数据进行多方面统计的功能。按照统计条件,该模块按类别统计,按品种统计和按客户姓名统计三个模块。每个模块根据统计的范围又各自分为2个子模块,共计6种不同的统计方式。如图2.4。(1)统计各类商品销售情况:年度各分类销售情况:按类别统计某年销售总重量、销售总额,按销售总额降序排序后,以表格形式输出分类名称、销售总重量、销售总额。某客户各分类购买情况:统计用户给出的客户的各类商品消费情况,输出类别名称、客户所购各种商品总重量、消费总金额。(2)按品种统计:年度各品种消费情况:统计用户给出的年份的各种商品的销售总重量、销售金额,按售总重量降序排序后,以表格形式输出商品名称、分类名称、售出总重量、销售金额。某客户各品种购买情况:统计用户给出的客户的各种商品消费情况,输出类别名称、商品名称、客户所购各种商品总重量、消费总金额。(3)按客户姓名统计:按查询内容分为三个子模块,查分类名称,查商品名称和查客户姓名。某分类销售情况:按客户名称统计用户给出的分类的购买总重量、消费总金额。输出客户名称、所购各类商品总重量、消费总金额。某商品销售情况:按客户名称统计用户给出的商品的购买总重量、消费总金额。输出客户名称、所购各种商品总重量、消费总金额。2.5 帮助帮助模块为用户使用系统提供帮助信息,同时提供系统版本和版权信息。分为帮助主题子模块和关于市场两个子模块。帮助图2.5帮助模块的子模块划分三、数据结构设计菜市场销售管理系统用于对菜市场商品销售信息进行管理,主要包括商品分类信息、商品基本信息和商品销售信息这三类基础信息数据。此外,系统在运行统计模块时还会结果形成三种生成数据,分别表示按品种统计的销售信息,按类别统计的销售信息和按客户名称统计的销售信息。下面为对本系统所涉及的基础数据和生成数据的数据结构,以及数据在内存和外存中的存储结构的介绍。1 .菜市场商品分类信息表:typedef struct type_node char type_id;/*分类编码*/char name10;/*分类名称*/struct item_node *inext;/*指向商品基本信息支链的指针*/struct type_node *next;/*指向下一结点的指针*/ TYPE_NODE;菜市场商品分类信息表如下:数据结构名称:菜市场商品分类信息表数据结构标识:TYPE_NODE中文字段名数据项标识类型及长度举例分类编码type_idcharT5分类名称namechar105个分类名称:肉类、鱼类、蔬菜、海鲜、杂粮内存中的存储结构:存放在十字交叉链表的主链节点上。每个主链节点除了保存下一个结点的地址外,还保存该分类对应的菜市场商品基本信息链表的头结点地址。如图3.1所示。数据文件中的存储结构:每条信息作为一条记录放到二进制文件。2 .菜市场商品基本信息表: typedef struct item_node /*商品编号*/*商品名称*/*分类码*/*产地(可以简单用文字描述)*/*单价(单位:元/斤)*/*销售总重量“斤” */*指向商品销售信息支链的指针*/*指向下一结点的指针*/int item_id;char name20;char type_id;char producer20;float price;float sale;struct sale_node *snext;struct item_node *next; ITEM_NODE;菜市场商品基本信息表如下:数据结构名称:菜市场商品基本信息表数据结构标识:ITEM_NODE中文字段名数据项标识类型及长度举例商品编号item_idint自增长(顺序增加)商品名称namechar20“猪肉”分类码type_idcharT 表示肉类商品产地producerchar20可以简单用文字描述单价pricefloat18.50单位:元/斤售出数量salefloat指销售总重量“斤二应自动从销售信息表中计算而得,初始值为03.菜市场商品销售信息表typedef struct sale_node int sale_id;int item_id;float weight;float sales_amount;char date 10;char client_name20;struct sale_node *next;/*销售编号*/*商品编号*/*销售重量*/*销售金额*/*销售日期*/*客户名称*/*指向下一结点的指针*/内存中的存储结构:存放在相应分类节点的商品基本信息链结点上。每个结点除了保存下一个结点的地址外,还保存该商品对应的菜市场商品销售信息链表的头结点地址。如图3.1所示。数据文件中的存储结构:每条信息作为一条记录放到二进制文件。 SALE_NODE;菜市场商品销售信息表如下:数据结构名称:菜市场商品销售信息表数据结构标识:SALE_NODE中文字段名数据项标识类型及长度举例销售编号sale_idInt自增长商品编号item_idInt同商品基本信息表中的商品编号销售重量weightfloat销售金额sales_amountfloat销售金额=斤数*单价,应是自动计算销售日期datechar10“20150222”年(4)+月(2)+日(2)客户名称client_namechar20“张三”内存中的存储结构:存放在相应基本信息节点的商品销售信息链结点上。每个结点保存下一个销售信息结点的地址。如图3.1所示。数据文件中的存储结构:每条信息作为一条记录放到二进制文件。3.1菜市场销售管理系统三个方向的十字交叉链表该系统基础数据部分在内存中以后进先出的方式创建三方向的十字交叉链表。十字交叉链表模型如图3.14 .各类商品消费情况表typedef struct type_stat char type 10;/*分类名称*/float weight;/*总重量*/float sale;/*消费金额*/struct type_stat *next;/*指向下一结点的指针*/ TYPE_STAT;各类商品消费情况表如下:数据结构名称:各类商品消费情况表数据结构标识:TYPE_STAT中文字段名数据项标识类型及长度举例分类名称typechar 10“肉类”总重量weightfloat消费金额salefloat销售金额=斤数*单价,应是自动计算内存中的存储结构:存放在各类商品消费情况单向链表的结点上。每个结点保存下一个销售信息结点的地址。数据文件中的存储结构:不介入外存。 ITEM.STAT;各类商品消费情况表如下:数据结构名称:各类商品消费情况表数据结构标识:ITEM_STAT中文字段名数据项标识类型及长度举例商品名称typechar 20“猪肉”分类名称itemchar 10“肉类”总重量weightfloat消费金额salefloat销售金额=斤数*单价,应是自动计算内存中的存储结构:存放在各种商品消费情况单向链表的结点上。每个结点保存4.各种商品消费情况表typedef struct item_stat char typeflO;char item20; float weight; float sale;struct item_stat *next;/*分类名称*/*商品名称*/*总重量*/*销售金额*/*指向下一结点的指针*/下一个销售信息结点的地址。数据文件中的存储结构:不介入外存。/*客户姓名*/*总重量*/*销售金额*/*指向下一结点的指针*/5 .按客户名称统计的消费情况表 typedef struct client_stat char client20;float weight;float sale;struct client_stat *next; CLIENT_STAT;按客户名称统计的消费情况表如下:数据结构名称:按客户名称统计的消费情况表数据结构标识:CLIENT.STAT中文字段名数据项标识类型及长度举例客户姓名clientchar 20“张三”总重量weightfloat消费金额salefloat销售金额=斤数*单价,应是自动计算内存中的存储结构:存放在各种商品消费情况单向链表的结点上。每个结点保存下一个销售信息结点的地址。数据文件中的存储结构:不介入外存。四、详细设计与系统实现4.0主程序(开始)*加载数据*界面初始化::系统功能模块的选择及运行:退出系统(结束)4.0主程序流程图数据加载,界面初始化,选择及运行系统功能模块,退出系统。如流程图4.0 o4.1 数据维护函数原型:/*维护商品分类信息*/*维护商品基本信息*/ /*维护商品销售信息*/BOOL MaintainTypelnfo(void)BOOL Maintainltemlnfo(void)BOOL MaintainSalelnfo(void)函数功能:进入三类信息维护的子菜单,选择要执行的操作。详细设计:选择要进行维护的信息后,进入信息维护子菜单选项,选择要执行的操作。选择插入/修改/删除后返回信息维护子菜单,选择退出则提示保存信息到外存后返回主菜单。(分类信息维护,基本信息维护,销售信息维护流程相同)如图4.1。4.1数据维护流程图4.1.1 分类信息维护(1)录入分类信息:函数原型:void InsertTypeNode(TYPE_NODE* hd)函数功能:在十字链表中插入一个分类信息结点。详细设计:新建分类信息结点p,输入分类编码和分类名称。若名称长度超过10字节,提示字数过多后返回分类信息维护菜单。否则遍历商品分类信息链表,检查分类编码和分类名称是否已被使用。若能够查找到与新建结点的分类编码或分类名称相同的结点,提示信息重复并返回分类信息维护菜单。若p的分类编码,分类名称都没有与已存在的分类信息结点重复,且分类名称不超过10字节,则将p作为商品分类信息链表的头结点,提示插入成功后返回分类信息维护菜单。如流程图4.1.1所示。,-.-i ,4.1.1录入分类信息流程图(2)修改分类信息:函数原型:void ModifTypeNode(TYPE_NODE *hd)函数功能:从十字链表中修改指定的分类信息结点.详细设计:输入要修改的分类的名称后遍历商品分类信息链表,查找名称符合的结点pt。若没有查找到,提示分类不存在并返回分类信息维护子菜单。否则输出当前分类信息,然后选择要修改的内容。若选择修改分类编号,输入新编号后遍历链表,查找分类编号相同的结点,若查找到,提示编号已被使用,否则修改编号。然后继续选择要修改的内容。若选择修改名称,输入新分类名称后先判断新名称长度是否大于10字节。若大于10字节,提示字数过多后继续选择要修改的内容。若不超过10字节,遍历分类信息链表,若能查找到分类名称与新名称相同的分类信息结点,提示名称重复后继续选择要修改的内容。否则将pt的分类名称改为新名称。( 开始 )输入分类名称name输入新编号pt=gp_headpt二NULLpt=pt->nextpl=gp_headpl=NULL新编号相同Nopl=pl->next提示 修改失败修改 pt->type_id, 提示修改成功显示分类信息 选择要修改 的内容选择修改编No选择修改名称选择退出No No提示分类名称不 存在,修改失败输入新名称namestrlen (name)>10pl=NULLpl=pl->next提取 修改失败修改 pt->name, 提示修改成功新编弓相同pl=gp_headpl->name与4.1.2修改分类信息流程图若选择退出,则返回分类信息维护菜单。如流程图4.1.2所示。(3)删除分类信息:函数原型:void DelTypeNode(TYPE_NODE *hd)函数功能:从十字链表中删除指定的分类信息结点.详细设计:输入要删除的结点的分类名称。遍历商品分类信息链表,查找分类名称相符的结点pt以及pt的前驱p。若查找到,判断pt是否为头结点。若pt 为头结点,令pt->next为新的头结点,若不是,使p->next=pt->nexto然后释放 pt及对应的基本信息和销售信息链表的存储空间,提示删除成功并返回分类信息维护菜单。否则没有查找到符合条件的pt,提示删除失败后返回分类信息维护菜单。如流程图4.1.3所示。4.1.3删除分类信息流程图4.1.2基本信息维护(1)插入基本信息:函数原型:void InsertItemNode(TYPE_NODE* hd)函数功能:在十字链表中插入一个基本信息结点.详细设计:输入商品所在分类的名称。遍历分类信息链表,查找分类名称与输入的相同的分类信息结点pt。若pt为NULL,提示商品分类不存在并返回基本信息维护子菜单。否则新建基本信息结点p。输入商品名称,判断商品名称长度是否大于20字节。若名称大于20字节,提示字数过多后返回基本信息维护菜单。若没有超过20字节,遍历商品基本信息链表,查找商品名称与输入的商品名称相同的基本信息结点pi,同时查找最大的商品编号ITEMJDo若pi不为NULL,提示名称已被使用,返回基本信息维护菜单。否则继续输入商品产地和单价,若产地长度超过20字节,提示字数过多后返回基本信息维护菜单。否则将p作为pt对应的基本信息支链的新的头结点,并令p的商品编码为ITEMJD+1,然后返回基本信息维护子菜单。如图4.1.4所示。4.1.4插入商品基本信息流程图(2)修改基本信息:函数原型:void ModintemNode(TYPE_NODE *hd)函数功能:从十字链表中修改指定的基本信息结点详细设计:输入商品名称,遍历基本信息链表,查找商品名称与输入的相同的结点pi, pi所在基本信息支链对应的分类信息结点pt和pi的前驱。若pi为 NULL,提示商品不存在并返回基本信息维护子菜单。若pi存在,选择修改内容。若选择改名称,则输入新名称,若新名称长度大于20字节,提示字数过多修改失败,并继续选择要修改的内容。否则提示遍历基本信息链表,查找与商品名称与新名称相同的基本信息结点pi2,若pi2存在则提示修改失败,否则修改结点的商品名称,并继续选择要修改的内容。若选择改产地,则输入新产地,若新产地长度不超过20字节,修改产地并提示修改成功,然后继续选择要修改的内容;否则提示字数过多后继续选择要修改的内容。若选择修改单价,输入并修改基本信息结点pi中的单价后,遍历pi对应的销售信息链表,修改销售信息结点中的销售金额。若选择分类编码,则遍历分类信息链表,查找新编码所在结点pt2, pt2不存在则提示失败并继续选择修改内容。否则如果pi为原基本信息支链的头结点,则令pt->next指向pi->next,否则令pi的前驱指向pi->next。然后将pi插入pt2对应的基本信息支链,并作为支链头结点。最后令pt = pt2并继续选择修改内容。若选择退出,则返回基本信息维护子菜单。如流程图4.1.5所示。(开始)*输入名称name提示商品名称不 存在,修改失败输入新名称name提示修改成功输新编号type_idpi=pt->inext;提示分类 不存在pitem=p i; pi=pi->next;输出pi中的基本信息令pi的前驱指向pi的后继,将pi 作为新的基本信息支链的头结点选择修改内容选毛勇Ino选分类编码Yes1Yes3提示修改成功修改 pi->name提示字数过多N.选退出pi2=pi2->next;输入新单价遍历pi对应的销售信息支链,修改销售金额4.1.5修改基本信息流程图(4)删除基本信息:函数原型:void DelItemNode(TYPE_NODE *hd)函数功能:从十字链表中删除指定的基本信息结点.详细设计:输入要删除的基本信息结点的商品名称,遍历基本信息链表,查找结点pi,pi的前驱pi2, pi所在基本信息支链对应的分类信息结点pt。若pi 为NULL,提示商品不存在并返回基本信息维护菜单;否则判断pi是否为基本信息链表头结点,若是头结点,则令pi->next为pt对应的基本信息支链的新的头结点,否则pi2->next=pi->nexto最后释放pi对应的销售信息链表和pi的存储空间,提示删除成功后返回基本信息维护子菜单。如图4.1.6所示。4.1.6删除基本信息流程图4.1.3销售信息维护(1)录入销售信息函数原型:void InsertSaleNode(TYPE_NODE* hd)函数功能:在十字链表中插入一个销售信息结点详细设计:输入商品名称,遍历基本信息链表,查找商品名称与输入的名称相同的基本信集结点pi,若pi不存在,提示商品不存在并返回销售信息维护菜单。否则新建销售信息结点p,输入销售重量,日期。日期是否为8个字节,若不是,提示格式错误后返回销售信息维护菜单。否则计算销售金额,并修改pi 中的销售总重量和总金额,然后遍历销售信息链表查找最大的销售编号SALEJD,令p->sale_id为SALE_ID+1O最后将p设置为pi对应销售信息支链的新的头结点。如图示4.1.7所示。输入商品名称Ifind =0遍历基本信息链表,查找名称相同的结点pi,若找到则find =1V工find=O提示商品不存在一No 、新建商品销售信息结点P p->item_id = pi->item_id;输入销售重量, 销售期date遍历销售信息链表, 查找最大的销售编号SALE_ID提示日期格式错误p->sale_id=SALE_ID+l,计算销售金额,修诙基本信底中的销售重量。将P设置为支链头结点I 提示插入成功 I(结束>4.1.7插入商品销售信息流程图(2)修改销售信息:函数原型:void ModifSaleNode(TYPE_NODE *hd)函数功能:从十字链表中修改指定的基本信息结点详细设计:输入销售编号,遍历销售信息链表,查找对应的结点ps, ps的前驱psale,以及ps所在销售信息支链对应的基本信息结点pio若ps不存在,提示修改失败,返回销售信息维护子菜单。否则输出当前销售信息的内容,选择修改的内容。若选择商品编号,则输入新编号后,遍历基本信息链表,查找新编号对应的基本信息结点pi2,若没找到,提示修改失败,若找到,令ps的前驱指向ps的后继。将ps作为pi2对应销售信息支链的新的头结点,并修改ps.的销售金额, pi2和原对应基本信息节点pi的销售重量。最后令pi=pi2后继续选择要修改的内容。若选择销售重量,输入新重量后修改销售金额和对应结点pi的总重量。若选择日期,则输入新日期。若日期超过8字节,提示格式错误,否则修改日期。然后继续选择修改的内容。若选择客户姓名,则输入新客户姓名。若客户姓名超过20字节,提示字数过多,否则修改客户姓名。然后继续选择修改的内容。若选择退出,返回销售信息维护子菜单。如流程图4.1.8所示。2输入新编号开始)输入销售编号flag二0V pi2!=NULL遍历基本信息链表,查找销售编号相同的结点ps, ps的前驱psale, ps对应基本信直结点pi,若番找到令flag=l不存在flag=0No靠簿普为PS为支链头结点Yes提示销售信息不存在 No psale->next:=ps->next11' 1品编选销售日4客户名称选退出(结束4.显示当前信息, 选择修改内容匿售重量令ps为pi2对应销售信息支 k链的头结点,修改ps的销售金额,原p2对应的基本信息结点与Pi2的总重量No1输入新重量修改销售金额, 对应基本信息的 销售总重量输入日期date输入客户名称client工strlen (date) >8二15提示格式错误«*,*""*y es< strlen(client)>8 AT 提示字数过多a No修改ps->date后提示修改成功X No修改ps->client后提示修改成功历遍商品基本信息链表,直找编号相同的结点Pi24.1.8修改销售信息流程图(3)删除销售信息:函数原型:void DelSaleNode(TYPE_NODE *hd)函数功能:从十字链表中删除指定的基本信息结点详细设计:输入销售编号,遍历销售信息链表,查找对应的结点ps, ps的前驱psale,以及ps所在销售信息支链对应的基本信息结点pio若ps不存在,提示删除失败,返回销售信息维护子菜单。否则判断ps是否为支链头结点。若不是头结点,令 psale->next=ps->next)否则令 pi->snext=ps->next,随后修改 pi 的销售总重量并释放ps的存储空间。如流程图4.1.9所示。'find =0输入销售编号4.1.9删除销售信息流程图4.2 数据查询4.2.1 分类信息查询(1)按分类编码查询:函数原型:void SeekType_id(TYPE_NODE *head)函数功能:根据输入的分类编码查找分类信息选择分类编码查询,输入分类编码,遍历分类信息链表,查找对应分类信息结点,若找到则输出结点中的分类信息,否则提示编码不存在,然后返回子菜单,若选择退出,返回主菜单,否则继续查询。如流程图421所示。4.2.1按分类编号查询流程图(2)输出全部:函数原型:void SeekType_All(TYPE_NODE *head)函数功能:输出所有分类信息详细设计:遍历分类信息链表,输出每个结点的信息。该功能主要用于测试信息维护功能是否正确。4.2.2 基本信息查询:(1)按商品名称关键词查询:函数原型:void SeekName(TYPE_NODE *head)函数功能:按商品名称中的关键词模糊查找并输出商品基本信息详细设计:输入商品名称中的关键词后,令find=0,遍历链表,查找商品名称中含关键词子串的基本信息结点。输出查找到的结点的信息并使find=l。若循环完毕find=O,则提示信息不存在。如图422所示。4.2.2按关键词查询流程图(2)按分类码和单价查询函数原型:void SeekId_Price(TYPE_NODE *head)函数功能:按分类码和单价区间查找商品基本信息详细设计:输入分类码和价格区间后,遍历分类信息链表,查找对应分类结点,若不存在,提示信息不存在。否则令find =0,然后遍历此分类结点对应的基本信息支链,查找并输出单价满足条件的基本信息结点的信息。若查找到,令 find=lo若循环完毕find等于0,提示信息不存在。如图4.2.3所示。4.2.3按分类码和价格查询流程图(3)输出全部:函数原型:void SeekItem_All(TYPE_NODE *head)函数功能:输出所有基本信息详细设计:遍历每个分类信息结点对应的基本信息链表,输出每个结点中的信息。该功能主要用于测试基本信息维护功能是否运行正确。4.2.3 销售信息查询(1)按客户名称和销售日期查询:函数原型:void SeekClient_Date(TYPE_NODE *head)函数功能:按客户名称和销售日期查找商品销售信息详细设计:输入客户名称和日期date,若date长度大于8字节,提示日期格式错误,返回销售信息查询菜单。否则令find=O,遍历销售信息链表,若查找到客户名称和日期都符合条件的销售信息结点,输出结点信息,令find=l。若循环结束时find=O,提示信息不存在。如流程图4.2.4所不。(2)按商品名称查询函数原型:void SeekSaleName(TYPE_NODE *head)函数功能:按商品名称查找商品销售信息详细设计:输入商品名称,令find =0, findsale =0。遍历基本信息链表,查找商品名称符合条件的基本信息结点pi,若pi存在,令find =1并遍历该结点对应的销售信息链表后退出循环。若销售信息链表不为空,使findsale=l,并输出销售信息支链中每个结点中存储的销售信息。若循环结束后,find等于0,提示商品不存在;若findsale等于0,提示该商品无销售记录。如流程图4.2.5所示。No4. 2.5按商品名称查询流程图(3)输出全部:函数原型:void SeekSale_AII(TYPE_NODE *head)函数功能:输出所有商品销售信息详细设计:遍历每个基本信息结点对应的销售信息链表,输出每个销售信息结点中的信息。该功能主要用于测试销售信息维护功能是否运行正确。4.3 数据统计4.3.1 按类别统计:(1)年度各类别销售情况统计:函数原型:void StatTypeSale(void)函数功能:按类别统计并输出所有类别总体的年度销售情况调用了的函数:函数原型:TYPE_STAT * StatTypeInfo(TYPE_NODE *head,char year5)函数功能:按类别统计所有分类的年度销售情况,创建统计结果链表函数原型:void StatTypeSort(TYPE_STAT *head, int len)函数功能:将按分类名称统计的链表按销售总额排序详细设计:输入年份Date,先判断Date的长度是否为4字节,若不是,提示格式错误后结束。否则新建年度各类别销售情况情况链表,令pl和phead指向头结点。遍历分类信息链表,每指向一个分类信息结点,新建统计结果结点,将结点插入统计结果链表表尾,并令pl指向该结点。对pl初始化,令pl->weight=O, pl->sale=0。遍历分类信息结点对应的销售信息支链,统计销售时间前四位与Date 相同的销售信息