第一篇:广西工学院数据结构与算法实训报告
《数据结构与算法实训》
实训报告
题 目:凸多边形直径计算研究与实现 完 成 人: 专业班级: 学 号: 指导教师:
****年**月**日
广西科技大学计算机学院
计算机学院 班 数据结构与算法实训报告 题目:凸多边形直径计算研究与实现
说明:1.请按实训要求完成实训任务,鼓励提出自己的算法,或是在已有算法基础上进行改进,以提高计算速度;2.程序代码不能低于500行;3.每位同学须完成实训报告,并打印上交;4.每位同学须参加实训答辩。5.答辩成绩占40%,平时成绩占30%,文档书写占30%。1.生成一个凸多边形
1.1生成来自同一个圆上的点集
阶段一(一次)
对于同一个圆上的点集,按顺时针(逆时针)顺序依次连接这些顶点,即可得到一个凸多形。
思考:是否可以通过随机生成圆上的点,来得到凸多边形的顶点集? 参考代码:
void generate_circle_points(int n,int seed){ double theta;double temp_x,temp_y;int i;srand(seed);for(i = 1;i <= n;i++){ theta =(2*PI / double(n))* i;//将圆等分的生成圆上点
temp_x = cos(theta);temp_y = sin(theta);Point[i][0]=temp_x*350+500;Point[i][1]=temp_y*250+300;} Point[0][0]=Point[n][0];Point[0][1]=Point[n][1];} 完成后的截图示例:
图1 生成圆上的点
1.2编程实现已有的凸壳(凸包)算法
阶段二(两次)
利用中国知网下载凸壳(凸包)计算的相关文献,任选择一篇文献编程实现;也可从图书馆查阅相关书籍,寻找简单的凸壳(凸包)计算的方法,编程实现。
完成后的截图示例:
图2 凸壳计算
2.实现文献中的凸多边形直径计算 阶段三(三次)
要求编程实现指定文献[1]中的凸多边形直径计算算法。完成后的截图示例:
图3 待计算的点集
图4 凸多边形直径值
3.利用数据结构中的算法对文献中的方法进行改进
阶段四(两次):上交改进算法的思想。阶段五(两次):实现改进算法。实验对比
为验证本文算法有效性,进行了大量实验,算法均能正确地计算出凸多边形直径,并分别与文献[1]、[2]、[3]、[4]进行对比实验,实验表 明,算法稳定性好,运行效率高。同时为验证本文对找首个对跖点对算法改进的有效性,与文献[1]、[4]算法进行了实验对比,结果表明,算法非常有效,运行效率非常高。限于篇幅,这里仅举出其中一例。该例实验的方法是通过随机函数自动生成以半径为250个象素宽的圆周上的点,点坐标值采用浮点型,则以这些点所构成的多边形必定是凸多边形,测得对比实验运行时间如表1所示,单位为1/10000秒。4.撰写实训报告
阶段六(一次):撰写并上交实训报告。
一、本文涉及的知识点有:
宏定义、全局变量、二维数组、一维数组、for循环、自定义头文件、指针
二、功能要求:
1、生成来自同一个圆上的点集
对于同一个圆上的点集,按顺时针(逆时针)顺序依次连接这些顶点,即可得到一个凸多形。
2、实现文献中的凸多边形直径计算,还要包括计算其运行时间。
3、算法设计
void sift(double A[],int s, int m){ //输出以A[m]为根节点的子树为堆
double t;int j;t=A[s];j=2*s;while(j<=m){ if(j A[s]=A[j]; s=j; j=2*j;} else j=m+1;} A[s]=t;} void heapsort(double A[],int n){ /*A是待排序数组(从下标1开始存储,最大元素下标为n),n为数组的元素的个数*/ int i,k;double temp;k=n/2;for(i=k;i>0;i--)//无序序列建堆 sift(A,i,n);for(i=n;i>1;i--){ //堆顶元素换到最后 temp=A[1]; A[1]=A[i]; A[i]=temp; sift(A,1,i-1);//调整 建堆 } } void generate_circle_points(int n,int seed){ //随机生成圆上的点 double angle[MaxLen+1];double temp_x,temp_y; int i,k;CString str; srand(seed); for(i = 1;i <= n;i++){ angle[i] =((double)rand()/ RAND_MAX)* 2 * PI;/*将圆随机的生成圆上点*/ for(k = 1;k < i;k++) { if(angle[k]==angle[i] || angle[k]==angle[i]+ 2*PI || angle[k]+ 2*PI==angle[i])//将重复的点去掉 { i--; break; } } } heapsort(angle,n); for(i = 1;i <= n;i++){ temp_x = cos(angle[i]); temp_y = sin(angle[i]); Point[i][0]=temp_x*200+400; Point[i][1]=temp_y*200+400;} Point[0][0]=Point[n][0];Point[0][1]=Point[n][1];Point[n+1][0]=Point[1][0];Point[n+1][1]=Point[1][1];} double Calculate_Maxdist(int n){ //计算凸多边形上最远的两点的距离 int i=0,j=1,k,antips[MaxLen][2],ant=0,l,pi,pj;double pd,d,dc;while((Point[i+1][0]-Point[i][0])*(Point[j+1][1]-Point[j][1])-(Point[i+1][1]-Point[i][1])*(Point[j+1][0]-Point[j][0])>0)//当其面积之差大于0时 j++;k=j;while(!(i==k && j==n)){ dc=(Point[i+1][0]-Point[i][0])*(Point[j+1][1]-Point[j][1])-(Point[i+1][1]-Point[i][1])*(Point[j+1][0]-Point[j][0]);/*计算其两三角形的面积之差*/ if(dc<0) { i++; antips[ant][0]=i; antips[ant++][1]=j; } else if(dc>0) { j++; antips[ant][0]=i; antips[ant++][1]=j; } else i++;} pd=-1;for(l=0;l pi=antips[l][0]; pj=antips[l][1]; d=(Point[pi][0]-Point[pj][0])*(Point[pi][0]-Point[pj][0])+(Point[pi][1]-Point[pj][1])*(Point[pi][1]-Point[pj][1]); if(d>pd) pd=d;} return sqrt(pd);//返回计算结果 } void CConvexDiameterView::OnDraw(CDC* pDC){ /*画出生成来自同一个圆上的点集 按顺时针(逆时针)顺序依次连接这些顶点,即可得到一个凸多形。*/ CConvexDiameterDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CClientDC pa(this);//自定义一个(this)指针 OnPrepareDC(& pa);// TODO: add draw code for native data here if(liulang==1){ int i; for(i=0;i pDC->Ellipse(Point[i][0]+4,Point[i][1]+4,Point[i][0]-4,Point[i][1]-4); CString pajiho; pajiho.Format(_T(“%d”),i+1);//输出点的序号 pa.TextOut(Point[i][0],Point[i][1],pajiho); for(int j=0;j { if(i>0) { //顺序两点相连 pa.MoveTo(Point[i-1][0],Point[i-1][1]); pa.LineTo(Point[i][0],Point[i][1]); //任意两点相连 // pa.LineTo(Point[j][0],Point[j][1]); } } } liulang=0;} //起点和末点链接 pa.MoveTo(Point[MaxLen-1][0],Point[MaxLen-1][1]);pa.LineTo(Point[0][0],Point[0][1]);} void CConvexDiameterView::OnAngleSign(){ // TODO: Add your command handler code here double Maxdis;generate_circle_points(MaxLen,100);/* 生成圆形上数据,第二参数为随机函数的种子*/ clock_t start_time, finish_time;//用于测试时间 double during_time=0.0;start_time = clock(); for(int i=0;i Maxdis=Calculate_Maxdist(MaxLen); finish_time= clock();during_time=((double)(finish_time-start_time)/ CLOCKS_PER_SEC)/xunhuancishu*10000;CString str;str.Format(“所花费的时间是%lf(万分之一秒)”,during_time);AfxMessageBox(str); str.Format(“最大距离为:%lf”,Maxdis);AfxMessageBox(str); liulang=1;Invalidate();UpdateWindow(); } 运行结果: 三、实训总结: 由于本次实训采用MFC编程,我对MFC完全没有一丁点的了解,更不知如何使用。但我通过上网搜索来MFC来有了一点了解,MFC的内容非常多,用起来相当不容易。对于随机画圆的部分,我不是很明白,x坐标y坐标的表示等等。在参考了老师的源程序之后,虽然有了一些认识,但由于初次接触这样的实训,还是有些模糊。 题目:在火车货场车皮编解场,2条轨道连接到2条侧轨道,形成2个铁路转轨栈,其中左边轨道为车皮入口,编号为A;右边轨道为出口,编号为D;2个铁路转轨栈分别编号为C和D如下图所示。编号为a, b, c, ┅, n的各车皮依序停放在车皮的入口处,调度室要安排个车皮进出栈次序,使得在出口处各车皮按照预先制定的顺序依次出站。车皮移动时只能按照从左到右的方向移动。组织与指导老师: 组长:* 成员:*** 指导教师:* 完成时间、地点: 时间:第16周(6月6日~6月10日) 地点:南校区东教学楼2楼机房。 一、需求分析 1、问题描述 掌握队列、栈、树的结构以及基本操作,熟悉for循环语句,if条件语句的嵌套,结构体函数等,从而实现程序的功能。 例如: typedef struct Stack { Data *data; Data *end; }Stack; …… 2、实现功能 (1)对于给定的车皮数n,以及各车皮的出站顺序,编程计算最优调度方案,使得移动车皮的次数最少。 (2)数据输入:由文件input.txt给出数据。第一行有1个正整数n,表示车皮数;接下来的1行是一个字符串,表示预先确定的车皮的出站顺序。 (3)数据输出:将计算得到的最优调度方案输出到文件output.txt,文件的第一行使最少移动次数m,接下来的m行使对于最优方案的m次移动。每次移动用“cXY”的3个字符表示,其中c表示车皮编号,X表示其时栈号,Y表示目标栈号。如果无法调度则输出“No Solution!” 二、概要设计 1、抽象数据类型 void ReadData(void) { int i; FILE *fp; fp = fopen(“input.txt”, “r”); if(fp == NULL) exit(__COUNTER__); fscanf(fp, “%d”, &total); if(total < 1) { fclose(fp); exit(__COUNTER__); } ……、void Show(Stack a, char *s) { char *tmp, *pc; char *p =(char*)a.data; pc = tmp =(char*)malloc(total + 1); while(p <= a.end) *pc++ = *p++; *pc = 0; printf(“%s%s”, tmp, s); } …… if(d == end) { if(min > count) { min = count; strcpy(res, tmp); return; } } count++; if(A.end >= A.data) a = *A.end; else a = EOD; …… 2、程序中包含功能模块及模块间的调用关系 各个基本操作都通过公有成员函数实现,然后通过主程序调用来实现程序的功能。 例如: void Init(Stack *a, int len) { a->data =(Data*)malloc(len * sizeof(Data)); memset(a->data, 0, len * sizeof(Data)); a->end = a->data-1; } …… void main(void) { ReadData(); Calc(head); End(); } 三、调试分析 完成情况说明: 编译程序的过程中发现了许多漏洞,调试起来很不方便,经过我和同学的共同努力,终于有了突破性的进展,程序按照预定的时间调试出来了,虽然当中还存在不少的漏洞,但不会影响程序的正常运行。 程序的性能分析:各个操作都是通过公有函数的调用来实现的,其中用到结构体函数,for循环,If语句的嵌套等,通过测试可以实现其预定的功能。出现的问题及解决方案: 缺失头文件导致的定义无效错误,通过添加头文件即可解决问题;定义字符类型错误,使用正确的函数类型定义即可,for循环的循环语句语法使用不当,导致函数无法实现循环,if条件语句的应用还存在问题,以上所述的编译错误都通过我很同学的认真分析后纠正了。 四、用户使用说明 了解程序的执行过程,输入合法的数值是程序正常运行的关键,输入的数值和开始需要的字符的长度要符合五、心得体会: 通过多次编写程序,我总结出来一条心得,程序不能写完才调试,而是应该写一个函数调试一个函数,这样才能缩小调试的范围,提高编程的效率,程序编完后在进行一次综合调试,将不完善的函数和功能处理好,才能将程序做到最好!而且,很多时候,一个大的工程并不是一个人就能完成,这就要求我们有团队精神。让我感受最深的是在我调试程序的时候,一个很细微的错误就可能导致程序的出错,正所谓的“细节决定成败”,不管是在学习中,生活中,我们都要有一颗善于发现问题,解决问题的新,除此之外,还要有乐于助人的精神。 (数据结构实训报告) 目录 一、实训目的...........................................................1 二、实训题目...........................................................1 三、实训步骤...........................................................2 四、实训内容...........................................................2 五、实训心得..........................................................19 六、参考文献..........................................................19 吉林工业职业技术学院 数据结构实训 一、实训目的 通过实训,对所学数据结构和程序设计的基本知识和基本理论有更进一步的了解和认识,将理论和实际相结合,能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来。主要是培养学生综合利用C语言进行程序设计的能力和创新能力以及综合解决问题的能力。运用算法分析与程序设计的一般方法进行实际项目的开发。本次实训尽量选取与实际结合紧密或学生比较感兴趣的项目,本次实训学生需要具备熟练的程序设计基础、数据结构和计算机应用基础知识,具备程序编写、调试的基本能力,具有一定的文字表达和报告撰写能力,具备办公软件使用能力。 通过实训,考查语言基本概述掌握是否牢固,并考查与后续课程较为密切的结构体,链表,文件的运用熟练程度,加强对基本概念的理解和复习,最重要的是了解基本软件的设计步骤,还有对软件调试的掌握。能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。 二、实训题目 (一)单项题目 1、二叉树遍历 【问题描述】建立二叉树,实现二叉树的先序遍历、中序、后序和层序遍历(用递归或非递归的方法都可以)。 【要 求】编写菜单程序。能够输入二叉树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立二叉树存储结构的输入函数、输出先序遍历序列的函数;输出中序遍历序列的函数;输出后序遍历序列的函数;输出层序遍历序列的函数。 (二)综合题目 1、图书管理系统 吉林工业职业技术学院 数据结构实训 【问题描述】建立一个图书信息文件,包括书号(num)、书名(bookname)、作者(name)、出版社(publish)、价格(price)等。 【要 求】建立一个图书信息文件,包括书号(num)、书名(bookname)、作者(name)、出版社(publish)、价格(price)等。 三、实训步骤 1、问题分析 正确理解问题,分析问题究竟“做什么”,分析问题已知的信息及其作用,分析在解决中对信息处理的规则、要求、限制条件,分析问题解决后应该输出什么样的结果(输出形式、格式、内容)。并分析得出判定结果是否正确的标准。 2、设计分析 得出解决问题的思路、主要流程、采用的数据结构类型的说明、主要算法的思想。 3、设计方案 采用的数据结构类型的定义、主要算法的描述及说明。 4、详细设计 根据问题要求和已得到的算法编写程序。 5、调试程序 发现程序中存在的语法错误和一些逻辑错误,并修改,使程序能够运行。 6、运行程序 选择若干具有代表性的输入数据(包括合理数据和不合理数据),进行测试,尽量使程序的各语句和分支都被检查到,以便发现程序中的错误和漏洞,以便改进算法和程序。 7、使用说明 包括程序源代码、算法(程序)流程图、开发过程中各阶段的有关记录、算法的正确性证明、程序的测试结果、对输入输出要求及格式的详细描述。 四、实训内容 (一)个人题目 1、二叉树遍历 【问题描述】建立二叉树,实现二叉树的先序遍历、中序、后序和层序遍历(用递归或非递归的方法都可以)。吉林工业职业技术学院 数据结构实训 【要 求】编写菜单程序。能够输入二叉树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立二叉树存储结构的输入函数、输出先序遍历序列的函数;输出中序遍历序列的函数;输出后序遍历序列的函数;输出层序遍历序列的函数。 【设计分析】 1、总体设计(基本概念)树的概念 树(Tree)是n(n>=0)个结点的有限集。在任意一棵非空树中: 1)有且仅有一个特定的称为根的结点; 2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2......Tm,其中每一个集合又是一棵树,并且称为根的子树(SubTree)。 【例】如图1所示: 图1 图1是有8个结点的树,其中A是根,其余结点分成2个互不相交的子集:T1={B,D},T2={C,E,F,G,H};T1和T2都是根A的子树,且本身也是一棵树。 【设计方案】1.创建二叉树(可从键盘输入各结点的值)2.按某种方式对二叉树进行遍历 3.树型结构是一种非常重要的非线性结构。树在客观世界是广泛存在的,在计算 机领域里也得到了广泛的应用。在编译程序里,也可用树来表示源程序的语法结构,在数据库系统中,数形结构也是信息的重要组织形式。 4.节点的有限集合(N大于等于0)。在一棵非空数里:(1)、有且仅有 吉林工业职业技术学院 数据结构实训 一个特定的根节点;(2)、当N大于1时,其余结点可分为M(M大于0)个互不相交的子集,其中每一个集合又是一棵树,并且称为根的子树。树的定义是以递归形式给出的。 5.二叉树是另一种树形结构。它的特点是每个结点最多有两棵子树,并且,二叉 树的子树有左右之分,其次序不能颠倒。 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:(1)访问结点本身(N),(2)遍历该结点的左子树(L),(3)遍历该结点的右子树(R)。以上三种操作有六种执行次序: NLR、LNR、LRN、NRL、RNL、RLN。【详细设计】本程序源代码如下: /*源程序*/ /* Note:Your choice is C IDE */ #include “stdio.h” #include typedef char DataType;#define MaxStackSize 50 using namespace std; typedef struct Node { DataType data; struct Node *leftChild; struct Node *rightChild; }BiTreeNode;typedef BiTreeNode* DataType2;typedef struct { DataType2 stack[MaxStackSize];吉林工业职业技术学院 数据结构实训 int top;} SeqStack;typedef struct { DataType2 quene[MaxStackSize]; int front; int rear;}Quene;void StackInitiate(SeqStack *S) { S->top = 0;} int StackNotEmpty(SeqStack S){ if(S.top <= 0)return 0; else return 1;} int StackPush(SeqStack *S, DataType2 x){ if(S->top >= MaxStackSize) { printf(“堆栈已满无法插入!n”); return 0; } else { S->stack[S->top] = x; S->top ++; return 1; } } int StackPop(SeqStack *S, DataType2 *d){ if(S->top <= 0) { printf(“堆栈已空无数据元素出栈!n”); return 0; } else { S->top--; *d = S->stack[S->top]; return 1;吉林工业职业技术学院 数据结构实训 } } int StackTop(SeqStack S, DataType2 *d){ if(S.top <= 0) { printf(“堆栈已空!n”); return 0; } else { *d = S.stack[S.top-1]; return 1; } } typedef struct node{ char data;struct node *lchild;struct node *rchild;}BTNode; typedef BTNode *BTree; int NodeNum,leaf; BTree CreatBTree(void){BTree T;char ch;if((ch=getchar())=='*')return(NULL); else{ T=(BTNode *)malloc(sizeof(BTNode));T->data=ch;T->lchild=CreatBTree();T->rchild=CreatBTree();return(T);} } void Preorder(BTree T)吉林工业职业技术学院 数据结构实训 { if(T){ printf(“%c”,T->data); Preorder(T->lchild); Preorder(T->rchild);} } void Inorder(BTree T){ if(T){ Inorder(T->lchild); printf(“%c”,T->data); Inorder(T->rchild);} } void Postorder(BTree T){ if(T){ Postorder(T->lchild); Postorder(T->rchild); printf(“%c”,T->data);} } int TreeDepth(BTree T){ int hl,hr,max;if(T){ hl=TreeDepth(T->lchild); hr=TreeDepth(T->rchild); max=hl>hr?hl:hr; NodeNum=NodeNum+1; if(hl==0&&hr==0) leaf=leaf+1; return(max+1);} 吉林工业职业技术学院 数据结构实训 else return(0);} void Levelorder(BTree T){ int front=0,rear=1;BTNode *cq[Max],*p;cq[1]=T;while(front!=rear){ front=(front+1)%NodeNum; p=cq[front]; printf(“%c”,p->data); if(p->lchild!=NULL) { rear=(rear+1)%NodeNum; cq[front]=p->lchild; cq[rear]=p->lchild; } if(p->rchild!=NULL) { rear=(rear+1)%NodeNum; cq[front]=p->rchild; cq[rear]=p->rchild; } } } void main(){ BTree root;int i,depth;printf(“n”);printf(“创建二叉树,请输入完全二叉树的先序序列,用*代表虚结点:”);root=CreatBTree();//返回根结点 do{ 吉林工业职业技术学院 数据结构实训 printf(“t1:先序遍历n”);printf(“t2:中序遍历n”);printf(“t3:后序遍历n”);printf(“t4:深度、结点数、叶子数n”);printf(“t5:层次遍历n”);printf(“备注:选择层次遍历之前,需要先选择4,求出该树的结点数。”); printf(“t0:Exitn”); scanf(“%d”,&i);//输入菜单序号 switch(i) { case 1:printf(“先序遍历结果为:”); Preorder(root); break; case 2:printf(“中序遍历结果为:”); Inorder(root); break; case 3:printf(“后序遍历结果为:”); Postorder(root); break; case 4:depth=TreeDepth(root); printf(“深度=%d 结点数=%d”,depth,NodeNum); printf(“叶子数=%d”,leaf); break; case 5:printf(“层次遍历为:”); Levelorder(root); break; default:exit(1); } printf(“n”);} while(i!=0);} 吉林工业职业技术学院 数据结构实训 【使用说明】本程序在turboc 2.0环境下运行,迷宫大小为20×20,需要修改迷宫大小时,可以修改程序中N值的大小。迷宫图由系统自动随机生成,每次生成的迷宫图是不同的。按enter健显示最终搜索结果。按Q健退出程序。 【运行调试】 图(1)二叉树遍历主界面 图(2) (二)综合题目 1、图书管理系统 【问题描述】建立一个图书信息文件,包括书号(num)、书名(bookname)、作者(name)、出版社(publish)、价格(price)等。 【要 求】编写菜单程序,功能包括:建立图书信息、插入记录,删除记录、修改记录、按照书号或书名查询记录、显示记录、根据图书价格进行排序。定义图书信息结构体名称为book。书号(num)、书名(bookname)、作者(name)、出版社(publish)均为字符型数组。价格(price)为单精度型数据。 吉林工业职业技术学院 数据结构实训 【设计分析】系统目标分析 每个学校都有图书馆,最初由于图书数量和种类较少,人工手动管理比较方便和灵活。随着社会的发展,图书的数量和种类越来越多,人工手动管理会降低工作的效率,希望建立一个图书馆图书信息管理系统,是为了解决了人工手动管理图书信息在实践的问题,从而达到系统化、规范化、标准化的水平。该系统的建立不但给管理者带来了方便,也节省了工作时间从而提高了工作效率。 在构造系统时,首先从需求出发构造数据库表,然后再由数据库表结合需求划分系统功能模块。这样,就把一个大的系统分解成了几个小系统。这里把系统的层次划分为了三个部分:一个自由态:即面向任何用户的界面,提供登录功能,以便不同身份的用户登录子系统;一个是一般用户态:即图书有服务子系统;还有一个是管理员界面:提供图书的管理和维护功能。对于不同子系统之间的功换,采用了登录功能和用户注销功能。系统划分了子系统后,下一步的工作是继续划分子系统的小模块。先考虑在进入子系统时应该做什么,进入系统之后又应该做什么,提供那些服务等。例如,对于图书信息服务子系统,在用户进入时首先得调用相关数据库表,找出用户的图书借阅情况;进入系统后,子系统得提供图书查询、图书借阅和还书功能。另外,针对本系统的特殊情况,同时也考虑系统的可移植性,在系统中增加了数据库路径的维护部分。最后,考虑到系统的安全性,还在系统中特别增加了“加密界面”的功能。 【设计方案】本数据库管理系统主要由图书检索、图书管理、数据维护、图书统计、打印输出、系统维护六大模块组成, 如图1 所示。各模块功能如下: 1、主控模块主控模块的功能是控制各个分支模块,它是实现各模块功能的总控制台 2、图书检索模块是图书管理系统的重要模块之一,是读者快速查询图书的途径 本模块的功能是按书名、书号、作者、出版社、图书分类查询 数据维护模块是由图书管理员控制的模块,它由增加、修改和删除读者,增加、修改删除图书,浏览修改读者、浏览修改图书等程序组成。在软件设计时考虑到读者编号、书名、书号是唯一的,因此,在修改读者或图书中,读者记录或图书记录一经登记“读者编号”和“姓名”便不能修改,在删除读者或图书时只要读者有借出图书未还或库存图书原有数量与现有库存量不符便不能删除。 5、数据统计模块由读者统计、图书统计、借出图书分类统计、到期未归还图书读者统计几部分组成 吉林工业职业技术学院 数据结构实训 我们小组的信息系统开发课程设计题目是:图书管理系统开发。系统开发的总的设计目标是实现图书管理的系统化、规范化和自动化,实现对图书资料的集中统一的管理。 本系统主要实现对图书馆信息的管理,主要功能为管理有关读者,书籍,借阅和管理者的信息等。本系统结构分为读者信息管理模块,书籍信息管理模块,借阅信息管理模块,管理者信息管理模块。读者信息管理部分有两方面的功能,可以浏览读者的信息,可以对读者信息进行维护。书籍信息管理可以浏览书籍的信息,可以对书籍信息进行维护。借阅信息管理可以显示当前数据库中书籍借阅情况,可以对借阅信息进行维护。管理者信息管理可以显示数据库中管理者的情况,可以对管理者信息进行维护。可见,本系统并不复杂,主要解决的问题是利用关键字对数据库进行查询。 【详细设计】本程序源代码如下: /*源程序*/ /* Note:Your choice is C IDE */ /* Note:Your choice is C IDE */ #include struct books_list { char author[20]; /*作者名*/ char bookname[20]; /*书名*/ char publisher[20]; /*出版单位*/ char pbtime[15]; /*出版时间*/ char loginnum[10]; /*登陆号*/ float price; /*价格*/ char classfy[10]; /*分类号*/ struct books_list * next;/*链表的指针域*/ };吉林工业职业技术学院 数据结构实训 struct books_list * Create_Books_Doc(); /*新建链表*/ void InsertDoc(struct books_list * head);/*插入*/ void DeleteDoc(struct books_list * head , int num);/*删除*/ void Print_Book_Doc(struct books_list * head);/*浏览*/ void search_book(struct books_list * head);/*查询*/ void info_change(struct books_list * head);/*修改*/ void save(struct books_list * head);/*保存数据至文件*/ /*浏览操作*/ void Print_Book_Doc(struct books_list * head){ struct books_list * p;if(head==NULL || head->next==NULL)/*判断数据库是否为空*/ { printf(“n ━━━━ 没有图书记录!━━━━nn”); return;} p=head;printf(“┏━━━┳━━━┳━━━┳━━━┳━━━━┳━━━┳━━━┓n”);printf(“┃登录号┃书名 ┃ 作者 ┃出版单位┃出版时间┃分类号┃价格┃n”); printf(“┣━━━╋━━━╋━━━╋━━━╋━━━━╋━━━╋━━━┫n”);/*指针从头节点开始移动,遍历至尾结点,依次输出图书信息*/ while(p->next!= NULL){ p=p->next; printf(“┃%-6.6s┃%-10.10s┃%-10.10s┃%-10.10s┃%-12.12s┃%-6.6s┃%.2f ┃n”,p->loginnum,p->bookname,p->author,p->publisher,p->pbtime,p->classfy,p->price);/*循环输出表格*/ } printf(“┗━━━┻━━━┻━━━┻━━━┻━━━━┻━━━┻━━━┛n”);printf(“n”);吉林工业职业技术学院 数据结构实训 } /*删除操作*/ void DeleteDoc(struct books_list * head){ struct books_list *s,*p; /*s为中间变量,p为遍历时使用的指针*/ char temp[20];int panduan;/*此变量用于判断是否找到了书目*/ panduan=0;p=s=head;printf(“ [请输入您要删除的书名]:”);scanf(“%s”,temp);/*遍历到尾结点*/ while(p!= NULL) { if(strcmp(p->bookname,temp)==0) { panduan++; break; } p=p->next;} if(panduan==1){ for(;s->next!=p;) /*找到所需删除卡号结点的上一个结点*/ { s=s->next; } s->next=p->next;/*将后一节点地址赋值给前一节点的指针域*/ free(p); printf(“n ━━━━ 删除成功!━━━━n”);} else /*未找到相应书目*/ 吉林工业职业技术学院 数据结构实训 { printf(“ 您输入的书目不存在,请确认后输入!n”);} return;} int main(void){ struct books_list * head; char choice;head=NULL;for(;;)/*实现反复输入选择*/ { printf(“ ┏━━━━━━━━━━━━━━━━━━━┏━┓n”); printf(“ ┃ ┃ socat 图书管理系统 ┃ ┃n”); printf(“ ┃ ┗━━━━━━━━━━━━━━━━━━━┛ ┃n”); printf(“ ┃ ●[1]图书信息录入 ┃n”); printf(“ ┃ ┃n”); printf(“ ┃ ●[2]图书信息浏览 ┃n”); printf(“ ┃ ┃n”); printf(“ ┃ ●[3]图书信息查询 ┃n”); printf(“ ┃ ┃n”); printf(“ ┃ ●[4]图书信息修改 ┃n”); printf(“ ┃ ┃n”); printf(“ ┃ ●[5]图书信息删除 ┃n”); printf(“ ┃ ┃n”); printf(“ ┃ ●[6]退出系统 ┃n”); printf(“ ┗━━━━━━━━━━━━━━━━━━━━━━━┛ 15 吉林工业职业技术学院 数据结构实训 n”); printf(“ 请选择:”); fflush(stdin); scanf(“%c”,&choice); if(choice=='1') { if(head==NULL) { head=Create_Books_Doc(); } InsertDoc(head); } else if(choice=='2') { Print_Book_Doc(head); } else if(choice=='3') { search_book(head); } else if(choice=='4') { info_change(head); } else if(choice=='5') { struct books_list *s,*p; /*s为中间变量,p为遍历时使用的指针*/ char temp[20];int panduan;/*此变量用于判断是否找到了书目*/ panduan=0;p=s=head;printf(“ [请输入您要删除的书名]:”);吉林工业职业技术学院 数据结构实训 scanf(“%s”,temp);/*遍历到尾结点*/ while(p!= NULL) { if(strcmp(p->bookname,temp)==0) { panduan++; break; } p=p->next;} if(panduan==1){ for(;s->next!=p;) /*找到所需删除卡号结点的上一个结点*/ { s=s->next; } s->next=p->next;/*将后一节点地址赋值给前一节点的指针域*/ free(p); printf(“n ━━━━ 删除成功!━━━━n”);} else /*未找到相应书目*/ { printf(“ 您输入的书目不存在,请确认后输入!n”);} return; } else if(choice=='6') { printf(“n”); printf(“ ━━━━━━━━ 感谢使用图书管理系统 ━━━━━━━━n”);吉林工业职业技术学院 数据结构实训 break; } else { printf(“ ━━━━ 输入错误,请重新输入!━━━━”); break; } } } 【使用说明】本程序在turboc 2.0环境下运行,迷宫大小为20×20,需要修改迷宫大小时,可以修改程序中N值的大小。迷宫图由系统自动随机生成,每次生成的迷宫图是不同的。按enter健显示最终搜索结果。按Q健退出程序。 【运行调试】 图(3)图书管理系统主界面 吉林工业职业技术学院 数据结构实训 图(4)图书信息浏览 五、实训心得 六、参考文献 实验一 线性表 1.实验要求 1.1 掌握数据结构中线性表的基本概念。 1.2 熟练掌握线性表的基本操作:创建、插入、删除、查找、输出、求长度及合并并运算在顺序存储结构上的实验。1.3 熟练掌握链表的各种操作和应用。2.实验内容 2.1 编写一个函数,从一个给定的顺序表A中删除元素值在x到y之间的所有元素,要求以较高效率来实现。 2.2 试写一个算法,在无头结点的动态单链表上实现线性表插入操作 2.3 设计一个统计选票的算法,输出每个候选人的得票结果。 3.实验代码 2.1代码: #include A[i-k]=A[i];i++;} return(n-k);} void main(){ int i,j;int a[maxsize];printf(“输入%d个数:n”,maxsize);for(i=0;i scanf(“%d,”,&a[i]); 数据结构实验报告 j=del(a,maxsize,1,3); printf(“输出删除后剩下的数:n”); for(i=0;i ”n,a[i]);} 2.2代码: INSERT(L,i,b)。 void Insert(Linklist &L,int i,elemtype x){ if(!L){ L=(Linklist)malloc(sizeof(Lnode)); (*L).data=x;(*L).next=NULL;} else { if(i==1) { s=(Linklist)malloc(sizeof(Lnode)); s->data=x;s->next=L;L=s; } else { p=L;j=1; while(p&&j {j++;p=p->next;} if(p||j>i-1) return error; s=(Linklist)malloc(sizeof(Lnode)); s->data=x;s->next=p->next;p->next=s; } } } 2.3代码: typedef int elemtype typedef struct linknode { elemtype data;struct linknode *next;}nodetype; 数据结构实验报告 nodetype *create(){ elemtype d;nodetype h=NULL,*s,*t;int i=1;printf(“建立单链表:n”);while(1){ printf(“输入第%d个结点数据域”,i); scanf(“%d”,&d); if(d==0)break; if(i==1) { h=(nodetype *)malloc(sizeof(nodetype)); h->data=d;h->next=NULL;t=h; } else { s=(nodetype *)malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s; } i++;} return h;} void sat(nodetype *h,int a[]){ nodetype *p=h;while(p!=NULL){ a[p->data]++; p=p->next;} } void main(){ int a[N+1],i;for(i=0;i a[i]=0;nodetype *head;head=create();sat(head,a); 数据结构实验报告 } printf(“候选人:”);for(i=1;i<=N;i++)printf(“%3d”,i);printf(“n得票数n”);for(i=1;i<=N;i++)printf(“%3d”,a[i]);printf(“n”);4.实验小结 线性表是最简单的、最常用的一种数据结构,是实现其他数据结构的基础。 实验二 栈与队列 1.实验要求 1.1 了解栈和队列的特性,以便灵活运用。1.2 熟练掌握栈和有关队列的各种操作和应用。 2.实验内容 2.1 设一个算术表达式包括圆括号,方括号和花括号三种括号,编写一个算法判断其中的括号是否匹配。 3.实验代码 2.1代码: #include 数据结构实验报告 gets(str);deal(str);printf(“正确!”);getchar();return 0;} void deal(char *str){ list *L;L=(list *)malloc(sizeof(list));if(!L){ printf(“错误!”);exit(-2);} L->next=NULL;while(*str){ if(*str=='('||*str=='['||*str=='{') push(*str,L);else if(*str==')'||*str==']'||*str=='}') if(pop(*str,L)) {puts(“错误,请检查!”); puts(“按回车键退出”); getchar();exit(-2); } str++;} if(L->next){ puts(“错误,请检查!”);puts(“按任意键退出”);getchar();exit(-2);} } void push(char c,list *L){ list *p;p=(list *)malloc(sizeof(list));if(!p){ printf(“错误!”);exit(-2); 数据结构实验报告 } p->str=c;p->next=L->next;L->next=p;} #define check(s)if(L->next->str==s){p=l->next;L->next=p->next;free(p);return(0);} int pop(char c,list *L){ list *p;if(L->next==NULL)return 1;switch(c){ case')':check('(')break;case']':check('[')break;case'}':check('{')break;} return 1; 4.实验小结 栈和队列是最基础的一种数据结构之一,为实现其他数据结构的奠定基石。 实验三 树 1.实验要求 1.1 掌握二叉树,二叉树排序数的概念和存储方法。1.2 掌握二叉树的遍历算法。 1.3 熟练掌握编写实现树的各种运算的算法。 2.实验内容 2.1 编写程序,求二叉树的结点数和叶子数。 2.2 编写递归算法,求二叉树中以元素值为X的结点为根的子数的深度。2.3 编写程序,实现二叉树的先序,中序,后序遍历,并求其深度。 数据结构实验报告 3.实验代码 2.1代码: #include bt=(struct node *)malloc(sizeof(bnode)); bt->data=ch; bt->lchild=creat(); bt->rchild=creat();} return bt;} int n=0,n1=0;void preorder(blink bt){ if(bt){ n++; if(bt->lchild==NULL&&bt->rchild==NULL) n1++; preorder(bt->lchild); preorder(bt->rchild);} } void main(){ blink root;root=creat();preorder(root);printf(“此二叉数的接点数有:%dn”,n);printf(“此二叉数的叶子数有:%dn”,n1);} 数据结构实验报告 2.2代码: int get_deep(bitree T,int x){ if(T->data==x){ printf(“%dn”,get_deep(T));exit 1;} else { if(T->lchild)get_deep(T->lchild,x);if(T->rchild)get_deep(T->rchild,x);} int get_depth(bitree T){ if(!T)return 0;else { m=get_depth(T->lchild);n=get_depth(T->rchild);return(m>n?m:n)+1;} } 2.3代码: #include 数据结构实验报告 bt->lchild=creat();bt->rchild=creat();} return bt;} void preorder(blink bt){ if(bt){ printf(“%c”,bt->data);preorder(bt->lchild);preorder(bt->rchild);} } void inorder(blink bt){ if(bt){ inorder(bt->lchild);printf(“%c”,bt->data);inorder(bt->rchild);} } void postorder(blink bt){ if(bt){ postorder(bt->lchild);postorder(bt->rchild);printf(“%c”,bt->data);} } int max(int x,int y){ if(x>y)return x;else return y;} int depth(blink bt){ if(bt)return 1+max(depth(bt->lchild),depth(bt->rchild));else 数据结构实验报告 } { return 0;void main()blink root; root=creat();printf(“n”);printf(“按先序排列:”); preorder(root);printf(“n”); printf(“按中序排列:”);inorder(root);printf(“n”);printf(“按后序排列:”); postorder(root);printf(“n”); } printf(“此二叉数的深度是:”);printf(“depth=%dn”,depth(root));4.实验小结 通过本章学习实验,对树有了初步的认识。树就是一种非线性的数据结构,描述了客观世界中事物之间的层次关系。这种结构有着广泛的应用,一切具有层次关系的问题都可以用树来表示。 实验四 图 1.实验要求 1.1 熟悉图的各种存储方法。 1.2 掌握遍历图的递归和非递归的算法。1.3 理解图的有关算法。 2.实验内容 2.1 写出将一个无向图的邻接矩阵转换成邻接表的算法。 数据结构实验报告 2.2 以邻接表作存储结构,给出拓扑排序算法的实现。 3.实验代码 2.1代码: void mattolist(int a[][],adjlist b[],int n)/*n为图的结点个数*/ { for(i=0;i /*邻接表置空*/ for(i=0;i /*逐行进行*/ } 2.2代码: typedef struct vexnode { VertexType vertex;int in;/*增加一个入度域*/ ArecNodeTp * fristarc;for(j=n-1;j>=0;j--) if(a[i][j]!=0){p=(arcnodetp *)malloc(sizeof(arcnodetp));/*产生邻接点*/ p->adjvex=j; p->nextare=b[i].firstare;b[i].firstarc=p;} }AdjList[vnum];typedef struct graph { AdjList adjlist;int vexnum,arcnum;}GraphTp;Top_Sort(GraphTp g) 数据结构实验报告 { LstackTp *p;/*建立入度为0的顶点栈S*/ int m,i,v; initStack(S); } for(i=0;i } if(m 通过本章学习实验,对图有了具体的认识。图也是一种非线性的数据结构,这种结构有着广泛的应用,一切具有关系的问题都可以用图来表示。 数据结构实验报告 实验五 查找 1.实验要求 1.1 掌握顺序查找、二分法查找、分块查找和哈希表查找的算法。1.2 能运用线性表的查找方法解决实际问题。2.实验内容 2.1 编写一个算法,利用二分查找算法在一个有序表中插入一个元素X,并保持表的有序性。 2.2 根据给定的数据表,先建立索引表,然后进行分块查找。3.实验代码 2.1代码: #include int data[MAXNUM],m;int insert=1;m=input(data);printf(“Input the insert num:”);scanf(“%d”,data);insert=search(data,1,m);/*返回插入位置*/ plug(data,insert,m);for(insert=1;insert<=m+1;insert++)/*显示数据*/ printf(“%3d”,*(data+insert)); 数据结构实验报告 getch();} int input(int *data){ int i,m; printf(“nInput the max num:”);scanf(“%d”,&m);printf(“input datan”);for(i=1;i<=m;i++)scanf(“%d”,data+i);return m;} int search(int *data,int low,int high)/*递归查找插入位置*/ { int mid;if(low>high)return low;/*没有找到插入数据,返回low*/ else{ } search(data,low,high);} void plug(int *data,int insert,int m) { int i;for(i=m;i>insert;i--)*(data+i+1)=*(data+i);mid=(low+high)/2;if(*(data+mid)==*data)retun mid;/*找到插入数据,返回mid*/ else if(*(data+mid)<*data)else if(*()data+mid)>*data)*(data+insert)=*data 数据结构实验报告 } 2.2代码: #include /*元素个数*/ #definr Blocknum 3 /*分块数*/ typedef struct indexterm { int key;/*最大关键字*/ int addr;/*块的起始地址*/ }index;/*索引表数据类型*/ index * CreateList(int data[],int n)/*建索引表*/ { index *p;int m,j,k;m=n/BlockNum;/*分为BlockNum块,每块有m个元素*/ p=(index *)malloc(BlockNum *sizeof(index));for(k=0;k } return p;} int BlockSearch(index *list,int rectab[],int n,int m,int k)/*分块查找*/ { int low=0,high=m-1,mid,i;(p+k)->key=dat a[m*k];(p+k)->addr=m*k;for(j=m*k;j 数据结构实验报告 int b=n/m;/*每块有b个元素*/ while(low<=high){/*块间折半查找*/ } if(low } return-1;} void main(){ int record[N]={22,12,13,8,9,20,33,42,44,38,24,48,60,58,74,49,86,53};int key;index *list;printf(“please input key:n”);scanf(“%d”,&key);list=CreateList(record,N);printf(“data postion id %dn”,BlockSearch(list,record,N,BlockNum,key));} if(i<=(list+low)->addr+b-1)return i;mid=(low+high)/2;if((list+mid)->key>=k)high=mid+1;else low=mid+1;else return-1;4.实验小结 通过本章的学习,对排序有较高层次的理解与认识,从平时的练习中可以看出排序是数据处理中经常用到的重要运算。有序的顺序表可以采用查找效率较高的折半查找法,而无序的顺序表只能用效率较低的顺序查找法。 《业务流程与算法设计》实训报告 信息系统与信息管理 信息系统xxxx班 小组:xx,x 指导教师:xxx 一、概述 21世纪是一个信息化的时代,企业只有敏捷的获取生产信息和市场信息,才能置身于国际大舞台,这就离不开先进的企业管理系统——ERP。而仓库管理系统正是ERP中一个最重要的组成部分,也是企业生产过程的一个重要组成部分。企业要在现代化国内外市场取得一席之地,就必须使其仓库管理体系达到现代化水平,也即使仓库管理从原始的手工阶段走向方便快捷的计算机实现阶段。选择合理的仓库管理方法,不仅会促进销售,改善生产秩序,做到均衡生产,而且会降低库存的占用资金,最终使企业获得更好的经济效益。 基于此,仓库管理系统的主体任务是实现仓库物资信息的系统化、规范化和自动化。本文详细介绍了仓库管理系统的设计与实现。其仓库管理系统是通过入库业务、出库业务、仓库调拨、库存调拨和虚仓管理等功能,综合批次管理、物料对应、库存盘点、质检管理、虚仓管理和即时库存管理等功能综合运用的管理系统,有效控制并跟踪仓库业务的物流和成本管理全过程,实现完善的企业仓储信息管理。该系统可以独立执行库存操作,与其他系统的单据和凭证等结合使用,可提供更为完整全面的企业业务流程和财务管理信息。 1.1仓库是保管、储存物品的建筑物和场所的总称。物流中的仓库功能已经从单纯的物资存储保管,发展到具有担负物资的接收、分类、计量、包装、分拣、配送、存盘等多种功能。而且仓储在企业的整个供应链中起着至关重要的作用,如果不能保证正确的进货和库存控制及发货,将会导致管理费用的增加,服务质量难以得到保证,从而影响企业的竞争力。 1.2仓库管理系统是通过入库业务、出库业务、仓库调拨、库存调拨和虚仓管理等功能,综合批次管理、物料对应、库存盘点、质检管理、虚仓管理和即时库存管理等功能综合运用的管理系统,有效控制并跟踪仓库业务的物流和成本管理全过程,实现完善的企业仓储信息管理。该系统可以独立执行库存操作,与其他系统的单据和凭证等结合使用,可提供更为完整全面的企业业务流程和财务管理信息。 1.3仓库管理系统是为企业的采购、制造计划、制造执行、客户服务系统与仓库或配送中心提供的管理手段满足企业对低成本和快速处理的要求,帮助不同行业的企业。解决复杂的配送问题并且降低订单履行成本。通过对库存实时可见性和仓库作业流程的支持,仓库管理系统能够有效地组织人员、空间和设备进行收货、存储、拣货和运输:组织运送原材料和部件到生产企业,运送成品到批发商、分销商和最终客户手中。 二、业务流程分析 2.1、近几年,物流业发展的一个重要特征就是以“零库存”为最高目标。“零库存”的含义是以仓库储存形式的某种或某些种物品的储存数量很低的一个概念,甚至可以为“零”,即不保持库存。不以库存形式存在就可以免去仓库存货的一系列问题,如仓库建设、管理费用、存货维护、保管、装卸、搬运等费用,存货占用流动资金及库存物的老化、损失、变质等问题。因此“库存”以受到青睐,就在于给企业管理带来了诸多的优点,如高效率、低成本和完美的流程。虽然目前零库存还是一种理想模式,但是通过不断降低库存,企业可以节省很多成本。而仓储的信息化是实现零库存的必要前提。而中国企业信息化建设还处于在相对比较初级的阶段。2.2功能模块: (1)仓库管理系统功能设定模块 自定义整个系统的管理规则,包括定义管理员及其操作口令的功能;(2)仓库管理系统的基本资料维护模块 对每批产品生成唯一的基本条码序列号标签,用户可以根据自己的需要定义序列号,每种型号的产品都有固定的编码规则,在数据库中可以对产品进行添加、删除和编辑等操作; 2.3.采购管理模块 仓库管理系统 采购定单:当需要采购的时候,可以填写采购定单,此时并不影响库存; 采购收货:当采购定单被批准,完成采购后到货的时候,首先给货物帖上条形码序列号标签,然后在采购收货单上扫描此条形码,保存之后,库存自动增加。仓库管理系统 其他入库:包括借出货物归还、退货等只需要填写采购收货单; 2.4.仓库管理模块 仓库管理系统 产品入库:采购入库或者其他入库,自动生成入库单号,货品及可选择方便快捷,可以区分正常入库、退货入库等不同的入库方式。 产品出库:销售出库或者其他出库,可以自动生成出库单号,可以区分正常出库、赠品出库等不同的出库方式; 库存管理:不需要手工管理,当入库和出库时,系统自动生成每类产品的库存数量,查询方便; 特殊品库:当客户需要区分产品时,可以建立虚拟的仓库管理需要区分的产品,各功能和正常品库一致。 调拨管理:针对不同的库之间需要调拨,可以自动生成调拨单号,支持货品在不同的仓库中任意调拨。 盘点管理:用户随时可以盘点仓库,自动生成盘点单据,使盘点工作方便快捷。 3.1.2、入库管理 (1).物料进库时,仓库管理员必须凭送货单、检验合格单办理入库手续;拒绝不合格或手续不齐全的物资入库,杜绝只见发票不见实物或边办理入库边办理出库的现象。 (2).入库时,仓库管理员必须查点物资的数量、规格型号、合格证件等项目,如发现物资数量、质量、单据等不齐全时,不得办理入库手续。未经办理入库手续的物资一律作待检物资处理放在待检区域内,经检验不合格的物资一律退回,放在暂放区域,同时必须在短期内通知经办人员负责处理。3.1.3、出库管理 (1).各类材料的发出,原则上采用先进先出法。物料(包括原材料、半成品)出库时必须办理出库手续,并做到限额领料,车间领用的物料必须由车间主任(或其指定人员)统一领取,领料人员凭车间主任或计划员开具的流程单或相关凭证向仓库领料,领料员和仓管员应核对物品的名称、规格、数量、质量状况,核对正确后方可发料;仓管员应开具领料单,经领料人签字,登记入卡、入帐。(2)成品发出必须由各销售部开具销售发货单据,仓库管理人员凭盖有财务发货印章和销售部门负责人签字的发货单仓库联发货,并登记。 (3).仓管员在月末结账前要与车间及相关部门做好物料进出的衔接工作,各相关部门的计算口径应保持一致,以保障成本核算的正确性。 (4).库存物资清查盘点中发现问题和差错,应及时查明原因,并进行相应处理。如属短缺及需报废处理的,必须按审批程序经领导审核批准后才可进行处理,否则一律不准自行调整。发现物料失少或质量上的问题(如超期、受潮、生锈、或损坏等),应及时的用书面的形式向有关部门汇报。 (4).仓库管理员应责任心强,监守岗位,无故不能离岗。对突发事件能及时处理和协调,保证生产的顺利进行,严防以外事故发生。3.1.4、成品进仓管理流程 (1).仓库管理的流程根据已审核《采购订单》内容准备成品收货。 (2).厂家送货到达后,厂家提供《送货清单》给收货仓管员,《送货清单》应清晰显示送货单位名称、送货单位印章或经手人签名、货品的名称、规格、数量、采购订单号。收货仓管员将《送货清单》和对应的《采购订单》相核对。相核不符者拒收。相符者仓管员以《送货清单》和《采购订单》验收货品,收货量大于定购量时,仓库主管要通过营销部同意和取得营销部有权人的书面通知后才能超量收货。 (3).仓管员收货无误后,在《送货清单》上签收,并加盖收货专用章,一联自留,一联交对方。 (4).仓管员在电脑上开具《采购单》,并由仓库主管审核生效。将《采购单》打印一式三联,经仓库主管和仓管员签字加盖收货专用章后,第一联存根自留,第二联财务联连同送货单位的《送货清单》交财务,第三联对方联同时交财务。(5).返修品回仓,以对应的《采购退货单》为依据收货,仓管员核实货单无误后在电脑上开具《采购退返单》,注明原《采购退货单》号,并经仓库主管审核生效。 3.2具体职能: (1)仓库管理部门:对企业仓库实施控制的直接管理部门,是企业的重要组成部分。 (2)企业有关管理部门:根据仓库管理部门报送的库存物料汇总报表和库存物料资金占用报表,实施高层谋划和管理。 (3)财务部门:管理控制企业的财务收入和支出。(4)物料采购部门:制定合理的采购计划,负责物料的采购事宜,并经到货运至仓库。 (5)企业其他部门:其运作均依赖于仓库管理部门的物资储备,定时向仓库领取生产所需的物料,以满足生产。 仓库管理系统能够协调各个部门在仓库中工作,并且准确记录物资每次出入库清单及库存清单、明确限定每个管理员的操作权限、定期盘点以确保安全生产、真正意义上实现该公司的仓库管理从原始的手工阶段走向了方便快捷的计算机实现阶段。 三、业务流程设计 采用的办公软件:visio 2003 前台流程: 客户提货人员台帐操作员入库单出库单仓库管理员 管理员流程: 仓库管理员a货物入库a货物入库货物出库库存保管仓库员注明装卸作业量和车牌号以及其他事项按保管条件要求分类存放b仓库管理员签员,放行检查,清点仓库管理员存单1仓库管理员存单2 b仓库管理员签员,放行每天的第三单据交台帐操作员总流程:台帐操作员整理每天的作业量统计(装卸)作业量及费用编制日,周,月报表月底打印费用确认书月底交部门经理核定并上报主管,总经理 客户提货人员台帐操作员入库单出库单仓库管理员台帐操作员整理每天的作业量装卸(工人,叉车手)统计(装卸)作业量及费用货物入库货物出库编制日,周,月报表库存保管仓库员注明装卸作业量和车牌号以及其他事项按保管条件要求分类存放月底打印费用确认书仓库管理员签员,放行每天的第三单据交台帐操作员月底交部门经理核定并上报主管,总经理检查,清点仓库管理员存单1仓库管理员存单2 安排仓位入库管理核对单货,登记准确装卸规范,堆放标准定期检查货物,设备维护仓库清洁,安全库内管理各项运作规范,标准统计汇总,准确及时货物出库手续齐全出库货物数量准确出库管理装卸规范,堆放标准按出货单先后发放货物出库单据保存归档操作人员;仓库员;仓库主管;装卸工等 四、业务流程优化 仓库管理系统仓库管理系统能够协调各个部门在仓库中工作,并且准确记录物资每次出入库清单及库存清单、明确限定每个管理员的操作权限、定期盘点以确保安全生产、真正意义上实现该公司的仓库管理从原始的手工阶段走向了方便快捷的计算机实现阶段。4.1职能: 4.1.1.系统功能设定模块,自定义整个系统的管理规则,包括定义管理员及其操作口令的功能。 4.1.2.基本资料维护模块,对每批产品生成唯一的基本条码序列号标签,用户可以根据自己的需要定义序列号,每种型号的产品都有固定的编码规则,在数据库中可以对产品进行添加、删除和编辑等操作。4.1.3.采购管理模块 (1)采购定单:当需要采购的时候,可以填写采购定单,此时并不影响库存。(2)采购收货:当采购定单被批准,完成采购后到货的时候,首先给货物帖上条形码序列号标签,然后在采购收货单上扫描此条形码,保存之后,库存自动增加。(3)其他入库:包括借出货物归还、退货等只需要填写采购收货单。4.2 问题及解决方法 仓库管理系统是为企业的采购、制造计划、制造执行、客户服务系统与仓库或配送中心提供的管理手段满足企业对低成本和快速处理的要求,帮助不同行业的企业。解决复杂的配送问题并且降低订单履行成本。通过对库存实时可见性和仓库作业流程的支持,仓库管理系统能够有效地组织人员、空间和设备进行收货、存储、拣货和运输:组织运送原材料和部件到生产企业,运送成品到批发商、分销商和最终客户手中。 现在摆在人们面前的是,有些仓库管理系统非常成功而有的效果很差,甚至把仓库管理变成花钱和成本难以控制的地方。必须指出的是,所谓仓库,其实是一家公司内部各个部门的延伸。如果部门采购超量产品这个问题当然轮到仓库储存保管来承担后果。如果公司承诺第二天把产品交付订货的某客户,具体经办这件交易的当然也是仓库。如果财务部门从卖方收到的发票与实际到货数量、质量或者品名不相吻合需要核对、补充和调整等,这时候又要轮到仓库去办理。因此.仓库是公司不可分割的一个重要部门仓库管理系统实际上就是公司管理系统的延伸。但是仓库又是相对独立于公司其他部门的,尤其有相对独立的管理系统。 五、总结 21世纪是一个信息化的时代,企业只有敏捷的获取生产信息和市场信息,才能置身于国际大舞台,这就离不开先进的企业管理系统——ERP。而仓库管理系统正是ERP中一个最重要的组成部分,也是企业生产过程的一个重要组成部分。企业要在现代化国内外市场取得一席之地,就必须使其仓库管理体系达到现代化水平,也即使仓库管理从原始的手工阶段走向方便快捷的计算机实现阶段。选择合理的仓库管理方法,不仅会促进销售,改善生产秩序,做到均衡生产,而且会降低库存的占用资金,最终使企业获得更好的经济效益。 通过这次设计,我比较从前更全面的认识了业务流程的概念,流程优化和重组。在此感谢指导老师的帮助和刘慧老师的帮助,刘慧老师在教学过程中不仅讲解课本上的知识,还让学生们自己亲自动手操作,有助于同学们理解课程内容和掌握专业技巧,此外还要感谢好友的支持、帮助和鼓励。第二篇:数据结构实训报告
第三篇:数据结构实训报告样本
第四篇:《数据结构》实训报告
第五篇:《业务流程与算法设计》实训报告