图书理系统软件分析报告
XX学面象程序设计语言课程设计报告
目录
系统设计者开发者: 1
软件信息: 1
试验形式分工情况: 1
需求分析: 1
程序功: 2
模块功设计分析: 2
程序流程图: 5
类函数设计思想: 6
类关系图: 6
文件(表)说明: 6
类中函数说明: 7
分析讨模块: 10
系统测试: 17
说明: 23
源程序: 23
系统设计者开发者:
XX学号:XX班级:XX班
软件信息:
系统名称:图书理系统
包括文件:图书理系统压缩文件中文件
完成时间:2015年X月X日
试验形式分工情况:
完成类程序编写
需求分析:
书类进步阶梯着精神文化生活丰富书籍销售越越广泛书籍销售理智化信息化显尤重特信息技术发达天完善图书理系统必少提高效率减少工作量错误外利面象语言C++通封装完成
程序功:
根需图书理系统应该具功:
1 收银模块
2 书库理模块
3 报表模块
4 信息输出输入
模块功设计分析:
收银模块:
收银模块实现文件SalehSalecpp Cashierh Cashiercpp功:辅助图书销售工作户输入购买图书数量编号计算出销售额销售税外书库中动扣已销售图书连续
收银模块:
辅助图书销售工作
书库理模块:
书库文件默认情况文件名Defaultdata然户定义文件名文件包含该书店中图书书包含数项:
数项
含义
ISBN
书标准代码种书ISBN号唯
书名
书名称例毛泽东思想书名
作者
书作者
出版单位
出版社
进书日期
书店购进该书日期
库存量
该书前库存量书店次性购入某种书300已销售200前库存100
批发价
某种书批发价
零售价
某种书零售价例毛泽东思想批发价30元零售价40元
书库理模块允许户查书信息进书删某书修改某种书种信息
创建BookData类存储书信息该结构体成员:
成员项
含义
isbn
具14元素字符数组ISBN号13字符组成
bookTitle
具51元素字符数组书名50字符组成
author
具31元素字符数组作者名30字符组成
publisher
具31元素字符数组出版社名称30字符组成
dateAdded
具11元素字符数组存放进书日期存储日期格式YYYYMMDD
qtyInHand
Int 型整数存放该书库存量
wholesale
double型实数存放该书批发价
retail
double型实数存放该书零售价
报表模块:
报表模块分析书库中种信息产生结果报表:
报表
含义
书库列表
列出书库中图书信息
批发价列表
列出图书批发价批发价总
零售价列表
列出图书零售价零售价总
书数量列表
书库存量进行列表便理者进行分析
书价值额列表
书批发价总额进行列表便理者进行分析
进书日期列表
根进书日期进行列表
进入程序
确定数存放文件
总菜单:
1 收银模块
2 书库理模块
3 报表模块
4 退出系统
图书信息理
进行图书销售
类函数设计思想:
数函数写类中保证程序精简类设计思想充分运c++特点继承动态联编简化程序提高程序性c++类封装性功函数外透明程序定义TitleInfoBookDataSaleReportManagement五类中:
TitleInfo类保存图书基信息包含书名出版社ISBN作者等针数成员函数
BookData核心类继承TitleInfo类包含BookData数成员输入输出函数成员操作方法
SaleBookData子类完成销售功
Report类函数组成没定义数成员起限定函数范围作
Management类Report作类似
类关系图:
Sale类
BookData类
Management类
Report类
TitleInfo类
文件(表)说明:
程序包含文件(表)书库信息表(默认Defaultdata)……面表格形式列出信息
数量
ISBN号
书名
单价
金额
类中函数说明:
TitleInfo类:
设置书基信息函数:
void setTitleInformation()
设置书名函数:
void setTitle()
void setTitle(const titleType&)
设置ISBN号函数:
void setISBN()
void setISBN(const isbnType&)
设置作者名函数:
void setAuthor()
void setAuthor(const authorType&)
设置出版社函数:
void setPublisher()
void setPublisher(const publisherType&)
判断macthedTitle否title部分:
bool bookMatch(titleType&)
bool bookMatch(isbnType&)
bool bookMatch(authorType&)
bool bookMatch(publisherType&)
返回字符数组值:
titleType *getTitle()
isbnType *getISBN()
authorType *getAuthor()
publisherType *getPublisher()
BookData类:
输出书信息:
void printBookInformation()
修改书信息:
void setBookData()
调修改函数序:
void executeEditOrder(int order)
void edit()
处理日期四函数:
void setDateAdded(time_t)
void setCurrentDate()
void modifyDate()
time_t getDateAdded()
处理库存量四函数:
void increaseQuantityInHand()
void setQuantityInHand(int)
void setQuantityInHand()
int getQuantityInHand()
处理批发价三函数:
void setPriceWholeSale(double)
void setPriceWholeSale()
double getPriceWholeSale()
零售价关三函数:
void setPriceRetail(double)
void setPriceRetail()
double getPriceRetail()
根书名查找书查找函数:
static void find(titleType&)
根iSBN查找书查找函数:
static BookData *find(isbnType&)
根作者名查找书查找函数:
static void find(authorType&)
根出版社名查找书查找函数:
static void find(publisherType&)
Report类:
输出全部图书:
static void Allbook()
输出批发价列表表体:
static void WholeSale()
输出零售价列表表体:
static void Retail()
输出库存量列表表体:
static void Quantity()
书批发价总额排序然输出:
static void TotalWholeSale()
进库日期列表:
static void BookDate()
Management类:
查找理函数:
static void FindBook()
增加书:
static void AddBook()
修改书:
static void EditBook()
删书:
static void DelBook()
输出理模块表头:
ManagementOrderType printManagementHead()
根户选择调函数:
void processManagementOrder(ManagementOrderType)
Sale类:
构造函数设置默认税率:
static void Cashier(BookData& soldBook)
输出销售时屏幕显示信息:
void printSaleInformation()
购书重置书库中信息:
void renewSaleByBookData(BookData& bookProceeded)
设置税率:
static void setTaxRatio(double)
键盘读取税率:
static void readTaxRatio()
static double getTaxRatio()
计算税额:
void computeTax()
double getTax()
void increaseTotalTax()
static double getTotalTax()
static void setTotalTax(double)
读取某书库存量:
void readQuantitySold()
int getQuantitySold()
计算销售额:
void computeSubCost()
double getSubCost()
void increaseTotalCost()
static double getTotalCost()
static void setTotalCost(double)
分析讨模块:
特色算法
时处理信息表(数文件)
Finance类中calculate()函数类核心类中难度函数Calculate()实现功根交易表(tradegoodsdat)进退货表(stockdat)资金变化表(exmoneydat)计算出天前台销售利润天资金变化情况截天总财务变化信息写入财务理表(financedat)中作特色正常情况前台交易仓库交易资金处理时间样存放文件中
1 方函数重载样参数灵活选择扩充函数应范围面举例子
void TitleInfosetTitle(const titleType& newTitle)
{
memcpy完成拷贝功拷贝类型容
memcpy(title newTitle MAXtitleLength)
}
void TitleInfosetTitle()
{
cout << 请输入书名
while (true)
{
readConsoleString(title MAXtitleLength '\n')
if (strlen(title) 0)
cout << 输入空串请重新输入
else
break
}
}
参数时候调函数参数时候调函数
2 查找书算法简洁高效
void BookDatafind(publisherType& matchedPublisher)
{
sizeFinded 0
int indexPtrBook
BookData *book
for (indexPtrBook 1 indexPtrBook < sizeBook indexPtrBook++)
{
book (BookData*)ptrBook[indexPtrBook]
if (book>bookMatch(matchedPublisher) true)
{
++sizeFinded
swap(ptrBook[sizeFinded] ptrBook[indexPtrBook])
}
}
}
bool TitleInfobookMatch(publisherType& matchedPublisher)
{
if (substring(publisher matchedPublisher))
return true
else
return false
}
算法里find函数负责头尾检索外设置bookMatch函数进行字符匹配样保证代码简洁性
3 灵活指针
void writeFileData(const filenameType& filename)
{
fstream outputFile
remove(filename)
int index
outputFileopen(filename iosout | iosbinary|iosapp)
outputFilewrite((char*)&BookDatasizeBook sizeof(int))
for (index 1 index < BookDatasizeBook index++)
{
outputFilewrite((char*)BookDataptrBook[index] sizeof(BookData))
delete(BookData*)BookDataptrBook[index]
}
outputFileclose()
delete[] BookDataptrBook
delete[] SaleptrSold
}
4 时间处理算法
修改日期函数系统带tm结构体定义时间mktime库函数参数指结构体数转换成1970年1月1日0时0分0秒起秒数
void BookDatamodifyDate()
{
tm date
int year month day
cout << 请输入年份
readInteger(year)
cout << 请输入月份
readInteger(month)
cout << 请输入号:
readInteger(day)
datetm_year year 1900 获取年份
datetm_mon month 1 获取月份
datetm_mday day 获取天
datetm_hour 00
datetm_min 00
datetm_sec 00
dateAdded mktime(&date)
cout << 输入日期:
printDate(dateAdded)
cout << endl
}
显示天日期函数:
void printDateToday()
{
char tmpStr[80] 天日期
printStringInConsoleMiddle(getDateStringToday(tmpStr))
}
获取系统日期函数
char *getDateStringToday(char*tmpStr)
{
tm *date
time_t tempTime
tempTime time(NULL)
date localtime(&tempTime)
strftime(&tmpStr[14] 80 Y年m月d日 HMS date)
return tmpStr
}
5 整程序函数划分较细致样调函数更加灵活程序代码更加简洁
存足策
存足文件输入算法程序运行中数缓区程序结束时候统写入文件中针项足运行程序时保证次正常退出程序学程中会注意问题采取输入写算法避免问题
系统测试:
1 界面正常
2 收银模块测试正常
3 图书理模块基正常
4 报表模块测试正常
说明:
1 收银模块:户进入该模块系统动提示户否购买图书购买图书系统会提示户输入图书ISBN号系统书库中查找该书果书库中没相关信息提示户找该书找该书库存量零提示户该书已卖完找该书库存量会提示户输入购买图书数量售书完成会提示购书总额零售税
2 书库理模块:户提示输入相应数字选择相应功
查找某书信息:通书名模糊查找方式查找图书户需输入书名包含关键字找书籍
增加书:增加图书种类提示输入图书信息
修改书信息:系统会提示需修改项户提示输入
删书:书进行删操作户需输入书ISBN号系统列出书全部信息户确认否删
改变税率:户根实际情况改变税率默认税率006
3 报表模块
户根需选择列表方式屏幕限制屏输出两书信息继续查课意键查面图书
4 退出系统
4 课退出系统关闭文件
源代码
***************************************************
* 文件出类BookData定义继承TitleInfo类 *
***************************************************
#ifndef BookData_H
#define BookData_H
#includeTitleInfoh
#includeTypeDefineh
#includeCommonFunctionsh
class BookData public TitleInfo 定义BookData类该类继承TitleInfo
{
private
time_t dateAdded
int quantityInHand
double priceWholeSale
double priceRetail
public
static int sizeBook
static int *sizePtrBook
static int sizeFinded
static void **ptrBook
static void increaseBookKind()
BookData()
void printBookInformation() 输出书信息
void setBookData() 修改书信息
void executeEditOrder(int order) 调修改函数序
void edit()
void setDateAdded(time_t) 处理日期四函数
void setCurrentDate()
void modifyDate()
time_t getDateAdded()
void increaseQuantityInHand() 处理库存量四函数
void setQuantityInHand(int)
void setQuantityInHand()
int getQuantityInHand()
void setPriceWholeSale(double) 批发价关三函数
void setPriceWholeSale()
double getPriceWholeSale()
void setPriceRetail(double) 零售价关三函数
void setPriceRetail()
double getPriceRetail()
static void find(titleType&) 根书名查找书查找函数
static BookData *find(isbnType&)根iSBN查找书查找函数
static void find(authorType&) 根作者名查找书查找函数
static void find(publisherType&) 根出版社名查找书查找函数
}
#endif
#ifndef Cashier_H
#define Cashier_H
#include Saleh
void InitialCashier()
void printCashierHead()
void printCashierList()
#endif
*******************************************
* 文件出常函数原型 *
*******************************************
#ifndef CommonFunctions_H
#define CommonFunctions_H
#includeTypeDefineh
控制台读取字符串函数原型
void readConsoleString(char * streamsize char delim)
读写模式开文件
bool openFileInReadWriteMode(fstream& mediumFile const filenameType& filename)
bool FileExists(const filenameType& fname) 判断文件否存
streamsize GetFileSize(fstream &mediumFile) 获取文件
int substring(char a[] char b[]) 判断b否a子串
重新设置缓区
void resizePtrSequence(void **& ptrSequence int *& oldSize const int& newSize)
void memoryExceedException()
void readReal(double&) 读取浮点数
void readInteger(int &)
void printDate(time_t t)
void printCurrentDate()
bool getOrderYes() 键盘读取yes函数提供种出错处理方法
void readFilename(filenameType& filename)
void readEnterKeyForContinue()
void printPrice(double price int)
void printCost(double cost int)
void printStringInConsoleMiddle(char*) 控制屏幕中间输出容
void printDateToday() 显示天日期
#endif
#ifndef Management_H
#define Management_H
#includeCommonFunctionsh
#includeBookDatah
enum ManagementOrderType 定义书库理关类型
{
manaError
manaFindBook
manaAddBook
manaEditBook
manaDelBook
manaChangeTaxRatio
manaReturnMainMenu
}
class Management
{
public
static void FindBook()
static void AddBook()
static void EditBook()
static void DelBook()
}
ManagementOrderType printManagementHead()
void processManagementOrder(ManagementOrderType)
#endif
#ifndef Report_H
#define Report_H
#includeBookDatah
报表关定义
enum reportOrderType 定义枚举类型方便调报表函数
{
reportError
reportAllBook
reportWholeSale
reportRetail
reportQuantity
reportTotalWholeSale
reportBookDate
reportReturnMainMenu
}
class Report
{
public
static void Allbook()
static void WholeSale()
static void Retail()
static void Quantity()
static void TotalWholeSale()
static void BookDate()
}
reportOrderType getReportOrder()
void processReportMenuOrder(reportOrderType)
#endif
******************************************
* 文件出Sale类定义 *
******************************************
#ifndef Sale_H
#define Sale_H
#include BookDatah
#include TypeDefineh
#include CommonFunctionsh
class Sale public BookData 定义Sale类该类继承BookData
{
private
static double taxRatio
int quantitySold
double tax
double subCost
static double totalCost
static double totalTax
public
ptrSold包含N指针类型数列指针指址
某Sale类型象首址sizePtrSold表示现开辟sizeSoldvoid*
sizeSold表示现开辟sizeSoldSale现进行sizeSold次销售
次销售指卖某种书n注意sizeSoldsizePtrSold值定相等
static void **ptrSold
static int *sizePtrSold
static int sizeSold
static void Cashier(BookData& soldBook)
void printSaleInformation()
void renewSaleByBookData(BookData& bookProceeded)
static void setTaxRatio(double)
static void readTaxRatio()
static double getTaxRatio()
void computeTax() 计算销售额
double getTax()
void increaseTotalTax()
static double getTotalTax()
static void setTotalTax(double)
void readQuantitySold()
int getQuantitySold()
void computeSubCost()
double getSubCost()
void increaseTotalCost()
static double getTotalCost()
static void setTotalCost(double)
}
#endif
*******************************************
* 文件出类TitleInfo定义 *
*******************************************
#ifndef TitleInfo_H
#define TitleInfo_H
#includeTypeDefineh
#includeCommonFunctionsh
class TitleInfo 定义TitleInfo类该类类继承
{
private
titleType title
isbnType isbn
authorType author
publisherType publisher
public
void setTitleInformation()
void setTitle()
void setTitle(const titleType&)
void setISBN()
void setISBN(const isbnType&)
void setAuthor()
void setAuthor(const authorType&)
void setPublisher()
void setPublisher(const publisherType&)
bool bookMatch(titleType&)
bool bookMatch(isbnType&)
bool bookMatch(authorType&)
bool bookMatch(publisherType&)
titleType *getTitle()
isbnType *getISBN()
authorType *getAuthor()
publisherType *getPublisher()
}
#endif
*************************************************
* 文件定义程序中常量类型 *
*************************************************
#ifndef TypeDefine_H
#define TypeDefine_H
#define _CRT_SECURE_NO_DEPRECATE
#include
#include
#include
using namespace std
const int MAXisbnLength 14
const int MAXtitleLength 51
const int MAXauthorLength 32
const int MAXpublisherLength 31
const int MAX_SIZE 2147483647
typedef char filenameType[FILENAME_MAX]FILENAME_MAX系统定义整数260
const filenameType defaultFileName defaultdata
typedef char isbnType[MAXisbnLength]
typedef char titleType[MAXtitleLength]
typedef char authorType[MAXauthorLength]
typedef char publisherType[MAXpublisherLength]
#endif
************************************************
* 文件类BookData中函数出实现 *
************************************************
#include BookDatah 类中静态变量初始化
int BookDatasizeBook 0
int BookDatasizeFinded 0
int *BookDatasizePtrBook NULL
void **BookDataptrBook NULL
BookDataBookData()
{
quantityInHand 0
} 显示书信息
void BookDataprintBookInformation()
{
cout << ISBN号 << *getISBN() << endl
cout << 书名 << *getTitle() << endl
cout << 作者 << *getAuthor() << endl
cout << 出版社 << *getPublisher() << endl
cout << 进书日期
printDate(getDateAdded())
cout << endl
cout << 库存量 << getQuantityInHand() << endl
cout << 批发价
printPrice(getPriceWholeSale() 0)
cout << endl << 零售价
printPrice(getPriceRetail() 0)
cout << endl
}
设置书信息
void BookDatasetBookData()
{
setTitleInformation()
setCurrentDate()
setQuantityInHand()
setPriceWholeSale()
setPriceRetail()
}
修改日期
void BookDatamodifyDate()
{
tm date
int year month day
cout << 请输入年份
readInteger(year)
cout << 请输入月份
readInteger(month)
cout << 请输入号:
readInteger(day)
datetm_year year 1990 获取年份
datetm_mon month 1 获取月份
datetm_mday day 获取天
dateAdded mktime(&date) mktime库函数参数指结构体数转换成
1970年1月1日0时0分0秒起秒数
cout << 输入日期:
printDate(dateAdded)
cout << endl
}
调修改函数序
void BookDataexecuteEditOrder(int order)
{
switch (order) 根参数order决定调函数序
{
case 1
setTitle()
break
case 2
setAuthor()
break
case 3
setPublisher()
break
case 4
modifyDate()
break
case 5
setQuantityInHand()
break
case 6
setPriceWholeSale()
break
case 7
setPriceRetail()
break
default
cout << 认识命令 << endl
return
}
cout << 修改成功… << endl
}
显示修改项
void printBookDateEditMenu()
{
printStringInConsoleMiddle(想修改项)
printStringInConsoleMiddle(1书名 )
printStringInConsoleMiddle(2作者 )
printStringInConsoleMiddle(3出版社 )
printStringInConsoleMiddle(4进书日期 )
printStringInConsoleMiddle(5库存量 )
printStringInConsoleMiddle(6批发价 )
printStringInConsoleMiddle(7零售价 )
printStringInConsoleMiddle(8退出修改 )
cout << 请选择 18间整数:
}
输入效选择
int getBookDataEditOrder()
{
int order
cout << 请选择 17间整数:
readInteger(order)
while (order<1 || order>8)
{
cout << 选择错误请重新输入17间整数:
readInteger(order)
}
return order
}
修改书信息
void BookDataedit()
{
int order
while (true)
{
cout << 书前信息 << endl
printBookInformation()
printBookDateEditMenu()
order getBookDataEditOrder()
if (8 order)
break
else
{
executeEditOrder(order)
readEnterKeyForContinue()
}
}
}
增加书库存量
void BookDataincreaseBookKind()
{
BookData *newBook
BookData *findBook
newBook new BookData
newBook>setBookData()
findBook BookDatafind(*newBook>getISBN())
if (findBook NULL)
{
delete newBook
cout << 现添加书已存书库中该书信息: << endl
findBook>printBookInformation()
cout << endl << 想修改书(yesno)
if (getOrderYes())
findBook>edit()
}
else
{
cout << 添加概述成功 << endl
++sizeBook
if (sizeBook *sizePtrBook)
resizePtrSequence(ptrBook sizePtrBook sizeBook * 2)
ptrBook[sizeBook] (void *)newBook
}
}
void BookDatasetDateAdded(time_t newDate)
{
dateAdded newDate
}
void BookDatasetCurrentDate()
{
dateAdded time(NULL)
}
time_t BookDatagetDateAdded()
{
return dateAdded
}
void BookDataincreaseQuantityInHand()
{
int increasedAmount
cout << 请输入该书新入库数量:
cin >> increasedAmount
quantityInHand + increasedAmount
}
void BookDatasetQuantityInHand(int newQuantity)
{
quantityInHand newQuantity
}
根情况重新设置书数量
void BookDatasetQuantityInHand()
{
int order
cout << 想添加种书库存重设该书库存? << endl
cout << 1增加该书库存 << endl
cout << 2重设该书库存 << endl
cout << 3书新书前书库中没该书 << endl
cout << 请输入选择(13)
readInteger(order)
while (order<1 || (order>3))
{
cout << 输入命令错误请重新输入:
readInteger(order)
}
switch (order)
{
case 1
cout << 请输入该书新增数量:
break
case 2
cout << 请输入该书库存量:
break
case 3
cout << 请输入该书首次进货数量:
break
default
cout << 法识命令 << endl
return
}
int tempQuantity
while (true)
{
readInteger(tempQuantity)
if (tempQuantity<0)
cout << 输入错误请次输入:
else
break
}
if (1 order)
quantityInHand + tempQuantity
else
setQuantityInHand(tempQuantity)
}
int BookDatagetQuantityInHand()
{
return quantityInHand
}
void BookDatasetPriceWholeSale(double newPrice)
{
priceWholeSale newPrice
}
设置书批发价
void BookDatasetPriceWholeSale()
{
cout << 请输入该书批发价:
while (true)
{
readReal(priceWholeSale)
if (priceWholeSale<0)
cout << 输入错误请次输入:
else
break
}
}
double BookDatagetPriceWholeSale()
{
return priceWholeSale
}
void BookDatasetPriceRetail(double newPrice)
{
priceRetail newPrice
}
设置书零售价
void BookDatasetPriceRetail()
{
cout << 请输入书零售价:
while (true)
{
readReal(priceRetail)
if (priceRetail<0)
cout << 输入错误请次输入:
else
break
}
}
double BookDatagetPriceRetail()
{
return priceRetail
}
通书名查找书
void BookDatafind(titleType& matchedTitle)
{
sizeFinded 0
int indexPtrBook
BookData *book
for (indexPtrBook 1 indexPtrBook < sizeBook indexPtrBook++)
{
book (BookData*)ptrBook[indexPtrBook]
if ((*book)bookMatch(matchedTitle) true)
{
++sizeFinded
swap(ptrBook[sizeFinded] ptrBook[indexPtrBook])
}
}
}
通ISBN号查找书
BookData *BookDatafind(isbnType& matchedISBN)
{
sizeFinded 0
int indexPtrBook
BookData *book
for (indexPtrBook 1 indexPtrBook < sizeBook indexPtrBook++)
{
book (BookData*)ptrBook[indexPtrBook]
if (strcmp(*(book>getISBN()) matchedISBN) 0)
{
swap(ptrBook[1] ptrBook[indexPtrBook])
sizeFinded 1
return book
}
}
return NULL
}
通作者查找书
void BookDatafind(authorType& matchedAuthor)
{
sizeFinded 0
int indexPtrBook
BookData *book
for (indexPtrBook 1 indexPtrBook < sizeBook indexPtrBook++)
{
book (BookData*)ptrBook[indexPtrBook]
if (book>bookMatch(matchedAuthor) true)
{
++sizeFinded
swap(ptrBook[sizeFinded] ptrBook[indexPtrBook])
}
}
}
通出版社查找书
void BookDatafind(publisherType& matchedPublisher)
{
sizeFinded 0
int indexPtrBook
BookData *book
for (indexPtrBook 1 indexPtrBook < sizeBook indexPtrBook++)
{
book (BookData*)ptrBook[indexPtrBook]
if (book>bookMatch(matchedPublisher) true)
{
++sizeFinded
swap(ptrBook[sizeFinded] ptrBook[indexPtrBook])
}
}
}
#include Cashierh
初始化函数
void InitialCashier()
{
SaleptrSold new void *
SalesizePtrSold (int *)SaleptrSold
*SalesizePtrSold 1
SalesizeSold 0
SalesetTotalTax(0)
SalesetTotalCost(0)
}
void printCashierHead()
{
printStringInConsoleMiddle(前台销售模块)
cout << endl
printDateToday()
cout << endl
cout << 请输入购买书店ISBN号:
}
void printCashierListHead()
{
printStringInConsoleMiddle(前台销售模块)
printDateToday()
cout << 数量 ISBN号 书名 单价 金额
<< endl
}
屏幕输出销售信息
void printCashierList()
{
int iSizeSold
Sale *tempSale
if (SalesizeSold > 0)
{
printCashierListHead()
for (iSizeSold 1 iSizeSold < SalesizeSold iSizeSold++)
{
tempSale (Sale*)SaleptrSold[iSizeSold]
tempSale>printSaleInformation()
cout << endl
if (iSizeSold 20 0)
{
readEnterKeyForContinue()
printCashierListHead()
}
delete tempSale
}
cout << 销售合计
printCost(SalegetTotalCost() 20)
cout << endl
cout << 零售税
printCost(SalegetTotalTax() 20)
cout << endl
cout << 应付总额
printCost(SalegetTotalTax() + SalegetTotalCost() 20)
cout << endl
}
else
cout << endl << endl << 没卖出书 << endl
readEnterKeyForContinue()
SalesizeSold 0
delete[] SaleptrSold
}
#includeCommonFunctionsh
#include
using namespace std
#include
函数完成键盘读取字符串功
void readConsoleString(char *cinString streamsize cinStringMaximumSize char delim)
{
cinget(cinString cinStringMaximumSize delim)
cinclear()
cinignore(MAX_SIZE delim)
}
二进制读写模式开文件
bool openFileInReadWriteMode(fstream& mediumFile const filenameType& filename)
{
mediumFileclear()
if (FileExists(filename) false) 判断文件否存
mediumFileopen(filename iosin | iosout | iosbinary | iostrunc)
else
mediumFileopen(filename iosin | iosout | iosbinary|iosapp)
return mediumFilefail()
}
通否开文件判断否存存返回true反返回false
bool FileExists(const filenameType& fname)
{
ifstream tempFile
bool existFile
tempFileopen(fname)
existFile tempFilefail()
tempFileclose()
return existFile
}
获取文件1代表文件存否代表文件
streamsize GetFileSize(fstream &mediumFile)
{
streamsize mediumPosition
mediumFileseekg(0L iosend)
mediumPosition mediumFiletellg()
mediumFileseekg(0 iosbeg)
return mediumPosition
}
判断b否a子串返回true否返回false
int substring(char a[] char b[])
{
return (strstr(ab) NULL) false true
}
重新设置缓区
void resizePtrSequence(void **& ptrSequence int *& oldSizePtr const int& newSize)
{
if (newSize<0)
{
cout << Incorrect newSize value << endl
return
}
void **tempPtrSequence
tempPtrSequence new void *[newSize]
if (newSize < (*oldSizePtr))
{
memcpy(tempPtrSequence ptrSequence sizeof(void*)*newSize)
}
if (newSize > (*oldSizePtr))
{
memcpy(tempPtrSequence ptrSequence sizeof(void*)*(*oldSizePtr))
}
delete[]ptrSequence
ptrSequence tempPtrSequence
if (NULL ptrSequence)
{
oldSizePtr NULL
if (newSize)
memoryExceedException()
}
else
{
oldSizePtr (int*)tempPtrSequence
*oldSizePtr newSize
}
}
存出错显示函数
void memoryExceedException()
{
cout << 存溢出错误 << endl
}
读取浮点数
void readReal(double &real)
{
while (true)
{
cin >> real
if (cinfail())
{
cout << 输入错误请重新输入
cinclear()
cinignore(MAX_SIZE '\n')
}
else
break
}
cinignore(MAX_SIZE '\n') 忽略读取数面剩字符
}
键盘读取整数
void readInteger(int &integer)
{
while (true)
{
cin >> integer
if (cinfail())
{
cout << 输入错误请重新输入
cinclear()
cinignore(MAX_SIZE '\n')
}
else
break
}
cinignore(MAX_SIZE '\n')
}
显示日期
void printDate(time_t t)
{
tm *date
char tmpStr[80]
date localtime(&t)
strftime(tmpStr80Y年m月d日date)
cout << tmpStr
}
获取系统前日期显示
void printCurrentDate()
{
time_t t time(NULL)
printDate(t)
}
键盘读取yes函数提供种出错处理方法
bool getOrderYes()
{
char orderString[5]
while (true)
{
readConsoleString(orderString 5 '\n')
if (strcmp(orderString no) 0)
return false
else if (strcmp(orderString yes) 0)
return true
else
cout << 输入yesno请重新输入
}
}
键盘读取字符串
void readFilename(filenameType& filename)
{
cout << 请输入文件名
while (true)
{
readConsoleString(filename FILENAME_MAX '\n')
if (strlen(filename) 0)
cout << 输入文件名效请重新输入
else
break
}
}
读取回车字符
void readEnterKeyForContinue()
{
cout << 回车键继续 << endl
char tmpString[2]
readConsoleString(tmpString 2 '\n')
}
显示价格
void printPrice(double price int width)
{
cout << RMB
coutprecision(1)
coutwidth(width)
coutsetf(iosfixed)
coutsetf(iosleft)
cout << price
coutunsetf(iosfixed)
coutunsetf(iosleft)
}
void printCost(double cost int width)
{
printPrice((double)cost width)
}
面函数屏幕中间输出容
void printStringInConsoleMiddle(char*PrintedString) 控制屏幕中间输出容
{
streamsize length
length strlen(PrintedString)
if (length > 80)
cout << PrintedString << endl
else
{
static streamsize i
static streamsize SizeBlankSpaceString
SizeBlankSpaceString (80 length) 2
for (i 0 i
cout << PrintedString << endl
}
}
获取系统日期
char *getDateStringToday(char*tmpStr)
{
tm *date
time_t tempTime
tempTime time(NULL)
date localtime(&tempTime)
strftime(&tmpStr[14] 80 Y年m月d日 HMS date)
return tmpStr
}
显示天日期
void printDateToday()
{
char tmpStr[80] 天日期
printStringInConsoleMiddle(getDateStringToday(tmpStr))
}
#includeCommonFunctionsh
#includeCashierh
#includeReporth
#includeManagementh
#includeTypeDefineh
#include
using namespace std
#include
enum mainMenuOrderType
{
errorMainMenu cashier bookManagement report exitSystem
}
void processMainMenuOrder(mainMenuOrderType)
void loadFileData(filenameType&) 文件中读取数
void process() 菜单处理模块
void writeFileData(const filenameType&)文件中写数
void processCashier() 前台销售模块
void processManagement() 书库理模块
void processReport() 报表模块
int main()
{
filenameType filename
loadFileData(filename)
process()
writeFileData(filename)
cout << 已退出书库理系统 << endl
return 0
}
判断文件长度否正确
bool correct(streamsize fileSize)
{
fileSize sizeof(int)
if (fileSize < (streamsize)BookDatasizeBook)
return false
return fileSize BookDatasizeBook*sizeof(BookData)
}
书库读取信息
void loadFileData(filenameType & filename)
{
fstream mediumFile
cout << 否指定文件载入保存数(yesno) << endl
cout << 果输入no << defaultFileName << 默认保存数文件 << endl
if (getOrderYes())
readFilename(filename)
else
strcpy(filename defaultFileName)
while (openFileInReadWriteMode(mediumFile filename) false)
{
mediumFileclear()
cout << 输入文件名正确请重新输入
readFilename(filename)
}
streamsize fileSize
fileSize GetFileSize(mediumFile)
bool correctFile true
BookData *books NULL
开始读入文件
if (fileSize > sizeof(int))
{
mediumFileread((char*)&BookDatasizeBook sizeof(int))
if (correct(fileSize))
{
books new BookData[BookDatasizeBook]
if (NULL books)
memoryExceedException()
mediumFileread((char*)books sizeof(BookData)*BookDatasizeBook)
}
else
correctFile false
}
else
correctFile false
if (correctFile false)
{
BookDatasizeBook 0
mediumFileclose()
remove(filename)
openFileInReadWriteMode(mediumFile filename)
}
int indexBook
BookDataptrBook new void *[BookDatasizeBook + 1]
BookDatasizePtrBook (int *)BookDataptrBook
*BookDatasizePtrBook BookDatasizeBook + 1
for (indexBook 0 indexBook < BookDatasizeBook indexBook++)
{
BookDataptrBook[indexBook + 1] &books[indexBook]
}
cout << 书库中现 << BookDatasizeBook << 种书 << endl << endl
mediumFileclose()
}
书库写数
void writeFileData(const filenameType& filename)
{
fstream outputFile
remove(filename)
int index
outputFileopen(filename iosout | iosbinary|iosapp)
outputFilewrite((char*)&BookDatasizeBook sizeof(int))
for (index 1 index < BookDatasizeBook index++)
{
outputFilewrite((char*)BookDataptrBook[index] sizeof(BookData))
delete(BookData*)BookDataptrBook[index]
}
outputFileclose()
delete[] BookDataptrBook
delete[] SaleptrSold
}
显示书库理系统功
void printMainMenuHead()
{
printStringInConsoleMiddle(图书理系统)
printStringInConsoleMiddle(菜单)
printStringInConsoleMiddle(1 收银模块)
printStringInConsoleMiddle(2 书库理模块)
printStringInConsoleMiddle(3 报表模块)
printStringInConsoleMiddle(4 退出系统)
cout << endl
cout << 请选择14间数字
}
根选择决定调函数
mainMenuOrderType readMainMenuOrder()
{
printMainMenuHead()
int order
readInteger(order)
while (order<1 || order>4)
{
cout << 输入错误请输入14间数
readInteger(order)
}
switch (order)
{
case 1
return cashier
case 2
return bookManagement
case 3
return report
case 4
return exitSystem
default
return errorMainMenu
}
}
根户选择决定调功
void process()
{
mainMenuOrderType order
while (true)
{
order readMainMenuOrder()
if (order exitSystem)
processMainMenuOrder(order)
else
return
}
}
void processMainMenuOrder(mainMenuOrderType order)
{
switch (order)
{
case cashier
processCashier()
break
case bookManagement
processManagement()
break
case report
processReport()
break
default
cout << 函数processMainMenuOrder出现未知错误 << endl
}
}
销售处理函数
void processCashier()
{
static isbnType tempISBN
static BookData *tempBook
InitialCashier()
while (true)
{
printCashierHead()
readConsoleString(tempISBNMAXisbnLength'\n')
tempBook BookDatafind(tempISBN)
if (NULL tempBook)
{
cout << 书库中没书 << endl
}
else
{
SaleCashier(*tempBook)
}
cout << 想继续(yesno)
if (getOrderYes() false)
break
}
printCashierList()
}
void processManagement()
{
ManagementOrderType order
while (true)
{
order printManagementHead()
if (order manaReturnMainMenu)
processManagementOrder(order)
else
return
}
}
void processReport()
{
reportOrderType order
while (true)
{
order getReportOrder()
if (order reportReturnMainMenu)
processReportMenuOrder(order)
else
return
}
}
#includeManagementh
#includeSaleh
显示书库理模块功
ManagementOrderType printManagementHead()
{
printStringInConsoleMiddle(图书理系统)
printStringInConsoleMiddle(书库理模块)
printStringInConsoleMiddle(1 查找某书信息)
printStringInConsoleMiddle(2 增加新书种)
printStringInConsoleMiddle(3 修改书信息)
printStringInConsoleMiddle(4 删书)
printStringInConsoleMiddle(5 返回菜单)
cout << 请输入15间整数:
int order
readInteger(order)
while (order<1 || order>6)
{
cout << 输入错误请输入16间整数:
readInteger(order)
}
switch (order)
{
case 1
return manaFindBook
case 2
return manaAddBook
case 3
return manaEditBook
case 4
return manaDelBook
case 5
return manaReturnMainMenu
default
return manaError
}
}
根选择调相应函数
void processManagementOrder(ManagementOrderType order)
{
switch (order)
{
case manaFindBook
ManagementFindBook()
break
case manaAddBook
ManagementAddBook()
break
case manaEditBook
ManagementEditBook()
break
case manaDelBook
ManagementDelBook()
break
default
cout << 出现未知选择\n
}
}
ISBN查找
void FindBookByISBN()
{
isbnType isbn
BookData *findedBook
cout << 输入ISBN号\n
readConsoleString(isbn MAXisbnLength '\n')
findedBook BookDatafind(isbn)
if (findedBook NULL)
{
cout << 书信息 << endl
findedBook>printBookInformation()
readEnterKeyForContinue()
}
else
cout << 没找 << endl
}
书名查找
void FindBookByTitle()
{
titleType title
cout << 请输入书名
readConsoleString(title MAXtitleLength '\n')
BookDatafind(title)
if (BookDatasizeFinded)
{
cout << 书信息 << endl
for (int i 1 i < BookDatasizeFinded i++)
{
cout << endl << endl << endl
((BookData*)BookDataptrBook[i])>printBookInformation()
if (i 2 0)
readEnterKeyForContinue()
}
}
else
cout << 书库中书 << endl
}
出版社
void FindBookByPublisher()
{
publisherType publisher
cout << 请输入出版社
readConsoleString(publisher MAXpublisherLength '\n')
BookDatafind(publisher)
if (BookDatasizeFinded)
{
cout << 书信息 << endl
for (int i 1 i < BookDatasizeFinded i++)
{
cout << endl << endl << endl
((BookData*)BookDataptrBook[i])>printBookInformation()
if (i 2 0)
readEnterKeyForContinue()
}
}
else
cout << 书库中书 << endl
}
作者
void FindBookByAuthor()
{
authorType author
cout << 请输入作者名
readConsoleString(author MAXauthorLength '\n')
BookDatafind(author)
if (BookDatasizeFinded)
{
cout << 书信息 << endl
for (int i 1 i < BookDatasizeFinded i++)
{
cout << endl << endl << endl
((BookData*)BookDataptrBook[i])>printBookInformation()
if (i 2 0)
readEnterKeyForContinue()
}
}
else
cout << 没找 << endl
}
模糊查找
void FindBookInAnyway()
{
char matchedString[80]
cout << 请输入匹配字符串:
readConsoleString(matchedString 80 '\n')
int indexPtrBook
BookData *book
titleType title
strncpy(title matchedString MAXtitleLength)
title[MAXtitleLength 1] 0
publisherType publisher
strncpy(publisher matchedString MAXpublisherLength)
cout << publisher
publisher[MAXpublisherLength 1] 0
authorType author
strncpy(author matchedString MAXauthorLength)
author[MAXauthorLength 1] 0
BookDatasizeFinded 0
for (indexPtrBook 1 indexPtrBook < BookDatasizeBook indexPtrBook++)
{
book (BookData*)BookDataptrBook[indexPtrBook]
if (book>bookMatch(author) true || book>bookMatch(publisher) true || book>bookMatch(title) true)
{
++BookDatasizeFinded
swap(BookDataptrBook[BookDatasizeFinded] BookDataptrBook[indexPtrBook])
}
}
if (BookDatasizeFinded)
{
cout << 书信息 << endl
for (int i 1 i < BookDatasizeFinded i++)
{
cout << endl << endl << endl
((BookData*)BookDataptrBook[i])>printBookInformation()
if (i 2 0)
readEnterKeyForContinue()
}
}
else
cout << 没找<
查找理函数
void ManagementFindBook()
{
printStringInConsoleMiddle(图书理系统查找模块)
printStringInConsoleMiddle(1 精确ISBN号查找)
printStringInConsoleMiddle(2 书名模糊查找)
printStringInConsoleMiddle(3 出版社模糊查找)
printStringInConsoleMiddle(4 作者模糊查找)
printStringInConsoleMiddle(5 模糊查找(包括ISBN号))
cout << 请选择查找方式(15)
int order
readInteger(order)
while (order<1 || order>5)
{
cout << 输入错误请重新输入
readInteger(order)
}
switch (order)
{
case 1
FindBookByISBN()
break
case 2
FindBookByTitle()
break
case 3
FindBookByPublisher()
break
case 4
FindBookByAuthor()
break
case 5
FindBookInAnyway()
break
default
cout << 嫩执行步写程序写累死 << endl
}
}
增加书
void ManagementAddBook()
{
BookDataincreaseBookKind()
}
修改书
void ManagementEditBook()
{
BookData *findedBook
isbnType isbn
cout << 请输入修改书号
readConsoleString(isbn MAXisbnLength '\n')
findedBook BookDatafind(isbn)
if (findedBook NULL)
findedBook>edit()
else
cout << 没找 << endl
}
删
void ManagementDelBook()
{
BookData *findedBook
isbnType isbn
cout << 请输入删书号
readConsoleString(isbn MAXisbnLength '\n')
findedBook BookDatafind(isbn)
if (findedBook NULL)
{
cout << 找书信息 << endl
findedBook>printBookInformation()
cout << 确认删(yesno)
if (getOrderYes())
{
delete findedBook
swap(BookDataptrBook[1] BookDataptrBook[BookDatasizeBook])
BookDatasizeBook
}
}
else
cout << 没找 << endl
}
#includeReporth
输出列表
void printReportMenuHead()
{
printStringInConsoleMiddle(FIVESTAR图书理系统)
printStringInConsoleMiddle(书库理模块)
printStringInConsoleMiddle(1 书库列表)
printStringInConsoleMiddle(2 批发价列表)
printStringInConsoleMiddle(3 零售价列表)
printStringInConsoleMiddle(4 书库存列表)
printStringInConsoleMiddle(5 桉书批发价总额列表)
printStringInConsoleMiddle(6 入库日期列表 )
printStringInConsoleMiddle(7 返回菜单 )
cout << 请输入17间整数
}
获取列表选择
reportOrderType getReportOrder()
{
printReportMenuHead()
int order
readInteger(order)
while (order<1 || order>7)
{
cout << 输入错误请重新输入17间整数:
readInteger(order)
}
switch (order)
{
case 1
return reportAllBook
case 2
return reportWholeSale
case 3
return reportRetail
case 4
return reportQuantity
case 5
return reportTotalWholeSale
case 6
return reportBookDate
case 7
return reportReturnMainMenu
default
return reportError
}
}
根输入选择决定调报表函数
void processReportMenuOrder(reportOrderType order)
{
switch (order)
{
case reportAllBook
ReportAllbook()
break
case reportWholeSale
ReportWholeSale()
break
case reportRetail
ReportRetail()
break
case reportQuantity
ReportQuantity()
break
case reportTotalWholeSale
ReportTotalWholeSale()
break
case reportBookDate
ReportBookDate()
break
default 执行步
cout << 出现未知错误processReportMenuOrder 函数 << endl
}
}
输出全部图书时表头
void printAllbookListHead()
{
printStringInConsoleMiddle(报表模块)
printStringInConsoleMiddle(1列出书库中书信息)
printDateToday()
cout << endl << endl
}
输出全部图书时表体
void ReportAllbook()
{
BookData *book
int indexPtrBook
printAllbookListHead()
for (indexPtrBook 1 indexPtrBook < BookDatasizeBook indexPtrBook++)
{
book (BookData *)BookDataptrBook[indexPtrBook]
book>printBookInformation()
cout << endl
if (indexPtrBook 2 0)
{
readEnterKeyForContinue()
printAllbookListHead()
}
}
}
输出批发价列表表头
表头表体输出分成2函数处理屏输出
void printWholeSaleListHead()
{
printStringInConsoleMiddle(报表模块)
printStringInConsoleMiddle(2批发价列表)
printDateToday()
cout << ISBN号 书名 批发价
<< endl
}
输出批发价列表表体
void ReportWholeSale()
{
BookData *book
double TotalWholeSale 0
int indexPtrBook
printWholeSaleListHead()
for (indexPtrBook 1 indexPtrBook < BookDatasizeBook indexPtrBook++)
{
book (BookData*)BookDataptrBook[indexPtrBook]
coutsetf(iosleft)
coutwidth(15)
cout << *book>getISBN() <<
coutwidth(45)
cout << *book>getTitle() <<
coutunsetf(iosleft)
printPrice(book>getPriceWholeSale() 0)
cout << endl
TotalWholeSale + book>getPriceWholeSale()*book>getQuantityInHand()
if (indexPtrBook 19 0)
{
readEnterKeyForContinue()
printWholeSaleListHead()
}
}
cout << 批发价总:
printPrice(TotalWholeSale 40)
cout << endl
readEnterKeyForContinue()
}
输出零售价列表表头
void printRetailListHead()
{
printStringInConsoleMiddle(报表模块)
printStringInConsoleMiddle(3零售价列表)
printDateToday()
cout << ISBN号 书名 零售价
<< endl
}
输出零售价列表表体
void ReportRetail()
{
BookData *book
double TotalRetail 0
int indexPtrBook
printRetailListHead()
for (indexPtrBook 1 indexPtrBook < BookDatasizeBook indexPtrBook++)
{
book (BookData*)BookDataptrBook[indexPtrBook]
coutsetf(iosleft)
coutwidth(15)
cout << *book>getISBN() <<
coutwidth(45)
cout << *book>getTitle() <<
coutunsetf(iosleft)
printPrice(book>getPriceRetail() 0)
cout << endl
TotalRetail + book>getPriceRetail()*book>getQuantityInHand()
if (indexPtrBook 19 0)
{
readEnterKeyForContinue()
printRetailListHead()
}
}
cout << 零售价总:
printPrice(TotalRetail 30)
cout << endl
readEnterKeyForContinue()
}
较书数量
int cmpBookQuantity(BookData*a BookData*b)
{
int ta tb
ta a>getQuantityInHand()
tb b>getQuantityInHand()
if (ta < tb)
return 1
else if (ta tb)
return 0
else
return 1
}
输出库存量列表表头
void printQuantityListHead()
{
printStringInConsoleMiddle(报表模块)
printStringInConsoleMiddle(4 书库存列表)
printDateToday()
cout << 库存 ISBN号 书名 << endl
}
输出库存量列表表体
void printQuantityList()
{
BookData *book
int indexPtrBook
printQuantityListHead()
for (indexPtrBook 1 indexPtrBook < BookDatasizeBook indexPtrBook++)
{
book (BookData*)BookDataptrBook[indexPtrBook]
coutsetf(iosleft)
coutwidth(15)
cout << book>getQuantityInHand()
cout <<
coutwidth(14)
cout << *book>getISBN() <<
cout << *book>getTitle()
coutunsetf(iosleft)
cout << endl
if (indexPtrBook 20 0)
{
readEnterKeyForContinue()
printQuantityListHead()
}
}
readEnterKeyForContinue()
}
void ReportQuantity()
{
int i j
for (i 1 i < BookDatasizeBook i++)
for (j i + 1 j < BookDatasizeBook j++)
if (cmpBookQuantity((BookData*)BookDataptrBook[i] (BookData*)BookDataptrBook[j]) 1)
swap(BookDataptrBook[i] BookDataptrBook[j])
printQuantityList()
}
输出书批发价总额列表表头
void printTotalWholeSaleListHead()
{
printStringInConsoleMiddle(报表模块)
printStringInConsoleMiddle(5 书批发价总额列表)
printDateToday()
cout << 批发总额 ISBN号 书名
<< endl
}
输出书批发价总额列表表体
void printTotalWholeSaleList()
{
BookData *book
int indexPtrBook
printTotalWholeSaleListHead()
for (indexPtrBook 1 indexPtrBook < BookDatasizeBook indexPtrBook++)
{
book (BookData*)BookDataptrBook[indexPtrBook]
printPrice(book>getPriceWholeSale()*book>getQuantityInHand() 20)
cout <<
coutsetf(iosleft)
coutwidth(14)
cout << *book>getISBN() <<
cout << *book>getTitle()
coutunsetf(iosleft)
cout << endl
if (indexPtrBook 19 0)
{
readEnterKeyForContinue()
printTotalWholeSaleListHead()
}
}
readEnterKeyForContinue()
}
书批发价总额较
int cmpTotalWholeSale(BookData*ptr1_BookData BookData*ptr2_BookData)
{
double ta tb
ta ptr1_BookData>getPriceWholeSale()*ptr1_BookData>getQuantityInHand()
tb ptr2_BookData>getPriceWholeSale()*ptr2_BookData>getQuantityInHand()
if (ta
else if (ta>tb)
return 1
else
return 0
}
先书批发价总额排序然输出
void ReportTotalWholeSale()
{
int i j
for (i 1 i
if (cmpTotalWholeSale((BookData*)BookDataptrBook[i] (BookData*)BookDataptrBook[j]) 1)
swap(BookDataptrBook[i] BookDataptrBook[j])
printTotalWholeSaleList()
}
输出书进库日期列表表头
void printBookDateListHead()
{
printStringInConsoleMiddle(报表模块)
printStringInConsoleMiddle(6 入库日期先列表)
printDateToday()
cout << 入库日期 ISBN 书名 << endl
}
书进库日期列表
void printBookDateList()
{
BookData *book
int indexPtrBook
printBookDateListHead()
for (indexPtrBook 1 indexPtrBook < BookDatasizeBook indexPtrBook++)
{
book (BookData*)BookDataptrBook[indexPtrBook]
printDate(book>getDateAdded())
cout <<
coutsetf(iosleft)
coutwidth(20)
cout << *book>getISBN() <<
cout << *book>getTitle()
coutunsetf(iosleft)
cout << endl
if (indexPtrBook 19 0)
{
readEnterKeyForContinue()
printBookDateListHead()
}
}
readEnterKeyForContinue()
}
较日期
int cmpBookDate(BookData*a BookData*b)
{
time_t ta tb
ta a>getDateAdded()
tb b>getDateAdded()
if (ta
else if (ta>tb)
return 1
else
return 0
}
进库日期列表
void ReportBookDate()
{
int i j
for (i 1 i
if (cmpBookDate((BookData*)BookDataptrBook[i] (BookData*)BookDataptrBook[j]) 1)
swap(BookDataptrBook[i] BookDataptrBook[j])
printBookDateList()
}
#include Saleh
double SaletaxRatio 006 默认税率
double SaletotalCost 0
double SaletotalTax 0
void **SaleptrSold NULL
int *SalesizePtrSold NULL
int SalesizeSold 0
void SaleCashier(BookData& soldBook)
{
Sale *NewSale
NewSale new Sale
NewSale>renewSaleByBookData(soldBook)
while (true)
{
NewSale>readQuantitySold()
cout << 购买 << NewSale>quantitySold
<< << *NewSale>getTitle() << << endl
cout << 确定(yesno)
if (getOrderYes())
break
else
cout << 请输入购买书数
}
NewSale>computeSubCost()
NewSale>increaseTotalCost() 计算总额
NewSale>computeTax()
NewSale>increaseTotalTax() 计算税
soldBooksetQuantityInHand(NewSale>getQuantityInHand() NewSale>getQuantitySold())
NewSale>setQuantityInHand(NewSale>getQuantityInHand() NewSale>getQuantitySold())
cout << 卖出 << NewSale>quantitySold << << *NewSale>getTitle() << 书信息 << endl
NewSale>printBookInformation()
int &sizeSold SalesizeSold
int &sizePtrSold *SalesizePtrSold
++sizeSold
if (sizeSold sizePtrSold)
resizePtrSequence(SaleptrSold SalesizePtrSold sizePtrSold * 2)
SaleptrSold[sizeSold] (void*)NewSale
cout << 书已处理完毕请继续输入书信息 << endl
}
输出销售时屏幕显示书信息
void SaleprintSaleInformation()
{
coutwidth(5)
coutsetf(iosright)
cout << getQuantitySold() <<
coutunsetf(iosright)
coutsetf(iosleft)
coutwidth(16)
cout << *getISBN() <<
coutwidth(30)
cout << *getTitle() <<
coutunsetf(iosleft)
printPrice(getPriceRetail() 9)
cout <<
printCost(getSubCost() 9)
}
购书重新设置书库中该书信息
void SalerenewSaleByBookData(BookData& bookProceeded)
{
setTitle(*bookProceededgetTitle())
setPublisher(*bookProceededgetPublisher())
setAuthor(*bookProceededgetAuthor())
setISBN(*bookProceededgetISBN())
setPriceRetail(bookProceededgetPriceRetail())
setPriceWholeSale(bookProceededgetPriceWholeSale())
setQuantityInHand(bookProceededgetQuantityInHand())
setDateAdded(bookProceededgetDateAdded())
}
设置税率
void SalesetTaxRatio(double newTaxRatio)
{
taxRatio newTaxRatio
}
键盘读取税率
void SalereadTaxRatio()
{
cout << 请输入新税率非负实数:
while (true)
{
readReal(taxRatio)
if (taxRatio > 0)
break
else
cout << 请重新输入:
}
}
double SalegetTaxRatio()
{
return taxRatio
}
计算税率
void SalecomputeTax()
{
tax getSubCost()*taxRatio
}
double SalegetTax()
{
return tax
}
void SaleincreaseTotalTax()
{
totalTax + tax
}
double SalegetTotalTax()
{
return totalTax
}
void SalesetTotalTax(double newTotalTax)
{
newTotalTax newTotalTax
}
读取某书库存量
void SalereadQuantitySold()
{
cout << 书前库存: << getQuantityInHand() << endl
cout << 请输入购买书数量
while (true)
{
readInteger(quantitySold)
if (quantitySold >getQuantityInHand())
cout << 库存足请减少购买量
else if (quantitySold<0)
cout << 输入负数请重新输入:
else
break
}
}
int SalegetQuantitySold()
{
return quantitySold
}
void SalecomputeSubCost()
{
subCost getPriceRetail()*getQuantitySold()
}
double SalegetSubCost()
{
return subCost
}
void SaleincreaseTotalCost()
{
totalCost + subCost
}
double SalegetTotalCost()
{
return totalCost
}
void SalesetTotalCost(double newTotalCost)
{
totalCost newTotalCost
}
************************************
* 文件类中函数出实现 *
************************************
#includeTitleInfoh
void TitleInfosetTitleInformation()
{
setTitle()
setISBN()
setAuthor()
setPublisher()
}
void TitleInfosetTitle(const titleType& newTitle)
{
memcpy完成拷贝功拷贝类型容
memcpy(title newTitle MAXtitleLength)
}
void TitleInfosetISBN(const isbnType& newISBN)
{
memcpy(isbn newISBN MAXisbnLength)
}
void TitleInfosetAuthor(const authorType& newAuthor)
{
memcpy(author newAuthor MAXauthorLength)
}
void TitleInfosetPublisher(const publisherType& newPublisher)
{
memcpy(publisher newPublisher MAXpublisherLength)
}
void TitleInfosetTitle()
{
cout << 请输入书名
while (true)
{
readConsoleString(title MAXtitleLength '\n')
if (strlen(title) 0)
cout << 输入空串请重新输入
else
break
}
}
void TitleInfosetISBN()
{
cout << 请输入书ISBN号
while (true)
{
readConsoleString(isbn MAXisbnLength '\n')
if (strlen(isbn) 0)
cout << 输入空串请重新输入
else
break
}
}
void TitleInfosetAuthor()
{
cout << 请输入书作者
while (true)
{
readConsoleString(author MAXauthorLength '\n')
if (strlen(author) 0)
cout << 输入空串请重新输入
else
break
}
}
void TitleInfosetPublisher()
{
cout << 请输入书出版社
while (true)
{
readConsoleString(publisher MAXpublisherLength '\n')
if (strlen(publisher) 0)
cout << 输入空串请重新输入
else
break
}
}
判断macthedTitle否title部分
bool TitleInfobookMatch(titleType& matchedTitle)
{
if (substring(title matchedTitle))
return true
else
return false
}
bool TitleInfobookMatch(isbnType& matchedISBN)
{
if (strcmp(isbn matchedISBN) 0)
return true
else
return false
}
bool TitleInfobookMatch(authorType& matchedAuthor)
{
if (substring(author matchedAuthor))
return true
else
return false
}
bool TitleInfobookMatch(publisherType& matchedPublisher)
{
if (substring(publisher matchedPublisher))
return true
else
return false
}
titleType *TitleInfogetTitle()
{
return &title
}
isbnType *TitleInfogetISBN()
{
return &isbn
}
authorType *TitleInfogetAuthor()
{
return &author
}
publisherType *TitleInfogetPublisher()
{
return &publisher
}
南JING航空航天学
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档