超市商品管理系统设计 C++实现

超市商品管理系统设计—C++实现


文章目录

  • 超市商品管理系统设计---C++实现
  • 一、内容要求
    • 大纲图
  • 二、源代码(包含大量注释)
    • 1、main.cpp文件
    • 2、supermarket.h文件
    • 3、supermarket.cpp文件
    • 4、administrator.h文件
    • 5、administrator.cpp文件
    • 6、user.h文件
    • 7、user.cpp文件
    • 8、管理员密码:helloworld
  • 总结(运行截图)


一、内容要求

要求

新增要求:

  1. 将管理员和用户分别开。
  2. 管理员需要密码才能进入系统。
  3. 查询功能:两种查询功能。第一种是按商品类别、商品名称、生产厂家进行查询;第二种是按商品类别、商品名称进行查询。第一种偏向管理员,第二种偏向用户。
  4. 修改功能:可以修改所以的属性。
  5. 排序功能:两种排序功能(都包含升序和降序)。第一种按照价格排序;第二种按照库存量排序。两种排序都要包含升序和降序。
  6. 清空功能:将商品全部清空的要求。
  7. 读取文件数据功能:系统运行时,就需要读取文件商品数据。包含文件不存在、文件为空、文件不为空且有数据。
  8. 存储文件功能:将商品数据存放到文件中。
  9. 展示商品gongn:打印所有商品数据信息。
  10. 在增、删、修、排序、清空功能中,要实现文件数据的时时更新。

大纲图

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

在这里插入图片描述


二、源代码(包含大量注释)

在这里插入图片描述

7个文件,3个头文件,4个.cpp文件
main.cpp
supermarket.h
supermarket.cpp
administrator.h
administrator.cpp
user.h
user.cpp


1、main.cpp文件

#include <iostream>
#include "supermarket.h"
#include "administrator.h"
#include "user.h"
using namespace std;int main()
{//test01();administrator adm;//管理员supermarket market;//超市系统user us;//用户int input = 0;do{market.supermarketMenu();cout << "请输入对应的序号:";cin >> input;switch (input){case 1:us.operate_user(market);break;case 2://adm.login_administrator()if (adm.login_administrator()){system("cls");adm.operate_administrator(market);}else{input = 0;}break;case 0:cout << "退出超市系统,欢迎下次光临" << endl;break;default:cout << "输入序号不存在,请重新输入" << endl;break;}} while (input);//按任意键后,退出程序cout << endl;system("pause");return 0;
}

2、supermarket.h文件

#pragma once//防止头文件重复包含
#include <iostream>
using namespace std;
#include <string>
#include <fstream>
#define FILENAME "Goods.txt"
#define ARRSIZE 10//商品的抽象基类
class goods
{
public://显示商品信息virtual void showGoodsInfo() = 0;//获取商品类型virtual string goodsType() = 0;int goodsClass;//记录商品类string name;//商品名称int price;//商品价格int inventory;//商品库存量string manufacturer;//商品生产厂家};//食物类
class food : public goods
{
public://构造函数food(string n, int p, int i, string m);//显示商品信息virtual void showGoodsInfo();//获取商品类型virtual string goodsType();
};//化妆品
class cosmetics : public goods
{
public://构造函数cosmetics(string n, int p, int i, string m);//显示商品信息virtual void showGoodsInfo();//获取商品类型virtual string goodsType();
};//日用品
class necessities : public goods
{
public://构造函数necessities(string n, int p, int i, string m);//显示商品信息virtual void showGoodsInfo();//获取商品类型virtual string goodsType();
};//饮料
class drink : public goods
{
public://构造函数drink(string n, int p, int i, string m);//显示商品信息virtual void showGoodsInfo();//获取商品类型virtual string goodsType();
};//超市管理系统
class supermarket
{
public:supermarket();//构造函数void supermarketMenu();//超市管理系统菜单~supermarket();//析构函数//商品类型的数量int goodsTypeNum;//商品数组指针goods** goodsArray;//商品类的菜单void goodsClassMenu();//标志判断文件是否为空bool fileEmpty;//统计文件中的商品类型的数量int getFile_goodsTypeNum();//用文件初始化商品void initGoods();//将商品保存到文件void save();//添加商品void addGoods();//展示商品void showGoods();//查询商品——按商品类别、名称、生产厂家查询int inquireGoods_1();//打印查询1的商品信息void printInquireGoods_1(int index);//查询商品——按商品类别、名称查询int* inquireGoods_2();//打印查询2的商品信息void printInquireGoods_2(int* p);//修改商品void reviseGoods();//下架商品void delGoods();//排序1--按价格排序void sortGoods_1();//排序2--按库存量排序void sortGoods_2();//清空商品void clearGoods();
};

3、supermarket.cpp文件

#include "supermarket.h"//食物类构造函数
food::food(string n, int p, int i, string m)
{this->goodsClass = 1;this->name = n;this->price = p;this->inventory = i;this->manufacturer = m;
}//显示食物类商品信息
void food::showGoodsInfo()
{cout << this->goodsType() << "\t|";cout << this->name << "\t|";cout << this->price << "\t|";cout << this->inventory << "\t|";cout << this->manufacturer << endl;
}//获取商品类型
string food::goodsType()
{return string("食物");
}//化妆品类构造函数
cosmetics::cosmetics(string n, int p, int i, string m)
{this->goodsClass = 2;this->name = n;this->price = p;this->inventory = i;this->manufacturer = m;
}//显示化妆品类商品信息
void cosmetics::showGoodsInfo()
{cout << this->goodsType() << "\t|";cout << this->name << "\t|";cout << this->price << "\t|";cout << this->inventory << "\t|";cout << this->manufacturer << endl;
}//获取商品类型
string cosmetics::goodsType()
{return string("化妆品");
}     //日用品类构造函数
necessities::necessities(string n, int p, int i, string m)
{this->goodsClass = 3;this->name = n;this->price = p;this->inventory = i;this->manufacturer = m;
}//显示日用品类商品信息
void necessities::showGoodsInfo()
{cout << this->goodsType() << "\t|";cout << this->name << "\t|";cout << this->price << "\t|";cout << this->inventory << "\t|";cout << this->manufacturer << endl;
}//获取商品类型
string necessities::goodsType()
{return string("日用品");
}//饮料类构造函数
drink::drink(string n, int p, int i, string m)
{this->goodsClass = 4;this->name = n;this->price = p;this->inventory = i;this->manufacturer = m;
}//显示饮料类商品信息
void drink::showGoodsInfo()
{cout << this->goodsType() << "\t|";cout << this->name << "\t|";cout << this->price << "\t|";cout << this->inventory << "\t|";cout << this->manufacturer << endl;
}//获取商品类型
string drink::goodsType()
{return string("饮料");
}//超市管理构造函数
supermarket::supermarket()
{//读文件方式打开文件ifstream ifs;ifs.open(FILENAME, ios::in);//1、文件不存在if (!ifs.is_open()){cout << "------------------------" << endl;cout << "-----  文件不存在!-----" << endl;cout << "------------------------" << endl;cout << endl;//初始化商品类型的数量this->goodsTypeNum = 0;//初始化商品数组指针this->goodsArray = NULL;//初始化文件是否为空this->fileEmpty = true;ifs.close();//关闭文件return;}//2、文件存在,数据为空char ch;ifs >> ch;//读取一个字符if (ifs.eof())//文件结尾EOF{//文件为空cout << "------------------------" << endl;cout << "----  文件为空文件!----" << endl;cout << "------------------------" << endl;cout << endl;//初始化商品类型的数量this->goodsTypeNum = 0;//初始化商品数组指针this->goodsArray = NULL;//初始化文件是否为空this->fileEmpty = true;ifs.close();//关闭文件return;}//3、文件存在,并且有数据cout << "------------------------" << endl;cout << "--  从文件中导入数据  --" << endl;cout << "------------------------" << endl;cout << endl;int num = this->getFile_goodsTypeNum();cout << "商品类型的数量为:" << num << endl;//商品类型的数量this->goodsTypeNum = num;//初始化文件不为空this->fileEmpty = false;//开辟空间this->goodsArray = new goods * [this->goodsTypeNum];//将文件商品存放数组中this->initGoods();ifs.close();//关闭文件
}//超市管理析造函数
supermarket::~supermarket()
{//释放空间if (NULL != this->goodsArray){//清空堆区数据int i = 0;//遍历删除每个数据for (i = 0; i < this->goodsTypeNum; i++){delete this->goodsArray[i];this->goodsArray[i] = NULL;}//删除指针delete[] this->goodsArray;this->goodsArray = NULL;}
}//超市管理系统菜单
void supermarket::supermarketMenu()
{cout << endl;cout << "***********************************" << endl;cout << "*****    1、用户购买商品      *****" << endl;cout << "*****    2、管理员管理超市    *****" << endl;cout << "*****    0、退出超市系统      *****" << endl;cout << "***********************************" << endl;cout << endl;
}//商品类的菜单
void supermarket::goodsClassMenu()
{cout << "***********************" << endl;cout << "***  1、 食物类     ***" << endl;cout << "***  2、 化妆品类   ***" << endl;cout << "***  3、 日用品类   ***" << endl;cout << "***  4、 饮料类     ***" << endl;cout << "***********************" << endl;
}//统计文件中的商品类型的数量
int supermarket::getFile_goodsTypeNum()
{//读文件方式打开文件ifstream ifs;ifs.open(FILENAME, ios::in);int count = 0; //统计商品数量int Class;//记录商品类string Name;//商品名称int Price;//商品价格int Inven;//商品库存量string Manu;//商品生产厂家while (ifs >> Class && ifs >> Name && ifs >> Price && ifs >> Inven && ifs >> Manu){count++;}ifs.close();//关闭文件return count;
}//用文件初始化商品
void supermarket::initGoods()
{//读文件方式打开文件ifstream ifs;ifs.open(FILENAME, ios::in);int Class;//记录商品类string Name;//商品名称int Price;//商品价格int Inven;//商品库存量string Manu;//商品生产厂家goods* Goods = NULL;int index = 0;while (ifs >> Class && ifs >> Name && ifs >> Price && ifs >> Inven && ifs >> Manu){if (1 == Class)//食物类{Goods = new food(Name, Price, Inven, Manu);}else if (2 == Class)//化妆品类{Goods = new cosmetics(Name, Price, Inven, Manu);}else if (3 == Class)//日用品类{Goods = new necessities(Name, Price, Inven, Manu);}else if (4 == Class)//饮料类{Goods = new drink(Name, Price, Inven, Manu);}//将文件数据存放在数组中this->goodsArray[index] = Goods;index++;}ifs.close();//关闭文件
}//将商品保存到文件
void supermarket::save()
{//判断商品数据否是为空if (!this->goodsTypeNum){cout << "无商品数据" << endl;this->fileEmpty = true;return;}ofstream ofs;//用写文件打开文件ofs.open(FILENAME, ios::out);int i = 0;for (i = 0; i < this->goodsTypeNum; i++){ofs << this->goodsArray[i]->goodsClass << " ";ofs << this->goodsArray[i]->name << " ";ofs << this->goodsArray[i]->price << " ";ofs << this->goodsArray[i]->inventory << " ";ofs << this->goodsArray[i]->manufacturer << endl;}//关闭文件ofs.close();
}//添加商品
void supermarket::addGoods()
{cout << "添加新商品开始" << endl;int addNum;int i = 0;cout << "请输入要添加的商品的类型数量:";cin >> addNum;if (addNum > 0){//计算添加后的总空间大小int newSize = this->goodsTypeNum + addNum;//开辟新空间goods** newSpace = new goods * [newSize];//将原来的空间数据,拷贝到新空间if (NULL != this->goodsArray){for (i = 0; i < this->goodsTypeNum; i++){newSpace[i] = this->goodsArray[i];}}//添加新商品int input;int Class;//记录商品类string Name;//商品名称int Price;//商品价格int Inven;//商品库存量string Manu;//商品生产厂家goods* newGoods = NULL;//商品的父类指针for (i = 0; i < addNum; i++){cout << endl;cout << "第" << i + 1 << "个新增商品样式" << endl;cout << "新商品的名称:";cin >> Name;cout << "新商品的价格:";cin >> Price;cout << "新商品的库存量:";cin >> Inven;cout << "新商品的生产厂家:";cin >> Manu;//商品类的菜单this->goodsClassMenu();cout << "请选择商品的类型:";cin >> input;switch (input){case 1://开辟食物类的空间newGoods = new food(Name, Price, Inven, Manu);break;case 2://开辟化妆品类的空间newGoods = new cosmetics(Name, Price, Inven, Manu);break;case 3://开辟日用品类的空间newGoods = new necessities(Name, Price, Inven, Manu);break;case 4://开辟饮料类的空间newGoods = new drink(Name, Price, Inven, Manu);break;default:break;}//将创建好的新商品的地址,存放在数组中newSpace[this->goodsTypeNum + i] = newGoods;}//释放原有的空间delete[] this->goodsArray;//更新新的空间指向this->goodsArray = newSpace;//更新新的商品类型数量this->goodsTypeNum = newSize;//更新文件不为空this->fileEmpty = false;cout << "----------添加新商品成功----------" << endl;this->save();//将商品保存到文件}else{cout << "输入数据有误" << endl;}
}//展示商品
void supermarket::showGoods()
{//判断商品数据否是为空if (!this->goodsTypeNum){cout << "无商品,展示商品失败" << endl;return;}cout << "展示商品开始" << endl << endl;int i = 0;int count = 0;cout << "---------------------商品库---------------------" << endl;cout << "类型\t|名称\t|价格\t|库存量\t|生产厂家" << endl;cout << "--------|-------|-------|-------|---------------" << endl;for (i = 0; i < this->goodsTypeNum; i++){count += this->goodsArray[i]->inventory;this->goodsArray[i]->showGoodsInfo();cout << "--------|-------|-------|-------|---------------" << endl;}cout << endl;cout << "商品类型的数量:" << this->goodsTypeNum << endl;cout << "商品的总数:" << count << endl;cout << "----------展示商品完成----------" << endl;
}//查询商品——按商品类别、名称、生产厂家查询
int supermarket::inquireGoods_1()
{//判断商品数据否是为空if (!this->goodsTypeNum){cout << "无商品,查询失败" << endl;return -1;}int i = 0;int Class;//记录商品类string Name;//商品名称string Manu;//商品生产厂家this->goodsClassMenu();//商品类的菜单cout << "请输入要查询商品的类型序号:";cin >> Class;cout << "请输入要查询商品的名称:";cin >> Name;cout << "请输入要查询商品的生产厂家:";cin >> Manu;for (i = 0; i < this->goodsTypeNum; i++){//先判断商品类型是否相同if (this->goodsArray[i]->goodsClass != Class){continue;}//在进行商品名称比较if (!this->goodsArray[i]->name.compare(Name) && !this->goodsArray[i]->manufacturer.compare(Manu)){cout << "----------查询成功----------" << endl;return i;}}cout << "查询失败,该商品不存在" << endl;return -1;
}//打印查询1的商品信息
void supermarket::printInquireGoods_1(int index)
{//查询失败的情况if (-1 == index){return;}cout << "查询结果打印" << endl << endl;cout << "类型\t|名称\t|价格\t|库存量\t|生产厂家" << endl;cout << "--------|-------|-------|-------|---------------" << endl;this->goodsArray[index]->showGoodsInfo();cout << "--------|-------|-------|-------|---------------" << endl;
}//查询商品——按商品类别、名称查询
int* supermarket::inquireGoods_2()
{//判断商品数据否是为空if (!this->goodsTypeNum){cout << "无商品,查询失败" << endl;return NULL;}int i = 0;int arr[ARRSIZE] = { 0 };//存放查询到商品的位置int count = 0;//记录查询的个数int Class;//记录商品类string Name;//商品名称string Manu;//商品生产厂家this->goodsClassMenu();//商品类的菜单cout << "请输入要查询商品的类型序号:";cin >> Class;cout << "请输入要查询商品的名称:";cin >> Name;for (i = 0; i < this->goodsTypeNum; i++){//先判断商品类型是否相同if (this->goodsArray[i]->goodsClass != Class){continue;}//在进行商品名称比较if (!this->goodsArray[i]->name.compare(Name)){arr[count] = i + 1;count++;}}if (0 == count){cout << "查询失败,该商品不存在" << endl;return NULL;}else{cout << "----------查询成功----------" << endl;return arr;}
}//打印查询2的商品信息
void supermarket::printInquireGoods_2(int* p)
{//查询失败的情况if (NULL == p){return;}int count = 0;int i = 0;//记录总数int arr[ARRSIZE] = { 0 };for (i = 0; i < ARRSIZE; i++){//第一次是不需要判断的if (p[i] != 0){arr[i] = p[i];count++;}else{break;}}cout << "查询结果打印" << endl << endl;cout << "序号\t|类型\t|名称\t|价格\t|库存量\t|生产厂家" << endl;cout << "--------|-------|-------|-------|-------|---------------" << endl;for (i = 0; i < count; i++){int j = arr[i] - 1;//记录下标cout << i + 1 << "\t|";this->goodsArray[j]->showGoodsInfo();cout << "--------|-------|-------|-------|-------|---------------" << endl;}
}//修改商品
void supermarket::reviseGoods()
{//判断商品数据否是为空if (!this->goodsTypeNum){cout << "无商品,修改商品失败" << endl;return;}//查询功能1int index = this->inquireGoods_1();if (-1 == index)//是否查找失败{cout << "修改失败" << endl;return;}//打印查询到的结果this->printInquireGoods_1(index);int input = 0;goods* Goods = NULL;//记录原来商品类int Class = this->goodsArray[index]->goodsClass;//记录原来商品名称string Name = this->goodsArray[index]->name;//记录原来商品价格int Price = this->goodsArray[index]->price;//记录原来商品库存量int Inven = this->goodsArray[index]->inventory;//记录原来商品生产厂家string Manu = this->goodsArray[index]->manufacturer;do{cout << endl;cout << "----------修改类型----------" << endl;cout << "--   1、修改商品类        --" << endl;cout << "--   2、修改商品名称      --" << endl;cout << "--   3、修改商品价格      --" << endl;cout << "--   4、修改商品库存量    --" << endl;cout << "--   5、修改商品生产厂家  --" << endl;cout << "--   0、退出修改          --" << endl;cout << "----------------------------" << endl;cout << "请输入要修改的类型:";cin >> input;switch(input){case 1:this->goodsClassMenu();//商品类的菜单cout << "请输入要修改商品类 :";cin >> Class;delete this->goodsArray[index];if (1 == Class)//开辟食物类的空间{Goods = new food(Name, Price, Inven, Manu);}else if (2 == Class)//开辟化妆品类的空间{Goods = new cosmetics(Name, Price, Inven, Manu);}else if (3 == Class)//开辟日用品类的空间{Goods = new necessities(Name, Price, Inven, Manu);}else if (4 == Class)//开辟饮料类的空间{Goods = new drink(Name, Price, Inven, Manu);}//将数据重新放到类中this->goodsArray[index] = Goods;break;case 2:cout << "请输入要修改商品名称 :";cin >> Name;this->goodsArray[index]->name = Name;break;case 3:cout << "请输入要修改商品价格 :";cin >> Price;this->goodsArray[index]->price = Price;break;case 4:cout << "请输入要修改商品库存量 :";cin >> Inven;this->goodsArray[index]->inventory = Inven;break;case 5:cout << "请输入要修改商品生产厂家 :";cin >> Manu;this->goodsArray[index]->manufacturer = Manu;break;case 0:cout << "----------修改成功----------" << endl;this->save();//更新文件数据break;default:cout << "输入序号不存在,请重新输入" << endl;break;}} while (input);
}//下架商品
void supermarket::delGoods()
{//判断商品数据否是为空if (!this->goodsTypeNum){cout << "无商品,下架商品失败" << endl;return;}//查找要删除的数据int index = this->inquireGoods_1();if (-1 == index)//是否查找失败{cout << "删除失败" << endl;return;}//打印查询的数据this->printInquireGoods_1(index);int i = 0;//释放空间delete this->goodsArray[index];//将商品数据前移for (i = index; i < this->goodsTypeNum - 1; i++){this->goodsArray[i] = this->goodsArray[i + 1];}//商品类型的数量更新this->goodsTypeNum--;//更新文件的数据this->save();cout << "----------删除成功----------" << endl;
}//排序1--按价格排序
void supermarket::sortGoods_1()
{//判断商品数据否是为空if (!this->goodsTypeNum){cout << "无商品,排序商品失败" << endl;return;}cout << "*****************************" << endl;cout << "***   1、按价格----升序   ***" << endl;cout << "***   2、按价格----降序   ***" << endl;cout << "*****************************" << endl;cout << "请输入要排序的方式对应的序号:";int input = 0;cin >> input;int i = 0;int j = 0;goods* temp = NULL;bool flag = false;//每趟是否有交换的标志for (i = 0; i < this->goodsTypeNum - 1; i++){flag = false;//为交换时是falsefor (j = this->goodsTypeNum - 1; j > i; j--){if (input == 1)//升序{if (this->goodsArray[j - 1]->price > this->goodsArray[j]->price){temp = this->goodsArray[j];this->goodsArray[j] = this->goodsArray[j - 1];this->goodsArray[j - 1] = temp;flag = true;//交换}}else//降序{if (this->goodsArray[j - 1]->price < this->goodsArray[j]->price){temp = this->goodsArray[j];this->goodsArray[j] = this->goodsArray[j - 1];this->goodsArray[j - 1] = temp;flag = true;//交换}}}if (false == flag)//判断是否有序{this->save();//更新文件数据return;}}this->save();//更新文件数据
}//排序2--按库存量排序
void supermarket::sortGoods_2()
{//判断商品数据否是为空if (!this->goodsTypeNum){cout << "无商品,排序失败" << endl;return;}cout << "*****************************" << endl;cout << "***   1、按价格----升序   ***" << endl;cout << "***   2、按价格----降序   ***" << endl;cout << "*****************************" << endl;cout << "请输入要排序的方式对应的序号:";int input = 0;cin >> input;int i = 0;int j = 0;goods* temp = NULL;bool flag = false;//每趟是否有交换的标志for (i = 0; i < this->goodsTypeNum - 1; i++){flag = false;//为交换时是falsefor (j = this->goodsTypeNum - 1; j > i; j--){if (1 == input)//升序{if (this->goodsArray[j - 1]->inventory > this->goodsArray[j]->inventory){temp = this->goodsArray[j];this->goodsArray[j] = this->goodsArray[j - 1];this->goodsArray[j - 1] = temp;flag = true;//交换}}else//降序{if (this->goodsArray[j - 1]->inventory < this->goodsArray[j]->inventory){temp = this->goodsArray[j];this->goodsArray[j] = this->goodsArray[j - 1];this->goodsArray[j - 1] = temp;flag = true;//交换}}	}if (false == flag)//判断是否有序{this->save();//更新文件数据return;}}this->save();//更新文件数据
}//清空商品
void  supermarket::clearGoods()
{//判断商品数据否是为空if (!this->goodsTypeNum){cout << "无商品,不需要清空" << endl;return;}int input = 0;cout << endl;cout << "-----  确定要清空吗  -----" << endl;cout << "-----  1、确定       -----" << endl;cout << "-----  0、不要       -----" << endl;cout << "--------------------------" << endl;cout << "请输入序号:";cin >> input;cout << endl;if (0 == input){cout << "清空操作取消" << endl;return;}//清空//trunc 如文件存在,将其长度截断为零并清除原有内容//      如果文件存在先删除,再创建ofstream ofs(FILENAME, ios::trunc);//清除文件数据ofs.close();//清空堆区数据int i = 0;//遍历删除每个数据for (i = 0; i < this->goodsTypeNum; i++){delete this->goodsArray[i];this->goodsArray[i] = NULL;}//删除指针delete[] this->goodsArray;this->goodsArray = NULL;this->goodsTypeNum = 0;this->fileEmpty = true;cout << "----------清空成功----------" << endl;
}

4、administrator.h文件

#pragma once
#include <iostream>
#include <string>
#include "supermarket.h"
using namespace std;//管理员
class administrator
{
public://管理员操作菜单void menu_administrator();//管理员登录界面bool login_administrator();//管理员操作超市系统void operate_administrator(supermarket& sup);//管理员添加商品void addGoods_administrator(supermarket& sup);//管理员展示商品void showGoods_administrator(supermarket& sup);//管理员查找商品void inquireGoods_administrator(supermarket& sup);//管理员修改商品void reviseGoods_administrator(supermarket& sup);//管理员删除商品void delGoods_administrator(supermarket& sup);//管理员排序商品void sortGoods_administrator(supermarket& sup);//管理员清空商品void clearGoods_administrator(supermarket& sup);
};

5、administrator.cpp文件

#include "administrator.h"//管理员操作菜单
void administrator::menu_administrator()
{cout << "****************************" << endl;cout << "***----管理员操作菜单----***" << endl;cout << "***    1、增加新商品     ***" << endl;cout << "***    2、展示商品       ***" << endl;cout << "***    3、查找商品       ***" << endl;cout << "***    4、修改商品       ***" << endl;cout << "***    5、下架商品       ***" << endl;cout << "***    6、排序商品       ***" << endl;cout << "***    7、清空商品       ***" << endl;cout << "***    0、退出后台系统   ***" << endl;cout << "****************************" << endl;cout << endl;
}//管理员登陆界面
bool administrator::login_administrator()
{string str;//密码为:helloworldstring password = "helloworld";int i = 0;//3次输入密码机会for (i = 0; i < 3; i++){cout << "请输入登入密码:";cin >> str;if (!password.compare(str)){cout << "密码正确,欢迎进入系统" << endl;return true;}else{cout << "密码错误" << endl;}}cout << "三次都输入错误,强制退出系统" << endl;return false;
}//管理员操作超市系统
void administrator::operate_administrator(supermarket& sup)
{system("cls");//清屏cout << "欢迎管理员进入超市后台" << endl;int input = 0;do{this->menu_administrator();cout << "请输入对应的序号:";cin >> input;switch (input){case 1:this->addGoods_administrator(sup);break;case 2:this->showGoods_administrator(sup);break;case 3:this->inquireGoods_administrator(sup);break;case 4:this->reviseGoods_administrator(sup);break;case 5:this->delGoods_administrator(sup);break;case 6:this->sortGoods_administrator(sup);break;case 7:this->clearGoods_administrator(sup);break;case 0:cout << "退出超市系统后台" << endl;break;default:cout << "输入序号不存在,请重新输入" << endl;break;}} while (input);//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}//添加商品
void administrator::addGoods_administrator(supermarket& sup)
{sup.addGoods();//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}//管理员展示商品
void administrator::showGoods_administrator(supermarket& sup)
{sup.showGoods();//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}//管理员查找商品
void administrator::inquireGoods_administrator(supermarket& sup)
{cout << "-----------------------------------------" << endl;cout << "--  1、按商品类别、名称、生产厂家查询  --" << endl;cout << "--  2、按商品类别、名称查询            --" << endl;cout << "-----------------------------------------" << endl;cout << "请输入要查询的方法序号:";int input;cin >> input;if (1 == input){int i = sup.inquireGoods_1();sup.printInquireGoods_1(i);}else if (2 == input){int* p = sup.inquireGoods_2();sup.printInquireGoods_2(p);}//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}//管理员修改商品
void administrator::reviseGoods_administrator(supermarket& sup)
{sup.reviseGoods();//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}//管理员删除商品
void administrator::delGoods_administrator(supermarket& sup)
{sup.delGoods();//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}//管理员排序商品
void administrator::sortGoods_administrator(supermarket& sup)
{cout << "------------------------" << endl;cout << "--  1、按价格排序     --" << endl;cout << "--  2、按库存量排序   --" << endl;cout << "------------------------" << endl;cout << "请输入要排序方法序号:";int input;cin >> input;if (1 == input){sup.sortGoods_1();sup.showGoods();}else if (2 == input){sup.sortGoods_2();sup.showGoods();}//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}//管理员清空商品
void administrator::clearGoods_administrator(supermarket& sup)
{sup.clearGoods();//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}

6、user.h文件

#pragma once
#include "supermarket.h"
#include <iostream>
using namespace std;//用户
class user
{
public://用户菜单void menu_user();//用户使用超市系统void operate_user(supermarket& sup);//用户销售功能void salesFeatures_user(supermarket& sup);//用户展示商品void showGoods_user(supermarket& sup);//用户查找商品void inquireGoods_user(supermarket& sup);//用户排序商品void sortGoods_user(supermarket& sup);
};

7、user.cpp文件

#include "user.h"//用户菜单
void user::menu_user()
{cout << "**************************" << endl;cout << "***----用户操作菜单----***" << endl;cout << "***    1、购买商品     ***" << endl;cout << "***    2、展示商品     ***" << endl;cout << "***    3、查找商品     ***" << endl;cout << "***    4、排序商品     ***" << endl;cout << "***    0、退出购买     ***" << endl;cout << "**************************" << endl;cout << endl;
}//用户使用超市系统
void user::operate_user(supermarket& sup)
{system("cls");//清屏cout << "欢迎光临本超市商城" << endl;int input = 0;do{this->menu_user();//用户菜单cout << "请输入对应的序号:";cin >> input;switch (input){case 1:this->salesFeatures_user(sup);break;case 2:this->showGoods_user(sup);break;case 3:this->inquireGoods_user(sup);break;case 4:this->sortGoods_user(sup);break;case 0:cout << "退出超市,欢饮下次光临" << endl;break;default:cout << "输入序号不存在,请重新输入" << endl;break;}} while (input);//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}//用户销售功能
void user::salesFeatures_user(supermarket& sup)
{cout << "欢迎您购买商品" << endl;//用户查找商品的方式int* p = sup.inquireGoods_2();if (p == NULL)//查找是否成功{cout << "商品不存在,购买失败" << endl;return;}//将商品数据位置,放到arr中int count = 0;int i = 0;//记录总数int arr[ARRSIZE] = { 0 };for (i = 0; i < ARRSIZE; i++){//第一次是不需要判断的if (p[i] != 0){arr[i] = p[i];count++;}else{break;}}//打印查询结果sup.printInquireGoods_2(p);cout << endl;//判断输入是否合法int input = 0;while (true){cout << "请输入要买商品的序号:";cin >> input;if (input > count || input <= 0){cout << "输入序号无效,请重新输入" << endl;continue;}else{break;//输入合法退出死循环}}cout << endl;int temp = 0;int number = 0;//记录用户购买商品数//记录商品的库存量int inven = sup.goodsArray[arr[input - 1] - 1]->inventory;//输入的购买的商品数,是否合法,库存量while (true){cout << "请输入要购买的商品数:";cin >> number;if (number < 0)//输入buhef{cout << "输入购买的商品数无效,请重新输入" << endl;}else if (number > inven)//输入大于库存量{cout << "抱歉,您购买的商品数超出了本店的库存量" << endl;cout << "--------------------------------" << endl;cout << "-- 1、继续购买 -- 0、结束购买 --" << endl;cout << "--------------------------------" << endl;cout << "请输入您的选择:";cin >> temp;if (0 == temp){cout << "购买结束" << endl;return;//退出购买}else{cout << "购买继续" << endl;continue;}}else{break;//输入合法退出死循环}}int money = 0;//金钱money = sup.goodsArray[arr[input - 1] - 1]->price * number;cout << endl;cout << "----------------------------------------" << endl;cout << "--------------- 电子发票 ---------------" << endl;cout << "---  购买的商品名称:" << sup.goodsArray[arr[input - 1] - 1]->name << endl;cout << "---  购买的商品数量:" << number << "  个" << endl;cout << "---  购买的商品单价:" << sup.goodsArray[arr[input - 1] - 1]->price << "  元" << endl;cout << "---  总价:" << money << "  元" << endl;cout << "----------------------------------------" << endl;cout << endl;cout << "................请支付.................." << endl;cout << endl;//更新库存量sup.goodsArray[arr[input - 1] - 1]->inventory = inven - number;//更新文件的数据sup.save();cout << "购买成功,欢迎您下次购买" << endl;//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}//用户展示商品
void user::showGoods_user(supermarket& sup)
{sup.showGoods();//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}//用户查找商品
void user::inquireGoods_user(supermarket& sup)
{cout << "-----------------------------------------" << endl;cout << "--  1、按商品类别、名称、生产厂家查询  --" << endl;cout << "--  2、按商品类别、名称查询            --" << endl;cout << "-----------------------------------------" << endl;cout << "请输入要查询的方法序号:";int input;cin >> input;if (1 == input){int i = sup.inquireGoods_1();sup.printInquireGoods_1(i);}else if (2 == input){int* p = sup.inquireGoods_2();sup.printInquireGoods_2(p);}//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}//用户排序商品
void user::sortGoods_user(supermarket& sup)
{cout << "------------------------" << endl;cout << "--  1、按价格排序     --" << endl;cout << "--  2、按库存量排序   --" << endl;cout << "------------------------" << endl;cout << "请输入要排序方法序号:";int input;cin >> input;if (1 == input){sup.sortGoods_1();sup.showGoods();}else if (2 == input){sup.sortGoods_2();sup.showGoods();}//按任意键后,清屏回到上级目录cout << endl;system("pause");system("cls");
}

8、管理员密码:helloworld


总结(运行截图)

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

在这里插入图片描述
在这里插入图片描述
其他的远行截图省略,自行运行

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

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

相关文章

数据结构之单调栈、单调队列

今天学习了单调栈还有单调队列的概念和使用&#xff0c;接下来我将对其定义并配合几道习题进行讲解&#xff1a; 首先先来复习一下栈与队列&#xff1a; 然后我们来看一下单调栈的定义&#xff1a; 单调栈中的元素从栈底到栈顶的元素的大小是按照单调递增或者单调递减的关系进…

Programming Abstractions in C阅读笔记:p242-p245

《Programming Abstractions in C》学习第67天&#xff0c;p242-p245总结&#xff0c;总计4页。 一、技术总结 6.2小结主要讲回溯算法及递归算法在迷宫求解中应用&#xff0c;当然&#xff0c;理解然后用代码实现出来还是有些难度的。不过&#xff0c;这并不影响我们进行下一…

关于目标检测任务中,XML(voc格式)标注文件的可视化

1. 前言 最近在弄关于目标检测的任务&#xff0c;因为检测的图片和标签是分开的&#xff0c;可视化效果不明显&#xff0c;也不知道随便下载的数据集&#xff0c;标注信息对不对。网上看了好多代码&#xff0c;代码风格和本人平时不同&#xff0c;看起来麻烦&#xff0c;也不知…

flutter 通过打包参数区分来 打内网 外网包

内网 # 打包内网环境flutter build apk --dart-defineis_intranettrue --dart-defineis_managerAppfalse 外网 # 打包内网环境flutter build apk --dart-defineis_intranettrue --dart-defineis_managerAppfalse env.dart // main.dart class EnvironmentConfig {// 是否…

RHCE9学习指南 第19章 网络时间服务器

19.1 时间同步的必要性 对于一些服务来说对时间要求非常严格&#xff0c;例如&#xff0c;图19-1所示由三台服务器搭建的ceph集群。 图19-1 三台机器搭建的集群对时间要求比较高 这三台服务器的时间必须要保持一样&#xff0c;如果不一样&#xff0c;就会显示报警信息。那么…

Vue基础-搭建Vue运行环境

这篇文章介绍了在Vue.js项目中进行开发环境搭建的关键步骤。包括node.js安装和配置、安装Vue及Vue CLI工具、安装webpack模板、安装vue-router、创建Vue项目等步骤。这篇文章为读者提供了清晰的指南&#xff0c;帮助他们快速搭建Vue.js开发环境&#xff0c;为后续的项目开发奠定…

已设定选项 ‘readonly‘ (请加 ! 强制执行)

这是vim编辑器报的错误&#xff0c;相信很多人都遇到过。在使用vi编辑一个需要sudo权限的文件后&#xff0c;保存的时候出现这样的错误。这个时候很多人做的事情可能就是不保存退出&#xff08;敲命令:q!&#xff09;&#xff0c;然后再以sudo vi打开文件重新编辑一次。如果恰巧…

Django的数据库模型的CharField字段的max_length参数与中文字符数的关系探索(参数max_length的单位是字符个数还是字节数?)

01-清理干净之前的数据库迁移信息 02-根据setting.py中的信息删除掉之前建立的数据库 03-删除之后重新创建数据库 04-models.py中创建数据库模型 from django.db import modelsclass User(models.Model):username models.CharField(max_length4)email models.EmailField(uni…

【makedown自带语法技巧】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

YOLOv8优化策略:轻量化改进 | 华为Ghostnet,超越谷歌MobileNet | CVPR2020

🚀🚀🚀本文改进:Ghost bottleneck为堆叠Ghost模块 ,与YOLOV8建立轻量C2f_GhostBottleneck 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.Ghostnet介绍 论文: https://arxiv.org/pdf/1911.11907.…

python数据结构堆栈

堆 堆是一种树形结构&#xff1a;满足两个主要性质 堆是一种完全二叉树&#xff1a;堆中所有层级除了最后一层都是完全填满的&#xff0c;且最后一层的节点都是向左排列堆中的任意节点都不大于&#xff08;或不小于&#xff09;其子节点的值&#xff0c;这也是堆的属性 impo…

【C++】C++11中的常见语法(上)

C11 一、C11简介二、统一的列表初始化1.&#xff5b;&#xff5d;初始化2. std::initializer_list 三、声明1. auto2. decltype3. nullptr 四、右值引用和移动语义1. 左值引用和右值引用2. 左值引用与右值引用比较3. 右值引用使用场景和意义4. 右值引用引用左值及其一些更深入的…

yolov5_master的下载、环境搭建、数据处理及训练全过程

本文借用了以下微博的文章&#xff0c;觉得写的比较全&#xff0c;所以照抄了过来&#xff0c;并且搭建了一遍可以正常训练&#xff0c;在这里作为笔记以后用的时候方便找&#xff0c;这个yolov5_master的使用可以将pth模型文件转换为onnx文件&#xff0c;进而转换为rknn文件&a…

揭秘 Gossip 协议:节点之间的悄悄话

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 揭秘 Gossip 协议&#xff1a;节点之间的悄悄话 前言Gossip协议简介Gossip 协议的工作原理Gossip 协议的优势Gossip协议的实际应用 前言 在分布式系统中&#xff0c;节点之间的信息传递如同社交中的悄…

供应链+低代码,实现数字化【共赢链】转型新策略

在深入探讨之前&#xff0c;让我们首先明确供应链的基本定义。供应链可以被理解为一个由采购、生产、物流配送等环节组成的网状系统&#xff0c;它始于原材料的采购&#xff0c;经过生产加工&#xff0c;最终通过分销和零售环节到达消费者手中。 而数字化供应链&#xff0c;则是…

235个国家-数字经济发展相关23个指标(2000-2022年)

本文涉及235个国家的数字经济发展的23个相关指标数据&#xff0c;为我们提供了一个全面的视角&#xff0c;用以分析和比较全球范围内数字经济的发展状况。这些国家&#xff0c;年份&#xff0c;移动网络覆盖率&#xff0c;固定电话普及率&#xff0c;固定宽带普及率等指标。这些…

学习记录-自动驾驶与机器人中的SLAM技术

以下所有内容均为高翔大神所注的《自动驾驶与机器人中的SLAM技术》中的内容 融合导航 1. EKF和优化的关系 2. 组合导航eskf中的预测部分&#xff0c;主要是F矩阵的构建 template <typename S> bool ESKF<S>::Predict(const IMU& imu) {assert(imu.timestamp…

典型的无人机打击技术

无人机打击技术主要指的是用于中和、摧毁或干扰无人机&#xff08;UAV&#xff09;的各种技术手段。 这些技术随着无人机的广泛使用而迅速发展&#xff0c;特别是在军事和安全领域。下面是一些主要的无人机打击技术及其原理&#xff1a; 射频干扰&#xff08;RF Jamming&#x…

国产服务器 BIOS下组建RADI不同RAID卡-超详细

国产服务器 长城 组建Raid的方法 说明 大多数国产服务器通用型服务器进入BIOS的都是按DEL键。 9361RAID卡组建方法 在服务器启动过程中&#xff0c;按下DEL键进入BIOS界面。 进入设备管理器&#xff0c;选择AVAGO MegaRAID页签。 3. 进入RAID卡设备&#xff0c;选择Main Me…

大话 JavaScript(Speaking JavaScript):第十六章到第二十章

第十六章&#xff1a;变量&#xff1a;作用域、环境和闭包 原文&#xff1a;16. Variables: Scopes, Environments, and Closures 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 本章首先解释了如何使用变量&#xff0c;然后详细介绍了它们的工作方式&#xff08;环境…