物品库存管理课程设计报告0616150140

更新时间:2024-01-30 04:45:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程设计名称: 物品库存管理系统 难易程度: A级 指导教师: 刘 永 班级: 06161501 学号: 0616150140 姓名: 王 绿 原

C++课程设计报告

姓名 王绿原 学号 0616150140 班级 06161501 任课教师 刘永 时间 9月

选定题目 物品库存管理系统 评定难易级别 A 程序功能简介

用文件系统实现的物品库存管理程序,一种商品里面包括三个品牌,以品种为单位,可以实现品种的添加、删除、查找、显示等功能。

程序设计要求

⑴ 组成商品品种的品牌不限数量,设置一个最大值(比如10),增加一个成员变量指

示品牌的具体数量。商品品种数量是每个品牌的数量之和。 ⑵ 设计输出每日进货与出货的统计表,要求进货与出货分别为两个文本文档,清单上

列有进货的时间、品种描述,具体品牌进出货数量,如果是出货清单,在每笔出货清单后还要有该次提取货物的总价格。 ⑶ 商品品种以品种代码的顺序存放。

程序设计思想

1. 类的封装

源程序的结构比较简单,只有Brand与CItem类,而现在要求对链表进行处理,其中把CItem类着为一个结点,而且后面程序要求对数据进行大量的各种操作而其实就是对链表进行操作,因此包含了大量的对链表进程操作的函数,为了满足程序完整性与可读性,应将对链表操作的所有程序封装在一起。

class Brand //品牌类 {

??

friend class CItem; //定义品种类为有元类 friend class CNode; //定义结点类为有元类 friend class Clist; //定义链表类为有元类 };

class CItem//品种类 {

??

friend class CList;//定义链表类为有元类

friend class CNode; //定义结点类为有元

};

class CList//链表类

{ ??

friend class CNode;//定义结点类为有元类 }list;//说明一个对象

注:省略部分详见源程序代码及课程设计教材提示部分 2. 程序各功能菜单的设置

程序主题采用菜单选项的形式,输入相应的菜单选项后程序可以反复运行, 而其中还要求3、4、5、6各有一个菜单,分别是:按照商品品种名称 和按照商品代码进行操作。

***********************************************************

请选择以下功能:

1.添加商品品种 2.显示商品品种 3.查询商品 4.删除商品 5.商品出库 6.商品进库 0.退出系统:

*********************************************************** 3.程序设计具体实现过程:

⑴添加商品品种

共调用四个函数,它们是SetItem、InputData、Insert、ModifyRecord

其中SetItem是添加商品品种信息同时产生一个指向数据成员的指针,而InputData是 InputData就是将该指针所指向的数据的起始地址赋给Pdata指针而Pdata又是CNode类的数据成员,因此就通过此过程,讲输入的数据产生为为一个结点类的对象,而后面 Insert()函数就将产生的结点类对象按照一定的顺序插入到链表中。总的来说数据就是通 过这几个过程完成输入工作的。关于Insert()函数的实现过程: 在设计添加记录程序的过程中,我想是否能在输入数据以后程序自动把数据按照工资的钱数从少到多排序,以便在显示记录当中方便查看。这个问题我思考了很长时间,最终在老师的帮助下运用指针得以实现。函数的第一个参数head指向链表的第一个结点,第二个参数p指向要插入的结点。第一种特殊情况是head的值为0,表明是空链表,使head指向这结点(A行),并使链表尾指针置为0(B行)。第二种特殊情况是,p所指向的结点插入链表首部(满足C行条件)。这时将head所指向的链表接在p所指向的结点之后(D行),并使head指向新的链表首部(E行)。第三种情况要从链表上找到插入位置,然后把新结点插入。F行的循环语句实现查找过程,这完全类同于删除一结点中的查找过程。查找结束后分二种情况:首先是当p2->pData->GetItemCode()pData->GetItemCode()时,将p所指向的结点插入到链表尾,G行和H行完成这一功能。另一种情况是将p所指向的结点插入p1和p2所指向的结点之间,I行和J行完成这一功能。(注:void CList::Insert(CNode*p)//按代码的顺序插入一个结点 {

CNode*p1,*p2; if (pHead==0) { pHead=p;//A

p->pNext=0;//B

}

else if (pHead->pData->GetItemCode()>=p->pData->GetItemCode())//C { p->pNext=pHead;//D pHead=p//E; } else { p2=p1=pHead;

while (p2->pNext&&p2->pData->GetItemCode()pData->GetItemCode())//F { p1=p2; p2=p2->pNext; }

if (p2->pData->GetItemCode()pData->GetItemCode()) { p2->pNext=p;//G

p->pNext=0;//H

} else {

p->pNext=p2//I; p1->pNext=p;//J } } } )

(2)显示商品品种

这个过程算是整个过程中最简单的,只是利用Showlist函数就可以了,而Showlist

是我们以前经常看见过的,而现在可以照搬下来,运行时调用此函数就可以完成数据的显示工作。 (3)-查询商品

这一过程相对来说较为复杂,因为他是后面几个程序的支撑部分,他涉及到查询的方式,包括按照商品品种代码和按照商品品种名称。关于这两种方式查询,包括了可以利用两个函数,他们是CompareName和GetItemCode();但是我们在设计程序的时候并没有调用这两个函数,而是直接插入两个函数的代码,因为这两个函数的代码都特别简单。此段函数代码为:CNode*CList::LookUp()//查找指定数据,返回数据所在结点的指针,若无返回零 {

cout<<\按商品名称操作\\t\\n(2)按商品代码操作\\t\\t\\n\ int choice,code; cin>>choice; CNode*p1,*p2;

CItem *m;

char * name=new char []; if (choice==1) {

cout<<\输入商品名称\\t\ cin>>name;

m=new CItem(name); } ??

}其他详细代码请参看设计的程序的代码。 4-删除商品

调用DeleteNode()函数就可以,这一的关键之处是怎么写好这个函数,DeleteNode()在课本上已经见过,这里的要求其实就是要将条件查询与删除结点有机的结合在一起。基本过程式这样的,先调用LookUp()查找函数找到符合要求的结点,然后再删除结点。这里有一句关键的条件语句:if (strcmp(p->GetData()->GetItemName(),pHead->GetData()->GetItemName())==0||p->GetData()->GetItemCode()==pHead->GetData()->GetItemCode())。这里面程序的设计过程中将其分为两个部分,分别是首结点和不再首结点。 5.商品出库

这里也是调用一个函数。写好这个函数时通过书本上的提示和自己的理解。这里面有涉及到

文件流的操作,对我们来说比较陌生,因此这是我们设计程序面对的难点。但另一方面课程设计源代码中给了一些提示,在理解的基础上作一些小的修改就行了。具体实现过程如下:

void CNode::ModifyRecord(char * filename)//进出货记录 {

ofstream outfile;

outfile.open(filename,ios::out|ios::ate); if(!outfile) {

exit(1); }

time_t timer; timer=time(NULL);

outfile<

//outfile.write(reinterpret_cast(pData),sizeof(CItem)); outfile<

for(int i=0;inBrand;i++) {

outfile<<\品牌名称:\

<<\品牌代码:\

<<\品牌数量:\ <<\品牌价格:\ ; }

outfile.close(); return; }

此函数将类中数据成员写入文本文档,用到文件流类,我们知道ifstream、ofstream和

fstream并没有直接定义文件操作的成员函数,因此对文件的操作是通过调用基类ios、istream、ofstream中说明的成员函数来实现的,采用这种方式的明显好处是,对文件的操作与标准输入输出流的使用方式相同,可通过提取运算符”>>”和插入运算符”<<”来读写文件。

注:这里另外两个进库和出库的函数主要有我的合作者周柏成同学写的,这里就省略其具

体的函数代码,详见周柏成同学的课程设计报告。

程序设计过程中遇到的问题

1、程序设计过程中遇到的问题主要是进出货的价格问题。我们在调试中价格始终出现货物总价格出错的信息,其错误的地方为CItem:类中的函数OutModify()。其价格统计代码为for( i=0;inBrand;i++) {

float price;

price=m->brnd[i].brnd_price; allprice=price*num; }

最后在老师的帮助下找到了原因,原来是没有把全局变量和局部变量搞清楚,只

要把allprice=0放在循环语句之外就可以了,现在知道了每一个细节都十分重要。 2、怎样解决在进货清单里面不输入价格。因为在设计程序时把输入到txt文件的函数设为

了一个公共函数,其中就包含了总价格的输出,怎样在不大面积的修改程序的情况下达到这个要求呢?最后经过思考,终于找到了方法,就是在Brand类中建立两个数据成员,在进货和出货里面分别调用

“ m->brnd[i].number1=num;

m->brnd[i].number2=0; 。。。。。。。 和出货时的代码:

“m->brnd[i].number1=num; m->brnd[i].number2=1;“即使通过改变在进出货物的函数中的两个成员中的其

中一个数据成员。

3、怎样实现按任意键回到主菜单。为了使程序的可读性和使用的方便性更好,设计程序时,

打算增加此功能。在设计过程中,试图通过一段程序实现,但始终都要输入一个字符后按回车键才行,表面上已经实现了此功能,但其实并没有达到预期的效果。过了几天,在网上查找相关资料,终于在别人设计的一个小程序里面找到代码,原来只需要在利用库函数里面的一函数system(),当然这里要包含头文件dos.h,程序中加入system(“pause”)即可达到要求。

课程设计过程中的收获和感想

这次c++课程设计,一定程度上使我们对上一学期学的vc++语言有了更深层次的理解,上一学期我们只是学一些最基本的小程序,并没有利用所学的知识编写适用、实际的程序。做一次课程设计,虽然不是要我们做比较复杂的大的程序,但也要求我们对所学知识有一个全方位的了解。比如我们在利用dos.h头文件时,这里在课程设计的课本里面的源代码里面已经有了运用,我们就想,为什么包含这个头文件,它的目的是什么?经过仔细阅读源程序我们知道是程序里调用了一个“system(“cls”)”,这里的意思是指清屏。比如还有在程序中,头文件conio.h、iomanip.h都是平时在学习中很少见过的东西新接触的东西,这也使我们对c++语言有了更多的了解。在这次课程设计中,也大量运用到了类的基本知识,其中包括了四个类,它们是Brand 、CItem、CNode、Clist,而它们之间又有很多必然的联系,这就需要我们对类以及指针有一个较好的理解,特别是指针,它是我们学习C++的难点,经过在设计中指针的运用,指针的理解也就有了更深的认识。我做了这次课程设计,最大的收获就真正尝试设计一个稍微比较适用的程序,不仅仅是知识,因为程序设计关系到每一个细节,这也恰恰是我们做每一件事的要求,这就无形中锻炼了这方面的能力,为今后的工作学习打下了扎实的基础。

本文来源:https://www.bwwdw.com/article/d11w.html

Top