【C++课设】超市商品管理系统设计(结构体完成)

超市商品管理系统设计

  • 一、题目
  • 二、功能展示
  • 三、代码


一、题目

2.超市商品管理系统设计
某超市有三类商品,食品、化妆品、日用品,每种商品都包含商品名称、价格、库存量和生产厂家、品牌等信息。需要设计一个系统,对商品的销售相关数据进行统计和管理,设计要求如下
①应用程序中需有菜单,用于选择各项功能调用,以下功能至少选做4项:
添加功能:主要完成商品信息的添加。
②查询功能:可按商品类别、商品名称等进行查询。若存在相应信息,输出所查询的信息,若不存在该记录,则提示“该记录不存在!”。
③删除功能:主要完成商品信息的删除。先输入商品类别,再输入要删除的商品名称,根据查询结果删除该物品的记录,如果该商品不在物品库中,则提示“该商品不存在”。
④销售功能。销售商品时,先输入类别,然后输入商品名称,并在库存中查找该商品的相关信息。如果有库存量,输入销售的数量,进行相应计算。如果库存量不够,给出提示信息,结束销售。
⑤统计功能。输出当前库存中所有商品的总数及详细信息;可按商品的价格、库存量、生产厂家进行统计,输出统计信息时,要按从大到小进行排序。

二、功能展示

超市商品管理系统

三、代码

#include <iostream>
using namespace std;
#include <String>
#include <algorithm>	//分类统计
#define MAX 1000	//可以存放的最大数量
/* designed by:susocool
 * 题目要要求五个功能均能实现->增(1)查(2)删(3)销售(4)统计(5)
 * 增加清除(6)和退出系统(0)功能,使得操作系统完善
 */
//设计商品结构体
struct GoodsInfo
{
	int category;		//类别
	int Allowance;		//库存量
	int price;
	string name;
	string Producers;	//生产产家
	string brand;		//品牌
};

struct Goodsbooks
{
	// 管理录中保存的商品数组
	struct GoodsInfo GoodsArray[MAX];
	// 管理系统中当前记录商品人个数
	int m_Size;
	// 分别记录每个类别的库存总量
	int foodTotal;
	int cosmeticsTotal;
	int dailyUseTotal;
};

// 0、菜单显示
//菜单界面
void showMenu()
{
	cout << "****************************" << endl;
	cout << "***** 1、添加商品信息  *****" << endl;
	cout << "***** 2、显示商品信息  *****" << endl;
	cout << "***** 3、删除商品信息  *****" << endl;
	cout << "***** 4、销售商品      *****" << endl;
	cout << "***** 5、统计商品信息  *****" << endl;
	cout << "***** 6、清空商品信息  *****" << endl;
	cout << "***** 0、退出管理系统  *****" << endl;
	cout << "****************************" << endl;
}
//1、添加商品
void addGoods(Goodsbooks*gbs)
{
	if (gbs->m_Size == MAX)
	{
		cout << "商品信息已满,无法继续添加!" << endl;
		return;
	}
	else
	{
		//如果可以,先输入六类别
		//1-食品 2-化妆品 3-日用品 
		int category = 0;
		cout << "请输入商品类别:" << endl;
		cout << "1--------食品" << endl;
		cout << "2--------化妆品:" << endl;
		cout << "3--------日用品:" << endl;
		//对用户输入进行判断,排除输入错误的情况
		while (true)
		{
			cin >> category;
			if (category == 1 || category == 2 || category == 3)
			{
				gbs->GoodsArray[gbs->m_Size].category = category;
				break;
			}
			else
			{
				cout << "输入错误,请重新输入!" << endl;
			}
		}
		string name;
		cout << "请输入商品姓名:" << endl;
		cin >> name;
		gbs->GoodsArray[gbs->m_Size].name = name;

		int price;
		cout << "请输入价格:" << endl;
		cin >> price;
		gbs->GoodsArray[gbs->m_Size].price = price;

		int Allowance;		
		cout << "库存量:" << endl;
		cin >> Allowance;
		gbs->GoodsArray[gbs->m_Size].Allowance = Allowance;

		string Producers;
		cout << "请输入生产产家:" << endl;
		cin >> Producers;
		gbs->GoodsArray[gbs->m_Size].Producers = Producers;

		string brand;
		cout << "请输入品牌信息:" << endl;
		cin >> brand;
		gbs->GoodsArray[gbs->m_Size].brand = brand;

		// 添加商品后,更新类别总量
		switch (category)
		{
			case 1: // 食品类别
				gbs->foodTotal += gbs->GoodsArray[gbs->m_Size].Allowance;
				break;
			case 2: // 化妆品类别
				gbs->cosmeticsTotal += gbs->GoodsArray[gbs->m_Size].Allowance;
				break;
			case 3: // 日用品类别
				gbs->dailyUseTotal += gbs->GoodsArray[gbs->m_Size].Allowance;
				break;
			default:
				break;
		}

		//更新管理系统数量
		gbs->m_Size++;
		cout << "添加成功!" << endl;

		system("pause");	//请按任意键继续
		system("cls");		//清屏
	}
}

//2、显示商品信息
void showGoods(Goodsbooks* gbs)
{
	if (gbs->m_Size == 0)
	{
		cout << "当前记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < gbs->m_Size; i++)
		{
			if (gbs->GoodsArray[i].category == 1)
			{
				cout << "食品" << "\t";
			}
			else if (gbs->GoodsArray[i].category == 2)
			{
				cout << "化妆品" << "\t";
			}
			else if (gbs->GoodsArray[i].category == 3)
			{
				cout << "日用品" << "\t";
			}
			cout << "商品名称:" << gbs->GoodsArray[i].name << "\t";
			cout << "商品价格:" << gbs->GoodsArray[i].price <<"元" << "\t";
			cout << "余量:" << gbs->GoodsArray[i].Allowance << "个" << "\t";
			cout << "商品厂家:" << gbs->GoodsArray[i].Producers << "\t";
			cout << "品牌信息:" << gbs->GoodsArray[i].brand << "\t";
			cout << endl;
		}
	}

	system("pause");	//请按任意键继续
	system("cls");		//清屏
}
//3 & 4需要判断商品是否存在
int isExist(Goodsbooks* gbs, string name)
{
	for (int i = 0; i < gbs->m_Size; i++)
	{
		//找到该商品名称
		if (gbs->GoodsArray[i].name == name)
		{
			return i;
			//未找到
		}
	}
	return -1;
}
//3、删除商品信息
void deleteGoods(Goodsbooks* gbs)
{
	cout << "请输入要删除的商品名称:" << endl;

	string name;
	cin >> name;
	int res = isExist(gbs, name);
	if (res == -1)		//未查到
	{
		cout << "未查询到该商品" << endl;
	}
	else				//找到,删除过程是顺序表的删除
	{
		for (int i = res; i < gbs->m_Size; i++)
		{
			//数据前移
			gbs->GoodsArray[i] = gbs->GoodsArray[i + i];
		}
		gbs->m_Size--;
		cout << "商品信息删除成功" << endl;
	}

	system("pause");	//请按任意键继续
	system("cls");		//清屏
}

//4、销售功能,查找商品信息
//如果商品信息足够,输入销量(卖多少个)进行相应的计算,不足给出提示,结束销售
//检测商品是否存在->检查商品数量是否满足
//@1系统名称  @2对比名称
void findGoods(Goodsbooks* gbs)
{
	cout << "请输入要查找商品的名称:" << endl;
	string name;
	cin >> name;

	int ret = isExist(gbs, name);
	if (ret == -1)
	{
		cout << "查无此商品" << endl;
	}
	else
	{
		//对余量进行判断
		if (gbs->GoodsArray[ret].category == 1)
		{
			cout << "该商品属于食品类,还有" << gbs->foodTotal << "件" << endl;
		}
		else if (gbs->GoodsArray[ret].category == 2)
		{
			cout << "该商品属于化妆品类,还有" << gbs->cosmeticsTotal << "件" << endl;
		}
		else if (gbs->GoodsArray[ret].category == 3)
		{
			cout << "该商品属于日用品,还有" << gbs->dailyUseTotal << "件" << endl;
		}

		// 输入销售数量
		int salesAmount;
		cout << "请输入销售数量:";
		cin >> salesAmount;

		// 检查销售数量
		if (salesAmount <= 0 || salesAmount > gbs->GoodsArray[ret].Allowance)
		{
			cout << "销售数量无效!或者库存量不足!" << endl;
		}
		// 计算总的售价
		double unitPrice = gbs->GoodsArray[ret].price;	//单价
		double totalSalesPrice = salesAmount * unitPrice;

		// 更新库存水平
		gbs->GoodsArray[ret].Allowance -= salesAmount;

		// 更新余量
		switch (gbs->GoodsArray[ret].category)
		{
			case 1:
				gbs->foodTotal -= salesAmount;
				break;
			case 2:
				gbs->cosmeticsTotal -= salesAmount;
				break;
			case 3:
				gbs->dailyUseTotal -= salesAmount;
				break;
			default:
				break;
		}

		// 检测库存量
		if (gbs->GoodsArray[ret].Allowance <= 0)
		{
			cout << "该商品已售罄!" << endl;
		}
		else
		{
			cout << "销售成功!剩余库存:" << gbs->GoodsArray[ret].Allowance << "件。" << endl;
		}

		// 输出总价
		cout << "销售应该金额为:" << totalSalesPrice << "元。" << endl;
	}
	system("pause");	//请按任意键继续
	system("cls");		//清屏
}

//5、统计商品信息
void showGoodsInfo(Goodsbooks* gbs)
{
	cout << "统计当前商品信息:" << endl;

	// 用于计算商品的数目
	int total_items = 0;

	// 按价格从大到小排序
	cout << "\n按价格从大到小排序:" << endl;
	sort(gbs->GoodsArray, gbs->GoodsArray + gbs->m_Size,
		[](const GoodsInfo& a, const GoodsInfo& b) {
			return a.price > b.price;
		});
	for (int i = 0; i < gbs->m_Size; ++i) {
		total_items += gbs->GoodsArray[i].Allowance;
		cout << "商品名称: " << gbs->GoodsArray[i].name << ", 价格: " << gbs->GoodsArray[i].price
			<< ", 库存量: " << gbs->GoodsArray[i].Allowance << ", 生产厂家: " << gbs->GoodsArray[i].Producers << endl;
	}

	// 按库存量从大到小排序
	cout << "\n按库存量从大到小排序:" << endl;
	sort(gbs->GoodsArray, gbs->GoodsArray + gbs->m_Size,
		[](const GoodsInfo& a, const GoodsInfo& b) {
			return a.Allowance > b.Allowance;
		});
	for (int i = 0; i < gbs->m_Size; ++i) {
		cout << "商品名称: " << gbs->GoodsArray[i].name << ", 价格: " << gbs->GoodsArray[i].price
			<< ", 库存量: " << gbs->GoodsArray[i].Allowance << ", 生产厂家: " << gbs->GoodsArray[i].Producers << endl;
	}

	// 按生产厂家排序
	cout << "\n按生产厂家排序:" << endl;
	sort(gbs->GoodsArray, gbs->GoodsArray + gbs->m_Size,
		[](const GoodsInfo& a, const GoodsInfo& b) {
			return a.Producers < b.Producers;
		});
	for (int i = 0; i < gbs->m_Size; ++i) {
		cout << "商品名称: " << gbs->GoodsArray[i].name << ", 价格: " << gbs->GoodsArray[i].price
			<< ", 库存量: " << gbs->GoodsArray[i].Allowance << ", 生产厂家: " << gbs->GoodsArray[i].Producers << endl;
	}

	// 输出总库存数
	cout << "\n当前库存中所有商品总数: " << total_items << endl;


	system("pause");	//请按任意键继续
	system("cls");		//清屏
}
//6、清空商品信息
//使用简单的方法---逻辑上清空
void clearGoods(Goodsbooks* gbs)
{
	gbs->m_Size = 0;//将当前记录商品数量置为0
	cout << "商品信息已经清空咯~" << endl;

	system("pause");
	system("cls");
}

int main()
{
	//创建管理系统结构体变量
	Goodsbooks gbs;
	gbs.m_Size = 0;
	gbs.m_Size = 0;
	gbs.foodTotal = 0;
	gbs.cosmeticsTotal = 0;
	gbs.dailyUseTotal = 0;

	int select = 0;
	while (true)
	{
		showMenu();
		cin >> select;
		switch (select)
		{
		case 1:	//添加商品信息
			addGoods(&gbs);
			break;
		case 2:	//显示商品信息
			showGoods(&gbs);
			break;
		case 3:	//删除商品信息
			deleteGoods(&gbs);
			break;
		case 4:	//销售商品
			findGoods(&gbs);
			break;
		case 5:	//统计商品信息
			showGoodsInfo(&gbs);
			break;
		case 6:	//清空商品信息
			clearGoods(&gbs);
			break;
		case 0:	//退出商品仓库
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;

		default:
			break;
		}
	}
	

	system("pause");
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「全新升级,性能更强大——ONLYOFFICE 桌面编辑器 8.1 深度评测」

文章目录 一、背景二、界面设计与用户体验三、主要新功能亮点3.1 高效协作处理3.2 共同编辑&#xff0c;毫无压力3.3 批注与提及3.4 追踪更改3.5 比较与合并3.6 管理版本历史 四、性能表现4.1 集成 AI 工具4.2 插件强化 五、用户反馈与使用案例 一、背景 Ascensio System SIA -…

finalize——释放内存

重写 没写的话就按照定义的方法&#xff0c;object的默认方法 system.gc会主动调用垃圾回收器&#xff0c;不会使用finalize方法。需求不大 对于用debug怎么进入jdk源码&#xff0c;ararry.sort的源码进入

OpenAI: 禁止在不支持的地区使用其 API

OpenAI 给开发者发邮件表示&#xff0c;禁止其 API 用于不被允许的地区&#xff0c;否则 7 月 9 日将面临封杀。 本次封杀似乎不区分 IP &#xff0c;而是直接按照地理位置。

Centos+Jenkins+Maven+Git 将生成的JAR部署到远程服务器上

1、登录 没有安装的参考下面的安装步骤先安装: Jenkins安装手册 输入账号、密码登录系统。 2、新建任务 2.1 创建页面 1,“输入一个任务名称”; 2,任务类型点击“构建一个maven项目”; 3,点击“确定”,此时,构建任务创建完成。 2.2 General 1、描述:输入要部署…

Kotlin设计模式:代理模式详解

Kotlin设计模式&#xff1a;代理模式详解 在软件开发中&#xff0c;设计模式是解决常见问题的一种优雅方法。本文将介绍Kotlin中的代理模式&#xff08;Proxy Pattern&#xff09;&#xff0c;其应用场景&#xff0c;以及如何通过实例代码实现这一模式。 代理模式的目的 代理…

【软考高项】- 2024.05月成绩查询

查询地址&#xff1a;全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试 考试批次&#xff1a;2024.05.26 第二批&#xff08;论文&#xff1a;成本管理&#xff09; 我的分数&#xff1a; 结论&#xff1a;未通过本次考试&#xff0c;2025.05 继续努力&…

判断对象是否为空的多种方式

判断对象是否为空 网上也有许多方法&#xff0c;这里来整理一下 一、Object.keys(obj) ES6 写法&#xff1a; const data {}; const arr Object.keys(data); console.log(arr.length); // 0二、JSON.stringify() const obj {}; const arr JSON.stringify(obj); console.…

基本工资8000,三班倒轮班,有点辛苦,技术含量高,但越老越吃香的工作工资待遇分享...

技术员的逆袭&#xff1a;数控技术员的职场升级攻略 引言 在职场这片星辰大海中&#xff0c;有一群默默耕耘的技术员&#xff0c;他们用双手和智慧&#xff0c;雕刻着工业的明天。数控技术员&#xff0c;一个听起来就充满机械感和科技感的职业&#xff0c;他们的故事&#xff0…

05-java基础——循环习题

循环的选择&#xff1a;知道循环的次数或者知道循环的范围就使用for循环&#xff0c;其次再使用while循环 猜数字 程序自动生成一个1-100之间的随机数&#xff0c;在代码中使用键盘录入去猜出这个数字是多少&#xff1f; 要求&#xff1a;使用循环猜&#xff0c;一直猜中为止…

Linux[高级管理]——Squid代理服务器的部署和应用(传统模式详解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月24日11点11分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— Squid功能 Squ…

Lobe Chat openai claude

claude-3-5-sonnet-20240620 $ docker run -d -p 3210:3210 \-e OPENAI_API_KEYsk-xxxx \-e OPENAI_PROXY_URLhttps://api-proxy.com/v1 \-e ACCESS_CODElobe66 \--name lobe-chat \lobehub/lobe-chatDocker 部署 更新 docker ps CONTAINER ID IMAGE …

字节跳动联手博通:5nm AI芯片诞生了?

字节跳动联手博通&#xff1a;5nm AI芯片诞生了&#xff1f; 前言 就在6月24日&#xff0c;字节跳动正在与美国博通合作开发一款5纳米工艺的专用集成电路(ASIC) AI处理器。这款芯片旨在降低采购成本并确保高端AI芯片的稳定供应。 根据报道&#xff0c;尽管芯片设计工作进展顺利…

使用 frida hook Android app

Frida&#xff1a; 一种基于动态插装&#xff08;dynamic instrumentation&#xff09;技术的工具包&#xff0c;它主要是为测试人员、开发人员和逆向工程爱好者创建&#xff0c;在目标程序运行时&#xff0c;允许用户将 JavaScript代码注入其中&#xff0c;实现动态修改和调试…

如何恢复Excel保存前的数据?分享5个实用技巧!

在数字化时代&#xff0c;Excel表格已经成为我们工作生活中不可或缺的一部分。然而&#xff0c;随着数据的日益增多&#xff0c;误操作或系统崩溃导致的数据丢失问题也日益突出。但你知道吗&#xff1f;数据其实并没有真正消失&#xff0c;它们只是被隐藏在了电脑深处的某个角落…

手机卡顿反应慢怎么解决?4个实用技巧,轻松提升运行速度

当你的手机变得像一只蜗牛一样缓慢&#xff0c;每一个滑动、每一次点击都充满了无尽的等待&#xff0c;是不是让你感到无比沮丧&#xff1f;别担心&#xff0c;你并不孤单。手机卡顿、反应慢是许多用户都会遇到的问题。那么&#xff0c;手机卡顿反应慢怎么解决呢&#xff1f;本…

智慧仓储的秘密武器:数据可视化的应用

智慧仓储中数据可视化是如何应用的&#xff1f;在现代物流和供应链管理中&#xff0c;智慧仓储已成为企业提升效率、降低成本和优化运营的重要手段。而数据可视化作为智慧仓储的重要工具&#xff0c;通过将复杂的数据转化为直观、易理解的图表和图形&#xff0c;极大地提升了仓…

VOSviewer分析知网文献

VOSviewer简介 VOSviewer 是一款用于构建和可视化科学文献计量网络的软件工具。它能够帮助用户分析和可视化期刊、研究人员或单个出版物之间的关系&#xff0c;这些关系可以基于引用、共引、共著或术语共现关系来构建。VOSviewer 还提供了文本挖掘功能&#xff0c;可以用来构建…

uni-app系列:uni.navigateTo传值跳转

文章目录 1. 使用URL参数2. 使用页面栈注意事项&#xff1a;uni.navigateTo API 参数详细说明回调函数参数 在uni-app中&#xff0c;如果想要通过uni.navigateTo方法跳转到另一个页面并传递参数&#xff0c;可以使用页面路由的URL参数或者页面栈的方式来传递。但是&#xff0c;…

eNSP中静态NAT和动态NAT的配置和使用

一、静态NAT 1.拓扑图 a.新建拓扑图 b.PC端配置 PC1: PC2&#xff1a; c.路由器配置 AR1: <Huawei>system-view [Huawei]sysname R1 [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.254 24 [R1-GigabitEthernet0/0/0]quit…

Arduino 旋转编码器

Arduino 旋转编码器 电位计 Arduino - Rotary Encoder In this tutorial, we are going to learn how to use the incremental encoder with Arduino. In detail, we will learn: 在本教程中&#xff0c;我们将学习如何将增量编码器与Arduino一起使用。详细来说&#xff0c;…