资源描述
学 号:
0120803490306
课 程 设 计
题 目
库存模型维护
学 院
管理学院
专 业
信息管理与信息系统
班 级
0803
姓 名
黄勇彪
指导教师
王庆国
2010
年
07
月
12
日
课程设计任务书
学生姓名: 黄勇彪 专业班级: 信管0803
指导教师: 王庆国 工作单位: 管理学院
题 目:库存模型维护
初始条件:
以链式结构的有序表表示某商厦家电部的库存模型。当有提货或进货的业务要求时,需要对该有序表及时进行维护。每个工作日结束之后,将链式结构的有序表中的数据以文件的形式保存;每天营业之初需要将文件形式的数据恢复成链式结构的有序表。
要求完成的主要任务: (包括课程设计工作量及其技术要求、说明书撰写等具体要求)
链式结构的有序表的结点结构的数据域应包括家电名称、品牌、型号、单价及数量,以结点中单价值的非减序列体现着有序性。日常的维护操作应包括初始化、创建表、插入、删除、更新数据、打印、查询以及链式结构的有序表与文件之间的数据转换。
时间安排:
序号
设计内容
所用时间
1
问题分析和任务定义
0.5天
2
数据类型和系统设计
0.5天
3
编码实现和静态检查
3天
4
上机准备和上机调试
2天
5
总结和整理设计报告
1天
合 计
7天
指导教师签名: 2010年 07月02日
系主任(或责任教师)签名: 2010年 07月02日
库存模型维护
1. 需求分析
1.1 背景分析
在商场中,各种商品的库存量在每天的销售与进货过程中会发生不断的变化,而由于商场是零售经营,所以每天涉及库存的维护是一个比较麻烦的问题,另一方面,由于受市场和物价,居民消费水品的影响,商品的价格在不同的时间内会发生一定的变化,部分商品也会由于科技的发展,或者消费者的价值取向,审美观等方面的影响,会淘汰掉,这既涉及到库存价格的变化,以及商品的变化,作为一个大型商场,没有好的库存管理方案,将会是一场灾难,所以,库存管理系统是必需的。为此,我用所学的C语言设计了这样一个实现库存模型维护的程序,从而实现商场家电部门的库存维护,其中包括商品的初始化,商品的录入,淘汰商品的删除,以及商品信息的更新,商品信息的打印,以及库存商品文件与程序中表的转换。
1.2 功能分析
1.商品信息的输入形式:以手动输入或者从文件中读取。商品结构体中(商品号,商品名,商品 品牌,商品单价,商品数量)是要求输入的,其中商品号和商品数量的数据类型是整型,商品名和 商品品牌的数据类型是字符串型,商品单价是浮点型。
2.输出的形式包括以单行为一商品信息的屏幕输出和输出到文件。包括按商品号的顺序输出和按 商品价格高低输出两种。
3.商品的初始化,商品的录入,按商品号的排序,按商品号排序输出,按商品价格排序,按商品 价格排序输出,指定商品的查询,淘汰商品的删除,以及商品信息的更新,商品信息的打印,以及 库存商品文件与程序中表的转换。
4.测试数据,如下截图:
当库存文件记录为空时,输出库存文件,结果如下:
当库存文件记录为空时,删除记录,结果如下:
当库存文件记录为空时,排序输出记录,结果如下:
当库存文件记录为空时,出货操作时,结果如下:
当库存文件记录为空时,查询操作时,结果如下:
当库存文件记录为空时,修改操作时,结果如下:
2. 概要设计
2.1 商品结构体数据类型如下
typedef struct node{ //定义结构体
int no; //产品号
char name[10]; //产品名
char kind[10]; //产品种类
float price; //产品单价
int num; //产品库存数量
int pno; //产品号指针
int pnum; //产品库存数量指针
int pprice; //产品价格指针
}EmpType;
2.2 主函数的流程图如下
3. 详细设计
3.1 函数天用关系
#include<stdio.h>
#include<math.h>
#define MaxSize 100
typedef struct node{ //定义结构体
int no; //产品号
char name[10]; //产品名
char kind[10]; //产品种类
float price; //产品单价
int num; //产品库存数量
int pno; //产品号指针
int pnum; //产品库存数量指针
int pprice; //产品价格指针
}EmpType;
void ReadFile(EmpType emp[],int &n) //对库存文件读取的函数
void Clearup(EmpType emp[],int &n) //清空库存文件中的记录的函数
void SaveFile(EmpType emp[],int &n) //将商品记录保存到商品库库文件的函数
void InputEmp(EmpType emp[],int &n) //插入新的记录函数
void OutputFile(EmpType emp[],int n) //输出库存文件中所有记录的函数
void Purchase(EmpType emp[],int n) //进货记录些如山品库存文件的函数
void Shipping(EmpType emp[],int n) //出货记录保存到商品文件的函数
void Dispno(EmpType emp[],int n) //按商品号排序输出库存文件的函数
void Dispprice(EmpType emp[],int n) //按商品价格排序输出的函数
void Inquiry(EmpType emp[],int n) //查询商品记录的函数
void Modify(EmpType emp[],int n) //修改商品记录的函数
void Delete(EmpType emp[],int &n) //删除文件中商品记录的函数
int Comparison(char a[],char b[]) //字符串比较
void main()
{ double dummy;
dummy=sin(0.0);
EmpType emp[MaxSize];
int k, n,t,h;
char a[10]="hyb\0";
char b[10];
char c[10]="hx123\0";
char d[10];
printf(" 欢迎登陆黄勇彪的库存维护系统!!!\n");
printf(" ============================================================================\n");
printf("请输入您的登录名:");
scanf("%s",b);
t=Comparison(a,b);
if (t!=0)
printf("对不起,登录名错误!!");
else
{
printf("请输入您的密码:");
scanf("%s",d);
h=Comparison(c,d);
if (h!=0)
printf("对不起,密码错误!!");
else
{
printf(" 欢迎使用黄勇彪的库存维护系统!!!\n");
printf(" ============================================================================\n");
ReadFile(emp,n);
do{
printf(" 1:输入新产品记录 2:输出库存信息\n ");
printf(" 3:清空库存记录 4:删除记录\n");
printf(" 5: 按产品号排序输出 6:按价格排序输出\n");
printf(" 7:进货登记 8:出货登记\n");
printf(" 9:查询记录 10:修改记录\n");
printf(" 0:存储退出\n");
printf("请选择操作0--10:");
scanf("%d",&k);
switch(k)
{
case 1:InputEmp(emp,n);
break;
case 2:OutputFile(emp,n);
break;
case 3:Clearup(emp,n);
break;
case 4:Delete(emp,n);
break;
case 5:Dispno(emp,n);
break;
case 6:Dispprice(emp,n);
break;
case 7:Purchase(emp,n);
break;
case 8:Shipping(emp,n);
break;
case 9:Inquiry(emp,n);
break;
case 10:Modify(emp,n);
break;
case 0:SaveFile(emp,n);
break;
}
}while(k!=0);
}
}
}
3.2 函数调用关系结构图
4. 调试分析
4.1 遇到的问题
1,调试的过程中遇到了居多问题,首先是单价作为浮点数的输出问题,在输出过程中,一直未能正常输出,最后想到了以前也遇到类似问题,查阅资料,发现在函数开始添加库头函数#include<math.h>,程序中加入double dummy=sin(0.0);即可解决该问题,其次是文件和顺序表的转换问题,即文件的读和写,当然这些在课本上都是能够找到的,输出格式问题,这个也花了相当长的时间,由于缺乏经验,在控制输出格式时,再三调试才是文件中的记录合理输出,还有各个函数的编制问题,虽然说起来都是很简单的几句话,但是在实际操作过程中却需要大量的时间去解决这些细碎的问题。
2,在设计系统登陆,涉及字符数组的比较,其中用字符数组常量存储用户名,而登录时输入的用户名存储在另一字符数组中,然后调用设计的字符比较函数进行比较,看输入的用户名与字符常量数组中存储的字符串是否一致,是一致,则进行第二步的密码校验,当然密码校验和用户名校验类似。在这其中,关于字符常量数组应该是什么,一直存在着偏差,例如:开始我以为应该设为char a[10]="hyb",但是在调试过程中,一直未能正确,后翻看以前教材,查看关于字符数组的知识,才知道,键盘输入的字符数组是以“\0”结尾的,后通过调试,完成了这一功能,虽然这是自己额外添加的功能,但是还是收获不少,其次是感觉自己的知识不够牢固,有一种“知识用时方恨少”的感觉。
3,在涉及到C语言编程时,关于使用的环境问题是大家问我问的最多的问题,其实我个人也遇到了同样的麻烦,因为以前C语言的程序设计动用的是TC,总的感觉是TC编程时,函数内部调试比较好使,但是涉及多个文件链接时的工程文件时,就显得有些繁琐,没有像VC和VS那样清晰的文件结构,除此之外,TC的界面单调,但是总的来说TC的关键字显示对于编程人员来说,有很好的提示作用,而且他也可以结合文本文件编程,而VS则属于大型工程编辑的,其界面,支持中文等方面就是其强势的一面,以前一直没怎么使用VS,但是这次,为了提高系统的可阅读性,及良好的人机界面,采用了VS,从TC到VS,还是存在一些代码的区别,当然修改后的效果是显著的,界面支持中文,是库存管理一目了然。
4,算法的分析,在时间复杂度和空间复杂度上,我的程序可能存在一些问题,因为我用的是顺序表结合指针,我个人认为,同样的问题,用简单的方式解决是最高效的,况且我们课程设计的时间有限,顺序表比链表掌握的基础好一些,所以我选择了最适合我的方式,导致了在进行产品信息删除时,时间复杂度稍高,但是这并不存在很大的问题。在时间和空间复杂度上,基本上也得到了很好的控制。
4.2 经验和体会
编程过程中必须要有明确的思路,只有有明确的思路,才会少走弯路,所谓“磨刀不误砍柴工”,有了明确的路线,你的工作便会事半功倍!!其次是编程过程中,要有恒心,要敢于创新,当然,在遇到麻烦时,不要忘了查阅工具书,好比喻C语言函数速查手册,这样同样会让你事半功倍。最后就是学习的工程中要勇于动手实践,没有实践,再好的理论基础也是空谈,在我们班的很多同学便是这样,考试成绩相当牛,动起手来确实四处碰壁。这也证实了强大的思想并不能支撑一个完美的现实。
5. 用户使用说明
5.1 登陆提示
登陆名为:hyb
登录密码为:hx123
登陆界面如下:
5.2 成功登陆后操作
第一步,选择你要进行的操作(程序会提示你),第二步,按照你选择的操作,进行输入等步骤即可(程序会提示)。简单,一目了然的操作提示,使整个程序更加和谐化!
附加说明:关于生成的hyb.exe文件,貌似需要安装VS。具体的还未验证。
6. 测试结果
6.1 运行测试
库存维护系统登陆界面:
初始操作界面,如下:
插入一组新的商品记录,如下:(插入新产品5号产品的信息)
输出库存文件中的商品记录,如下:
将库文件中的商品按商品号排序并输出,如下:
将库存文件中的商品按单价排序并输出,如下:
进货操作,如下:(1号商品进货5件)
出货操作,如下:(1号商品出货15件)
按商品号查询某一商品的操作,如下:(查询5号商品的信息)
更新商品信息的操作,如下:(修改商品5的编号,价格,数量)
删除商品信息的操作,如下:(删除2号产品)
6.2 库存信息文件
保存商品信息到库存文件good.dat,如下:
7. 附录
代码如下:
#include "stdafx.h"
#include"stdio.h"
#include"math.h"
#define MaxSize 100
typedef struct node{ //定义商品记录结构体
int no;
char name[10];
char kind[10];
float price;
int num;
int pno; //指向下一产品的产品号
int pnum; //指向下一产品的数量
int pprice; //指向下一产品的单价
}EmpType;
void ReadFile(EmpType emp[],int &n) //读取库存文件并存入emp数组
{
FILE *fp; //定义文件指针
long length;
int i;
if((fp=fopen("good.dat","rb"))==NULL){ //判断文件是否可读
n=0;
return;
}
fseek(fp,0,2); //文件指针移到文件尾
length=ftell(fp); //length求出文件长度
rewind(fp); //文件位置指针指向文件首
n=length/sizeof(EmpType);
if(n!=0)
n--;
else
emp[0].pno=emp[0].pnum=emp[0].pprice=-1; //n=0时,初始化指针
for(i=0;i<=n;i++)
fread(&emp[i],sizeof(EmpType),1,fp); //将文件的数据读到emp中
fclose(fp);
}
void Clearup(EmpType emp[],int &n) //清空库存文件的全部商品记录
{
FILE *fp;
if((fp=fopen("good.dat","wb"))==NULL){
printf(">> 文件不能打开\n");
return;
}
emp[0].pno=emp[0].pnum=emp[0].pprice=-1;
n=0;
fclose(fp);
printf(" ============================================================================\n");
}
void SaveFile(EmpType emp[],int &n) //将emp数组存入库存文件
{
int i;
FILE *fp;
if((fp=fopen("good.dat","wb"))==NULL){
printf(">> 文件不能打开\n");
return;
}
if(n>1)
for(i=0;i<=n;i++)
fwrite(&emp[i],sizeof(EmpType),1,fp);
fclose(fp);
printf(" ============================================================================\n");
}
void InputEmp(EmpType emp[],int &n) //添加一项新的商品记录
{ int i;
printf(">>输入产品号,产品名,品牌,价格,数量:\n");
n++;
scanf("%d%s%s%f%d",&emp[n].no,&emp[n].name,&emp[n].kind,&emp[n].price,&emp[n].num);
for(i=0;i<=n-2;i++)
{
if(emp[i].no==emp[n].no)
{
emp[i].num=emp[i].num+emp[n].num;
n=n-1;
}
}
emp[n].pno=emp[n].pnum=emp[n].pprice=0;
printf(" ============================================================================\n");
}
void OutputFile(EmpType emp[],int n) //输出库存文件的所有记录
{
int i;
if(n<1)
{
printf(">> 没任何记录\n");
return;
}
for(i=1;i<=n;i++)
printf(">>%3d%10s%10s %.2f %d\n",emp[i].no,emp[i].name,emp[i].kind,emp[i].price,emp[i].num);
printf(" ============================================================================\n");
}
void Purchase(EmpType emp[],int n) //库存已有商品的进货
{ int no,num,i;
int flag=0;
printf("请输入进货产品的产品号,数量:\n");
scanf("%d%d",&no,&num);
for(i=1;i<=n;i++)
{
if(emp[i].no==no)
{ emp[i].num=emp[i].num+num;
flag=flag+1;
}
}
if(flag==0)
printf("该产品是第一次入库,请选择操作,进行产品详细登记!!\n");
//如果输入的是新产品,提示应该进行新品登记操作
printf(" ============================================================================\n");
}
void Shipping(EmpType emp[],int n) //库存已有商品出货
{ int no,num,i;
int flag=0;
if(n<1)
{
printf(">> 没任何记录,无法出货!!\n");
return;
}
printf("请输入出货产品的产品号,数量:\n");
scanf("%d%d",&no,&num);
for(i=1;i<=n;i++)
{
if(emp[i].no==no)
{ emp[i].num=emp[i].num-num;
flag=flag+1;
}
}
if(flag==0)
printf("\n");
printf(" ============================================================================\n");
}
void Dispno(EmpType emp[],int n) //按商品号排序输出库存商品记录
{ int i=2,j;
int k=emp[0].pno;
if(n<1)
{
printf(">> 没有产品记录,不能按产品号排序!!\n");
return;
}
emp[0].pno=1;emp[1].pno=-1;
while(i<=n)
{
j=0;
while(emp[j].pno!=-1 && emp[emp[j].pno].no<emp[i].no)
j=emp[j].pno;
emp[i].pno=emp[j].pno;
emp[j].pno=i;
i++;
}
while(k!=-1)
{
printf(">>%3d%10s%10s %.2f %d\n",emp[k].no,emp[k].name,emp[k].kind,emp[k].price,emp[k].num);
k=emp[k].pno;
}
printf(" ============================================================================\n");
}
void Dispprice(EmpType emp[],int n) //按价格排序输出库存商品记录
{ int i=2,j;
int k=emp[0].pprice;
if(n<1)
{
printf(">> 没有产品记录,不能按价格排序!!\n");
return;
}
emp[0].pprice=1;emp[1].pprice=-1;
while(i<=n)
{
j=0;
while(emp[j].pprice!=-1 && emp[emp[j].pprice].price<emp[i].price)
j=emp[j].pprice;
emp[i].pprice=emp[j].pprice;
emp[j].pprice=i;
i++;
}
while(k!=-1)
{
printf(">>%3d%10s%10s %.2f %d\n",emp[k].no,emp[k].name,emp[k].kind,emp[k].price,emp[k].num);
k=emp[k].pprice;
}
printf(" ============================================================================\n");
}
void Inquiry(EmpType emp[],int n) //查询库存中某一商品记录
{
int no,i;
if(n<1)
{
printf(">> 没任何记录,不能查询!!\n");
return;
}
printf("请输入你要查询的产品号:\n");
scanf("%d",&no);
for(i=0;i<=n;i++)
{
if(emp[i].no==no)
printf(">>%3d%10s%10s %.2f %d\n",emp[i].no,emp[i].name,emp[i].kind,emp[i].price,emp[i].num);
}
printf(" ============================================================================\n");
}
void Modify(EmpType emp[],int n) //修改商品记录
{
int NO,no,num,i,j;
char name[10];
char kind[10];
float price;
int flag=0;
if(n<1)
{
printf(">> 没任何记录,无法修改!!\n");
return;
}
printf("请输入你要修改的产品的产品号:\n");
scanf("%d",&NO);
for(j=0;j<=n;j++)
{
if(emp[j].no==NO)
flag=flag+1;
}
if(flag==0)
printf("库存中没有该产品!!");
else
{
printf("请输入你修改后的信息产品号,价格,数量:\n");
scanf("%d%f%d",&no,&price,&num);
for(i=0;i<=n;i++)
{
if(emp[i].no==NO)
{
emp[i].no=no;emp[i].price=price;emp[i].num=num;
}
}
}
printf(" ============================================================================\n");
}
void Delete(EmpType emp[],int &n) //删除某一商品记录
{
int NO,i,j;
if(n<1)
{
printf(">> 没任何记录,不用删除!!\n");
return;
}
printf("请输入你要删除的产品号:\n");
scanf("%d",&NO);
for(i=0;i<=n;i++)
{
if(emp[i].no==NO)
{
for(j=i;j<n;j++)
emp[j]=emp[j+1];
}
}
n--;
printf(" ============================================================================\n");
}
int Comparison(char a[],char b[]){ //字符串比较函数
int i;
for(i=0;a[i]!='\0'||b[i]!='\0';i++)
{ if(a[i]>b[i])
return 1;
else if(a[i]<b[i])
return -1; }
if(a[i]=='\0'&&b[i]=='\0')
return 0;
if(a[i]=='\0')
return -1;
return 1;
}
void main()
{ double dummy;
dummy=sin(0.0);
EmpType emp[MaxSize];
int k, n,t,h;
char a[10]="hyb\0";
char b[10];
char c[10]="hx123\0";
char d[10];
printf(" 欢迎登陆黄勇彪的库存维护系统!!!\n");
printf(" ============================================================================\n");
printf("请输入您的登录名:");
scanf("%s",b);
t=Comparison(a,b);
if (t!=0)
printf("对不起,登录名错误!!");
else
{
printf("请输入您的密码:");
scanf("%s",d);
h=Comparison(c,d);
if (h!=0)
printf("对不起,密码错误!!");
else
{
printf(" 欢迎使用黄勇彪的库存维护系统!!!\n");
printf(" ============================================================================\n");
ReadFile(emp,n);
do{
printf(" 1:输入新产品记录 2:输出库存信息\n ");
printf(" 3:清空库存记录 4:删除记录\n");
printf(" 5: 按产品号排序输出 6:按价格排序输出\n");
printf(" 7:进货登记 8:出货登记\n");
printf(" 9:查询记录 10:修改记录\n");
printf(" 0:存储退出\n");
printf("请选择操作0--10:");
scanf("%d",&k);
switch(k) //根据k的值,调用相应的函数
{
case 1:InputEmp(emp,n);
break;
case 2:OutputFile(emp,n);
break;
case 3:Clearup(emp,n);
break;
case 4:Delete(emp,n);
break;
case 5:Dispno(emp,n);
break;
case 6:Dispprice(emp,n);
break;
case 7:Purchase(emp,n);
break;
case 8:Shipping(emp,n);
break;
case 9:Inquiry(emp,n);
break;
case 10:Modify(emp,n);
break;
case 0:SaveFile(emp,n);
break;
}
}while(k!=0);
}
}
}
本科生课程设计成绩评定表
姓 名
黄勇彪
性 别
男
专业班级
信息管理与信息系统0803
课程设计题目:库存模型维护
课程设计答辩或质疑记录:
成绩评定依据:
评 定 项 目
评分成绩
1.设计原创性达到80%(30分)
2.程序执行结果实现指导书中的所有基本要求(20分)
3.设计结果(软件程序)正确(10分)
4.设计报告的规范化(10分)
5. 答辩(30分)
总分(100分)
备注:成绩等级:优(90分—100分)、良(80分—89分)、中(70分—79分)、及格(60分—69分)、60分以下为不及格。若第一项低于20分,或第一项与第五项之和低于35分,则课程设计成绩不能及格。
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
2010年 07月 12日
展开阅读全文