超市商品管理系统+含报告.docx
武汉理工大学计算机基础强化训练课程设计超市商品管理的设计与实现1. 系统描述1.1 问题说明要求设计并实现一个简单超市商品管理系统,至少实现数据的增加、修改、删除、查询和显示相应结果,内存数据用链表组织,数据文件用文本文件,用户界面用字符界面,枚举量用枚举类型表示。1.2 数据需求编号数据项数据类型数据长度描述1编号字符串14商品的唯一标识2名称字符串25商品的名称3价格浮点型8商品的售价4数量整型4商品的库存数量5类别字符串12商品类别1.3 功能需求编号功能描 述1添加商品若该编号的商品在文件中不存在,则将该商品记录添加到文件中。2删除商品若该编号的商品存在文件中,则将该商品记录从文件中删除。3修改商品若该编号的商品存在文件中,则重新录入该商品记录。4显示清单显示商品清单5查询商品查询商品是否在文件中,若在则输出详细信息。查询操作可按多个数据项进行2.系统设计2.1 开发平台计算机系统:Microsoft Windows XP;开发工具:Microsoft Visual Studio 6.0;语言:C+2.2内存数据结构设计用单链表表示商品数据记录,链表接点定义为:struct node ProductsInfo productsInfo;node *pnext;其中自定义数据类型ProductsInfo定义为:struct ProductsInfo /定义超市商品的相关属性char no14;char name25;float price;int num;char sort12;枚举菜单类型与操作类型:enum MenuType MAINMENU, SUBMENU; /枚举菜单类型enum FuncType NONE, ADD, PRINT, DELETE, MODIFY,QUERY, QB_NO, QB_NAME, QB_price,QB_num, QB_sort, SAVE, 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 << "* (2) 按商品名称查询 *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); 功能函数调用关系图如下:mainCreateProListPrintMenuAddprintdeletemodifyquerysaveRemoveProListGetproductsInfoSetproductsInfo1附:源程序清单/products.h/文件功能:定义超市商品的数据结构及其相关操作#include <iostream>#include <iomanip>#include <fstream>#include <string>struct ProductsInfo /定义超市商品的相关属性char no14;char name25;float price;int num;char sort12;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, SAVE, 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/文件功能:products.h文件中操作的具体实现及主函数部分#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 = SAVE; 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;cout<< &*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&n"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->productsInfo.name;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->productsInfo.name;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->productsInfo.name << " " ;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->productsInfo.name << " "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->productsInfo.name, productsInfo.name) 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 * Add(ProductsInfo& productsInfo) /添加数据项node * p;if(p = new node() strcpy(p->productsInfo.no, productsInfo.no);strcpy(p->productsInfo.name, productsInfo.name);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 no14;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 no14;cout<<"请输入要修改的商品编号:"cin>>no;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 >> productsInfo.name;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 >> productsInfo.name;break;case QB_price:cout << "请输入商品价格: "cin >> productsInfo.price;break;case QB_num:cout << "请输入商品数量: "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 SAVE: /保存至文件Save("productsInfo.txt");break;case EXIT: /退出RemoveProList();cont = 0;break;default:break;return 0;3.系统测试3.1 程序调试多个功能在执行时均出现健壮性较差的问题,输入非法数据后程序容易出错而停止运行,或是在查询、修改一条数据链表中记录时,也回出现类似情况,发现该问题后加入了检查输入数据非法性的语句,程序运行正常;另在int strcmp(char *,char *)函数使用时,未弄清该函数的返回值问题,相关功能便会出现相反的结果;再者便是一些常见的语法上的错误,一一改正之后,程序运行正常。3.2结果测试分析运行程序,结果如下:输入1后进行添加操作,如下:系统返回主菜单后再添加两条商品记录,输入2显示清单:返回主菜单后输入3进行删除操作,如下:选择修改功能,运行如下:如选择查询功能各项功能运行正常,达到预期要求。4.心得体会通过本次训练,在编程的过程中对抽象建模、算法设计、计算过程规划与实施有了更深切认识,更重要的还培养严谨认真的科学态度和严谨务实的工作作风。一个程序完成之初难免有很多漏洞甚至错误需要修正,语法错误相对来说要容易调试一些,但有两点需要特别指出:一是应该用规范化的格式输入源程序,函数体内、循环体内等都应该缩进一个TAB位,相应的块语句的两个大括号都应保持在同一列上,函数体之间、模块之间都应用空行隔开,这就解决了各种匹配的问题,更重要的是它极大的增强的程序的可读性。二是应该注意函数的实参与形参的传递问题,要尽量保持两者类型的匹配,(当不匹配又可通过编译时会发生数据类型的隐式转换,这样会产生很多不安全且又很难找到的错误)当不需要改变形参时,只需传入变量,如果想在函数体内改变函数的外部变量,则传入指针。在编译错误为0的情况下,不要高兴的太早,此时也要关注一下警告warning,每一个warning都有他一定的道理。当修改的只剩下一些无关紧要的时,才可以连接运行。这其中出现的一些逻辑错误才是调试的难点所在。在连接程序时可能出现的问题可能是,库连接不上、标志符有问题(如函数名不应该以数字开头命名,定义的标志符与编译器内部或库内部定义的标识符相冲突。)5.参考文献1 严蔚敏 吴伟民.数据结构(C语言版).清华大学出版社(北京).1997.042 郑莉,董渊,张瑞丰.C+程序设计(第三版).清华大学出版社.20033 钟珞.计算机科学导论(第二版).武汉理工大学出版社.2004.014 闵联营,何克右. C+程序设计教程(第二版).武汉理工大学出版社.2005.075 张力.Visual c+高级编程.人民邮电出版社.2002.0315