数据结构课程设计报告-超市商品管理.doc_第1页
数据结构课程设计报告-超市商品管理.doc_第2页
数据结构课程设计报告-超市商品管理.doc_第3页
数据结构课程设计报告-超市商品管理.doc_第4页
数据结构课程设计报告-超市商品管理.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.需求分析在某个大型生活服务区内,有三个超市,每个超市中的商品包括:商品号,商品名称,商品价格,库存数量,每种商品总数,生产日期等基本信息,假设三个超市的商品信息分别是用单链L1,L2, L3取存储的,请写一个程序实现下列任务要求:知识点:线性表操作【任务要求】1. 当超市有新的商品购入是能添加到单链表中;2. 能查找出三个超市中具有相同商品名称的商品信息;3. 在超市商品信息L1中删除那些与其他两个超市都有的商品信息;4. 能修改各超市商品基本信息,如价格等。5. 能查找比较超市中相同商品的销售情况,能统计每个超市中每种商品的销售量及销售额。6. 能输出每个超市的所有商品信息;【测试数据】自行设定,注意测试将活区删空等特殊情况。2.概要设计2.1必要算法1.当超市有新的商品购入是添加到单链表中算法概要:运用单链表的基本操作插入一个新结点,即分配一个新的储存空间,然后依次输入结点所含的数据,再插入到原结点的尾部即可。此算法时间复杂度为O(1)。2.查找出三个超市中具有相同商品名称的商品信息算法概要:1.寻找相同商品名称算法:先比较前两个链表(超市)l1,l2,运用比较字符串的strcmp()方法找出两个链表中含有相同的商品名称,然后将两个链表中具有相同商品名称的商品信息存储到新建链表fs中,再比较链表fs和l3,重复上述步骤,找出链表l1,l2,l3中都具有相同商品名称的商品,将其商品信息存储在链表fs中。此算法时间复杂度为O(n)。2.输出相同商品的商品信息:访问fs中每个结点中的商品名称,根据商品名称分别遍历原链表l1,l2,l3的商品信息找出原结点,然后将其信息输出。此算法时间复杂度为O(n)。3.在超市商品信息L1中删除那些与其他两个超市都有的商品信息算法概要:首先运用上述的寻找相同商品名称算法,找出l1中那些与其他两个超市都有的商品名称,再根据其名称遍历链表l1,找出其结点删除并释放单链表的基本操作。此算法时间复杂度为O(n)。4修改各超市商品基本信息,如价格等算法概要:首先交互输入需要修改信息的商品号,排除超市中没有的商品后,定位到改商品的结点,然后选择需要修改的信息,比如价格,库存数量等,或者全部修改即可修改信息。此算法时间复杂度为O(1)。5.查找比较超市中相同商品的销售情况,统计每个超市中每种商品的销售量及销售额。算法概要:首先通过寻找相同商品名称算法找出相同的商品,若没有相同商品,则返回,若有(多个)相同商品,通过交互输入商品号分别定位到3个链表中的相应结点然后输出其销售信息,包括销售量和销售额,统计每个超市中每种商品的销售量及销售额是在输出程序中一并输出。此算法时间复杂度为O(n)。6.输出每个超市的所有商品信息算法概要:遍历3个链表的所有结点,然后分别输出每个结点的所有信息。此算法时间复杂度为O(n)。2.2辅助程序1.单链表存储结构:为3个超市分别创建单链表,链表中每个结点含有7个数据,分别是:整型的商品号,字符数组型的商品名称,整型的库存数量,整型的商品总数,整型的生产日期,整型的销售数量。还有一个next指针。2.超市商品信息初始化:在每个链表当中交互输入每个结点的所有信息作为超市商品信息的初始化。3.销售算法:销售算法为了方便统计销售信息而存在,实现思路是:输入卖出的商品编号定位到链表中的相应结点,然后输入销售数量保存但结点中,同时该结点库存数量相应地减少。此算法时间复杂度为O(1)。2.3主程序主程序概要:主程序中首先创建3个链表然后初始化,再输出所需的操作信息供选择,通过交互式输入选择所要进行的操作,直到输入退出程序按钮。1. 详细设计3.1必要算法1.当超市有新的商品购入时添加到单链表中linklist *purchase(linklist *l,int s) /超市有新的商品购入是添加到单链表中 linklist *p,*q,*r,*head;int n;head=l;r=l;p=l-next;/输入购入商品的基本信息 q=(linklist *)malloc(sizeof(linklist);printf(请依次输入超市%d此次购入新商品的商品号、商品名称、(出售)价格、购入量、生产日期:n,s);scanf(%d,&q-gno);scanf(%s,&q-name);scanf(%f,&q-price);scanf(%d,&q-amount);scanf(%d,&q-date);q-QuantityInStock=q-amount;q-sold=0;printf(购入成功!n); /将新结点插入到表尾 q-next=NULL;while(p!=NULL)r=p;p=p-next;r-next=q;r=r-next;return head;2.查找出三个超市中具有相同商品名称的商品信息算法1:寻找3个链表中具有相同商品名称的商品linklist *findSame(linklist *l1,linklist *l2,linklist *l3) /寻找3个链表中具有相同商品名称的商品 linklist *p1=l1-next,*p2,*p3,*fs,*q,*p;fs=(linklist *)malloc(sizeof(linklist); /分配一个新的存储空间用来保存相同商品的信息 fs-next=NULL;q=fs;int flag;/寻找l1,l2中具有相同商品名称的商品 while(p1)p2=l2-next;while(p2)flag=strcmp(p1-name,p2-name);if(flag=0)p=(linklist *)malloc(sizeof(linklist);strcpy(p-name,p1-name);p-next=NULL;q-next=p;q=q-next;p2=p2-next;p1=p1-next;/寻找l2,l3中具有相同商品名称的商品 p=fs;while(p-next)p3=l3;while(p3-next)flag=strcmp(p-next-name,p3-next-name);if(flag=0) break;if(p3-next=NULL)q=p-next;p-next=q-next;p3=p3-next;p=p-next; return fs;算法2:输出3个链表中具有相同商品名称的商品信息void outputSame(linklist *l1,linklist *l2,linklist *l3) /输出3个链表中具有相同商品名称的商品信息 linklist *p1=l1-next,*p2=l2-next,*p3=l3-next,*fs,*p;int flag;fs=findSame(l1,l2,l3);p=fs-next;printf(*3个超市中具有相同名称的商品信息*n);while(p)/遍历链表l1while(p1)flag=strcmp(p1-name,p-name);if(flag=0)printf( 商品号t商品名称t商品价格t库存数量t商品总数t售出数量t生产日期n);printf(超市1: %dt %stt%5.2ftt %dtt %dtt %dtt%dn, p1-gno,p1-name,p1-price,p1-QuantityInStock,p1-amount,p1-amount-p1-QuantityInStock,p1-date);p1=p1-next;/遍历链表l2while(p2)flag=strcmp(p2-name,p-name);if(flag=0)printf(超市2: %dt %stt%5.2ftt %dtt %dtt %dtt%dn, p2-gno,p2-name,p2-price,p2-QuantityInStock,p2-amount,p2-amount-p2-QuantityInStock,p2-date);p2=p2-next;/遍历链表l3while(p3)flag=strcmp(p3-name,p-name);if(flag=0)printf(超市3: %dt %stt%5.2ftt %dtt %dtt %dtt%dn, p3-gno,p3-name,p3-price,p3-QuantityInStock,p3-amount,p3-amount-p3-QuantityInStock,p3-date);p3=p3-next;p=p-next;3.在超市商品信息L1中删除那些与其他两个超市都有的商品信息void delSame(linklist *l1,linklist *l2,linklist *l3) /L1中删除那些与其他两个超市都有的商品信息int flag;linklist *p,*s,*q,*fs;fs=findSame(l1,l2,l3);p=fs;while(p-next)q=l1;while(q-next)flag=strcmp(q-next-name,p-next-name);if(flag=0)s=q-next;q-next=s-next;free(s);printf(n成功删除超市1中与其他两个超市都有的商品信息!);return;q=q-next;p=p-next;4.能修改各超市商品基本信息,如价格等 void update(linklist *l) /修改商品信息 linklist *p=l,*q=l,*s=l-next; int gno,m,price,QuantityInStock,amount,date,n=0,location=0,flag=0; if (l=NULL) /链表为空 printf(链表为空!n); return; printf(请输入需要修改价格的商品号:); scanf(%d,&gno);while(s)if(s-gno=gno)flag=1;s=s-next;if(!flag) /找不到此商品 printf(没有此商品!n);return; while(q-gno!=gno)location+;q=q-next;printf(请选择需要修改的商品信息:n);printf(1.商品价格 2.库存数量 3.商品总数 4.生产日期 5.全部修改n);/选择需要修改的信息 scanf(%d,&m);switch(m)case 1:printf(请输入新的价格:);scanf(%d,&price); while (p) if (location=n) p-price=price; return; else p=p-next; n+; break; case 2:printf(请输入新的库存数量:);scanf(%d,&QuantityInStock); while (p) if (location=n) p-QuantityInStock=QuantityInStock; return; else p=p-next; n+; break; case 3:printf(请输入新的商品总数:);scanf(%d,&amount); while (p) if (location=n) p-amount=amount; return; else p=p-next; n+; break; case 4:printf(请输入新的生产日期:);scanf(%d,&date); while (p) if (location=n) p-date=date; return; else p=p-next; n+; break; case 5:printf(请输入新的价格:);scanf(%d,&price);printf(请输入新的库存数量:);scanf(%d,&QuantityInStock);printf(请输入新的生产日期:);scanf(%d,&date);printf(请输入新的商品总数:);scanf(%d,&date); while (p) if (location=n) p-price=price; p-QuantityInStock=QuantityInStock; p-amount=amount; p-date=date; return; else p=p-next; n+; break; 5.查找比较超市中相同商品的销售情况 void soldInformation(linklist *l1,linklist *l2,linklist *l3) /查找比较超市中相同商品的销售情况linklist *q1=l1,*p1=l1,*q2=l2,*p2=l2,*q3=l3,*p3=l3,*s; int gno,n1=0,location1=0,n2=0,location2=0,n3=0,location3=0; s=findSame(l1,l2,l3); if(s-next=NULL) printf(3个超市没有相同商品!);return; printf(请输入需要查询销售信息的商品号:); scanf(%d,&gno); while(q1-gno!=gno)location1+;q1=q1-next;/遍历l1 while (p1) if (location1=n1) while(q2-gno!=gno)location2+;q2=q2-next;/遍历l2 while (p2) if (location2=n2) while(q3-gno!=gno)location3+;q3=q3-next;/遍历l3 while (p3) if (location3=n3) printf(*商品%s的销售信息*n,q1-name);printf(t 商品t销售量t 销售额n);printf(t超市1:%st %d t%5.0fn,q1-name,q1-sold,q1-sold*q1-price); printf(t超市2:%st %d t%5.0fn,q2-name,q2-sold,q2-sold*q2-price); printf(t超市3:%st %d t%5.0fn,q3-name,q2-sold,q3-sold*q3-price); return; else p3=p3-next; n3+; if(!p3)printf(没有此商品!);return; else p2=p2-next; n2+; if(!p2)printf(没有此商品!);return; else p1=p1-next; n1+; if(!p1)printf(没有此商品!);return; 6.输出每个超市的所有商品信息(包括销售量、销售额)void output(linklist *l) /输出每个超市的所有商品信息(包括销售量、销售额) linklist *p;p=l-next;printf(*商品信息输出*n);printf(商品号t商品名称t商品价格t库存数量t商品总数t销售量t销售额t生产日期n);while(p)printf( %dt %stt%5.2ftt %dtt %dtt %dt%5.2f t%dn, p-gno,p-name,p-price,p-QuantityInStock,p-amount,p-sold,p-sold*p-price,p-date);p=p-next;4.调试分析4.1初始数据 图1调试过程分析:直接分别按顺序输入每个超市的每个商品的商品号、商品名称、商品价格、库存数量、生产日期即可存在的问题:在这里遇到的问题在于输入数据的时候非常繁琐,一不小心输入错误就要重新运行程序重新输入,而且一下子输入商品所有信息容易出现类型错误或者不能对应的上相应的信息。改进设想:本来想改成一次输入一个数据,但是这样在初始化数据时会有很长的一段程序,于是否决了这个想法。 4.2各模块测试1.当超市有新的商品购入时添加到单链表中图2图3调试过程分析:当有新商品购入时,如图2所示,对超市1进行操作,依次输入其信息并保存在链表末尾,再显示超市1中的所有商品信息,如图3所示,新购入的商品已添加进超市1中。存在的问题:这里所说的问题是后面所有调试程序中都存在的问题,就是每次操作中都所有的操作选项都会出现,这样会占用大量的位置,用户体验不佳。改进设想:在主程序中选择需要的操作时不带上操作选项,操作选项仅在第一次出现。2.查找出三个超市中具有相同商品名称的商品信息图4调试过程分析:根据初始数据,3个超市中具有的相同商品名称是a,因此如图4所示,分别显示了3个超市名为a的商品的商品信息。存在的问题:无改进设想:无3.在超市商品信息L1中删除那些与其他两个超市都有的商品信息调试过程分析:选择删除l1中那些与其他两个超市都有的商品信息选项,即可完成操作,如图5,这里l1中已删除商品a。图5存在的问题:无改进设想:无4.修改各超市商品基本信息,如价格等。图6调试过程分析:如图6,在超市1中修改商品号为2的商品信息,在这里仅修改价格,再显示超市1中的商品信息,可见2号商品价格已经改变。存在的问题:这个算法非常冗长,每一个修改信息都占据几行代码。改进设想:构建一个函数专门用于修改一个信息,这样每次修改信息之需调用该函数即可,不过暂时未能实现此想法。5查找比较超市中相同商品的销售情况图7图8图9图10调试过程分析:首先需要对每个超市进行售出操作,图7,8,9分别是对超市1,2,3进行售出,售出的是商品号为1,即商品a。再显示每个超市中商品a的销售量和销售信息,如图10所示。存在的问题:输出需要查询的销售信息的商品号时并不知道有哪些商品是3个超市都有的,一旦有许多商品时容易混乱。改进设想:在此算法中插入输出3个超市具有相同商品的商品信息算法即可解决,但考虑到这里所测试的信息量少,没有插入的必要。6输出每个超市的所有商品信息,统计每个超市中每种商品的销售量及销售额。图11调试过程分析:对超市1进行操作,选择输出所有商品信息的选项,即可显示所有商品信息,包括销售量和销售额。存在的问题:无改进设想:无5. 总结5.1课程设计过程的收获当我决定选择超市商品处理这个题目时,一开始想运用3个链表及指针来完成,但是在慢慢琢磨之后,觉得完全可以用一个链表即可,只要3个超市在初始化商品时调用一个函数即可。还有就是主程序中用了很多的循环,因此对于循环的控制要十分小心,纠结了好久用while还是dowhile,最后选择用while,因为逻辑简单,当然缺点就是每次都会出现所有操作的选项,显得冗长繁琐。 这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。自己动手,自己发现和解决问题。发现了自己的许多不足。平时没有掌握好的知识在这次实验中彻底暴露出来,最主要就是单链表的头结点和尾结点的判定,经过不断思考,不断查阅资料和上机运行,解决其中大部分问题,当然还存在一些问题没有解决。我相信在以后的学习能够解决好它们。总的来说,收获还是不小的,我不仅对C语言的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式,可以说,这是我第一次为程序写注释。5.2程序调试能力的思考在程序调试方面,这次的课程设计中,我最主要是感悟到了一种调试程序的方法,就是逐行分析,原理很简单,在出现错误的函数中插入一个printf语句,从头开始,一行一行或者在每个循环中插入printf语句,如果printf语句的信息没有显示,说明此循环出现问题了,而且在这个课题中,编译时的错误解决不难,难的是逻辑上的错误,在这里程序调试最大的问题就是不知道问题出在哪里了,所以这不失为一种好方法。5.3对数据结构课程的认识与思考这个学期数据结构主要学习了,线性结构(包括栈和队列)、树形结构、图状结构。线性结构包括顺序表、链表、栈、队列等,栈和队列是操作受限的线性表,表中的数据元素本身也是一个数据结构。除了线性表以外,栈是重点,因为栈和递归紧密相连,递归是程序设计中很重要的一种工具。树状结构中的重点自然是二叉树和哈弗曼树了。对于二叉树的很多操作都是基于对二叉树的遍历,掌握了如何遍历,很多问题也就迎刃而解了,比如对二叉树结点的查找访问、统计二叉树中叶子结点的数目、求二叉树的深度等。哈弗曼编码也有着很广泛的应用。对于图状结构,主要学习图的存储结构及图的遍历。要学好数据结构,最主要的就是要注重对算法的掌握。对于一个算法,如果我们不是很理解的话,可以手动将算法走一遍,慢慢理解该算法的思想。学习这门课程的最终目的,还是要学会如何设计算法,这需要我们长期的练习和思考。数据结构是一门既重视理论,又重视实践的课程,而在我的学习中,理论占了绝大多数的时间,在更多时候,我过分注重一些算法的实现原理,但是却很少自己编写算法,这点在这次课程设计中就暴露了许多问题。因此以后学习数据结构的时候一定要举一反三,对一个算法,不仅仅只弄懂这个算法是怎么来的,也要思考用其他方法实现此算法的功能,这样才会让自己的编程能力和解决问题能力得到提高。6.程序源代码#include #include #include #include #define MAXNUM 20typedef struct nodeint gno;char nameMAXNUM;float price;int QuantityInStock;int amount;int date;int sold;struct node *next;linklist;linklist *create(int s) /初始化商品信息 linklist *head,*p,*r;int i,n;head=(linklist *)malloc(sizeof(linklist);head-next=NULL;r=head;printf(n*超市%d商品初始化*n,s);printf(n请输入超市%d初始的商品种类数:,s);scanf(%d,&n);for(i=0;igno);scanf(%s,&p-name);scanf(%f,&p-price);scanf(%d,&p-amount);scanf(%d,&p-date);p-QuantityInStock=p-amount;p-sold=0;p-next=NULL;r-next=p;r=r-next;return head;linklist *purchase(linklist *l,int s) /超市有新的商品购入是添加到单链表中 linklist *p,*q,*r,*head;int n;head=l;r=l;p=l-next;/输入购入商品的基本信息 q=(linklist *)malloc(sizeof(linklist);printf(请依次输入超市%d此次购入新商品的商品号、商品名称、(出售)价格、购入量、生产日期:n,s);scanf(%d,&q-gno);scanf(%s,&q-name);scanf(%f,&q-price);scanf(%d,&q-amount);scanf(%d,&q-date);q-QuantityInStock=q-amount;q-sold=0;printf(购入成功!n); /将新结点插入到表尾 q-next=NULL;while(p!=NULL)r=p;p=p-next;r-next=q;r=r-next;return head;void sold(linklist *l)linklist *p=l,*q=l; int gno,sold,n=0,location=0; if (l=NULL) printf(链表为空!n); return; printf(请输入售出的商品号:); scanf(%d,&gno); while(q-gno!=gno)location+;q=q-next;printf(请输入售出数量:);scanf(%d,&sold); if(p-QuantityInStocksold+=sold; p-QuantityInStock-=sold; printf(售出成功!n); return; else p=p-next; n+; if(p-QuantityInStock=0)printf(此物品已售完!);return; linklist *findSame(linklist *l1,linklist *l2,linklist *l3) /寻找3个链表中具有相同商品名称的商品 linklist *p1=l1-next,*p2,*p3,*fs,*q,*p;fs=(linklist *)malloc(sizeof(linklist); /分配一个新的存储空间用来保存相同商品的信息 fs-next=NULL;q=fs;int flag;/寻找l1,l2中具有相同商品名称的商品 while(p1)p2=l2-next;while(p2)flag=strcmp(p1-name,p2-name);if(flag=0)p=(linklist *)malloc(sizeof(linklist);strcpy(p-name,p1-name);p-next=NULL;q-next=p;q=q-next;p2=p2-next;p1=p1-next;/寻找l2,l3中具有相同商品名称的商品 p=fs;while(p-next)p3=l3;while(p3-next)flag=strcmp(p-next-name,p3-next-name);if(flag=0) break;if(p3-next=NULL)q=p-next;p-next=q-next;p3=p3-next;p=p-next; return fs;void outputSame(linklist *l1,linklist *l2,linklist *l3) /输出3个链表中具有相同商品名称的商品信息 linklist *p1=l1-next,*p2=l2-next,*p3=l3-next,*fs,*p;int flag;fs=findSame(l1,l2,l3);p=fs-next;printf(*3个超市中具有相同名称的商品信息*n);while(p)/遍历链表l1while(p1)flag=strcmp(p1-name,p-name);if(flag=0)printf( 商品号t商品名称t商品价格t库存数量t商品总数t售出数量t生产日期n);printf(超市1: %dt %stt%5.2ftt %dtt %dtt %dtt%dn, p1-gno,p1-name,p1-price,p1-QuantityInStock,p1-amount,p1-amount-p1-QuantityInStock,p1-date);p1=p1-next;/遍历链表l2while(p2)flag=strcmp(p2-name,p-name);if(flag=0)printf(超市2: %dt %stt%5.2ftt %dtt %dtt %dtt%dn, p2-gno,p2-name,p2-price,p2-QuantityInStock,p2-amount,p2-amount-p2-QuantityInStock,p2-date);p2=p2-next;/遍历链表l3while(p3)flag=strcmp(p3-name,p-name);if(flag=0)printf(超市3: %dt %stt%5.2ftt %dtt %dtt %dtt%dn, p3-gno,p3-name,p3-price,p3-QuantityInStock,p3-amount,p3-amount-p3-QuantityInStock,p3-date);p3=p3-next;p=p-next;void delSame(linklist *l1,linklist *l2,linklist *l3) /L1中删除那些与其他两个超市都有的商品信息int flag;linklist *p,*s,*q,*fs;fs=findSame(l1,l2,l3);p=fs;while(p-next)q=l1;while(q-next)flag=strcmp(q-next-name,p-next-name);if(flag=0)s=q-next;q-next=s-next;free(s);printf(n成功删除超市1中与其他两个超市都有的商品信息!);return;q=q-next;p=p-next;void update(linklist *l) /修改商品信息 linklist *p=l,*q=l,*s=l-next; int gno,m,price,QuantityInStock,amount,date,n=0,location=0,flag=0; if (l=NULL) /链表为空 printf(链表为空!n); return; printf(请输入需要修改价格的商品号:); scanf(%d,&gno);while(s)if(s-gno=gno)flag=1;s=s-next;if(!flag) /找不到此商品 printf(没有此商品!n);return; while(q-gno!=gno)location+;q=q-next;printf(请选择需要修改的商品信息:n);printf(1.商品价格 2.库存数量 3.商品总数 4.生产日期 5.全部修改n);/选择需要修改的信息 scanf(%d,&m);switch(m)case 1:printf(请输入新的价格:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论