语言数据结构课程库存管理系没统的与实现含源代码.doc
*课程设计报告*浙江理工大学计算机学院2010年第二学期C语言数据结构 课程设计题 目: 库存管理系统的设计与实现 专业班级: 姓 名: 学 号: 指导教师: 成 绩: 目 录一、程序设计目标31.1问题描述31.2目的和意义32.1方案确定52.2程序设计模块连接图52.3模块功能说明5三、详细设计73.1数据设计73.2流程框图8四、调试分析和测试结果11五、新得体会13六、C源程序清单14七、附录24题目:库存管理系统一、程序设计目标1.1问题描述一个库存货品信息管理系统软件,要求能实现库存货品信息的输入、插入、删除、查找等功能,并能建立和更新的库存信息保存于文件供输出或打印。对于查找、删除等功能要求能按货品名、货品号分别进行。每个货品的相关信息包括:货品号、货品名、货品库存量、进货日期、货品生产厂家及供应商等。实际上要完成的是一个简单数据库管理信息系统的设计,同时要掌握数据结构方面的知识。 1.2目的和意义 通过课程设计题目的练习,强化对所学知识的掌握及对问题分析和任务定义的理解,对每到题目作出了相应的逻辑分析和数据结构的选择,通过对任务的分析,为操作对象定义相应的数据结构,以过程化程序设计的思想方法为原则划分各个模块,定义数据的抽象数据类型。分模块对题目进行设计,强化学生对C语言的掌握和对数据结构的选择及掌握。通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。促使学生养成良好的编程习惯, 以及让学生对书本上的知识进行了实践。算法与数据结构这门课是计算机科学中一门综合性的专业基础课。它不仅是计算机学科的核心课程,而且已成为其它理工专业的热门选修课。它又是操作系统、编译原理、数据库原理、算法分析、人工智能、图象处理等专业课程的前导课。具有承上启下的作用。数据结构的研究不仅涉及到计算机硬件的研究范围,而且和计算机软件的研究有着密切的关系。计算机科学各领域及有关的应用软件都要用到数据结构。该课程的目的就是介绍一些最常用的数据结构,阐明数据结构内在的逻辑关系,讨论它们在计算机中的存储表示,并结合各种典型应用说明它们在进行各种运算时的动态性质及实际的执行算法。二、概要设计2.1方案确定库存货品信息管理系统要求实现许多功能,可遵循结构化程序设计思想来进行本系统的设计自顶向下,逐步细化,也就是将软件设计任务划分成许多容易解决的小的子任务,即分解出许多子功能模块进行设计。本程序经过分析可划分出6个子任务:输入、输出、插入、删除、查找和保存。2.2程序设计模块连接图库存货品信息管理系统的模块连接结构如下图:仓库货品信息管理系统 载入模块删除模块保存模块 查找模块插入模块 输出模块输入模块2.3模块功能说明对本系统的功能进行分析后可作如下的模块化设计:输入模块实现功能:按顺序将货物编号、货物名称、货物数量依次输入,并建立链表将其连接。当输入的货品编号为0时,输入结束。插入模块实现功能:向已经存盘的文件中再输入货品的信息,包括货品编号、货品名称、货品数量等等。删除模块实现功能:在已经存储的文件中删除指定的货品信息,并释放内存空间。删除可以按照货品编号和货品名称两中方法进行。查找模块实现功能:在已经存储的文件中查找指定的货品信息。可以按照查找货品编号和货品名称两种方法进行。输出模块实现功能:在输入特定的文件名之后,输出该文件中所包含的全部货品信息。保存模块实现功能:进行上述操作后,都要进行保存操作,链表中的信息以文件形式被长期。保存。载入模块实现功能:将磁盘上的数据文件载入链表。主序模块实现功能:完成系统的界面处理,包括开始界面和主菜单界面。三、详细设计3.1数据设计(1)数据结构的选择选取动态数据结构,本系统是通过双向链表来完成的。动态存储分配与释放: 申请存储空间函数malloc( )函数首部原型为void * malloc(unsigned int size) 释放存储空间函数free( )函数首部原型为void free(void*p)动态数据结构双向链表head 2030 2036 2025 20422030head2030 20362025D NULL C 2042B 2025A20363.2流程框图开 始(1)插入模块调入载入模块Head=NULL“yes”or “no” Head=>ptr1ptr3=>ptr2->next;ptr2=>ptr3->priorNULL=>ptr3->nextptr1=>ptr2;ptr1->next=>ptr1ptr2=>ptr1->priorptr1!=NULL申请一个结点空间,使ptr3指向它给ptr3指向结点输入预插入货品的信息YNY返回NULLNY返回head结束开始(4)保存模块输入预保存文件的文件名创建文件成功 N YHead=>ptr1Ptr1!=NULL N Y将ptr1指向结点的数据写入文件Ptr1->next=>ptr1结束开始(5)输出模块调用载入模块Head= =NULL Y NHead=>ptr1输出ptr1指向结点的货品信息结束对以上各模块的文字解释说明:(1)输入模块:其实就是一个建立链表的操作模块。建立链表的具体操作就是逐一输入各结点数据,并建立其前后相链的关系。首先设三个指针变量:head,ptr1,ptr2。它们都是指向结构体类型数据的。先使head的值为NULL,这是链表为空的情况。用malloc函数开辟一个结点,并使ptr1,ptr2都指向它,之后从键盘读入一个货品的数据给ptr1所指向的结点。当输入的ptr1->num不为0时,令headptr1;ptr2=ptr1,即把ptr1的值赋给head,使ptr2,ptr1,head都指向这一新开辟的结点,此结点就成为链表中的第一个结点。再开辟一个新结点并使ptr1指向它,读入该结点的数据,如果输入的ptr1->num不为0,则应链入这第二个结点,这时和上一个结点的处理不同,是将ptr1的值赋给ptr2->next,也就是使第一个结点的next成员指向第二个结点,接着将ptr2也指向结点2。再开辟一个新结点并使ptr1指向它,读入该结点的数据,同样将ptr1的值赋给ptr2->next,也就是使第三个结点链接到第二个结点之后,并接着将ptr1的值赋给ptr2,使ptr2指向结点3。再开辟一个新结点,并使ptr1指向它,输入该结点的数据,如果输入ptr1->num为0,则是输入结束标志,此结点不被链接到链表中,就将NULL赋给ptr2->next。建立链表过程至此结束,ptr1最后所指结点并未链入链表中。(2)插入模块:要完成的是链表的插入操作,即将一个新结点插入到一个已有的链表中,对刚刚建立的链表,首先新设一个指针变量ptr0,并开辟一个结点使ptr3指向它,输入该结点的数据,即新货的有关数据,接下来查找要插入位置结点,找到后只需修改此结点和ptr0指向结点指针域的值即可,链表中所有元素位置均不需移动,这就体现了链表的优点。(3)删除模块:要完成的是链表的删除操作,只需修改链表中要删除结点的前一个结点的链指针。使之指向被删除结点的后面一个结点即可。(4)保存模块:将最终想要保留的数据信息保存于文件中。(5)输出模块:要完成的是依次输出链表中各结点的数据的操作。首先找到链表头结点的地址,也就是head的值,然后设一个指针变量ptr1,先指向第一个结点,输出ptr1所指的结点,然后使ptr1后移一个结点,再输入直至链表的尾结点结束。四、调试分析和测试结果各模块功能测试:COM *input( )输入模块功能测试用户逐一输入的数据不断添加就形成了一个列表。前面已经表明本系统的数据结构选取动态数据结构双向链表,因此此列表在内存中是以链表的形式存储的。那么输入模块实际上就是一个建立链表的操作模块。通过模块save( )将内存中的已输入的数据存入到指定路径的某*.dat文件中去.特别指出: * 为用户自己规定的货品名。输入条件: goodsnumb ld型,且>0. 当=0时退出 goodsname s 型 goodscount d型,且>0. 当<0时显示输入错误,重输字样。 调用save( )时 goosfilename:d:pllfu输出结果: 货品保存在用户指定路径的 *.dat文件中以免丢失。2Print( )输出模块可将指定文件中的内容显示在屏幕上。输出条件:调用载入模块时,goosfilename:d:pllfu输出结果:如输出条件正确,则可在屏幕上显示如下:goodsnumb goodsname goodscount0001 a 1250002 b 2300003 c 1803. insert( )插入模块插入模块要完成的是链表的插入操作,即将一个新结点插入一个已有的链表中。输入条件:调用载入模块。goosfilename:d:pllfu按货品名的number, name, count 分别输入,如输错则有信息提示。输出结果:输入正确后,则显示插入成功,返回菜单后,存盘。Delet( )删除模块删除模块要完成的是链表的删除操作,即将一个结点从已有的链表中删除。输入条件:调用载入模块。goosfilename:d:pllfu有两种删除方式按号和名删除,如输错则有信息提示。输出结果:输入正确后,则显示删除成功,返回菜单后,存盘。search( )查找模块链表的查找操作是指在已知链表中查找值为某指定值的结点。输入条件:调用载入模块。goosfilename:d:pllfu有两种查找方式按号和名查找,如输错则有信息提示。输出结果:输入正确后,则显示查找成功,返回菜单后,存盘。6Save( )保存模块保存模块最终将想要保留的数据信息保存于文件。7COM *openfile( )载入模块用于调用。 五、新得体会本学期我们学习了数据结构课程,通过基本的训练和基础知识的巩固,在对数据结构算法进行初步了解的同时也提高了语言设计能力,本次短学期在经过一个学期数据结构学习后,我们总结归纳了重点知识,并通过重点知识的运用设计了一个多功能菜单,以实现多方面的需求。就我们计算机专业看来,编程能力是很重要的,一个计算机专业学生首先需要了解的运用的知识就是程序语言设计。而要学习编程,必须明确学习的目的,也就是学习编程是为了什么。是为了了解计算机,还是为了自己的发展或者是因为个人爱好。程序的实现不是一时爱好就可以完成的。一般来说在学习程序设计方法和语言时掌握基本理论及语法时比较容易,但是在实际应用和算法估量时却觉得无从下手。比如本次程序设计中的第一个程序,运动会分数统计,拿到题目的时候觉得很简单,可以通过结构体输入文本和数据,然后经过几个函数的计算得出分数,但是在语言编辑过程中,发现无法区分各学校以及各选手,无法用恰当的方法储存数据和字符,这就是知识在实际中的运用问题。如何编写符合要求的程序、如何编写高质量的程序更是我们所面临的难题。这就要求我们仔细体会,在反复实践的过程中掌握编程技巧,通过不断的克服困难来提高自己的编程能力。这是一个长期的过程,所以必须有坚定的恒心才能开始学习。这是我们在本次课程设计中得到的体会之一。通过本次课程设计,我们体会到编程能力的高低主要是由以下几点决定:编程的习惯;数学应用能力,其中包括逻辑思维,分析问题的能力;对数据结构的认识能力;经验的多少,包括各种语言的掌握能力。其实,最主要的一点还是要认真勤奋,为自己的目标而不怕困难不断前进,这不只是对程序设计而言,学习其他所有的东西都应如此。 六、C源程序清单#include<stdio.h> /*标准输入/输出头文件*/#include<conio.h> /*包含绘制图形函数等头文件*/#include<string.h> /*包含字符串处理函数头文件*/#include<stdlib.h> /*包含动态存储与释放函数头文件*/#include<graphics.h>#define LEN sizeof(COM)#define PRINT "% -15ld% -15s% -15dn",ptr1->num,ptr1->name,ptr1->count#define CHECK_COUNT ptr1->count<0#define CHECK_COUNT2 ptr3->count<0#define NULL 0typedef struct com long int num; char name10; int count; struct com *prior, *next; COM; /*定义结构体*/COM *input(); /*输入货品信息*/COM *insert( ); /*插入货品信息*/COM *delet( ); /*删除货品信息*/void search( ); /*查找货品信息*/void save(COM *head); /*保存货品信息*/COM *openfile( ); /*从文件将货品信息载入链表*/void print( ); /*输出货品信息*/FILE *fp; /*定义指向文件的指针变量*/COM *head=NULL;COM *ptr1=NULL,*ptr2=NULL;char filename110; /*定义字符数组,用来存放文件名*/char filename2 =".dat" /*文件扩展名.dat*/*输入模块*/COM *input( )char string1 ="number" char string2 ="name" char string3 ="count" int n=1; if(ptr1=(COM*)malloc(LEN)=NULL) /*申请空间函数*/ printf("No enough memory,fail to creat linklist!"); getch( ); /*无回显的从键盘读取任意一个字符*/ clrscr( ); printf("Please input depend on the emply(goodsnumber=0 over):n"); do printf("Please input the No.%d goods'%s:n",n,string1); scanf("%ld",&ptr1->num);flushall(); if(ptr1->num=0) printf("Please press any key to back to last Menu:"); getch( ); free(ptr1); return(0); printf("Please input the No.%d goods'%s:n",n,string2);scanf("%s",&ptr1->name); flushall( ); /*刷新缓冲区函数*/ printf("Please input the No.%d goods'%s:n",n,string3);scanf("%d",&ptr1->count); flushall( ); if(CHECK_COUNT) printf("Please input the right goodscount!n"); while(CHECK_COUNT); while(ptr1->num!=NULL) if(n=1) head=ptr1; else ptr2->next=ptr1; ptr1->prior=ptr2; n=n+1; ptr2=ptr1; if(ptr1=(COM* )malloc(LEN)=NULL) printf("No enough memory,fail to creat linklist!"); getch( ); do printf("Please input the No.%d goods'%s:n",n,string1); scanf("%ld",&ptr1->num); flushall( ); if(ptr1->num=0) ptr1->num=NULL; break; printf("Please input the No.%d goods'%s:n",n,string2);scanf("%s",&ptr1->name); flushall( ); printf("Please input the No.%d goods'%s:n",n,string3);scanf("%d",&ptr1->count); flushall( ); if(CHECK_COUNT) printf("Please input the right goodscount!n"); while(CHECK_COUNT); ptr2->next=NULL; gotoxy(1,24); printf("Finish the inputting of goods'message,press any key to back to last Menu,please save:"); getch(); return(head);/*插入模块*/COM * insert( ) COM * ptr3; char string1 ="goodsnumber" char string2 ="goodsname" char string3 ="goodscount" char judge10; clrscr( ); gotoxy(18,10); printf("Please input inserted goods'fliename:"); head=openfile( ); if(head=NULL) return(NULL); else do clrscr( ); printf("Please input inserted goods'goodsmessage:n"); if(ptr3=(COM*)malloc(LEN)=NULL) printf("No enough memory,fail to creat node!"); getch(); do printf("Please input goods'%s(>0):n",string1);scanf("%ld",&ptr3->num); flushall( ); if(ptr3->num<=0) printf("Error inputting!please choose the inserted goods againn"); getch( );return; printf("Please input goods'%s:n",string2);scanf("%s",&ptr3->name);flushall( ); printf("Please input goods'%s:n",string3);scanf("%d",&(ptr3->count); flushall( ); if(CHECK_COUNT2) printf("Please input the right goodscount(>0)!n"); while(CHECK_COUNT2); ptr1=head; while(ptr1!=NULL) ptr2=ptr1; ptr1=ptr1->next; ptr1->prior=ptr2; ptr2->next=ptr3;ptr3->prior=ptr2; ptr3->next=NULL; printf("nInserting success!Cotinue to insert?(yes or no):"); scanf("%s",judge); clrscr( ); while(! strcmp(judge,"yes"); gotoxy(20,10); printf("Inserting success!n"); gotoxy(18,11); printf("Press any key to back to last Menun"); gotoxy(16,12); printf("And make sure to Save(6) them or you will lose them!n"); getch( ); return(head);/*删除模块*/COM *delet( ) char name10; char judge10; int sel; int del_num; clrscr( ); gotoxy(20,10); printf("Please input delected goods'fliename:"); head=openfile( ); clrscr( ); if(head=NULL) return(NULL); else do do clrscr( ); gotoxy(3,4); printf("Please input delected goods'message:"); gotoxy(1,9); printf(" *1.Del depend on goodsnumbern"); gotoxy(1,10); printf(" *2.Del depend on goodsnamen"); gotoxy(10,22); printf("please choose a number between 1 and 2:"); scanf("%d",&sel); switch(sel) case 1:clrscr( ); gotoxy(6,6); printf("Please input goodsnumber:"); scanf("%d",&del_num); break; case 2:clrscr( ); gotoxy(6,6); printf("Please input goodsname:"); scanf("%s",&name); break; while(sel!=1&&sel!=2); ptr1=head; if(ptr1->num=del_num|(strcmp(ptr1->name,name)=0) head=ptr1->next; printf("Success to delect goodsmessage!n"); else /*判断是否是目标结点*/ while(ptr1!=NULL&&ptr1->num!=del_num&&strcmp(ptr1->name,name)!=0) ptr2=ptr1; ptr1=ptr1->next;ptr1->prior=ptr2; if(ptr1->num=del_num|(strcmp(ptr1->name,name)=0) ptr2->next=ptr1->next; ptr1->next->prior=ptr1->prior; free(ptr1); printf("nSuccess to delect goodsmessage!nn"); else printf("nCan't find this goodsmessage!nn"); printf("Cotinue to delect?(yes or no):"); scanf("%s",judge); while(!strcmp(judge,"yes"); clrscr( ); gotoxy(20,10); printf("Delecting success!n"); gotoxy(18,11); printf("Press any key to back to last Menun"); gotoxy(16,12); printf("And make sure to Save(6) them or you will lose them!n"); getch( ); return(head); /*查找模块*/void search( )char name10; char judge10; int sel; long int sel_num; clrscr( ); gotoxy(18,10); printf("Please press searched goods'fliename:"); head=openfile( ); if(head=NULL) return; else do do clrscr( ); gotoxy(5,4); printf("Please choose the way to search:"); gotoxy(1,9); printf(" *1.Search depend on goodsnumbern"); printf(" *1.Search depend on goodsnamen"); gotoxy(10,22); printf("please choose a number between 1 and 2:"); scanf("%d",&sel); switch(sel) case 1:clrscr( ); printf("Please input goodsnumber:"); scanf("%ld",&sel_num); break; case 2:clrscr( ); printf("Please input goodsname:"); scanf("%s",name); break; while(sel!=1&&sel!=2); ptr1=head; while(ptr1!=NULL&&ptr1->num!=sel_num&&strcmp(ptr1->name,name)!=0) ptr1=ptr1->next; if (ptr1->num=sel_num)|(strcmp(ptr1->name,name)=0) printf("n Success to search goodsmessage!n"); printf("goodsnumber goodsname goodscountnn"); printf(PRINT); else printf("nCan't find this goodsmessage!nn"); printf("Cotinue to search?(yes or no):"); scanf("%s",judge); while(!strcmp(judge,"yes"); gotoxy(10,24); printf("Please press any key to back to last Menu:"); getch( ); /*输出模块*/void print( ) int i=1; clrscr( ); gotoxy(18,10); printf("Please input printed goods'filename:"); head=openfile( ); if(head=NULL) return; else clrscr( ); printf(" The printed result as follows:n"); printf("goodsnumber goodsname goodscountnn"); ptr1=head; do printf(PRINT); ptr1=ptr1->next; if(i/10=1) /*超过十行换页*/ i=0; printf("Press any key to change page:"); getch( ); clrscr( ); gotoxy(0,6); printf("goodsnumber goodsname goodscountnn"); i=i+1; while(ptr1!=NULL); g