版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、南京理工大学紫金学院VC+课程设计报告课 程:VC+课程设计系 别:计算机系班 级:计科一班学 号:120601105姓 名:付瑞课题名称:物品库存管理起止时间:2013.11.262013.12.11指导教师:朱 俊2013年 12 月1 程序功能介绍用文件系统实现的物品库存管理程序。一种商品的品种里面包括(<10个)品牌,以品种为单位,可以实现商品品种的添加、删除、查找、显示,以及商品的进货,出货等功能。2 课程设计要求(1)组成商品品种的品牌不限数量,设置一个最大值(比如10),增加一个成员变量指示品牌的具体数量。商品品种的数量是每个品牌的数量之和。(2)设计输出每日进货与出货的统
2、计表,要求进货与出货分别为两个文本文件,清单上列有进出货物的时间、品种描述,具体品牌的进出货数量,如果是出货清单,在每笔出货的清单后还要有该次提取货物的总价格。(3)商品品种以品种代码的顺序存放。3 对课程题目的分析该设计比较复杂,要对原程序做较大的修改,首先是数据的存放形式,因为要求数据按代码的顺序存放,并且进出货时对数据的各个组成成员都要做较大的修改。如果要用文件的形式存放,那么文件的读写就非常频繁,而且要使用大量的临时文件,因此建议使用链表的形式存放数据,在程序开始运行时读取固定文件中的数据,程序运行时全部数据都在内存进行操作。在程序运行结束前再将链表中的数据存放在原来的文件中,供下次运
3、行程序时读取。建议首先将文件读取这部分程序调试好,这样在调试程序时就不用每次都从键盘输入数据了,可以节省大量的时间。同时,对链表中结点的操作有很多典型的程序可以参考,不同的结点只是数据部分类型不同,所以只要在上面稍加修改就可以使用。4 程序设计和说明(说明算法思想、设计思路,给出重要的、关键的代码)(1)类的封装由于数据的存放形式使用链表的形式,所以对于程序的很多操作实际上都是要求对链表进行一系列处理。其中吧Citem类作为一个结点,因此包含了大量对链表进行操作的函数,为了满足程序的完整性与可读性,应将对链表操作的所有程序封装在一起。 class Brand /品牌类 . friend cla
4、ss CItem; /定义品种类为友元类; class CNode /结点类 . friend class CList; /定义链表类为友元类; class coustomer /客户类 .;(2)程序功能菜单的设置 程序主题采用菜单选项的形式,输入相应的菜单选项后程序可以反复运行,而其中还要求3.4.5.6.8.9.项各有一个菜单,分别是:按照商品品种名称和按照商品代码进行操作。 * * ¥欢迎使用物品库存管理系统¥ * * * * 设计者 付瑞 * * * * 指导老师 朱俊 * * * * 详细目录 1. 添加商品品种 2. 显示商品品种 3. 查询商品 4. 删除商品 5. 商品出库
5、6. 商品进库 7. 添加客户 8. 删除客户 9. 查询客户 10.显示客户资料 0. 退出系统 输入选择: int CItem:SetItem(int n) /置品种数据,正确返回1,当n为1时,是新进货物,输出至出清单文件cout<<"n输入商品名称:"Flush(cin);cin.getline(Item_name,20);cout<<"n输入商品代码:"cin>>Item_code;cout<<"n输入商品颜色:"Flush(cin);cin.getline(colour,20
6、);cout<<"n输入品牌数:"<<"(不超过"<<MAXNUM<<"个)"cin>>nBrnd;/循环实现品牌数据的输入,count为商品总数for(int i=0,count=0;i<nBrnd;i+)cout<<"n输入品牌"<<i+1<<"的数据n"cout<<"n输入品牌名称:"Flush(cin);cin.getline(brndi.brnd_nam
7、e,20);cout<<"n输入品牌代码:"cin>>brndi.Brand_code;cout<<"n输入数量:"cin>>brndi.quantity;cout<<"n输入价格:"cin>>brndi.brnd_price;count+=brndi.quantity;quantity=count;if(n=1)ofstream file("进货清单.txt",ios:out|ios:ate);if(!file)cout<<&qu
8、ot;错误,不能打开文件."getch();exit(1);timer=time(NULL);file<<ctime(&timer);file<<"品种"<<"t"<<"代码"<<"t"<<"颜色"<<"n"file<<Item_name<<"t"<<Item_code<<"t"<&
9、lt;colour<<"n"file<<"品牌"<<"t"<<"代码"<<"t"<<"数量"<<"t"<<"价格"<<"n"for(int i=0;i<nBrnd;i+)file<<brndi.brnd_name<<"t"<<brndi.Brand_
10、code<<"t"<<brndi.quantity<<"t"<<brndi.brnd_price<<"n"file<<"n"();return 1; 此函数的两个功能:第一个是在添加商品时从键盘输入商品的各种数据,调用这个功能时利用n的缺省值,在调用时不给n赋值;第二个是在进货时如果进的是新的品种,那么也要从键盘输入这个品种的各种数据,这部分与第一个功能相同,但是进货要输出进货清单,所以进货功能调用该函数时n设置为1,函数在运行时增加一个判断语
11、句,若n为1时,将所键入的数据输出至进货清单。void CItem:Show()/显示品种数据cout<<"品种"<<"t"<<"代码"<<"t"<<"颜色"<<"n"cout<<Item_name<<"t"<<Item_code<<"t"<<colour<<"n"cout&
12、lt;<"品牌"<<"t"<<"代码"<<"t"<<"数量"<<"t"<<"价格"<<"n"for(int i=0;i<nBrnd;i+)cout<<brndi.brnd_name<<"t"<<brndi.Brand_code<<"t"<<br
13、ndi.quantity<<"t"<<brndi.brnd_price<<"n"cout<<"nn"<<flush;system("pause");cout<<"n"这个函数也是与出货功能有关,与InModify()的函数类似。因为是库中的商品出货,所以商品品种必须存在,若不存在,则输出提示信息,出货失败。还有一种可能是商品品种曾经存在,但已经全部出完了,这时,该品种的各种数据还存在,只是数量为零。所以,在函数开始执行时要判
14、断库存量是否为零,若为零,则输出提示信息,出货失败。在出货成功结束时同样要将本品种的各种品牌的出货数据输出到出货清单中。同样,该函数也是对链表中所存在的结点的数据部分的修改。void CItem:OutModify()/出货,修改结点中的数据部分int choice,count,chuhuo,price=0;/chuhuo为出货量,price为总价格int *num;num=new intnBrnd;if(quantity=0)cout<<"数量为0."exit(1);for(int i=0;i<nBrnd;i+)/储存原来的数量numi=brndi.qu
15、antity;cout<<"品牌"<<"t"<<"代码"<<"t"<<"数量"<<"t"<<"价格"<<"n"for(i=0;i<nBrnd;i+)cout<<i+1<<"."<<brndi.brnd_name<<"t"<<brndi.B
16、rand_code<<"t"<<brndi.quantity<<"t"<<brndi.brnd_price<<"n"cout<<"nn"cout<<"输入数字选择出货商品或按0退出.n"cin>>choice;while(choice>=1&&choice<=nBrnd)cout<<"输入商品数量:"cin>>count;whil
17、e(count>brndchoice-1.quantity)cout<<"库存不足,重新输入:"cin>>count;brndchoice-1.quantity-=count;cout<<"出货成功,按0退出或按数字继续出货.n"cin>>choice;ofstream file("出货清单.txt",ios:out|ios:ate);if(!file)cout<<"错误,不能打开文件."getch();exit(1);timer=time(NULL
18、);file<<ctime(&timer);file<<"品种"<<"t"<<"代码"<<"t"<<"颜色"<<"n"file<<Item_name<<"t"<<Item_code<<"t"<<colour<<"nn"file<<"品
19、牌"<<"t"<<"代码"<<"t"<<"价格"<<"t"<<"出货量"<<"n"for(i=0;i<nBrnd;i+)if(chuhuo=numi-brndi.quantity)price=chuhuo*brndi.brnd_price;file<<brndi.brnd_name<<"t"<<brnd
20、i.Brand_code<<"t"<<brndi.brnd_price<<"t"<<chuhuo<<"n"file<<"总价格为:"<<price<<"nn"delete num;();InModify()同样也与进货功能有关。因为所进的品种可能是也有的品种,只是增加其中的数量而已。所以,在输入进货品种或品种代码时要判断是否是库中已有的品种,若是就调用这个函数,只从键盘输入具体的品牌数量或新增品牌数据
21、即可,而不用在键入品种的各种数据,同时,新键入的各种数据也输出到进货清单。实际上该函数是对链表中所存在的结点的数据部分的修改。此函数先判断出货量是不是大于库存量,如果大于将显示“库存不足,重新输入”。如果小于的话将会继续程序,通过brndchoice-1.quantity-=count;把原有量减去省下剩余量。void CItem:InModify()/已有商品,再次进货,修改结点中的数据部分char name20;char choice;int count,jinhuo=0;int prenBrnd=nBrnd; /原先品牌数int n=1;/用于判断是否继续进货int flag=0;/用于
22、判断是否新品牌int * num;num=new intprenBrnd;for(int i=0;i<nBrnd;i+)/储存原来的数量numi=brndi.quantity;while(n)cout<<"nn输入品牌名称:"Flush(cin);cin.getline(name,20);for(int i=0;i<nBrnd;i+)if(strcmp(brndi.brnd_name,name)=0)cout<<"nn输入进货数量:"cin>>count;brndi.quantity+=count;quan
23、tity+=count;flag=1;break;if(flag=0)strcpy(brndnBrnd.brnd_name,name);cout<<"n输入品牌代码:"cin>>brndnBrnd.Brand_code;cout<<"n输入数量:"cin>>brndnBrnd.quantity;cout<<"n输入价格:"cin>>brndnBrnd.brnd_price;quantity+=brndnBrnd.quantity;nBrnd+;cout<&l
24、t;"n继续进货:y/n "cin>>choice;if(choice='y'|choice='Y')n=1;else n=0;ofstream file("进货清单.txt",ios:out|ios:ate);if(!file)cout<<"错误,不能打开文件."getch();exit(1);timer=time(NULL);file<<ctime(&timer);file<<"品种"<<"t"
25、;<<"代码"<<"t"<<"颜色"<<"n"file<<Item_name<<"t"<<Item_code<<"t"<<colour<<"nn"file<<"品牌"<<"t"<<"代码"<<"t"<<
26、;"价格"<<"t"<<"进货量"<<"n"for(i=0;i<prenBrnd;i+)if(jinhuo=brndi.quantity-numi)file<<brndi.brnd_name<<"t"<<brndi.Brand_code<<"t"<<brndi.brnd_price<<"t"<<jinhuo<<"
27、;n"if(nBrnd>prenBrnd)for(i=prenBrnd;i<nBrnd;i+)file<<brndi.brnd_name<<"t"<<brndi.Brand_code<<"t"<<brndi.brnd_price<<"t"<<brndi.quantity<<"n"file<<"nn"delete num;(); void add()这个函数实现添加客户
28、资料功能。创建了一个“客户资料”文件,从键盘输入客户资料,再将客户的资料传到文件中,从而实现添加的功能。void customer:add() /加入客户资料 ofstream file( "客户资料.txt", ios:out |ios:ate ); if(!file) cout<<"错误,无法打开文件" getch(); exit(1); customer p2; p2.getdata(); /从键盘输入客户资料 /将该客户的资料传到文件中 (reinterpret_cast <char *> (&p2),sizeof
29、(customer);/reinterpret_cast将其他类型的数据转换为字符指针 void showab()这个函数实现的是显示客户资料的功能。首先以输入方式打开文件,读取“客户资料”文件,再读取,从而实现显示的功能。void customer:showab() /全部显示ifstream file( "客户资料.txt" ,ios:in); /以输入方式打开文件 if(!file)cout<<"错误,无法打开文件"getch(); exit(1); customer p2;(reinterpret_cast <char *>
30、; (&p2),sizeof(customer);/读取文件内容while(!()/读入正确,显示,接着读取p2.showdata();getch();(reinterpret_cast <char *> (&p2),sizeof(customer); void search()这个函数实现的是查询客户资料的功能。增加了一个子菜单,选择是按客户名称查询,或者是按客户代码查询,亦或者是退出。同样的,我们所需的数据是要从“客户资料”文件中读取的。void customer:search() /搜索char name110; int code; int choice; c
31、out<<"nn1. 按客户名称查询 "cout<<"nn2. 按客户代码查询 "cout<<"nn0. 退出 "cout<<"nn输入选择: " cin>>choice; switch(choice) case 1:cout<<"nn输入客户名称: " cin>>name1; code=0;break; case 2:cout<<"nn输入客户代码: " cin>>c
32、ode; strcpy(name1,"null");break;fstream file( "客户资料.txt" ,ios:in); if(!file)cout<<"错误,无法打开文件" getch();exit(1); char flag='a' customer p2; (reinterpret_cast<char *>(&p2),sizeof(customer); while( !() ) if(strcmp(p2.customer_name,name1)=0) | (p2.cus
33、tomer_code=code) p2.showdata(); getch(); flag='z' break; (reinterpret_cast<char *> (&p2),sizeof(customer); if(flag !='z') cout<<("nn客户未找到nn"); getch(); void remove()这个函数实现的是删除客户资料的功能。和search函数一样,也是添加了一个子菜单,打开文件,若文件存在,则删除原文件,否则显示,“错误 文件无法打开”,依次读取文件内容,将未删除的文件写
34、入temp中,然后再将temp文件中的内容写回file1中。void customer:remove() /删除客户 char name110; int code; int choice; cout<<"nn1. 按客户名称删除 " cout<<"nn2. 按客户代码删除 " cout<<"nn0. 退出 " cout<<"nn输入选择: " cin>>choice; if(choice=1) cout<<"nn输入客户名称: &qu
35、ot; cin>>name1; code=0; else cout<<"nn输入客户代码: " cin>>code; strcpy(name1,"null"); ifstream file( "客户资料.txt" ,ios:in ); ofstream temp( "delete2.txt", ios:trunc); if( !) cout<<"n无法打开文件n" getch(); exit(1); (0); temp.seekp(0); cust
36、omer p2; (reinterpret_cast<char *> (&p2),sizeof(customer); while( !() ) if( (strcmp(name1,p2.customer_name)=0) | (code=p2.customer_code) (reinterpret_cast<char *> (&p2),sizeof(customer); else temp.write(reinterpret_cast<char *>(&p2),sizeof(customer);/将未删除的文件写入temp中 (rei
37、nterpret_cast<char *> (&p2),sizeof(customer); (); temp.close(); ifstream temp1("delete2.txt",ios:in); ofstream file1("客户资料.txt", ios:trunc); temp1.seekg(0); (0); temp1.read( reinterpret_cast<char *> (&p2),sizeof(customer) ); while( !temp1.eof() )/将temp文件中的内容写回
38、file1 ( reinterpret_cast<char *> (&p2),sizeof(customer) ); temp1.read( reinterpret_cast<char *> (&p2),sizeof(customer) ); temp1.close(); (); 5 课程设计中遇到的问题及解决方法问题1: 怎么设置按任意见键继续。解决办法:通过百度知道,getch()那么就是按下就起效,按下的字符不可见,而getchar()就是按了以后还要再敲回车才会起效,并且按下的字符是可见的。 if(!outfile)cout<<&qu
39、ot;错误,不能打开文件"getch();exit(1);问题2: 怎样解决如果初始储存器中含有数据对程序的影响问题?解决办法:在实际操作中,可能会因错误而输入错误的字符,这时可能会对程序的正常运行造成影响,所以必须刷新输入流清除储存器中的数据,经过翻阅C语言方面的资料发现使用以下函数就可实现。inline istream & Flush(istream & stream) stream.clear();int chars_to_skip=stream.rdbuf()->in_avail();return stream.ignore(chars_to_skip);问题3: 怎样做到商品品种以品种代码的顺序存放?解决办法: 一开始我想到用文件的形式存放,那么文件的读写就非常频繁,而且要使用大量的临时文件。所以后来就考虑到可以使用链表的形式存放数据,在程序开始运行时读取固定文件中的数据,程序运行时全部数据都在内存进行操作。在程序运行结束前再将链表中的数据存放在原来的文件中,供下次运行程序时读取。只要将文件读取这部分程序调试好,在调试程序时就不用每次都从键盘输入数据了,可以节省大量的时间。问题4:为保证程序界面的美观,如何清屏?解决办法:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年河南信息统计职业学院单招职业技能考试参考题库带答案解析
- 2026年福建农林大学金山学院单招职业技能考试模拟试题带答案解析
- 医疗人才培养与储备计划
- 2026年常州纺织服装职业技术学院高职单招职业适应性测试备考题库有答案解析
- 2026年阜阳幼儿师范高等专科学校单招职业技能笔试备考试题带答案解析
- 0年度医疗设备采购回顾
- 2026年阜阳职业技术学院高职单招职业适应性考试备考题库带答案解析
- 2026年武夷学院单招职业技能考试模拟试题附答案详解
- 医学知识传播技巧
- 气相培训题库及答案
- 企业员工健康教育知识讲座
- 某汽车上市传播规划
- 活化水与健康
- 流体力学(刘鹤年版)第二版课后习题答案
- 用工结算单Excel模板
- YS/T 1148-2016钨基高比重合金
- JJF 1143-2006混响室声学特性校准规范
- GB/T 39597-2020出租汽车综合服务区规范
- 蒂森克虏伯无机房MC2安装说明
- 四年级数学下册解决问题练习题
- 幼儿园四季交替课件
评论
0/150
提交评论