🪵Good模块

搭建储存和操作商品信息的底层数据结构

当前进度

.---+- include -+- tools -+- color.h
    |           |         +- hint.h
    |           |         +- info.h
    |           | 
    |           +- user  -+- user.h
    |           |
    |           +- good  -+- good.h <---
    |           |
    |           +- config.h <---
    |
    +-   src   -+- tools -+- color.c
                |         +- hint.c
                |         +- info.c 
                |
                +- data  -+- id.txt
                |         +- user.txt
                |         +- good.txt <---
                |
                +- user  -+- user.c 
                |
                +- good  -+- good.c <---
                |
                +- main.c

设计数据类型

商品有三种状态:销售中、已售出、已下架。我们用一个枚举类型表示商品的状态:

根据前面所说的要求,我么可以在good.h中定义如下的用户类型:

选择数据结构

我选用了数组结构,因此我们需要约定商品的总数不超过MAX_GOOD,并且在config.h中定义这个宏。

我们在good.c中定义这个数据结构,同时定义商品的初始总数为0:

设计对外接口

接口设计

根据项目刚开始时的需求汇总,我们对于商品的数据结构提供如下一些接口,声明在good.h头文件中。

这里我们注意到不同的主题查看商品的权限是不一样的,比如说:

  • 管理员可以查看全部的商品(包括已下架的)

  • 买家只能查看正在销售中的商品

  • 卖家只能查看自己出售的商品

接口实现

从外部文件导入商品信息

注意,枚举类型本质上是无符号整数。

将商品信息导出到外部文件

获取商品对象

打印详细的商品信息

因为商品状态是用枚举类型表示的,而枚举类型本质上只是一个无符号整数,但用户需要看到的应该是一个表示状态的字符串,所以我们使用stateName数组建立起枚举类型和对应字符串之间的映射关系。这样在打印的时候就可以打印状态名称,而不是012了。

添加新商品

注意判断是否数组已满,防止数组越界导致程序崩溃。

查找给定ID的商品

这里的搜索采用的是最直白的顺序搜索,其实基于顺序表的搜索可以采用折半搜索来提高效率。不过我们这个项目侧重点不在此就是了,所以直接顺序搜索也没问题。

删除给定ID的商品

这里需要注意以下的是,删除商品并不是真的删除商品的所有信息,而是将商品的状态从销售中或者已售出改为已下架。

打印详细的商品信息

为买家搜索商品

为管理员搜索商品

打印给定卖家id的商品

打印出售中的商品

这里的买家id其实用不到,这里放了这样一个参数其实是为了和其他几个打印函数保持接口上形式的统一。这样的话,到了交互界面阶段进行泛化处理的时候可以统一起来。这个点暂时按下不表,等到后面就知道了,可以期待一下哈。

最后更新于

这有帮助吗?