「C语言」超市收银管理系统

这篇具有很好参考价值的文章主要介绍了「C语言」超市收银管理系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 问题简介

设计项目名:超市收银管理系统
要求采用结构体数组存放商品数据,采用列表形式显示多行数据,界面显示的内容简明直观。标有“选做项”字样的功能,可以根据自己的能力选择是否完成,其他均为必做项。
项目功能说明:系统管理员对该系统具有最高权限,能进行商品的增删、折扣设置、查询、收银等操作。其中积分兑换与抽奖功能为选做项。主菜单如下:

-----------------
1、开始收银
2、增删商品
3、设置折扣
4、查询
5、积分兑换与抽奖(选做)
6、统计
0 退出系统
-----------------

1.1 收银功能

导入商品信息(data.txt),显示商品编号和名称。操作流程:输入商品代号、购买数量进行收银,若购买某种商品的数量大于库存,则显示“库存不足”,反之,自动生成订单编号,并显示购买信息,并提示“是否继续购买”。最后输入金额结束本单收银。

1.2 增删商品信息

可以对导入的商品信息进行删除,或添加商品信息。
操作流程:输入商品编号→查询信息→显示查询结果→增或删操作→显示操作的结果,并更新商品文件信息,以便下次导入使用。
二级菜单

----------------
1 增加商品信息(选做)
2 删除商品信息
3 编辑商品信息
4 显示所有商品信息
0 返回主菜单
----------------

1.3 设置折扣

可以对导入的商品的折扣进行修改。
操作流程:输入商品编号→查询信息→显示查询结果→修改折扣→显示操作的结果,并更新商品文件信息,以便下次导入使用。

1.4 查询与显示

可按编号或商品名称查询商品信息,也能按订单编号查询订单详情。
二级菜单

--------------------------------
1 查询商品(按编号)
2 查询商品(按名称)
3 查询订单(按编号)
0 返回主菜单
--------------------------------

1.5 积分兑换与抽奖(选做项)

该功能为选做项。导入会员积分信息,显示用户的积分值(购物花10元得1积分),可进行积分兑换成商品(1积分可当1元使用)或积分兑换抽奖(10积分换取1次抽奖机会,抽奖内容自定)。
xxx用户当期积分值:xxxx
可兑换x元的商品或兑换成x次抽奖

--------------
1 积分兑换
2 积分抽奖
0 返回主菜单
--------------

1.6 统计

统计功能包含以下3个功能,其中“3 统计销售量TOP3”为选做项

--------------
1显示全部订单
2 统计总销售额
3 统计销售量TOP3(选做)
0 返回主菜单
--------------

2 核心代码

2.1 结构体定义

  1. 商品类型
typedef struct
{
    int id;
    char name[30];   // 商品名
    char unit[5];    // 商品单位
    double cost;     // 成本
    double price;    // 商品价格
    double discount; // 折扣
    int stock;       // 存量
    int sale;        // 销售量
} Product;
  1. 订单类型
typedef struct
{
    char id[32];
    int *product; // 购买商品id数组
    int *num;     // 购买商品数量数组
    int size;
    double total;  // 总价
    double profit; // 本单利润
} Order;
  1. 会员类型
typedef struct
{
    char id[16];
    int memberPoint;//积分
} VIP;

2.2 C语言文件流操作

程序需要输入输出进行数据的存储,方便下次使用。
存储商品信息的文件格式:

2
商品代号 商品名称 单位 成本 售价 折扣 库存 销售额
1 抽纸 盒 4.00 5.20 0.90 956 44
2 牛奶 g 66.00 77.00 1.00 490 10

第一行记录商品种类数;
第二行记录数据所对应的含义;
以下每一行记录一种商品信息;

商品信息导入

// 导入商品
int importProduct(const char *path, Product *products)
{
    FILE *fin = fopen(path, "r");
    int num, i;
    char buf[1024];
    if (fin == NULL)
    {
        return 1;
    }
    fgets(buf, 1024, fin);//先获取第一行,即商品种类数
    num = atoi(buf);//atoi将 char* 转为 int 
    i = 0;
    fgets(buf, 1024, fin);//读取第二行,即字段名称,但只需要读出将文件指针下移,不需要其他操作
    while (fscanf(fin, "%d %s %s %lf %lf %lf %d %d", &products[i].id, products[i].name, products[i].unit, &products[i].cost, &products[i].price, &products[i].discount, &products[i].stock, &products[i].sale) != EOF)//判断文件指针是否到文件结尾,fscanf函数进行文件流的格式化输入
    {
        ++i;
    }
    if (fclose(fin) == EOF)//关闭文件
    {
        return 2;
    };
    return 0;
}

商品信息的导出

// 导出商品
int exportProduct(const char *path, Product *products, int num)
{
    FILE *fout = fopen(path, "w");
    if (fout == NULL)
    {
        return 1;
    }
    fprintf(fout, "%d\n", num);//按照上面的文件内容组成,这里先写入商品种类数
    fprintf(fout, "商品代号 商品名称 单位 成本 售价 折扣 库存 销售额\n");//然后写入字段名
    for (int i = 0; i < num; i++)
    {
        fprintf(fout, "%d %s %s %.2lf %.2lf %.2lf %d %d\n", products[i].id, products[i].name, products[i].unit, products[i].cost, products[i].price, products[i].discount, products[i].stock, products[i].sale);//fprintf函数进行文件流格式化输出
    }
    if (fclose(fout) == EOF)//关闭文件
    {
        return 2;
    }
    return 0;
}

2.3 C语言增加数组长度

不论是C语言还是C++,基本的数组类型在定义时就已经确定了数组的长度,后面需要修改数组长度比较麻烦。
需要用到的核心函数是:

void *malloc(size_t size);//开辟一块大小为size的空间
void *realloc(void *ptr, size_t size);//尝试在当前地址上增加长度到size,如果不可行则重新开辟一块大小size的空间,并将*ptr上的数据复制过去(ptr的大小不可为0)

以增加商品为例

// 增加商品
Product *addProduct(Product *products, int num)
{
    Product *newList;//声明一个指针变量
    if (num == 0)//如果原来的长度为0,不可使用realloc函数
    {
        newList = (Product *)malloc(sizeof(Product));//则创建一块空间
        if (!newList)
        {
            return products;
        }
    }
    else//长度不为0
    {
        newList = (Product *)realloc(products, (num + 1) * sizeof(Product));//增加长度
        if (!newList)
        {
            return products;
        }
    }
    Produce_Initial(&newList[num]);//调用商品初始化函数对新开辟的空间初始化
    return newList;//返回这个的空间的地址
}

//在调用时:
Product *productList;//声明
int product_num=0;//长度
//此处省略从文件导入商品...,长度改变
productList = addProduct(productList, product_num);//增加商品

2.4 抽奖(轮盘赌)

轮盘赌即转盘抽奖模型,将轮盘分为 n 份(可不等分),然后扔飞镖,根据飞镖所落在的区域判断中奖。
在计算上,可以处理为:将数轴上长度为 1 的线段分为 n 份,抽取一个随机数,通过判断随机数所在区间来判断中奖。
例:

n1 = 2
n2 = 4
n3 = 6
n4 = 8
将其归一
sum_n = n1 + n2 + n3 + n4 = 20
n1' = n1 / sum_n = 0.1
n2' = n2 / sum_n = 0.2
n3' = n3 / sum_n = 0.3
n4' = n4 / sum_n = 0.4
然后将其布置在数轴 0-1 上:
0---------0.1---------0.3---------0.6---------1
    n1'          n2'         n3'         n4'         --每个区间的含义
    0.1         0.2         0.3         0.4         ------长度

以商品抽奖为例:

// 轮盘赌,制作轮盘
double *probability(Product *products, int len)
{
    double offset = 0.5; // 轮盘概率的偏移量(谢谢惠顾)的占比,值越大中奖概率越低,即在轮盘上“谢谢回顾”已经占了 offset 的区域
    double pricesum = 0;//计算商品总价格(每种商品各一件)
    double sum = 0;
    double *prob = (double *)malloc((len + 1) * sizeof(double)); // 概率数组
    for (int i = 0; i < len; i++) // 计算商品总价格
    {
        pricesum += products[i].price;
    }
    double sumprob = 0;
    for (int i = 0; i < len; i++)//原本是 商品价格 / 总价,即可得出各个商品的价格占总价格的分量,价格越高其概率越大。
    //但是抽奖时,商家肯定是希望价格越高的商品中奖的概率越低,所以在 商品价/总价 的基础上,取倒数,(暂且称为“概率倒数”吧)即可让最大的概率变最小的概率,最小的概率变最大的概率
    {
        sumprob += pricesum / products[i].price;//计算这些概率倒数的总和,方便归一化
    }
    for (int i = 0; i < len; i++) // 制作轮盘// 反转概率,价格越高的商品中奖概率越低
    {
        sum += (pricesum / products[i].price) / sumprob * (1 - offset);//乘(1-offset),是因为“谢谢惠顾”已经占有了offset的概率,剩下的(1-offset)由各个商品按“概率的倒数”瓜分
        prob[i] = sum;//将概率布置到数轴上
    }
		//全部商品的概率已经布置在数轴上了,此时prob[len-1] = 1-offset
    prob[len] = 1;//将“谢谢惠顾”的概率布置到数轴上,即从 1-offset 到 1 的区间为不中奖
    return prob;
}
//布置好轮盘后,进行轮盘赌
// 轮盘赌
int roulette(Product *products, int len)
{
    srand(time(NULL));
    double num = (rand() % 1000) / 1000.0;//获取随机小数
    double *prob = probability(products, len);//制作轮盘
    for (int i = 0; i < len; i++)//遍历对比,找到随机数所在的区间
    {
        if (num <= prob[i])
        {
            return i;//确定中奖商品
        }
    }
    return -1;
}

其余功能简单且重复,不再赘述。文章来源地址https://www.toymoban.com/news/detail-490536.html

到了这里,关于「C语言」超市收银管理系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 超市商品信息管理系统/超市管理系统的设计与实现

    摘  要 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多国家的之中,随之就产生了“超市商品信息管理系统”,这样就让超市商品信息管理系统更加方便简单。 对于本超市商品信息管理系统的设计来说,系统开发主要是采用j

    2024年02月02日
    浏览(30)
  • python小实例——超市收银系统

    写在前面: 鉴于我们⽬前知识储备有限,所以我们先来完成简单版本的超市收银系统。 编写⼀个程序 实现⽤户输⼊商品的名称,价格,数量,折扣,算出应付⾦额 实现找零功能,并且打印⼩票

    2024年04月08日
    浏览(32)
  • 干洗店收银系统、上门洗鞋小程序,干洗店会员管理系统

    干洗店收银系统、上门洗鞋小程序,干洗店会员管理系统可以增加洗衣店的优势,让干洗店回本快,通过发行会员卡卡促销回收资金带来效益,减少投资压力。 干洗店管理软件功能介绍 预约上门收衣 智能提醒+员工手机APP抢单+APP拍照同步上传 快速完成订单 系统定价+系统

    2024年02月08日
    浏览(29)
  • [附源码]java毕业设计超市收银系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。 环境需要 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以

    2024年02月07日
    浏览(41)
  • 超市管理系统Java

    编程小白一枚,简单的Java小项目;自己的理解实现增删改查。 一、定义商品类 二、定义商品的操作类 三、主菜单页面 运行结果如下: 主界面:  添加货物:      查看货物清单: 修改货物:      查看库存及总价:  删除货物:      代码还需完善,欢迎评论,一起努力

    2024年02月11日
    浏览(33)
  • 超市会员管理系统

    目录 一、需求分析 二、问题描述 三、总体设计 四、详细设计 1)数据类型 2) 函数名 3)登陆界面 4)主界面 5)界面设计 (1)系统说明 (2) 输入会员信息  (3) 显示会员信息  (4)查询会员信息 (5) 插入会员信息 (6)删除会员信息 (7)修改会员信息 (8)会员消费

    2024年02月09日
    浏览(36)
  • 小型超市管理系统

      摘要 : 近些年,互联网行业的发展带给了很多人在生活上的便利,互联网能够改变人们的生活和工作的模式。很多企业都在将普通的工作模式结合了互联网,利用互联网的优势提高管理员的工作效率。目前不少超市管理系统存在着许多问题,因此根据电商行业的特点,可

    2024年02月02日
    浏览(23)
  • [MySQL]超市购物管理系统

    目录 数据库结构 一.逻辑结构设计 1.会员信息表hyxxb 2.货品名称表hpmcb 3.供应商信息表gysxxb 4.收银记录表 5.收银明细表symxb 6.货品库存表 7.扎帐记录表 8.汉字拼音表  二.索引 1.汉字拼音表索引  三.视图 1.货品库存数量视图 2.收银明细视图 四.创建函数  五.创建触发器  六.创建

    2024年02月08日
    浏览(32)
  • 超市管理系统 C++(课程设计)

    古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼 ---------------🍎------------🍉-------------- 🐼学编程的bird的博客,邀您一起学习🦌 ----------------🥕------------🥭------------- 😊很高兴你打开了这篇博客。 ★如有疑问不解或者说有想问的地方,都可以在下方评论留

    2024年01月16日
    浏览(30)
  • 超市管理系统(java+Mysql)

    目 录 摘 要 I Abstract II 1 正文 1 1.1研究背景分析 1 1.2 超市管理系统的概述 2 1.3所需软、硬件技术准备 2 1.4可行性分析 3 1.4.1 技术可行性 3 1.4.2 经济可行性 3 1.4.3 社会可行性 3 2 需求分析 4 2.1 需求分析的任务及主要内容 4 2.2.1 具体业务的需求 4 2.2 层次图 4 2.3数据流图 5 3 概要设

    2024年02月05日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包