基于C+++FLTK实现(WinForm)超市收银系统【100010032】

news2024/10/6 12:23:19

超市收银系统 Supermarket POS system

本次大作业是利用 C++语言,基于 FLTK 图形库来设计超市收银系统。首先介绍程序的设计思想:

这套程序完全是基于题目所给的要求逐条逐步设计的。我把程序实现大致分为数据层面和图形层面。

数据层面:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

程序使用的 Class 一览表

1.基本信息包括商品名称、商品类别、条形码号、单价、计量单位、进价、库存、备注等项。要求能够新增、删除 、修改、检索商品信息,能够检测非法条形码号并防止录入重复信息,允许以文件形式批量导入、导出商品信息。

题目中描述的基本商品对应的是上图中的 Goods 类,类中成员以及成员函数功能基本上和名字一一对应。

可以看出 Goods 类其实是对于一种商品的描述,而超市的商品实际上是 Goods 类的一个集合,因此,对于超市中所所有商品,这里定义了一个 vector来实现,并且该 Goods 向量名字也很形象:Warehouse(仓库)。

定义了该向量之后,搜索商品则变得十分容易,只需通过迭代器遍历访问 Warehouse 即可,而删除商品则是通过将商品信息置为非法值来达到的。

至于检测非法条形码号并防止录入重复信息,这里首先要说明的是,出于编程工作量以及实际商场运作 的考虑,没有提供手动输入商品信息的接口。检查条形码的工作实际放到了从文件导入商品信息的过程中。

在这里插入图片描述

可见上述代码分别进行了条形码检测(位数是否符合)以及是否重复的检查,该套程序默认有效条形码是八位整数(eg.10239523)。

至于从文件输入输出,这在之前的上机题目中已经有类似的练习,直接利用文件流便可以达成。

2.生成一次购买物品清单,包括消费日期、物品名称、单价、数量、总价等。 收银找银功能,根据收入金额计算找银金额。

对于物品清单,仍旧是文件操作,生成的收据清单样例如下

在这里插入图片描述

其中涉及的类有 Date 类,专门用来管理和日期相关的操作。同时,针对购买行为也专门涉及了

Purchase_action 类,这样可以将商品和日期之间关联起来。方便后面进行统计操作。

3.根据选择的时间跨度,生成营业报表。包括总营业额、利润曲线、各类商品的收益比重等统计功能

关于搜寻给定日期内的消费记录( Purchase_action ) , 由于在进行消费的时候创建了

Purchase_action 的向量,因此也是在该向量(History)中进行迭代器遍历,寻找对应日期以及对应商品的利润信息。此处需要注意的是,按商品归类的利润存储在 Goods 类的成员 profit 中,而按日期归类的利润则存贮在 ProfitPerDay 类中。

图形层面:

仔细阅读 main 函数会发现,该函数中主题部分都是定义 FLTK 库中的对象。此处主要说明程序中用到的一些对象:

Fl_Input

这个类是 FLTK 库中用来管理图形界面输入的。其中用到的具体类有:

Fl_Int_Input

用于定义仅仅能输入整数的输入框(0-9)。

Fl_Float_Input

用于定义仅仅能输入浮点数的输入框(0-9 & . )。

创建这些对象的时能够生成图形界面的文本输入框,而 FLTK 的事件触发(按下按钮,敲击回车, 输入框数值改变等)是通过调用对象的 when 函数(不仅仅对于 Fl_Input 类,对所有的可互动类均是如此)。而触发之后的操作则是通过配置该对象的 callback 函数来实现。举例而言,如果要读入某个输入框的输入值,那么需要针对该输入框(对象)写一个读入(变量赋值)函数,并且将函数作为形参传递给 callback 函数。这些函数统一都放在了 FLTK_functions.h 文件中。

Fl_Output

如其名所示,是用于管理 FLTK 输出的类。本程序中利用该类来生成输出文本框。改变其输出值只用调用其成员函数 value 即可。

Fl_Button

如其名所示,是用于管理 FLTK 按钮的类,使用按钮的原因是显式地告诉用户如何进行操作,直接按回车等方法总是容易让人感觉不直观,也不容易知道操作的是哪一部分。因此,按钮的作用是将输入和输出进行关联。

Fl_Box

这个类在本程序中的作用主要是标清楚各个区域,让用户比较直观地找到在哪里搜索,在哪里消费,在哪里查看统计信息。

至于绘图以及输出各个商品所占利润百分比,程序中采用的是 fl_draw 系列的函数。需要注意的是,FLTK 并不支持直接调用这些函数进行绘图,必须将其作为用户自定义类中的成员函数才能使用。这也是程序中 profitCurve 类的设计初衷。

最后附上一张程序运行结果图:

在这里插入图片描述

关于在Xcode中配置FLTK库

其实配置FLTK库才是比较重要的一点。在MacBook上使用过Visual Studio,按照老师主页上的配置确实可以使用FLTK库。但奈何自己的MacBook跑一会Windows就变铁板烧,所以还是想用Xcode,但无奈网上并没有很直接的教程,因此打算自己在这里记录一下。

这里使用的是Xcode 8.2.1 + FLTK 1.3.4,下载FLTK 1.3.4解压之后,打开./ide/Xcode4/FLTK.xcodeproj ,Xcode选择Automatically Create Schemes.注意这张图中的FL文件夹,我们待会需要用到。

在这里插入图片描述

在这里插入图片描述

对于FLTK开发不是很熟悉的同学(比如我),上图中左侧的Tests文件夹下全是例程,可以参考,看几个例程(input,output,line_style)之后,基本上FLTK的套路能学个大概。

如果想要运行例程,在下图中点击browser(因为我这里选的是browser…)然后在下拉菜单里选择你想要执行的Scheme,编译运行即可。Scheme对应的源码可以在上述Tests下同名文件夹中找到。

在这里插入图片描述

打开这个FLTK.xcodeproj目的主要是为了编译出FLTK的库,我也是自己胡乱摸索出来的,可能有更好的办法,下面讲一下具体过程。

给出的例子是绘制红白相间的棋盘,我已经将源代码上传到tutorial文件夹下。

1.首先,在打开的FLTK.xcodeproj中任选一个Scheme,在Xcode顶部标签Product下选择Archive(图中所示为"hello"这个scheme生成的),编译完毕后会显示如下窗口:

在这里插入图片描述

2.选择Export,弹窗中选择

在这里插入图片描述

3.点击Next,然后在你保存库的地方,就会出现一个文件夹,点进去之后,右键hello("hello"这个scheme生成的),选择”显示包内容“,进入Content/Frameworks就可以看到FLTK的库了,请务必记得将这个fltk.framework文件拷贝出来。

在这里插入图片描述

4.接下来我们就要将这个库和自己的Project关联起来,首先创建一个Command line tool 的 Project(FLTK_Tutorial),导入红白棋盘的源文件,在project的选项中选择Build Phase,在 Link Binary with Libraries中,选择"+"。

在这里插入图片描述

5.在Add Another…中选择刚刚拷贝出来的fltk.framework

在这里插入图片描述

如果此时编译,会提示找不到头文件,因此,接下来要做的是将FLTK的头文件包含到Project中,考虑到未来可能还要使用FLTK库,这里是将FLTK添加到系统的framekwork中。

6.将fltk.framework文件拷贝到 /Library/Frameworks文件夹下,可以看到这个文件夹下有很多framework文件夹,注意此步骤需要管理员权限

在这里插入图片描述

7.比较蛋疼的是,这个fltk.framework中虽然已经包含了头文件,但是并不全(142个),差一个abi-version.h文件,因此,我们回到最初的FLTK解压文件夹,在/FL文件夹中找到abi-version.h文件,然后再回到/Library/Frameworks下,打开刚刚拷贝进来的fltk.framework,在/Version/A/Headers/FL/ 下,将abi-version.h拷贝进来。

在这里插入图片描述

8.集齐了头文件之后,我们需要在Xcode中设定头文件搜寻路径。还是在Project的选项中,这次选择Build Setting,在Search Paths中按照下图进行设置。

在这里插入图片描述

设置完毕后理论上编译就可以执行了。效果如图:

在这里插入图片描述

♻️ 资源

在这里插入图片描述

大小: 1.97MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87248361

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抖音视频怎么拼接?分享一款功能强大的软件

抖音视频怎么拼接?利用软件就很方便,所以抖音视频拼接可以通过操作简单的视频软件来辅助比较简单。就比如万兴喵影,就是一款操作简单、功能齐全的视频编辑器,很适合新手小白和半专业人士。 用万兴喵影做视频拼接,只需要…

扩散模型类似的方式训练text_to_text可不可以

🍿*★,*:.☆欢迎您/$:*.★* 🍿 正文 # 使用 64*64 图 写入 16号字体 16个字 # 每组数据 的 文字 是连续的 # 三张图组成一个训练 # 至少48 个字符训练一次 # 选择好自己的文本数据集

Springboot整合Netty,自定义协议实现

Springboot整合Netty&#xff0c;自定义协议实现 Springboot整合Netty 新建springboot项目&#xff0c;并在项目以来中导入netty包&#xff0c;用fastjson包处理jsonStr。 <!-- netty --><dependency><groupId>io.netty</groupId><artifactId>…

Unity物理系统-物理材质-Collider碰撞体的弹力不够大如何处理

物理材质Physic Material&#xff1b; 当碰撞器发生碰撞的时候&#xff0c;具有该材质的游戏物体就会具有该材质的属性&#xff1b; Step1&#xff1a;在Project窗口下新建Physic Material&#xff08;命名为mat&#xff09;&#xff0c;并更改其弹力参数为1 Step2&#xff1a…

408 考研《操作系统》第二章第七节:死锁和死锁的三种处理策略(预防死锁、避免死锁、检测和解除)

文章目录1.死锁1.1 什么是死锁&#xff1f;1.2 死锁、饥饿、死循环的区别1.3 死锁产生的必要条件1.4 什么时候会发生死锁&#xff1f;1.6 总结2. 死锁的处理策略——预防死锁2.1 破坏互斥条件2.2 破坏不剥夺条件2.3 破坏请求和保持条件2.4 破坏循环等待条件2.5 总结3. 死锁的处…

chatgpt+mirai实现QQ机器人

chatGPTbot 配合mirai机器使用 安装 Java &#xff08;版本必须 > 11&#xff09; 下载Mirai 控制台 https://github.com/iTXTech/mirai-console-loader/releases 手动安装插件mirai-api-http 1.双击mcl.cmd 或./mcl 运行 Mirai Console 生成 plugins 文件夹 2.从 ht…

Android基于开源项目搭建自己的技术堆栈

一、app的整体架构 从较高的层次讲&#xff0c;一个APP的整体架构可以分为两层&#xff0c;即应用层和基础框架层。 1、应用层专注于行业领域的实现&#xff0c;如金融、支付、地图、社交等&#xff0c;它直接面向用户&#xff0c;是用户对产品的第一层感知。 2、基础框架层…

从安装过程品国产Linux操作系统的技术来源与异同之处

作者&#xff1a;IT圈黎俊杰 使用Linux操作系统的第一步无疑是安装&#xff0c;本文通过作者亲手对多个国外主流开源操作系统、多个主流国产操作系统的安装过程进行记录与对比&#xff0c;让大家可以借助安装过程的界面风格、页面布局、功能等&#xff0c;细细的品一下国产Linu…

Unity3D教程:简单的碰撞检测

需求&#xff1a;当立方体Cube碰到地面Plane的时候&#xff0c;输出碰撞物体的名称&#xff0c;则表述检测到立方体碰撞了地面。 1.搭建一个简单的场景。 在新的工程中选择File->new Scene创建新的场景。然后在该场景中添加地板&#xff1a;GameObject->Create Other-&…

Mapstruct类型转换Person ->PersonDTO以及po、vo、dto、request概念

文章目录po、vo、dto、requestPerson ->PersonDTO安装插件引入依赖Maven项目结构图Person 与 PersonDTOConverterpo、vo、dto、request Mapstruct 完成类型转换&#xff01; po&#xff1a;数据持久层对象&#xff0c;用于映射数据库中的表 dto&#xff1a;数据传输对象&a…

各类软件研发行业源代码防泄密需求分析

各类软件研发行业&#xff0c;都有自己的核心数据以及核心文档&#xff0c;用户数据等敏感信息&#xff0c;这些信息数据有以下共性&#xff1a; 属于核心机密资料&#xff0c;万一泄密会给造成恶劣影响 核心数据类型多&#xff0c;有源代码数据&#xff0c;员工计算机水平高…

[附源码]Nodejs计算机毕业设计基于web的图书借阅管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

2-3查找树-树-数据结构和算法(Java)

文章目录1 概述2 查找3 插入3.1 向2-结点中插入新键3.2 向一个只含有一个3-结点的树中插入新键3.3 向一个父结点为2-结点的3-结点中插入新键3.4 向一个父结点为3-结点的3-结点中插入新键4 分析4.1 局部变换4.2 全局性质5 后记1 概述 我们前面学习过关于二叉树的算法已经能够很…

CDN工作原理以及使用CDN的好处

所有的大厂以及其他很多互联网公司都使用了CDN&#xff0c;那CDN到底是什么呢&#xff1f;为什么要使用&#xff1f;一起来看看吧&#xff01; 文章目录1. 什么是CDN&#xff1f;2. CDN 是怎么工作的&#xff1f;3. 使用 CDN 有什么好处&#xff1f;3.1 缩短网站加载时间3.2 减…

Zookeeper[2]- Zookeeper集群环境搭建

前边步骤可参考: Zookeeper[1]-Zookeeper介绍与安装以及集群环境准备_豆虫儿的博客-CSDN博客Zookeeper的介绍和安装Zookeeper客户端使用ZookeeperJavaAPI使用我们为了学习Dubbo&#xff0c;而在dubbo中需要一个注册中心&#xff0c;而Zookeeper是我们在使用Dubbo是官方推荐的…

作业-12.13【使用QT制作一个简单的登录界面】

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //设置窗口属性 this->setWindowTitle("Sumeru Dance Training"); this->setFixedSize(8…

[激光原理与应用-52]:《激光焊接质量实时监测系统研究》-3-传感器选型和电路设计

目录 3.1 传感器的选取 3.1.1 光电探测基本概念 3.1.2 可见光传感器 3.1.4 声音传感器 3.2 信号调理电路 3.2.0 可见光电信号前置放大电路 3.2.1 红外光电信号前置放大电路 3.2.2 程控自适应增益的光信号放大电路 3.2.3 光信号滤波电路 3.2.4 声信号调理电路 3.3 数据…

【图像处理】边缘检测算子有哪些以及它们之间的对比

这个问题应该是做过传统图像处理的人都接触过的吧。粗略总结下&#xff0c;应该也不会问太细&#xff0c;面试官大概就考察下大家的知识面吧。 综述 边缘检测是图像处理和计算机视觉中&#xff0c;尤其是特征提取中的一个研究领域。图像边缘检测大幅度地减少了数据量&#xf…

第五章. 可视化数据分析图表—常用图表的绘制3—散点图,面积图,热力图

第五章. 可视化数据分析图 5.3 常用图表的绘制3—散点图&#xff0c;面积图&#xff0c;热力图 本节主要介绍常用图表的绘制&#xff0c;主要包括散点图&#xff0c;面积图&#xff0c;热力图。 1.散点图&#xff08;matplotlib.pyplot.scatter&#xff09; 散点图主要用来查…

Redux Hooks actions 调用方式优化(一)

hooks 可以说是现在react编程的的主流&#xff0c;redux 迎合这个主流也推出 toolkit 工具集来。但是在用toolkit 搭建前端框架后&#xff0c;给人的感觉就是比原先的connect 那一套好些&#xff0c;但用起来还是挺繁琐的。 一 toolkit 搭建的正常使用版本 1.1 创建store im…