数据结构课程设计校园超市商品销售统计系统.doc
目录1.需求分析11.1 问题描述11.2 设计内容12.概要设计12.1 数据结构算法选择12.2 算法要点归纳12.3 下面是针对本程序专门定义的数据结构类型42.4 各组织结构与功能分析53 测试结果及其分析64 小结8参考文献9附录:程序源代码91.需求分析1.1 问题描述 设计一系统,实现超市定期对销售各商品的记录进行统计,可按商品的编号、单价、销售量或销售额做出排名。1.2 设计内容 在本设计中,首先从数据文件中读出各商品的信息记录,存储在顺序表中。各商品的信息包括:商品编号、商品名、单价、销出数量、销售额。商品编号共4位,采用字母和数字混合编号,如:A125,前一位为大写字母,后三位为数字,按商品编号进行排序时,可采用基数排序法。对各商品的单价、销售量或销售额进行排序时,可采用多种排序方法,如直接插入排序、冒泡排序、快速排序,直接选择排序等方法。在本设计中,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。2.概要设计2.1 数据结构算法选择本设计主要采用了顺序表。共用四种排序方法:冒泡排序法,快速排序法,堆排序法,基数排序法。2.2 算法要点归纳1. 冒泡排序: 冒泡排序的算法思想是:通过无序区中相邻元素关键字间的比较和位置的交换,使关键字最小的元素如气泡一般逐渐往上“漂浮”直至“水面”。整个算法是从最下面的元素开始,对每两个相邻元素的关键字进行比较,且使关键字较小的元素换至关键字较大的元素之上,使得经过一趟冒泡排序后,关键字最小的元素到达最上端。接着,再在剩下的元素中找关键字次小的元素,并把它换在第二个位置上。依次类推,一直到所有元素都有序为止。图 1:冒泡排序算法思想2. 快速排序:快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字,则可分别对这两部分记录继续进行排序,以达到整个序列有序。图 2:快速排序算法思想3. 堆排序:堆排序只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。它的基本思想是:首先按大根堆的定义将R1n调整为堆(这个过程为初始建堆),交换R1和Rn(将最大元素R1归位,放到排序序列的最后);然后,将R1n-1调整为堆,交换R1和Rn-1;如此反复进行,直到交换了R1和R2为止。图 3:堆排序算法思想4.基数排序:基数排序是属于“分配式排序”,基数排序法又称“桶子法”。顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O(nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。图 4:基数排序算法思想2.3 下面是针对本程序专门定义的数据结构类型1.商品信息的元素类型定义: typedef struct node char num4; /*商品编号*/ char name10; /*商品名称*/ float price; /*单价*/ int count; /*销售数量*/ float sale; /*本商品销售额*/ DataType; 2.存储商品信息的顺序表的定义: typedef struct DataType rMaxSize; int length; SequenList; 2.4 各组织结构与功能分析各商品信息在设计系统中的主要功能:按照各商品信息排序,根据要求所需的排序算法对商品编号、商品名称、单价、销售量和销售额进行一个排序。图 5:功能分析图 3 测试结果及其分析图 6:输入商品编号、商品名称、商品单价和商品销售量图 7:按商品编号排序图 8:按商品名称排序图 9:分别按商品单价和商品销出数量排序图 10:按商品销售额排序4 小结通过这次课设,我学会了如何把数据结构的知识应用到实践当中,同时也进一步加深了对c/c+语言语法的应用,以及深刻的掌握了数据结构和c/c+语言的结合运用。 在编程过程中,遇到了许多问题,在一次次的运行错误后,问题被一步步改正,也从中学到了许多知识。虽然我的程序还不够完善,还需加以改进以实现更多的功能,但是我会尽我最大的努力去完成它,我相信我会努力去把程序做的更加完美。参考文献1王昆仑,李红等编著. 数据结构与算法. 北京:中国铁道出版社,2007.2苏仕华等编著. 数据结构课程设计. 北京:机械工业出版社 ,2005.3苏仕华编著. 数据结构与算法解析. 合肥:中国科学技术大学出版社,2004.4郭嵩山等著. 国际大学生程序设计竞赛例题解. 北京:电子工业出版社,2008.5刘大有,唐海鹰等编著. 数据结构. 北京:高等教育出版社,2001.6徐孝凯编著.数据结构实用教程. 北京: 清华大学出版社,1999.7严蔚敏,陈文博编著. 数据结构及算法教程. 北京: 清华大学出版社,2001.8刘振安,刘燕君等编著. C 程序设计课程设计. 北京: 机械出版社,2004.9胡学钢. 数据结构与算法设计指导. 北京: 清华大学出版社, 1999.附录:程序源代码#include<stdio.h>#include<stdlib.h>#include<string.h>#define maxsize 100 /该超市商品最大种类typedef struct node /商品信息的存储结构类型定义char num10; /商品编号 char name30; float price; /单价 int count; /销售量 float sale; /销售额DataType;typedef struct /存储商品信息的顺序表的定义 DataType rmaxsize; int length; int type;SqList;void number(SqList *L) /按商品编号排序 int i,j; char num110,name130; float price1,sale1; int count1; for(i=0;i<L->type;i+) for(j=i+1;j<L->type;j+) if(strcmp(L->rj.num,L->ri.num)>0) strcpy(num1,L->rj.num); strcpy(L->rj.num,L->ri.num); strcpy(L->ri.num,num1); strcpy(name1,L->rj.name); strcpy(L->rj.name,L->ri.name); strcpy(L->ri.name,name1); price1=L->rj.price; L->rj.price=L->ri.price; L->ri.price=price1; count1=L->rj.count; L->rj.count=L->ri.count; L->ri.count=count1; sale1=L->rj.sale; L->rj.sale=L->ri.sale; L->ri.sale=sale1; printf("t按商品编号排序后:n"); printf("t商品编号 商品名称 单价 销出数量 销售额n"); for(i=0;i<L->type;i+)printf("t%st%st%ft%dt%fn",L->ri.num,L->ri.name,L->ri.price,L->ri.count,L->ri.sale);void nam(SqList *L) /按商品名称排序 int i,j; char num110,name130; float price1,sale1; int count1; for(i=0;i<L->type;i+) for(j=i+1;j<L->type;j+) if(strcmp(L->rj.name,L->ri.name)>0) strcpy(num1,L->rj.num); strcpy(L->rj.num,L->ri.num); strcpy(L->ri.num,num1); strcpy(name1,L->rj.name); strcpy(L->rj.name,L->ri.name); strcpy(L->ri.name,name1); price1=L->rj.price; L->rj.price=L->ri.price; L->ri.price=price1; count1=L->rj.count; L->rj.count=L->ri.count; L->ri.count=count1; sale1=L->rj.sale; L->rj.sale=L->ri.sale; L->ri.sale=sale1; printf("t按商品编号排序后:n"); printf("t商品编号 商品名称 单价 销出数量 销售额n"); for(i=0;i<L->type;i+)printf("t%st%st%ft%dt%fn",L->ri.num,L->ri.name,L->ri.price,L->ri.count,L->ri.sale);void pric(SqList *L)/按商品单价排序int i=0,j; char num110,name130; float price1,sale1; int count1; for(i=0;i<L->type;i+) for(j=i+1;j<L->type;j+) if(L->rj.price>L->ri.price) strcpy(num1,L->rj.num); strcpy(L->rj.num,L->ri.num); strcpy(L->ri.num,num1); strcpy(name1,L->rj.name); strcpy(L->rj.name,L->ri.name); strcpy(L->ri.name,name1); price1=L->rj.price; L->rj.price=L->ri.price; L->ri.price=price1; count1=L->rj.count; L->rj.count=L->ri.count; L->ri.count=count1; sale1=L->rj.sale; L->rj.sale=L->ri.sale; L->ri.sale=sale1; printf("t按商品编号排序后:n"); printf("t商品编号 商品名称 单价 销出数量 销售额n"); for(i=0;i<L->type;i+) printf("t %st %st %ft %dt %fn",L->ri.num,L->ri.name,L->ri.price,L->ri.count,L->ri.sale);void coun(SqList *L)/按商品销出数量排序int i=0,j; char num110,name130; float price1,sale1; int count1; for(i=0;i<L->type;i+) for(j=i+1;j<L->type;j+) if(L->rj.count>L->ri.count) strcpy(num1,L->rj.num); strcpy(L->rj.num,L->ri.num); strcpy(L->ri.num,num1); strcpy(name1,L->rj.name); strcpy(L->rj.name,L->ri.name); strcpy(L->ri.name,name1); price1=L->rj.price; L->rj.price=L->ri.price; L->ri.price=price1; count1=L->rj.count; L->rj.count=L->ri.count; L->ri.count=count1; sale1=L->rj.sale; L->rj.sale=L->ri.sale; L->ri.sale=sale1; printf("t按商品编号排序后:n"); printf("t商品编号 商品名称 单价 销出数量 销售额n"); for(i=0;i<L->type;i+) printf("t%st%st%ft%dt%fn",L->ri.num,L->ri.name,L->ri.price,L->ri.count,L->ri.sale);void sales(SqList *L)/按商品销售额排序int i=0,j; char num110,name130; float price1,sale1; int count1; for(i=0;i<L->type;i+) for(j=i+1;j<L->type;j+) if(L->rj.sale>L->ri.sale) strcpy(num1,L->rj.num); strcpy(L->rj.num,L->ri.num); strcpy(L->ri.num,num1); strcpy(name1,L->rj.name); strcpy(L->rj.name,L->ri.name); strcpy(L->ri.name,name1); price1=L->rj.price; L->rj.price=L->ri.price; L->ri.price=price1; count1=L->rj.count; L->rj.count=L->ri.count; L->ri.count=count1; sale1=L->rj.sale; L->rj.sale=L->ri.sale; L->ri.sale=sale1; printf("t按商品编号排序后:n"); printf("t商品编号 商品名称 单价 销出数量 销售额n"); for(i=0;i<L->type;i+) printf("t %st %st %ft %dt %fn",L->ri.num,L->ri.name,L->ri.price,L->ri.count,L->ri.sale);void menu() printf("ttt销售记录排序n"); printf("t-n"); printf("t| 1)按商品编号 |n"); printf("t| 2)按商品名称 |n"); printf("t| 3)按商品单价 |n"); printf("t| 4)按商品销出数量 |n"); printf("t| 5)按商品销售额 |n"); printf("t| 0)退出系统 |n"); printf("t-n"); printf(" 请选择<05>");int main() SqList *L; int n,i,m; char num110,name130; float price1,sale1; int count1; FILE *fp; L=(SqList*)malloc(sizeof(SqList); fp=fopen("medince.txt","w"); /创建文件 if (!fp) printf("Sorry! File open error!n");exit(0); printf("请输入商品种类数(<=100):"); scanf("%d",&n); L->type=n; for (i=0; i<n; i+) printf("请输入该商品的编号:"); scanf("%s",num1); getchar(); printf("请输入该商品的名称:"); scanf("%s",name1); getchar(); printf("请输入该商品的单价:"); scanf("%f",&price1); printf("请输入该商品的销售量:"); scanf("%d",&count1); getchar(); sale1=price1*count1;fprintf(fp,"%st%st%ft%dt%fn",num1,name1,price1,count1,sale1); printf("n"); fclose(fp); L->length=0; fp=fopen("medince.txt","r"); if (!fp) printf("Sorry! File open error!");exit(0); for(i=0;i<n;i+)fscanf(fp,"%st%st%ft%dt%fn",L->ri.num,L->ri.name,&L->ri.price,&L->ri.count,&L->ri.sale); /从文件中读信息 L->length+; fclose(fp); printf("t商品编号 商品名称 单价 销出数量 销售额n"); for(i=0;i<L->type;i+) printf("t%st%st%ft%dt%fn",L->ri.num,L->ri.name,L->ri.price,L->ri.count,L->ri.sale); while(1) menu(); scanf("%d",&m); switch(m)case 1: /按商品编号排序number(L);break; case 2: /按商品名称排序nam(L);break; case 3: /按单价排序pric(L);break; case 4: /按销出数量排序coun(L);break; case 5: /按销售额排序sales(L);break; case 0: /退出系统exit(0);break; default:printf("Sorry!输入有误!");break;