欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    数据结构课程设计报告-超市商品管理.docx

    • 资源ID:69217985       资源大小:216.29KB        全文页数:52页
    • 资源格式: DOCX        下载积分:30金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要30金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据结构课程设计报告-超市商品管理.docx

    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)/遍历链表 l1 while(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;/遍历链表 l2 while(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;/遍历链表 l3 while(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;elsep=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;elsep3=p3->next;n3+;if(!p3)printf("没有此商品!"); return;elsep2=p2->next;n2+;if(!p2)printf("没有此商品!"); return;elsep1=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 <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>#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;i<n;i+)p=(linklist *)malloc(sizeof(linklist);printf("请依次输入超市%d 初始商品%d 的商品号、商品名称、(出售)价格、库存数量、生产日期:n",s,i+1); scanf("%d",&p->gno);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->QuantityInStock<=sold)printf("此商品库存量不足!"); return;while (p) if (location=n)p->sold+=sold;p->QuantityInStock-=sold;printf("售出成功!n");return;elsep=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->da

    注意事项

    本文(数据结构课程设计报告-超市商品管理.docx)为本站会员(暗伤)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开