<stdio.h>
#include
<fstream>
#include
<iostream>
#include
<string>
#include
<vector>
#include
<assert.h>
using
namespace
std
//
Item
info
base
class
class
ItemInfo{
public:
ItemInfo(){}
ItemInfo(string
barcode,
string
name,
float
price)
{
this->barcode
=
barcode
this->name
=
name
this->price
=
price
}
ItemInfo(string
barcode)
{
this->barcode
=
barcode
}
void
Display()
{
cout
<<
barcode
<<"\t"<<name<<"\t"<<price<<
endl
}
void
Input()
{
cout
<<
"输入条形码:"
<<
endl
cin
>>
barcode
cout
<<
"输入名称:"
<<
endl
cin
>>
name
cout
<<
"输入价格:"
<<
endl
cin
>>
price
}
void
Modify()
{
cout
<<
"输入名称:"
<<
endl
cin
>>
name
cout
<<
"输入价格:"
<<
endl
cin
>>
price
}
friend
ostream&
operator<<(ostream&
stream,
ItemInfo&
item){
stream
<<
item.barcode
<<'\t'<<
item.price
<<'\t'<<
item.name<<endl
return
stream
}
friend
istream&
operator>>(istream&
stream,
ItemInfo&
item){
stream
>>
item.barcode
>>
item.price
>>
item.name
return
stream
}
public:
string
barcode
string
name
float
price
}
//
Interface
class
class
DataProvider{
public:
virtual
void
GetFullData(string
barcode,
string&
name,
float&
price)
=
0
}
//
Purchase
item
class
class
ItemPurchaseInfo
:
public
ItemInfo{
public:
ItemPurchaseInfo():ItemInfo(){}
ItemPurchaseInfo(string
barcode,
int
count=1)
:
ItemInfo(barcode)
{
this->count
=
count
}
//
Rember
to
call
this
when
barcode
set
void
GetFullData(DataProvider&
aPro)
{
aPro.GetFullData(barcode,
name,
price)
}
void
Input()
{
cout
<<
"输入条形码:"
<<
endl
cin
>>
barcode
cout
<<
"输入数量:"
<<
endl
cin
>>
count
}
void
Display()
{
cout
<<
barcode
<<"\t"<<name<<"\t"<<price<<"\t"<<count<<
endl
}
public:
string
barcode
int
count
}
//
Item
list
class
class
ItemList
{
public:
ItemList(){items.clear()}
friend
ostream&
operator<<(ostream&
stream,
ItemList&
list){
unsigned
int
count
=
list.items.size()
stream
<<count<<endl
for(unsigned
int
i(0)i<counti++)
stream<<
list.items.at(i)
return
stream
}
friend
istream&
operator>>(istream&
stream,
ItemList&
list){
unsigned
int
count(0)
stream
>>count
list.items.clear()
for(unsigned
int
i(0)i<counti++){
ItemInfo
item
stream
>>
item
list.items.insert(list.items.end(),
item)
}
return
stream
}
void
Add(ItemInfo
item)
{
items.insert(items.end(),
item)
}
void
Modify()
{
string
barcode
cout
<<
"输入条形码:"
<<
endl
cin
>>
barcode
for(unsigned
int
i(0)i<items.size()i++)
{
if(items.at(i).barcode
==
barcode
)
{
items.at(i).Modify()
}
}
}
public:
vector<ItemInfo>
items
}
//
Purchase
item
list
class
class
PurchaseItemList
{
public:
PurchaseItemList(){items.clear()}
void
Add(ItemPurchaseInfo
item)
{items.insert(items.end(),
item)}
public:
vector<ItemPurchaseInfo>
items
}
//
Implements
the
interface
class
class
Cashier
:
public
DataProvider
{
public:
Cashier()
:
purchase(),
stock(){}
~Cashier(){}
public:
//
User
funcs
void
CheckIn(){
purchase.items.clear()
int
opt(0)
do
{
unsigned
int
i(0)
ItemPurchaseInfo
ipi
ipi.Input()
purchase.Add(ipi)
cout
<<
"按0退出,任意键继续"
<<
endl
cin
>>
opt
}
while(opt)
}
void
CheckOut(){
for(unsigned
int
i(0)
i
<
purchase.items.size()
i++)
{
purchase.items.at(i).GetFullData(
*this
)
}
float
checkin(0)
cout
<<
"输入收款数:"
<<
endl
cin
>>
checkin
DisplayList(checkin)
}
void
Display()
{
cout
<<
endl<<"商品清单
"<<
stock.items.size()
<<
endl
cout
<<"--------------------------------------"
<<
endl
for(unsigned
int
i(0)i<
stock.items.size()
i++){
stock.items.at(i).Display()
}
cout
<<"--------------------------------------"
<<
endl
}
void
DisplayList(float
checkin)
{
cout
<<
endl<<"购物小票清单"
<<
endl
cout
<<"--------------------------------------"
<<
endl
float
total(0.0)
for(unsigned
int
i(0)
i
<
purchase.items.size()
i++)
{
purchase.items.at(i).Display()
total
+=
purchase.items.at(i).price
*
purchase.items.at(i).count
}
cout
<<"--------------------------------------"
<<
endl
cout
<<"货款合计:"<<
total
<<
"元"
<<
endl
cout
<<"收款数:"<<
checkin
<<
"元"
<<
endl
float
change(checkin-total)
assert(
change
>=
0.0)
cout
<<"找零:"<<
change
<<
"元"
<<
endl<<
endl
}
friend
ostream&
operator<<(ostream&
stream,
Cashier&
c){
stream
<<
c.stock
return
stream
}
friend
istream&
operator>>(istream&
stream,
Cashier&
c){
c.stock.items.clear()
stream
>>
c.stock
return
stream
}
public:
//
interface
func
void
GetFullData(string
barcode,
string&
name,
float&price)
{
//
go
through
stock
and
find
the
item
by
barcode
matching
for(unsigned
int
i(0)
i
<
stock.items.size()
i++)
{
if(stock.items.at(i).barcode
==
barcode)
{
name
=
stock.items.at(i).name
price
=
stock.items.at(i).price
}
}
}
public:
PurchaseItemList
purchase
ItemList
stock
}
int
main()
{
int
opt(0)
Cashier
cashier
ifstream
fin("data.bin",
ios::in
|
ios::binary)
fin.seekg(0,
ios::beg)
//cashier.stock.Load(fin)
fin
>>
cashier
fin.close()
ofstream
fout
ItemInfo
item
do{
cout
<<
"1.
新购买"
<<
endl
cout
<<
"2.
输入新商品信息"
<<
endl
cout
<<
"3.
修改商品信息"
<<
endl
cout
<<
"4.
显示商品信息"
<<
endl
cout
<<
"0.
退出"
<<
endl
cin
>>
opt
switch(opt)
{
case
1:
cashier.CheckIn()
cashier.CheckOut()
break
case
2:
item.Input()
cashier.stock.Add(item)
fout.open("data.bin",
ios::out|
ios::binary)
fout.seekp(0,ios::beg)
fout
<<
cashier
fout.close()
break
case
3:
cashier.stock.Modify()
fout.open("data.bin",
ios::out|
ios::app
|
ios::binary)
fout
<<
cashier
fout.close()
break
case
4:
cashier.Display()
break
default:
break
}
}
while(opt)
return
0
}
因为C++兼容C语言的,所以在VisualStudio2010新建一个C++项目就可以实现编写一个C语言程序方法如下:1、电脑上安装微软公司的VS2010,可以从dreamspark上下载正版或通过其他途径获得,安装即可。2、打开VS20103、可以通过点击文件--新建--项目建立工程或者点击欢迎页的“新建项目”建立工程。4、弹出对话框,勾选“空项目”建立工程,工程名可任意填英文字符,如project1,其他不用填。5、建立工程后,在右侧有一个“解决方案资源管理器”,找到源文件,右击,再左击添加--新建项--C++文件,这样就在工程project1下建立了一个源文件,名称比如为源.cpp,就可以编辑代码了。如果你已经用其他字符编辑软件写好了C++源程序,也可以右击源文件,左击--现有项,在文件夹中找到你的源程序添加到工程下。6、编辑好了源文件,就可以运行或调试了,初学者是写简单的程序,所以只用一个源文件就行了。点击调试--开始运行(不调试)就直接编译运行,有错误的话系统会提示。7、如果要调试,可以点击调试--逐语句(F10)或逐过程(F11)8、调试前点击调试--窗口(也就是watch)可以选择不同的显示结果,可以显示出变量的变化过程,方便调试。点击“继续”结束调试。