某公司的库存管理系统1.设计容:对课程《算法与程序设计》中的相关容进行综合设计或应用(具体课题题目见后面的供选题目)。
(一)、课程设计题目:某公司的库存管理系统(二)、目的与要求:1、目的:(1)要求学生达到熟练掌握 C++语言的基本知识和技能;(2)基本掌握面向对象程序设计的基本思路和方法;(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:(1)要求利用面向对象的方法以及 C++的编程思想来完成系统的设计;(2)要求在设计的过程中,建立清晰的类层次;(3)在系统中至少要定义四个类,每个类中要有各自的属性和方法;(4)在系统的设计中,至少要用到面向对象的一种机制。
3、创新要求:基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。
4、写出设计说明书(三)、设计方法和基本原理:1、问题描述(功能要求):某公司现有以下设备:普通电视机、DVD、带 DVD 的电视机,带 DVD 的电视机的售价为普通电视机和 DVD 单价之和的 80%,要求对所有的库存设备都能按照品名进行显示、查找、增加和删除、保存的功能。
2、问题的解决方案:根据系统功能要求,可以将问题解决分为以下步骤:(1)分析系统中的各个实体之间的关系及其属性和行为;(2)根据问题描述,设计系统的类层次;(3)完成类层次中各个类的描述(包括属性和方法);(4)完成类中各个成员函数的定义;(5)完成系统的应用模块;(6)功能调试;(7)完成系统总结报告以及系统使用说明书。
2.设计要求:课程设计报告正文容(包括系统设计要求,设计思路,系统功能模块图,系统流程图,类的层次图(包括类成员列表),调试过程,关键程序代码,总结,参考书目等)。
(一)需求分析系统设计目的与意义;系统功能需求(系统流程图);输入输出的要求;(二)总体设计系统功能分析;系统功能模块划分与设计(系统功能模块图)。
(三)详细设计数据库需求分析;数据库概念结构设计(E-R 图);数据库逻辑结构设计;类层次图。
(四)界面设计与各功能模块实现(五)系统调试调试问题出现的主要问题:编译语法错误及修改,重点是运行逻辑问题修改和调整。
(六)使用说明及编程体会说明如何使用你编写的程序,详细列出每一步的操作步骤。
(七)关键源程序(带注释)3目录一、系统设计分析 (6)二、程序设计明 (6)1.四个类完成实体类的定义 (8)2.公司库存管理系统中各模块功能的实现 (8)3.添加物品信息模块 (9)4.显示物品信息模块 (10)5.查找物品信息模块 (10)6.删除物品信息模块 (11)7.保存物品信息模块 (12)三、系统调试..............................................................................................12四、总结 (12)五、附件.............................................................................................. (12)一、系统设计分析公司库存管理系统程序中,系统要求我们设计四个类:由家电类派生出来的普通电视机类和 DVD 类;再由普通电视机类和 DVD 类共同派生出来的带 DVD 的普通电视机类。
在这个系统中我们需要实现六个功能:1、显示物品功能;2、添加物品功能;3、查找物品功能;4、删除物品功能;5、保存物品功能。
公司库存管理系统主要是为了让用户根据自己的需要自己想输入的一些物品,然后将其保存,当用户想查看所有物品时可以查看,想添加物品时可以添加自己想添加的相关物品信息,当用户想删除自己认为应当删除的物品时,用户可以根据自己的需要输入用户想删除的物品名称,然后将物品的相关信息删除;当用户想查找某一物品时,用户可以输入这一物品的名称然后查看这一物品的所有信息。
在这个系统中,用户可以根据系统的提示分别执行用户自己想实现的功能,比如:在添加物品信息功能中,用户可以输入自己想输入的物品信息;在显示物品功能中用户可以查看用户所保存的所有物品信息;在查找物品功能中用户可以根据自己的需要输入自己想查找的物品名称,然后查找用户想查找的物品的所有相关信息;在删除物品功能中用户可以根据自己的需要输入自己想删除的物品名称,然后进行删除;在物品保存功能中,当用户需要实现物品的保存时,系统会自动打开文件然后将用户输入的数据保存在用户给定的文件中。
二、程序设计说明在公司库存管理系统中,物品信息主要为:物品名称,物品生产日期,物品的单价和数量。
公司库存管理系统中系统需要我们实现六个功能:2、添加物品功能;3、显示物品功能;4、查找物品功能;5、删除物品功能;6、保存物品功能。
在物品添加功能中用户可以根据自己的需要输入自己想输入的物品信息(名称、生产日期、数量),然后将其保存。
程序开始时,系统会提示用户先进行哪个功能,然后用户可根据需要输入相关型号的物品信息,输入完之后会再次提示用户是否继续输入,然后再根据提示进行相关操作。
一般情况下,我们先进行添加物品这一功能中,当用户选择此功能时系统会将录入这些信息并保存,以便下次查找。
在显示物品功能中,用户可以根据系统的提示输入想查找的相关物品的信息,之后系统便会弹出物品信息。
在删除物品功能中,用户根据系统的提示输入自己想删除的物品名称,然后将其删除。
在查找物品功能中,用户根据系统提示输入自己想查找的相关物品名称,然后在库存中的相关物品中查找,如果有此物品则会显示此物品的所有信息,如果没有则会显示无此物品信息。
在保存物品功能中,当用户选择此功能时,系统会将用户需要的所有物品保存。
详情:1.四个类完成实体类的定义Wiring类数据成员:物品名称,年.月.日.物品数量成员函数:设置价格函数class wiring{public:char name[10];//物品名称int year,month,day;//出厂日期int number;//物品数量TV类class TV:virtual public wiring {public:TV() {}void set1(char *n,int y,int m,int d,int nn){strcpy(name,n); year=y;month=m;day=d;number=nn;}void pay() {price1=3000;}// 普通电视机售价DVD类class DVD:virtualpublic wiring{public:DVD() {}void set2(char *n,inty,int m,int d,int nn){strcpy(name,n);year=y;month=m;day=d;number=nn;}void pay(){price2=2000;}//DVD售价float price2;};TV_DVD类class TV_DVD:publicTV,public DVD{public:TV_DVD() {}void set3(char *n,int y,int m,intd,int nn){strcpy(name,n);year=y;month=m;day=d;number=nn;}void pay(){price=(2000+3000)*80/100;}//带 DVD 的普通电视机售价float price;};float price1;};2.公司库存管理系统中各功能模块的实现:菜单1、添加物品信息2、显示物品信息3、删除物品信息3、查找物品信息5、保存物品信息6、保存物品信息3、添加物品信息模块:添加物品信息添加普通电视机的相关信息添加 DVD 的相关信息添加带 DVD 的普通电视机的相关信息1、物品名称2、生产日期3、产品数量4、显示物品信息模块:在输入完第一次的添加产品后显示产品时,即显示出产品信息。
5、查找物品信息:查找物品信息查找类型查找名称返回后根据菜单选择 3,即查找物品信息。
依照提示输入所查找的类型和名称,则弹出所需物品信息。
6、删除物品信息:删除物品删除物品信息物品名称7、最后根据提示将保存物品信息。
三、系统调试在调试程序中,出现很多问题,比如有的字符未定义,少花括号,分号,等等一些细节问题。
后来一个一个慢慢改,感觉很是麻烦。
还有显示有一个函数非法定义,后来经过同学帮忙才知道原来是花括号缺少的问题。
在调试中,我在添加物品信息中,当我输入完一类物品信息后,想输入另一物品信息时,无法继续输入,总是输入同一物品信息,后来当我在循环中想退出 for 语句循环时,在需要退出时加一个 break 语句就可以退出当前循环进行其他步骤。
在调试中,我深刻体会到循环语句的重要性,一个不留神就会把数据弄错,同时也尝到用 while 语句的妙用,感觉比do…while语句好用多了,所以在程序中就多次用到了 while 语句,用do…while语句的话,程序就要先执行一次,在判断那个语句是否正确,如果正确就会继续执行该程序段,否则就会退出程序。
而用 while 语句的话则是先判断那个语句是否正确,如果正确就会执行该程序段,否则不执行。
四、总结程序设计是一个很复杂的问题,有的时候自己感觉没有出现任何错误,但是一运行,错误一大堆。
小问题也随处可见。
所以感觉编程这份工作的确是需要付出很大的努力,要游刃有余的使用每个函数,而不用老是翻书查看,像我在建立类,需要创建派生类时,还需要翻书查看具体容,这是对书本知识不熟练的表现。
在完善程序时,感觉添加物品信息时类型太少了,只要输入物品类型、名称、生产日期和产品数目。
本来还打算多加几个,但又觉得太麻烦,所以就放弃了。
做完这次课程设计,深深的感到自己还有很大不足之处。
所以下定决心这个寒假回家好好补补课。
附件:#include<iostream>#include<fstream>#include<cstring>#include<windows.h>using namespace std;class wiring{public:char name[10];//物品名称int year,month,day;//出厂日期int number;//物品数量wiring(){}//构造函数~wiring(){}//析构函数virtual void pay(){}//设置价格函数};class TV:virtual public wiring{public:TV(){}void set1(char*n,int y,int m,int d,int nn){strcpy(name,n);year=y;month=m;day=d;number=nn;}void pay(){price1=3000;}//普通电视机售价float price1;};class DVD:virtual public wiring{public:DVD(){}void set2(char*n,int y,int m,int d,int nn){strcpy(name,n);year=y;month=m;day=d;number=nn;}void pay(){price2=2000;}//DVD 售价float price2;};class TV_DVD:public TV,public DVD{public:TV_DVD(){}void set3(char*n,int y,int m,int d,int nn){strcpy(name,n);year=y;month=m;day=d;number=nn;}void pay(){price=(2000+3000)*80/100;}//带 DVD 的普通电视机售价float price;};TV t1[20];DVD d1[20];TV_DVD td1[20];static int k(0),k1(0),k2(0);void main()//主函数{void caidan();caidan();}void caidan(){void addw();//添加物品信息void shown();//显示物品信息void selectw();//删除物品信息void searchw();//查找物品信息void savew();//保存物品信息int a1;system("color0D");cout<<"\n";cout<<"\t\t************************\n";cout<<"\t(1) *** 添加物品信息*** \n";cout<<"\t(2) *** 显示物品信息*** \n";cout<<"\t(3) *** 查找物品信息***\n";cout<<"\t(4) *** 删除物品信息***\n";cout<<"\t(5) *** 保存物品信息***\n";cout<<"\t(6) *** 退出***\n";cout<<"\t\t************************\n";cout<<"\n 请输入 1 或 2 或 3 或 4 或 5 或 6 进行你所要执行地下一步动作:\n";cin>>a1;while(a1!=1&&a1!=2&&a1!=3&&a1!=4&&a1!=5&&a1!=6) {cout<<"\n 请重新输入数字 1 或2 或3 或4 或5 或 6:";cin>>a1;}if(a1==1) addw();if(a1==2) shown();if(a1==3) searchw();if(a1==4) selectw();if(a1==5) savew();if(a1==6) cout<<"\n 退出程序!\n";}void addw()//添加物品信息函数{void caidan();//菜单函数char a[10];int m,n,h,n1,rr,i1,v,i=9,r1;cout<<"\n 请输入数字键添加对应的物品信息(1-普通电视机2-DVD3-带 DVD 的普通电视机):";while(i!=0){cin>>i;if(i==1){cout<<"\n 请输入普通电视机的相关信息!\n";for(v=k;v<20;v++){cout<<"物品名称:";cin>>a;cout<<"\n 物品出厂日期:";cin>>m>>n>>h;cout<<"\n 物品数量:";cin>>n1;t1[v].set1(a,m,n,h,n1);t1[v].pay();k++;cout<<"\n 想继续添加普通电视机的相关信息吗?(1-是2-否):";cin>>i1;while(i1!=1&&i1!=2){cout<<"\n 请重新输入数字 1 或 2:";cin>>i1;}if(i1==1){cout<<"\n 请继续输入普通电视机的相关信息!\n";}else break;}}if(i==2){cout<<"\n 请输入 DVD 的相关信息!\n";for(v=k1;v<20;v++){cout<<"物品名称:";cin>>a;cout<<"\n 物品出厂日期:";cin>>m>>n>>h;cout<<"\n 物品数量:";cin>>n1;d1[v].set2(a,m,n,h,n1);d1[v].pay();k1++;cout<<"\n 想继续添加 DVD 的相关信息吗?(1-是2-否):";cin>>i1;while(i1!=1&&i1!=2){cout<<"\n 请重新输入数字 1 或 2:";cin>>i1;}if(i1==1){cout<<"\n 请继续输入 DVD 的相关信息!\n";}else break;}}if(i==3){cout<<"\n 请输入带 DVD 的普通电视机的相关信息!\n";for(v=k2;v<20;v++){cout<<"物品名称:";cin>>a;cout<<"\n 物品出厂日期:";cin>>m>>n>>h;cout<<"\n 物品数量:";cin>>n1;td1[v].set3(a,m,n,h,n1);td1[v].pay();k2++;cout<<"\n 想继续添加带 DVD 的普通电视机的相关信息吗?(1-是2-否):";cin>>i1;while(i1!=1&&i1!=2){cout<<"\n 请重新输入数字 1 或 2:";cin>>i1;}if(i1==1){cout<<"\n 请继续输入带 DVD 的普通电视机的相关信息!\n";}if(i1==2)break;}}cout<<"\n 想添加其他物品的相关信息吗?(1-是2-否):";cin>>i1;while(i1!=1&&i1!=2){cout<<"\n 请重新输入数字 1 或 2:";cin>>i1;}if(i1==1) {cout<<"\n 请输入数字输入相对应的物品信息(1-普通电视机2-DVD3-带DVD 的普通电视机):";}if(i1==2)break;}cout<<"想保存你所输入得数据吗?(1-是2-否):";cin>>rr;while(rr!=1&&rr!=2){cout<<"\n 请重新输入数字 1 或 2:";cin>>rr;}if(rr==1){ofstream ofile("wiring.txt",ios_base::out);for(v=0;v<k;v++){ofile<<"\n 普通电视机的名称:"<<t1[v].name<<"\n 普通电视机的出厂日期:"<<t1[v].year<<"/"<<t1[v].month<<"/"<<t1[v].day<<"\n 普通电视机的单价:"<<t1[v].price1<<"\n 普通电视机的数量:"<<t1[v].number<<endl;}for(v=0;v<k1;v++){ofile<<"\nDVD 的名称:"<<d1[v].name<<"\nDVD 的出厂日期:"<<d1[v].year<<"/"<<d1[v]. month<<"/"<<d1[v].day<<"\nDVD 的单价:"<<d1[v].price2<<"\nDVD 的数量:"<<d1[v]. number<<endl;}for(v=0;v<k2;v++){ofile<<"\n 带 DVD 的普通电视机的名称:"<<td1[v].name<<"\n 带 DVD 的普通电视机的出厂日期:"<<td1[v].year<<"/"<<td1[v].month<<"/"<<td1[v].day<<"\n 带 DVD 的普通电视机的单价:"<<td1[v].price<<"\n 带 DVD 的普通电视机的数量:"<<td1[v].number<<endl;}ofile.close();cout<<"\n 物品信息已储存!";cout<<"\n 按键 1 返回菜单:";cin>>r1;while(r1!=1) {cout<<"\n 请重新输入数字 1:";cin>>r1;}if(r1==1) {system("cls");caidan();}if(r1==2) {cout<<"\n 退出程序!";}}if(rr==2){cout<<"\n 按键 1 返回菜单 2 退出程序:";cin>>r1;while(r1!=1&&r1!=2){cout<<"\n 请重新输入数字 1 或 2:";cin>>r1;}if(r1==1) {system("cls");caidan();}if(r1==2) {cout<<"\n 退出程序!";}}}void shown()//显示物品信息{cout<<"\n 从文件中读取物品信息\n";char ch;int nn;ifstream ofile("wiring.txt");while(ofile.get(ch))cout<<ch;ofile.close();cout<<"请按键 1 返回菜单或按键 2 退出程序:";cin>>nn;while(nn!=1&&nn!=2){cout<<"请重新输入数字 1 或 2:";cin>>nn;}if(nn==1){system("cls");caidan();}if(nn==2)cout<<"退出程序!\n";}void searchw()//查找物品信息{void caidan();char namestr[20];int rr;int i,j;cout<<"\n 请输入你想查找的物品类型(1-普通电视机2-DVD3-带 DVD 的普通电视机):"; cin>>rr;while(rr!=1&&rr!=2&&rr!=3) {cout<<"\n 请重新输入数字 1 或 2 或 3:";cin>>rr;}if(rr==1){cout<<"\n 请输入你要查找的普通电视机名称:";cin>>namestr;for(i=0;i<k;i++){if(strcmp(namestr,t1[i].name)==0){cout<<"\n 普通电视机的名称:"<<t1[i].name<<"\n 普通电视机的出厂日期:"<<t1[i].year<<"/"<<t1[i].month<<"/"<<t1[i].day<<"\n 普通电视机的单价:"<<t1[i].price1<<"\n 普通电视机的数量:"<<t1[i].number<<endl;break;}}if(i==k)cout<<"\n 对不起,没有你所要的普通电视机的相关信息!\n"; }if(rr==2){cout<<"\n 请输入你要查找的 DVD 名称:";cin>>namestr;for(i=0;i<k1;i++){if(strcmp(namestr,d1[i].name)==0){cout<<"\nDVD 的名称:"<<d1[i].name<<"\nDVD 的出厂日期:"<<d1[i].year<<"/"<<d1[i]. month<<"/"<<d1[i].day<<"\nDVD 的单价:"<<d1[i].price2<<"\nDVD 的数量:"<<d1[i]. number<<endl;break;}}if(i==k1)cout<<"\n 对不起,没有你所要的 DVD 的相关信息!\n";}if(rr==3){cout<<"\n 请输入你要查找的带 DVD 的普通电视机的名称:";cin>>namestr;for(i=0;i<k2;i++){if(strcmp(namestr,td1[i].name)==0){cout<<"\n 带 DVD 的普通电视机的名称:"<<td1[i].name<<"\n 带 DVD 的普通电视机的出厂日期:"<<td1[i].year<<"/"<<td1[i].month<<"/"<<td1[i].day<<"\n 带 DVD 的普通电视机的单价:"<<td1[i].price<<"\n 带 DVD 的普通电视机的数量:"<<td1[i].number<<endl;break;}}if(i==k2)cout<<"\n 对不起,没有你所要的带 DVD 的普通电视机的相关信息!\n";}cout<<"\n 请输入数字键 1 返回菜单或数字键 2 退出程序:";cin>>j;while(j!=1&&j!=2){cout<<"\n 请重新输入数字 1 或 2:";cin>>j;}if(j==1){system("cls");caidan();}if(j==2)cout<<"\n 退出程序!";}void selectw()//删除物品信息{void caidan();char namestr[20];int rr,i,r1,i1(-1),i2(-1),i3(-1);cout<<"\n 请输入你要删除的物品信息(1-普通电视机2-DVD3-带 DVD 的普通电视机):"; cin>>rr;while(rr!=1&&rr!=2&&rr!=3){cout<<"\n 请重新输入数字 1 或 2 或 3:";cin>>rr;}if(rr==1){cout<<"\n 请输入你想删除的普通电视机名称:";cin>>namestr;for(i=0;i<k;i++) {if(strcmp(namestr,t1[i].name)==0)i1=i;}}if(rr==2){cout<<"\n 请输入你想删除的 DVD 名称:";cin>>namestr;for(i=0;i<k1;i++) {if(strcmp(namestr,d1[i].name)==0)i2=i;}}if(rr==3){cout<<"\n 请输入你想删除的带 DVD 的普通电视机的名称:";cin>>namestr;for(i=0;i<k2;i++) {if(strcmp(namestr,td1[i].name)==0)i3=i;}}cout<<"想保存删除后的信息吗?(1-是2-否):";cin>>r1;while(r1!=1&&r1!=2){cout<<"请重新输入数字 1 或 2:";cin>>r1;}if(r1==1){ofstream ofile("wiring.txt",ios_base::out);for(i=0;i<k;i++){if(i==i1)continue;else{ofile<<"\n 普通电视机的名称:"<<t1[i].name<<"\n 普通电视机的出厂日期:"<<t1[i].year<<"/"<<t1[i].month<<"/"<<t1[i].day<<"\n 普通电视机的单价:"<<t1[i].price1<<"\n 普通电视机的数量:"<<t1[i].number<<endl;}}for(i=0;i<k1;i++){if(i==i2)continue;else{ofile<<"\nDVD 的名称:"<<d1[i].name<<"\nDVD 的出厂日期:"<<d1[i].year<<"/"<<d1[i]. month<<"/"<<d1[i].day<<"\nDVD 的单价:"<<d1[i].price2<<"\nDVD 的数量:"<<d1[i]. number<<endl;}}for(i=0;i<k2;i++){if(i==i3)continue;else{ofile<<"\n 带 DVD 的普通电视机的名称:"<<td1[i].name<<"\n 带 DVD 的普通电视机的出厂日期:"<<td1[i].year<<"/"<<td1[i].month<<"/"<<td1[i].day<<"\n 带 DVD 的普通电视机的单价:"<<td1[i].price<<"\n 带 DVD 的普通电视机的数量:"<<td1[i].number<<endl;}}ofile.close();cout<<"\n 物品信息已保存!\n";}cout<<"按键 1 返回菜单,2 退出程序:";cin>>r1;while(r1!=1&&r1!=2){cout<<"请重新输入数字 1 或 2:";cin>>r1;}if(r1==1){system("cls");caidan();}if(r1==2)cout<<"退出程序!\n";}void savew()//保存物品信息{void caidan();ofstream ofile("wiring.txt",ios_base::out);int i,rr;for(i=0;i<k;i++){ofile<<"\n 普通电视机的名称:"<<t1[i].name<<"\n 普通电视机的出厂日期:"<<t1[i].year<<"/"<<t1[i].month<<"/"<<t1[i].day<<"\n 普通电视机的单价:"<<t1[i].price1<<"\n 普通电视机的数量:"<<t1[i].number<<endl;}for(i=0;i<k1;i++){ofile<<"\nDVD 的名称:"<<d1[i].name<<"\nDVD 的出厂日期:"<<d1[i].year<<"/"<<d1[i]. month<<"/"<<d1[i].day<<"\nDVD 的单价:"<<d1[i].price2<<"\nDVD 的数量:"<<d1[i]. number<<endl;}for(i=0;i<k2;i++){ofile<<"\n 带 DVD 的普通电视机的名称:"<<td1[i].name<<"\n 带 DVD 的普通电视机的出厂日期:"<<td1[i].year<<"/"<<td1[i].month<<"/"<<td1[i].day<<"\n 带 DVD 的普通电视机的单价:"<<td1[i].price<<"\n 带 DVD 的普通电视机的数量:"<<td1[i].number<<endl;}ofile.close();cout<<"\n 物品信息已储存!";cout<<"\n 输入数字键 1 返回菜单,2 退出程序:";cin>>rr;while(rr!=1&&rr!=2){cout<<"\n 请重新输入数字 1 或 2:";cin>>rr;}if(rr==1) {system("cls");caidan();}//清屏并返回菜单else {cout<<"\n 退出程序!";}}。