资源描述
个人收集整理 勿做商业用途
课 程 设 计 报 告
课程名称 算法与程序设计
课题名称 设计某公司的库存管理系统
专 业 信息与计算科学
班 级
学 号
姓 名
指导教师
2014年 1月 3日
湖 南 工 程 学 院
课 程 设 计 任 务 书
课程名称 算法与程序设计
课 题 设计某公司的库存管理系统
专业班级
学生姓名
学 号
指导老师
审 批
任务书下达日期 2013 年 12 月 20日
任务完成日期 2014年 1 月 4日
一、设计内容与设计要求
1. 设计内容:
题目2: 某公司的库存管理系统
一.课程设计题目:
某公司的库存管理系统
二.目的与要求:
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.设计要求:
l 课程设计报告正文内容(包括系统设计要求,设计思路,系统功能模块图,系统流程图,类的层次图(包括类成员列表),调试过程,关键程序代码,总结,参考书目等).
(一) 需求分析
系统设计目的与意义:
快捷录入职工信息、查询信息、添加职工记录、删除职工记录、统计职工信息、显示所有信息;
输入输出的要求:
输入简单,输出明了。
(二)总体设计
设计思路:
本程序设计了6个类,其中Person类为抽象基类,Teacher类、Assistant类、Manager类以Person类为直接基类,Teacher_Assistant类为Teacher类和Assistant类的派生类,Manger_Teacher类为Manager类和Teacher类的派生类,Salary_Management类为Person类的友元类,提供实现管理功能的相应的函数,主要实现职工信息的录入,查询、修改、添加、删除、显示和保存退出系统的功能。
系统功能分析:
(1)功能选择可以用菜单来实现
例如:请选择您的计算内容:
1、 录入职工信息
2、 查询职工信息
3、 增加职工记录
4、 删除职工信息
5、 统计职工信息
6、 显示所有信息
7、 退出系统
用户通过输入不同的数字进入不同的菜单。次级菜单主要显示本程序的功能,主要的功能有录入职工信息、查询信息、添加职工记录、删除职工记录、统计职工信息、显示所有信息。
(2)运行时给出明确的提示信息.
比如,在选择主功能菜单是选择范围是(1-7),如果用户输入的选项不在可选择范围之内,程序会给出输入选项不在可选范围之内的提示,并要求用户且知道输入选项在可选范围内才执行相应的功能。本程序有较友好的用户交互界面,每进入或离开一个功能界面时都会有相应的提示信息,方便用户操作.
(三)详细设计
数据库需求分析:
数据库概念结构设计(E-R图);
数据库逻辑结构设计。
类层次图
(四)界面设计与各功能模块实现
(五)系统调试
调试问题出现的主要问题:编译语法错误及修改,重点是运行逻辑问题修改和调整
(六)使用说明及编程体会
这次课程设计完成的过程中,我学到了很多知识.
首先,我大体的复习了c++系统设计的方法,查询了一些课外书籍,并在网上搜索了很多关于C++的程序设计,让我对算法与程序设计方法又有了进一步的了解.
通过这次课程设计,深深体会到我对很多的专业知识还不了解,这就促使我要更多的阅读课外书籍,学到更多的专业知识,使自己得到不断的提高.
最后,我要衷心感谢老师和同学在我的设计过程中给予我的极大帮助,使我能够及时、顺利地完成此次的课程设计.
(七)关键源程序(带注释)
l 书写格式
a.要求用A4纸打印成册
b.正文格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为12。
c.正文的内容:正文总字数要求在3000字左右(不含程序原代码)。
d.封面格式如下页.
l 考核方式
指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。具体考核标准包含以下几个部分:
a.平时出勤 (占10%)
b.系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)
c.程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)
d.设计报告(占30%)
注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
e.独立完成情况(占10%).
l 课程验收要求
a.判定算法设计的合理性,运行相关程序,获得正确的数值结果。
b.回答有关问题.
c.提交课程设计报告.
d.提交软盘(源程序、设计报告文档).
e.依内容的创新程度,完善程序情况及对程序讲解情况打分。
附页:
三、 教材及参考书
朱战立等著, C++面向对象程序设计,人民邮电出版社;
郑莉著, C++ 语言程序设计(含实验指导书)。 清华大学出版社 ( 结构化程序设计部分 )
钱能主编 ,C++ 程序设计教程,清华大学出版社, 2000.11
戴锋编著, Visual C++ 程序设计基础 , 清华大学出版社 ,2001.4
吕日著, C++ 程序设计教程,清华大学出版社,
C++ 大学教程,美国 Harvey M。Deitel 等
四、进度安排
1、 班级:
2、 辅导教师:
3、 时间安排:
第 16—17 周 星期二 8时:00分-—11时:30分
星期二 14时:00分-—17时:30分
星期六 8时:30分—-11时:30分
星期六 14时:30分-—17时:30
一.总体设计
在公司库存管理系统中,物品信息主要为:物品名称,颜色,物品生产厂家,生产厂家地址,物品型号,物品生产日期,物品的单价和数量。
公司库存管理系统中系统需要我们实现六个功能:1、物品录用2、显示物品功能;3、添加物品功能;4、查找物品功能;5、删除物品功能;6、保存物品功能。
在物品录用功能中用户可以根据自己的需要输入自己想输入的物品信息(名称、颜色、生产厂家、厂家地址、型号、生产日期、数量),然后将其保存,一开始系统会提示输入自己想输入的物品型号,然后再输入相关型号的物品信息,输入完之后会再次提示用户是否继续输入,然后再根据提示进行相关操作.
在显示物品功能中,当用户选择此功能时系统会打开保存信息的文件然后将用户所有保存的信息全部显示出来。
在添加物品功能中,用户可以根据系统的提示输入相关物品的信息,并将其保存。
在查找物品功能中,用户根据系统提示输入自己想查找的相关物品名称,然后在库存中的相关物品中查找,如果有此物品则会显示此物品的所有信息,如果没有则会显示无此物品信息。
在删除物品功能中,用户根据系统的提示输入自己想删除的物品名称,然后将其删除.
在保存物品功能中,当用户选择此功能时,系统会将用户需要的所有物品保存。
二.公司库存管理系统中功能模块图:
1、物品信息录用
公司库存管理系统
2、添加物品信息
3、显示物品信息
4、查找物品信息
5、删除物品信息
6、保存物品信息
输入普通电视机的信息
输入DVD的信息
输入带DVD的普通电视机的信息
添加普通电视机的信息
添加DVD的信息
添加带DVD的普通电视机的信息
输入名称查找普通电视机的信息
输入名称查找DVD的信息
输入名称查找带DVD的普通电视机的信息
输入名称删除普通电视机的信息
输入名称删除DVD的信息
输入名称删除带DVD的普通电视机的信息
详细设计
公司库存管理系统中四个类的类层次图为:
Wiring类
TV类
DVD类
TV_DVD类
图2 公司库存管理系统中中四个类的类层次图
公司库存管理系统中各功能模块的实现:
1、物品信息录用
菜单
2、添加物品信息
3、显示物品信息
4、查找物品信息
5、删除物品信息
6、保存物品信息
图3 公司库存管理系统中菜单函数的功能图
1、物品信息录用功能模块:
1、物品信息录用功能
输入普通电视机的相关信息
输入DVD的相关信息
输入带DVD的普通电视机的相关信息
图4 物品信息录用功能的功能图
3、添加物品信息功能的模块图
添加物品信息
添加普通电视机的相关信息
添加DVD的相关信息
添加带DVD的普通电视机的相关信息
图5 添加物品信息功能的功能图
4、查找物品信息功能的模块图
输入物品名称查找普通电视机的相关信息
查找物品信息
输入物品名称查找DVD的相关信息
输入物品名称查找带DVD的普通电视机的相关信息
图6 查找物品信息功能的功能图
5、删除物品信息功能的模块图
删除物品信息
输入物品名称删除DVD的相关信息
输入物品名称删除普通电视机的相关信息
输入物品名称删除带DVD的普通电视机的相关信息
图7 删除物品信息功能的功能图
公司库存管理系统中四个类的UML图为:
Wiring
+Name[10]:char
+Color[10]:char
+Address[50]:char
+Factory[50]:char
+Type[20]:char
+year:int
+month:int
+day:int
+numbe:int
+wiring()
+~wiring()
<<Vitual>> pay():void
虚基类
Wiring
派生类
DVD
TV
+price1:float
+TV()
+set1():void
+pay():void
DVD
+price2:float
+DVD()
+set2():void
+pay():void
派生类
TV
TV_DVD
+price:float
+TV_DVD()
+set3():void
+pay():void
派生类
TV_DVD
图8 公司库存管理系统中类派生关系的UML图
六.系统调试
在调试程序中,我曾出现少花括号的问题,但每次检查时,我觉得没问题,可系统还是提示说有错误:某某函数非法定义,后来才知道原来是花括号缺少的问题,搞得我没找出错误,其实也是我这个程序写的太复杂了,还是分几个文件一起编译这样出现错误也容易找出来,也比较方便。
在调试中,我在物品信息录用中,当我输入完一类物品信息后,想输入另一物品信息时,无法继续输入,总是输入同一物品信息,后来当我在循环中想退出for语句循环时,在需要退出时加一个break语句就可以退出当前循环进行其他步骤。
.
七.结果分析
我在程序设计中曾遇到好多问题,虽然最终都解决了,但现在回过头来看这个系统,我总觉得自己许多地方还是存在不足。我也发现我的c++还存在一些不足,像继承派生这一块的知识就有点欠缺,有点陌生,比如像那些基类的保护成员不能对其赋值。在用循环语句时,常常搞得很糊涂,有时搞得程序不能像自己想的那样运行,会出现
“错误",去看程序时才知道当自己想跳出当前循环应该用break语句,这样才能退出当前循环,否则会一直执行下去直到该判断语句为否的时候.
我所设计的这个公司库存管理系统,基本功能已实现,我觉得自己的这个程序有些地方还是比较齐全的,像物品的录用、添加功能这两模块比较令我满意,这一块的功能自我感觉很齐全,虽然我的其他功能也还可以但我还是觉得这两个功能好一点。还有我在程序中用到了清屏函数,以及改变字体和背景的颜色。
虽然我这个程序还可以,但我觉得还有好多地方不足,像这个程序比较复杂,应该用多文件编译,这样出现错误时也好发现,错误也好改正,系统编译时也方便,还有在查找物品信息这一模块中,当程序关闭后再打开运行程序选择查找物品信息功能,无法显示所查找的相关物品信息,同时也无法添加物品信息和删除物品信息。
我觉得我写的这个公司库存管理系统写的不是很好,我会在以后的时间里多多琢磨,将这个系统修改几下,把这个系统的功能做得更完善一些.
八.课程设计总结
在做程序设计前就已经感觉到我设计的《设计某公司的库存管理系统》比较复杂,不仅要写出实现各种功能的函数还要保证函数之间的连接,怎样通过函数之间的关系能很好的把函数连接起来,还要保证程序能够很好的而且有效的运行。还有可能遇到一些以前没有用到的知识,像怎样在输入有误的情况下进行异常处理,这些都要通过函数的功能来实现,这些对我来说都是新的知识,而且觉得很有难度.
在做程序设计前还必须把书本上的基本知识搞懂,程序设计会用到书的类做,对类的理解也不是很到位,一些概念的知识还没有很好的理解,所以还需要借助书中的知识来加深对类的理解。
在编程的过程中也遇到了很多的困难,但是通过同学的帮助渐渐对于程序有更深一步的理解,而且他们也帮我编一个对异常处理的函数,这样在异常处理的过程中就能很好的处理因为在输入有误的情况的错误。
经过这次课程设计的编写我有增加了一些新知识,知道自己在编程方面还欠缺甚多,在自己完成了编程之后觉得收益良多,原来书本上的东西并不少,我们学习不要贪多,一定要把书本上的知识掌握好!
在这次课程设计的编写中我了解了一些输入输出流,知道了如何把程序保存到磁盘中,这些知识都是以前没有深究和不多用的.比如:常用的输入输出流除iostream(通用输入输出流和其他输入输出流的基类)外还有fstream(输入输出文件流)和strstream(输入书出字符串流类)。书本上好多知识都是我们没留意而在程序中要用到的。选课题的时候心高气傲觉得自己能编出来,而正要着手编的时候才知道题目并不简单.看到这个课题的时候觉得题目要求并不高,而且函数名及功能都给出来了,只需把它填满就行.处于心理作用而且老师也说了课程设计是要把整本书的知识都融合在一起的,于是我开始想如何用类、如何把程序写得简单明了,但是想了好久也想不出来,于是自己搜了一些有关这一课题的程序,想从中获得一些灵感,找到一些好的方法.事与愿违,网上的程序好多,大都用到了数据库,看不懂,我选了一个C程序来看,发现里面好多头文件都不认识,而它用的是struct和class相结和,多文件的编程,包括的知识广泛,感觉很复杂。
我后面就模范他的结构,用简单的语句编出框架,然后在一步步深入细化,最后用fstream类输入输出文本,然而简单的程序也有出错的时候,经过反复的修改、调试终于写出了这个程序!
八.附源程序
#include”jiadian。h”
int main()
{
JIADIAN *scores[10000];//库存的最大容量设定为10000
char pm[20]; //品名的最大字符串长度
char ys[20]; //颜色的最大字符串长度
int xh; //型号为整型变量
char cj[20]; //厂家的最大字符串长度
int i,j,n,a=0;//n为要选择的1 2 3当中的一个,初始化为0,i、j为循环变量 a=0 正常进行功能,a=1输出break前的那个语句。
static int k=0; //k静态全局变量,为库存量,初始化为0
cout<〈”********"〈<”欢迎进入本公司库存管理系统"<<"********”
<〈"********"〈<endl;
cout<<”*****请选择: 1 2 3当中的一个*****”〈〈endl 〈〈”*** 1为查找功能 2为增加功能 3为删除功能***"〈<endl;
while(cin〉〉n&&(n!=7)) // 输入1 2 3 的功能 实现按7键退出的功能
{
switch(n)
{
case 1: //实现按品名进行查找、显示功能
cout〈<"请输入要查找的品名: ”;
cin>>pm;
for(i=0;i<k;i++) //对库存内的产品进行循环查找
{
if(strcmp(pm,scores[i]—>getpingming())==0) // 如果查到所要查找的品名
{scores[i]—>print();a=1;} // 打印该种品名的相关信息
}
if(a){a=0;}
else
cout<〈"查找不到您所需要的结果!”;
break;
case 2: //实现按品名进行增加功能
cout<<”请再次选择所要增加的产品代号"〈<” 1 TV; 2 DVD; 3 DVDTV"〈<endl;
cout<<"请输入要增加的品名代号: ";
cin〉>n;
cout〈〈”请输入要增加的该产品的品名、颜色、型号、厂家: "<〈endl;
switch(n)
{
case 1: // 增加TV
cin>〉pm〉>ys>〉xh〉〉cj;
scores[k++]=new TV(pm, ys,xh ,cj,1500);
break;
case 2: // 增加DVD
cin>〉pm>〉ys>〉xh>>cj;
scores[k++]=new DVD(pm, ys, xh, cj,500);
break;
case 3: // 增加DVDTV
cin〉〉pm>>ys>〉xh〉〉cj;
scores[k++]=new DVDTV(pm, ys,xh,cj,1600);
break;
default:
cout<<"不能把这种品名加入本库存中”〈<endl;
break;
}
cout<<"增加后的成员如下:"〈<endl;
for(i=0;i<k;i++)
scores[i]->print();
break;
case 3: // 实现按品名进行删除功能
cout<〈 ”请输入要删除的产品的代号: ”<<endl;
cout<< ”1 TV; 2 DVD; 3 DVDTV"〈〈endl;
cin>>n;
cout<< "请输入要删除的品名: ”;
switch(n)
{
case 1:
cin〉>pm;
for(i=0;i<k;i++)
{
if(scores[i]->getkind()==1&&strcmp(pm,scores[i]-〉getpingming())==0)
{
for(j=i;j〈k—1;j++)
scores[j]=scores[j+1];
k-—;
}
}
break;
case 2:
cin>>pm;
for(i=0;i<k;i++)
{
if(scores[i]->getkind()==2&&strcmp(scores[i]—〉getpingming(),pm)==0)
{
for(j=i;j〈k-1;j++)
scores[j]=scores[j+1];
k--;
}
}
Break;
Case 3:
Cin>〉pm;
for(i=0;i〈k—1;i++)
{
if(scores[i]—〉getkind()==3&&strcmp(scores[i]—>getpingming(),pm)==0)
{
for(int j=i;j<k—1;j++)
scores[j]=scores[j+1];
k--;
}
}
break;
default:
break;
}
cout<〈"删除后的剩余成员如下:”<〈endl;
for(i=0;i〈k;i++)
scores[i]—〉print();
break;
default:
break;
}
cout<〈"需要退出请按7键或者继续操作.”<〈endl;
}
//system("pause");
return 0;
}
#ifndef HEAD_HPP
#define HEAD_HPP
#include〈iostream>
#include〈iomanip>
#include〈string.h>
using namespace std;
class JIADIAN {
protected:
int ab; // ab=1代表电视机 ab=2代表DVD ab=3代表DVDTV
char *pingming; //声明品名字符串
char *yanse; //声明颜色字符串
int xinghao; //声明型号的大小
char *changjia; //声明厂家字符串
int value; //声明价格
public:
JIADIAN(char*,char*,int ,char*, int); //基类构造函数
~JIADIAN(); //基类析构函数
virtual void print(); //定义打印虚函数
int getkind(); //定义取种类函数
char* getpingming(); //定义取品名指针函数
JIADIAN operator =(JIADIAN &); //声明=号赋值重载运算函数
};
class TV: public JIADIAN { //电视机类公有继承基类
public:
TV(char*, char*,int ,char*,int); //电视机类构造函数
~TV(); //电视机类析构函数
void print(); //打印函数
};
class DVD: public JIADIAN { // DVD类
public:
DVD(char*,char*,int ,char*,int); // DVD类构造函数
~DVD(); //DVD类析构函数
void print(); //打印函数
};
class DVDTV: public JIADIAN { // 带有DVD的电视机类
public:
DVDTV(char*,char*,int , char*,int); // 带有DVD类的电视机类构造函数
~DVDTV(); // 带有DVD类的电视机类析构函数
void print(); // 打印函数
};
#endif
#include"jiadian。h" //头文件
JIADIAN::JIADIAN(char *PINGMING=NULL,char *YANSE=NULL,int XINGHAO=20 ,
char *CHANGJIA=NULL, int VALUE=2000) //家电类的构造函数,初始化参数
{
pingming=new char[20]; // 创建品名的字符长度不超过20个
strcpy(pingming,PINGMING); // 把输入的品名输入到内存中
yanse=new char[20]; // 创建颜色的字符长度不超过20个
strcpy(yanse, YANSE); // 把输入的颜色字符串输入
xinghao=XINGHAO; // 把输入的型号字符输入到内存中
changjia=new char[20]; // 创建厂家的字符长度不超过20个字符
strcpy(changjia, CHANGJIA); // 输入的厂家字符输入到内存中
value=VALUE;
return ;
}
JIADIAN::~JIADIAN() // 家电类的析构函数
{
delete pingming; //分别释放输入的品名、颜色、厂家的内存单元
delete yanse;
delete changjia;
return ;
}
char* JIADIAN::getpingming() // 定义基类的取品名函数
{return pingming;}
int JIADIAN::getkind() // 定义基类的getkind函数
{return ab;}
JIADIAN JIADIAN ::operator=(JIADIAN& jiadian) // 定义基类的=号赋值重载运算函数
{
this—〉ab=jiadian。ab;
strcpy(this—>pingming,jiadian.pingming);
strcpy(this-〉pingming,jiadian。yanse);
this—>xinghao=jiadian.xinghao;
strcpy(this-〉pingming,jiadian。changjia);
this—〉value=jiadian.value;
return *this;
}
void JIADIAN:: print()
{ return ;}
TV::TV(char *PINGMING=NULL, char *YANSE=NULL, int XINGHAO=20, char *CHANGJIA=NULL, int VALUE=1000): //定义电视机类的构造函数,假定电视机类的价格是1000元
JIADIAN(PINGMING, YANSE, XINGHAO, CHANGJIA, VALUE)
{ ab=1;
return ;
}
TV ::~TV() //定义电视机类的析构函数
{return ;}
void TV:: print() //定义电视机类的打印函数
{
cout〈<"1 TV”〈〈" " 〈〈pingming〈〈” ” <〈yanse〈〈” " <<xinghao<<" ” 〈<changjia
<〈” " 〈< value〈<" "〈<endl;
}
DVD::DVD(char *PINGMING=NULL, char *YANSE=NULL, int XINGHAO=20, char *CHANGJIA=NULL, int VALUE=1000): //定义DVD类的构造函数
JIADIAN(PINGMING, YANSE, XINGHAO, CHANGJIA, VALUE)
{ ab=2;
return ;
}
DVD::~DVD() //定义DVD类的析构函数
{return ;}
void DVD:: print() //定义DVD类的打印函数
{
cout〈〈"2 DVD” <〈 ” " 〈<pingming〈< ” " <〈yanse<<” ” <〈xinghao<<” "〈〈changjia
〈<” ” << value〈<” "〈<endl;
}
DVDTV::DVDTV(char *PINGMING=NULL, char *YANSE=NULL, int XINGHAO=20, char *CHANGJIA=NULL, int VALUE=1600): //定义带有DVD类的电视机类的构造函数
JIADIAN(PINGMING, YANSE, XINGHAO, CHANGJIA, VALUE)
{
return ;
}
DVDTV::~DVDTV() // 定义带有DVD的电视机类的析构函数
{return ;}
void DVDTV:: print() // 定义带有DVD的电视机类的打印函数
}
cout〈<”3 DVDTV” 〈〈 " " 〈〈pingming<< " ” 〈〈yanse〈〈" " 〈<xinghao〈<" ”〈<changjia
<〈” ” 〈〈 value<〈" ”〈<endl;
}
参考书目:
[1] 谭浩强,《C++程序设计》,北京,清华大学出版社,2006年。
[2] 詹红霞、侯思颖、陶永红,《Visual C++ 程序设计教程》,北京,清华大学2007年.
课程设计评分表
课程名称: 算法与程序设计课程设计
项 目
评 价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日 期:
展开阅读全文