当前位置:文档之家› 超市商品管理系统含报告

超市商品管理系统含报告

超市商品管理的设计与实现1.系统描述1.1 问题说明要求设计并实现一个简单超市商品管理系统,至少实现数据的增加、修改、删除、查询和显示相应结果,内存数据用链表组织,数据文件用文本文件,用户界面用字符界面,枚举量用枚举类型表示。

1.2 数据需求1.3 功能需求2.系统设计2.1 开发平台计算机系统:Microsoft Windows XP;开发工具:Microsoft Visual Studio 6.0;语言:C++ 2.2内存数据结构设计用单链表表示商品数据记录,链表接点定义为:struct node{ProductsInfo productsInfo;node *pnext;};其中自定义数据类型ProductsInfo定义为:struct ProductsInfo //定义超市商品的相关属性{char no[14];char name[25];float price;int num;char sort[12];};枚举菜单类型与操作类型:enum MenuType {MAINMENU, SUBMENU}; //枚举菜单类型enum FuncType {NONE, ADD, PRINT, DELETE, MODIFY,QUERY, QB_NO, QB_NAME, QB_price,QB_num, QB_sort, SA VE, EXIT}; //枚举操作类型2.3数据文件设计数据记录保存在文本文件productsInfo.txt里,利用C++流类库进行数据读写操作,每条数据记录之间换行分隔开。

2.4用户界面设计用户界面为控制台字符模式,根据功能为用户设计了主菜单与分菜单,界面友好,易于操作,主菜单如下:cout << "*&*&*&*&*&*&*&*欢迎使用商品管理系统*&*&*&*&*&*&*\n";cout << "* *\n";cout << "* 请按下面的选单进行功能选择: *\n";cout << "* (1) 添加商品记录*\n";cout << "* (2) 显示商品清单*\n";cout << "* (3) 删除一条商品记录*\n";cout << "* (4) 修改一条商品记录*\n";cout << "* (5) 查询*\n";cout << "* (6) 保存至文档*\n";cout << "* (7) 退出*\n";cout<<"*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&\n";查询功能的分菜单如下:cout << "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*\n";cout << "* 商品信息管理系统*\n";cout << "*主菜单->查询*\n";cout << "* (1) 按商品编号查询*\n";cout << "* (3) 按商品价格查询*\n";cout << "* (4) 按商品分类查询*\n";cout << "* (5) 返回*\n";cout << "***********************************************\n";2.5具体功能设计根据功能需求分析,定义了如下功能函数:FuncType PrintMenu(MenuType which); //菜单选择函数node * CreateProList(char filename[]); //读取数据文件,建立数据链表void RemoveProList(); //撤销内存空间void RemoveQueryRes();void Save(char filename[]); //保存至文件void Print(node *pnode); //显示数据信息void Print(QueryRes *pnode);void modify(); //修改指定数据条目QueryRes * Query(ProductsInfo& productsInfo, FuncType func);//查询指定数据条目node * Add(ProductsInfo& productsInfo); //添加数据项bool Delete(); //删除指定条目ProductsInfo& GetproductsInfo(ProductsInfo& productsInfo); //从终端接收数据ProductsInfo& SetproductsInfo1(ProductsInfo& productsInfo,FuncType func);功能函数调用关系图如下:附:源程序清单//products.h//文件功能:定义超市商品的数据结构及其相关操作#include <iostream>#include <iomanip>#include <fstream>#include <string>struct ProductsInfo //定义超市商品的相关属性{char no[14];char name[25];float price;int num;char sort[12];};struct node //定义数据链表结点{ProductsInfo productsInfo;node *pnext;};struct QueryRes{node * pnode;QueryRes * pnext;};node *phead = NULL; //定义数据链表头指针QueryRes *pqueryres = NULL;enum MenuType {MAINMENU, SUBMENU}; //枚举菜单类型enum FuncType {NONE, ADD, PRINT, DELETE, MODIFY,QUERY, QB_NO, QB_NAME, QB_price,QB_num, QB_sort, SA VE, EXIT}; //枚举操作类型FuncType PrintMenu(MenuType which); //菜单选择函数node * CreateProList(char filename[]); //读取数据文件,建立数据链表void RemoveProList(); //撤销内存空间void RemoveQueryRes();void Save(char filename[]); //保存至文件void Print(node *pnode); //显示数据信息void Print(QueryRes *pnode);void modify(); //修改指定数据条目QueryRes * Query(ProductsInfo& productsInfo, FuncType func); //查询指定数据条目node * Add(ProductsInfo& productsInfo); //添加数据项bool Delete(); //删除指定条目ProductsInfo& GetproductsInfo(ProductsInfo& productsInfo); //从终端接收数据ProductsInfo& SetproductsInfo1(ProductsInfo& productsInfo,FuncType func);// products.h文件结束//products.cpp#include "products.h"using namespace std;FuncType PrintMenu(MenuType which) {FuncType func = NONE;int choice = 0;switch(which) {case MAINMENU: //主菜单选项cout << "*&*&*&*&*&*&*&*欢迎使用商品管理系统*&*&*&*&*&*&*\n";cout << "* *\n";cout << "* 请按下面的选单进行功能选择: *\n";cout << "* (1) 添加商品记录*\n";cout << "* (2) 显示商品清单*\n";cout << "* (3) 删除一条商品记录*\n";cout << "* (4) 修改一条商品记录*\n";cout << "* (5) 查询*\n";cout << "* (6) 保存至文档*\n";cout << "* (7) 退出*\n";cout<<"*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&\n";cout << "* 请选择(1-6):";cin >> choice;switch(choice) {case 1: func = ADD; break;case 2: func = PRINT; break;case 3: func = DELETE; break;case 4: func = MODIFY; break;case 5: func = QUERY; break;case 6: func = SA VE; break;case 7: func = EXIT;break;default: func = NONE; break;}break;case SUBMENU: //分菜单选项cout<<"*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*\n";cout << "* 商品信息管理系统*\n";cout << "*主菜单->查询*\n";cout << "* (1) 按商品编号查询*\n";cout << "* (2) 按商品名称查询*\n";cout << "* (3) 按商品价格查询*\n";cout << "* (4) 按商品分类查询*\n";cout << "* (5) 返回*\n";cout << "***********************************************\n";cout << "* 请选择(1-6):";cin >> choice;switch(choice) {case 1: func = QB_NO; break;case 2: func = QB_NAME; break;case 3: func = QB_price; break;case 4: func = QB_sort; break;case 5: func = EXIT; break;default: func = NONE; break;}break;default:cout << "没有查询到该条商品记录!!\n";break;}return func;}node * CreateProList(char filename[]) {node * p=NULL;ifstream products(filename);if(!products){cerr<<"文件不存在!请添加商品记录!"<<endl;return NULL;}while(!products.eof()) { //装载数据文件if(p = new node()) {products >> p->productsInfo.no;products >> p->;products >> p->productsInfo.price;products >> p->productsInfo.num;products >> p->productsInfo.sort;p->pnext = phead;phead = p;}}products.close();return phead;}void RemoveProList() { //撤销内存空间for(node *p2, *p1 = phead;p1;p1 = p2) {p2 = p1->pnext;delete p1;phead = NULL;}void RemoveQueryRes() {for(QueryRes *p2, *p1 = pqueryres;p1;p1 = p2) { p2 = p1->pnext;delete p1;}pqueryres = NULL;}void Save(char filename[]) { //保存至文档node * p;ofstream products(filename);if(!products) {return;}for(p = phead;p;p=p->pnext) {products << " " << p->productsInfo.no;products << " " << p->;products << " " << p->productsInfo.price;products << " " << p->productsInfo.num;products << " " << p->productsInfo.sort<<endl;}products.close();}void Print(node *pnode) { //输出数据for(node *p = pnode;p;p = p->pnext) {cout<<p->productsInfo.no << " " ;cout<<p-> << " " ;cout<<p->productsInfo.price << " " ;cout<<p->productsInfo.num << " " ;cout<<p->productsInfo.sort << "\n";}}void Print(QueryRes *pnode) {for(QueryRes *p = pnode;p;p = p->pnext) {cout << p->pnode->productsInfo.no << " ";cout << p->pnode-> << " ";cout << p->pnode->productsInfo.price << " ";cout << p->pnode->productsInfo.num << " ";cout << p->pnode->productsInfo.sort << "\n";}QueryRes * Query(ProductsInfo& productsInfo, FuncType func) { //查询功能实现int hasRes = 0;QueryRes *pquery = NULL;for(node *p = phead;p;p = p->pnext) {switch(func) {case QB_NO: //按编号查询if(!strcmp(p->productsInfo.no, productsInfo.no)) {hasRes = 1;}break;case QB_NAME: //按名称查询if(!strcmp(p->, )) {hasRes = 1;}break;case QB_price: //按价格查询if(p->productsInfo.price == productsInfo.price) {hasRes = 1;}break;case QB_sort: //按分类查询if(!strcmp(p->productsInfo.sort, productsInfo.sort)) {hasRes = 1;}break;default:break;}if(hasRes) {if(pquery = new QueryRes()) {pquery->pnode = p;pquery->pnext = pqueryres;pqueryres = pquery;}hasRes = 0;}}return pqueryres;}node * p;if(p = new node()) {strcpy(p->productsInfo.no, productsInfo.no);strcpy(p->, );p->productsInfo.price = productsInfo.price;p->productsInfo.num = productsInfo.num;strcpy(p->productsInfo.sort, productsInfo.sort);p->pnext = phead;phead = p;}return phead;}bool Delete() { //删除指定数据项cout<<"请输入商品编号:"<<endl;char no[14];cin>>no;if(phead==NULL) {cout<<" 不存在商品记录!"<<endl; return false;}node *p=phead;if(!strcmp(p->productsInfo.no, no)){phead=phead->pnext;return true;}for(phead;p->pnext;p = p->pnext){if(!strcmp(p->pnext->productsInfo.no, no)) break;}if(p->pnext==NULL){cout<<"不存在商品记录!"<<endl; return false;}p->pnext=p->pnext ->pnext;delete p->pnext;return true;}void modify() //修改指定条目{node *p=phead;if (p==NULL){cout<<"不存在商品记录!";return;}char no[14];cout<<"请输入要修改的商品编号:";for(p=phead;p;p = p->pnext){if(!strcmp(p->productsInfo.no, no)) break;}if (p==NULL){cout<<"不存在该编号的商品!\n";return;}cout<<"请重新输入该商品信息:";GetproductsInfo(p->productsInfo);}ProductsInfo& GetproductsInfo(ProductsInfo& productsInfo) { //从终端接收数据cout << "请输入商品编号: ";cin >> productsInfo.no;cout << "请输入商品名称: ";cin >> ;cout << "请输入商品价格: ";cin >> productsInfo.price;cout << "请输入商品数量: ";cin >> productsInfo.num;cout << "请输入商品类别: ";cin >> productsInfo.sort;return productsInfo;}ProductsInfo& SetproductsInfo1(ProductsInfo& productsInfo,FuncType func) { switch(func){case QB_NO:cout << "请输入商品编号: ";cin >> productsInfo.no;break;case QB_NAME:cout << "请输入商品名称:";cin >> ;break;case QB_price:cout << "请输入商品价格: ";cin >> productsInfo.price;break;case QB_num:cin >> productsInfo.num;break;case QB_sort:cout << "请输入商品类别: ";cin >> productsInfo.sort;break;}return productsInfo;}int main(){ProductsInfo productsInfo;int cont = 1;int cont1 = 1;phead = CreateProList("productsInfo.txt"); //装载数据文件while(cont) {switch(PrintMenu(MAINMENU)) {case ADD: //添加数据条目GetproductsInfo(productsInfo);phead = Add(productsInfo);break;case PRINT: //显示商品清单cout << "*&*&*&*&*&*&*&*以下是商品清单*&*&*&*&*&**&*&\n";Print(phead);break;case DELETE: //删除指定条目if(Delete())cout << "已删除!\n";else cout << "删除失败!\n";break;case MODIFY: //修改指定条目modify();break;case QUERY: //查询操作cont1 = 1;while(cont1) {FuncType func;func = PrintMenu(SUBMENU);switch(func) {case QB_NO:case QB_NAME:case QB_price:case QB_sort:SetproductsInfo1(productsInfo,func);Print(Query(productsInfo, func));RemoveQueryRes();break;case EXIT:cont1 = 0;break;default:break;}}break;case SA VE: //保存至文件Save("productsInfo.txt");break;case EXIT: //退出RemoveProList();cont = 0;break;default:break;}}return 0;}3.系统测试3.1 程序调试多个功能在执行时均出现健壮性较差的问题,输入非法数据后程序容易出错而停止运行,或是在查询、修改一条数据链表中记录时,也回出现类似情况,发现该问题后加入了检查输入数据非法性的语句,程序运行正常;另在int strcmp(char *,char *)函数使用时,未弄清该函数的返回值问题,相关功能便会出现相反的结果;再者便是一些常见的语法上的错误,一一改正之后,程序运行正常。

相关主题