C++实践项目:简易收银台程序

C++实践项目:简易收银台程序

  1. 项目开发背景
  2. 收银台简介
  3. 主要功能
  4. 数据库设计和封装
  5. 界面功能实现
  6. 可扩展

1.项目开发背景

在学校参与勤工助学岗位期间接触过收银员工作,由于当时学习了C语言和数据结构觉得可以简单的实现一个收银台程序。其次由于传统收银台缺陷

  • 收款结算速度慢,容易出现营业差错,
  • 不宜进行商品调价,盘点效率底
  • 用户体验不好
  • 收银台的优点:快捷方便,节省大量人力成本,不容易出错,能够快速反馈出商品的详细信息。
    因此:开发这个系统可以方便快捷地查出顾客结帐情况,商品信息情况,每天的售货情况,方便了对超市商 品管理、人员管理,大大提高了超市的售货速度。进而加速了社会的发展速度,提高了人民的生活水平。

2.收银台简介

收银台作为商场超市所必不可少的配套设施,越来越多的被客户所关注。收银台俗称付款处,是顾客付款交 易的地方,也是顾客在商店最后停留的地方。
收银台除了收银这一主要用途外,将在吸引顾客视线的同时发挥出特殊功效。事实上,收银作业不只是单纯 地为顾客提供结账服务而已,收银员收款工作完成后也并不代表卖场的销售行为就此结束,这其中还包括了 对顾客的礼仪态度。

3.主要功能

在这里插入图片描述

  1. 登录模块

在这里插入图片描述

  1. 后台管理员和前台售货员需要根据自己的用户名以及密码进行登录。
    用户输入名户名以及密码后,根据不同身份,显示不同界面,用户进行其相应操作。

  2. 管理员界面: 后台管理员 员工操作 查询员工基本信息 添加新员工 员工离职后,删除员工信息
    员工信息变更时,更新员工信息,比如:更新员工薪资 商品操作 按照条件查询商品的信息 商品入库 过期商品的删除 商品信息更新,比如:价格发生变动 按照日期查询商品销售情况

在这里插入图片描述
4. 售货员界面:
在这里插入图片描述
6. 售货员模块 售货 录入商品信息 出售:会员出售和普通用户出售 如果客户不满意,退货

4.数据库设计

设计

1.所有表格
在这里插入图片描述
2.员工表

在这里插入图片描述

3.商品表
在这里插入图片描述

4.销售记录
### 5.界面功

封装MySQL

1.配置Windows下mysql数据库环境
2.MySQL.h

#pragma once
#include<iostream>
#include<Winsock2.h>
#include<mysql.h>
#include<string>
#include<vector>
using namespace std;

class MySQL
{
public:
	MySQL();
	bool ConnectMySQL(const char* host, const char* user, const char* passward, const char* dbName);
	~MySQL();
	
	bool Insert(const string& strSQL);
	bool UpDate(const string& strSQL);
	bool Delete(const string& strSQL);
	vector<vector<string>> Select(const string& strSQL);
private:
	MYSQL * _mySQL;

};

3.mysql.cpp

#include"MySQL.h"
#include<iostream>
#include<mysql.h>
using namespace std;
MySQL::MySQL()
{
	_mySQL = mysql_init(nullptr);
}

bool MySQL::ConnectMySQL(const char* host, const char* user, const char* passward, const char* dbName)
{
	if (!mysql_real_connect(_mySQL, host, user, passward, dbName, 3306, nullptr, 0))
	{

		cout << "数据库连接失败" << endl;
		return false;
	}
	mysql_query(_mySQL,"set names 'gbk'");
	return true;
}

vector<vector<string>> MySQL::Select(const string& strSQL)
{
	vector<vector<string>> vvRet;
	if (mysql_query(_mySQL, strSQL.c_str()))
	{
		//SQL命令响应失败
		cout << mysql_error (_mySQL)<< endl;
		return vvRet;
	}

	//获取查询的记录集
	MYSQL_RES* mySQLRes = mysql_store_result(_mySQL);
	if (nullptr == mySQLRes)
	{
		cout << mysql_error(_mySQL) << endl;
		return vvRet;
	}
	//获取记录中有多少个字段
	int itemCount = mysql_num_fields(mySQLRes);
	MYSQL_ROW mysqlROW;

	while (mysqlROW = mysql_fetch_row(mySQLRes))
	{
		//已获取到一条记录
		vector<string> vItem;
		for (size_t i = 0; i < itemCount; i++)
		{
			vItem.push_back(mysqlROW[i]);
		}
		vvRet.push_back(vItem);
	}
	mysql_free_result(mySQLRes);

	return vvRet;
}

bool MySQL::Insert(const string& strSQL)
{
	if (mysql_query(_mySQL, strSQL.c_str()))
	{
		//SQL命令响应失败
		cout << mysql_error(_mySQL) << endl;
		return false;
	}
	return true;
}

bool MySQL::UpDate(const string& strSQL)
{
	if (mysql_query(_mySQL, strSQL.c_str()))
	{
		//SQL命令响应失败
		cout << mysql_error(_mySQL) << endl;
		return false;
	}
	return true;
}


MySQL::~MySQL()
{

}

界面功能实现

管理员界面部分功能实现

在这里插入图片描述
该界面点击获取

void MainWnd::Notify(TNotifyUI& msg)
{
	CDuiString strNAME = msg.pSender->GetName();
	if (msg.sType == _T("click"))
	{
		if (strNAME == _T("BTN_CLOSE"))
			Close();
		else if (strNAME == _T("BTN_MIN"))
			::SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
		else if (strNAME == _T("BTN_SELECT"))
			//MessageBox(NULL, _T("SSS"), _T("Cashier"), IDOK);
			SelectEmployeeInfo();
		else if (strNAME == _T("BTN_INSERT"))
			//MessageBox(NULL, _T("III"), _T("Cashier"), IDOK);
			InsertEmployeeInfo();
		else if (strNAME == _T("BTN_UPDATE"))
			MessageBox(NULL, _T("UUU"), _T("Cashier"), IDOK);
		else if (strNAME == _T("BTN_DELETE"))
			//MessageBox(NULL, _T("DDD"), _T("Cashier"), IDOK);
			DeleteEmployeeInfo();
		else if (strNAME == _T("BTN_SELL_RECORD"))
			MessageBox(NULL, _T("SR"), _T("Cashier"), IDOK);


	}
	else if (msg.sType == _T("selectchanged"))
	{
		CTabLayoutUI* pTab = (CTabLayoutUI*)m_PaintManager.FindControl(_T("tablayout"));
		if (strNAME == _T("OPTION_EMPLOYEE"))
			pTab->SelectItem(0);
		else
			pTab->SelectItem(1);
	}
	
	else if (msg.sType == _T("windowinit")) {
		//窗口在创建期间,将一些空间初始化
		
		CComboBoxUI* pGender = (CComboBoxUI*)m_PaintManager.FindControl(_T("usergender"));
		pGender->SelectItem(0);

		CComboBoxUI* pPosition = (CComboBoxUI*)m_PaintManager.FindControl(_T("position"));
		pGender->SelectItem(0);

		CComboBoxUI* pSelect = (CComboBoxUI*)m_PaintManager.FindControl(_T("COMOB_SELECT"));
		pGender->SelectItem(0);
	
	}
	
}

1.插入员工信息

void MainWnd::InsertEmployeeInfo()
{
	//从界面中获取员工信息
	CDuiString strName = ((CEditUI*)m_PaintManager.FindControl(_T("username")))->GetText();
	CDuiString strgender = ((CComboBoxUI*)m_PaintManager.FindControl(_T("usergender")))->GetText();
	CDuiString strBirthday = ((CEditUI*)m_PaintManager.FindControl(_T("userbirthday")))->GetText();
	CDuiString strPos = ((CComboBoxUI*)m_PaintManager.FindControl(_T("position")))->GetText();
	CDuiString strTel = ((CEditUI*)m_PaintManager.FindControl(_T("telphone")))->GetText();
	CDuiString strSalary = ((CEditUI*)m_PaintManager.FindControl(_T("salary")))->GetText();


	CListUI* pListUI = (CListUI*)m_PaintManager.FindControl(_T("ListDemo1"));
	char szCount[32] = { 0 };
	_itoa(pListUI->GetCount()+1,szCount,10);
	//构造SQL命令g
	string strSQL("insert into employee values(");
	strSQL +=szCount;
	strSQL += ",'";
	strSQL += UnicodeToANSI(strName);
	strSQL += "','";
	strSQL += UnicodeToANSI(strgender);
	strSQL += "','";
	strSQL += UnicodeToANSI(strBirthday);
	strSQL += "','0000','";
	strSQL += UnicodeToANSI(strPos);
	strSQL += "','";
	strSQL += UnicodeToANSI(strTel);
	strSQL += "','";
	strSQL += UnicodeToANSI(strSalary);
	strSQL += "');";

	//响应SQL命令
	p_mysql->Insert(strSQL);
	//将该员工插入到List
	CListTextElementUI* pItem = new CListTextElementUI;
	
	pListUI->Add(pItem);
	pItem->SetText(0, strName);
	pItem->SetText(1, strgender);
	pItem->SetText(2, strBirthday);
	pItem->SetText(3, strPos);
	pItem->SetText(4, strTel);
	pItem->SetText(5, strSalary);
}


2.查询员工信息

void MainWnd::SelectEmployeeInfo()
{
	string strSQL("select* from employee");

	CComboBoxUI* pCombo=(CComboBoxUI*)m_PaintManager.FindControl(_T("ListDemo1"));
	CDuiString strStyle = pCombo->GetText();
	if (strStyle == _T("无"))
			strSQL += ";";
	else if (strStyle==_T("名字"))
	{
		strSQL += "where Name = '";
		CDuiString strName = ((CEditUI*)m_PaintManager.FindControl(_T("")))->GetText();
		if (strName.IsEmpty())
		{
			MessageBox(m_hWnd, _T("请输入查询用户的名字"), _T("Cashier"), IDOK);
			return;
		}
		strSQL += UnicodeToANSI(strName);
		strSQL += "';";
	}
	else if(strStyle == _T("性别"))
		;
	else if (strStyle == _T("Salary"))
		;
	vector<vector<string>> vRet = p_mysql->Select(strSQL);
	if (vRet.empty())
		return;
	CListUI* pListUI= (CListUI*)m_PaintManager.FindControl(_T("ListDemo1"));
	pListUI->RemoveAll();
	for (size_t i=0;i<vRet.size();++i)
	{
		vector<string>& strItem = vRet[i];
		CListTextElementUI* pData = new CListTextElementUI;
		pData->SetAttribute(_T("align"), _T("center"));

		pListUI->Add(pData);
		//
		pData->SetText(0, ANSIToUnicode(strItem[1]));
		pData->SetText(1, ANSIToUnicode(strItem[2]));
		pData->SetText(2, ANSIToUnicode(strItem[3]));
		pData->SetText(3, ANSIToUnicode(strItem[5]));
		pData->SetText(4, ANSIToUnicode(strItem[6]));
		pData->SetText(5, ANSIToUnicode(strItem[7]));
	}
}

3.删除员工信息

void MainWnd::DeleteEmployeeInfo()
{
	//获取当前选中信息
	CListUI* pListUI = (CListUI*)m_PaintManager.FindControl(_T("ListDemo1"));
	pListUI->RemoveAll();
	int lineNo = pListUI->GetCurSel();
	CListTextElementUI* pRow = (CListTextElementUI*)pListUI->GetItemAt(lineNo);
	//从数据库中将该员工的信息删除
	//构造SQL命令
	string strSQL("delete");

    //CDuiString strName = pRow->GetText(0);

	//从数据库中将该条记录删除
	//p_mysql->Delete(strSQL);

	//从list里删除
	pListUI->RemoveAt(lineNo);

}
售货员界面部分功能实现

1.查询商品剩余

void CashierWnd::SelectGoods()
{
	//1.获取商品名称EDIT_GOODS_NAME	
	CDuiString strGoodsName= ((CEditUI*)m_PaintManager.FindControl(_T("EDIT_GOODS_NAME")))->GetText();

	//2.构造SQL语句,到数据库中查找此商品
	string strSQL("select * from goods where GoodsName='");
	strSQL += UnicodeToANSI(strGoodsName);
	strSQL += "';";
	vector<vector<string>>vRet = m_pMySQL->Select(strSQL);
	if(vRet.empty())
	{
		MessageBox(m_hWnd, _T("暂无此商品!"), _T("Cashier"), IDOK);
		return;
	}
	//3.将商品剩余个数显示到界面编辑框中
	((CEditUI*)m_PaintManager.FindControl(_T("EDIT_GOODS_LEFT")))->SetText(ANSIToUnicode(vRet[0][7]));
	
}

项目中遇到的问题

1.首先环境搭建,如果连接文件有误,或者编译文件出现错误没有生成目标文件
可以已通过报错返回的错误类型如果外部库或者数据库头文件等就是存在环境搭建问题
2.类型转化问题?
很多时候需要将Unicode格式的编码转化为二进制或者将二进制转化为Uicode我们在网上查阅了相关资料编写了相关函数
3.SQL语句编写出错

项目总结

首先给我的收获就是学会了Duillib这套库的使用,可以制作简单的界面,让我学到了很多界面设计的知识其次我们学会了将自己的在一个项目中,自己会的语言并不是简单的进行组合,更要有大局观,要用语言将所有模块统一组织,更加注重模块之间的关系,而不思简单的对于语言的利用整个项目到这里就差不多了,整个项目从开始到结束历时一个周左右,部分功能可能还有待扩展,但是节本框架完善,可以进行基本操作,在这次项目中让我们学到的知识更加能够利用起来,更加明了,纸上得来终觉浅绝知此事要躬行,在今天我们应届大学生将会是今后社会上的中流砥柱,更加是社会未来的主人,不能只学课本上的知识,更加要将书本与实际相结合,做一个理论素质强,同时兼具动手能力的新时代大学生,才能更好面对将来的挑战。

项目源代码参考:https://github.com/AYUEJR/Cashier

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《C 程序设计:原理与实践(基础篇)pdf》是一本介绍C程序设计原理与实践的电子书,篇幅为300字。 本书着重介绍了C程序设计的基础知识和实践技巧。首先,书中详细介绍了C语言的基本概念、语法规则和编程思想,包括数据类型、运算符、控制语句、函数等。读者通过学习这些内容,可以了解C语言的基本框架和编程范式,为后续的程序设计打下坚实基础。 同时,本书还通过丰富的实例和案例,帮助读者理解C程序设计的实践技巧。例如,介绍了程序的模块化设计思想,如何设计函数和文件结构,以及常见的程序调试和错误处理方法。这些内容对于初学者来说非常有帮助,可以提高编写程序的效率和质量。 此外,本书还详细介绍了C语言的高级特性和应用,如指针、动态内存管理、文件操作等。这些内容对于进一步提高编程能力和解决实际问题非常重要。 综上所述,《C 程序设计:原理与实践(基础篇)pdf》是一本系统、全面介绍C程序设计原理和实践的电子书。通过学习本书,读者可以全面掌握C语言的基本知识和实践技巧,为进一步学习和应用C语言打下坚实基础。 ### 回答2: 《C程序设计:原理与实践(基础篇)pdf》是一本关于C程序设计的教材,旨在帮助读者掌握C语言的基础知识和编程实践技巧。该教材以C语言为基础,通过详细的例子和实践项目,引导读者逐步理解和运用C语言编程。 本教材主要包括以下几个方面的内容: 1. 基本概念与语法:介绍C语言的基本数据类型、运算符、控制流语句等基础知识,并通过多个实例帮助读者熟悉C语言的语法和逻辑。同时,还介绍了一些常用的C库函数,如输入输出函数等。 2. 函数与模块化编程:重点介绍了函数的定义、调用和参数传递等概念,通过实例演示了如何使用函数来解决实际问题。同时,还介绍了如何将程序模块化,以便提高代码的可读性和可维护性。 3. 数组与指针:详细讲解了C语言中的数组和指针的概念及其应用。通过实例和练习,引导读者熟练掌握数组和指针的使用方法,并了解它们在C语言中的重要性。 4. 结构体与文件操作:介绍了结构体的定义和使用,以及如何通过文件操作来实现数据的读写。这一部分内容帮助读者了解如何处理结构化数据,并掌握文件操作的基本方法。 通过学习《C程序设计:原理与实践(基础篇)pdf》,读者可以获得系统而全面的C语言编程知识,培养编程思维和解决问题的能力。无论是初学者还是有一定编程基础的读者,都能从中受益,并逐步提升自己的编程能力。该教材的特点是理论与实践并重,通过大量的实例和练习,帮助读者将理论知识运用到实际编程中,从而更好地理解和掌握C语言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值