1课程设计报告超市数据汇总系统课程:程序设计基础班级:150407学号:20152476姓名:黄志浩指导教师:孙旸2016年1月12日2目录设计题目-------------------------3选题背景-------------------------4设计内容-------------------------5设计思路-------------------------6程序清单与运行结果----------------7程序清单------------------------7运行结果截图-------------------17总结、设计结果说明、设计体会-----223设计题目问题描述:在数据处理中经常需要对大量数据进行汇总,将相同关键字记录的某些数据项的值叠加起来,生成一个分类汇总表。假设某超级市场销售有m种商品(假设商品的编号为1,2,3,┅┅,m),有n台前台收款机(假设收款机的编号为1,2,3,┅┅,n)进行收款,以记录的形式提供给计算机,每个记录表示某台收款机的一种商品一次交易的数量和销售额。记录由4个域组成:收款机编号、商品编号、销售数量、销售金额。构造一个结构体类型,每次销售数据以一个结构体变量保存在一个数据文件中。实现要求:⑴编写实现将数据记录插入到数据文件的最后的函数;⑵编写以收款机为单位的数据分类处理函数。构造n个单链表,每个链表保存一台收款机的销售记录,这n个单链表的头指针存放在一个指针数组中,通过数组的下标就可以知道是哪台收款机。读取数据文件的记录,将所有的销售记录(数据文件中的全部记录)分解插入到n个单链表;⑶编写以商品为单位的数据分类处理函数。构造m个单链表,每个链表保存一种商品的销售记录,这m个单链表的头指针存放在一个指针数组中,通过数组的下标就可以知道是哪种商品。读取数据文件的记录,将所有的销售记录(数据文件中的全部记录)分解插入到m个单链表;⑷统计每台收款机的销售总额;⑸以收款机为单位,将所有收款机按销售总额的非递减顺序构造一个单链表并输出;⑹以商品为单位,统计每种商品的销售总额;⑺以商品为单位,将所有销售的商品按销售总额的非递减顺序构造一个单链表并输出;⑻设计一个菜单,具有上述要求的所有功能、退出系统等最基本的功能。4选题背景随着我国改革开放的不断深入、经济飞速的发展,企业要想生存发展,要想在激烈的市场竞争中立于不败之地,没有现代化的管理是万万不行的。作为现代社会的一部分,超市必须适应社会的发展,因此实现超市的信息化管理是很有必要的。在传统的手工管理中,往往是用人工清点的方式来掌握超市中现有的商品,使用手工记账的方式来掌握商品的进货和销售情况。这种方式在商品数量较少、商品库存变换少的情况下,不失为一种较好的方法。但是,在目前的大中型超市中,往往需要处理的商品种类数以千计,而且每天所发生的进货和销售情况纷繁复杂。如果要借助人工来实现这一系列数据的记录和管理,工作量将非常巨大,而且容易出现错误,造成管理上的混乱,更何况还需要对商品的数据进行统计和分析。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已被人们所认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对超市信息进行管理有着手工管理所无法比拟的优点,例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高超市管理的效率,也能使超市步入科学化、正规化的管理。基于这些问题,为了使超市管理工作规范化、系统化、程序化,避免超市管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效地查询和修改商品情况,建立一个超市管理系统是非常必要的。5设计内容1.实现将数据记录插入到数据文件的最后;2.以收款机为单位的数据分类处理。构造n个单链表,每个链表保存一台收款机的销售记录,这n个单链表的头指针存放在一个指针数组中,通过数组的下标就可以知道是哪台收款机。读取数据文件的记录,将所有的销售记录(数据文件中的全部记录)分解插入到n个单链表;3.统计每台收款机的销售总额;4.以收款机为单位,将所有收款机按销售总额的非递减顺序构造一个单链表并输出;5.以商品为单位的数据分类处理。构造m个单链表,每个链表保存一种商品的销售记录,这m个单链表的头指针存放在一个指针数组中,通过数组的下标就可以知道是哪种商品。读取数据文件的记录,将所有的销售记录(数据文件中的全部记录)分解插入到m个单链表;6.以商品为单位,统计每种商品的销售总额;7.以商品为单位,将所有销售的商品按销售总额的非递减顺序构造一个单链表并输出;6设计思路1.首先将数据通过程序存储到文件中供程序提取并操作。2.将文件中的数据提取并做成一个单链表。3.将上一步的单链表分成N个单链表,每个收款机为一个单链表。N个单链表头指针放在一个指针数组里。4.查找N个单链表中的数据并计算总金额,同时把总金额存储到一个数组中供下步使用。5.根据总金额将指针数组排序并输出。6.以商品为单位,重复3-5步。7程序清单与运行结果程序清单#includestdio.h#includemalloc.h#includestring.h#includestdlib.h#defineN3//3个收款机#defineM9//9种商品characount[10]=737701995;//管理员账号charpassword[10]=123456;//管理员密码structNode*atm[N];//存放收款机链表头指针structNode*goods[M];//商品链表头指针charn1[N]={'a','b','c'};charn2[M]={'1','2','3','4','5','6','7','8','9'};floatm1[N];//每台收款机收款总额floatm2[M];//每种商品销售总额structshop//结构体数据{charATM;//标号为a-ccharGOODS;//标号为1-9floatnum;floatprice;floattotal;};structNode//链表{structshopcontent;structNode*next;};8voidadd(){structshopdata;FILE*fp=NULL;fp=fopen(data.txt,a);if(fp==NULL){printf(文件打开失败!);return;}charflag='y';while(flag=='y'||flag=='Y'){printf(输入收款机号:(a-c));rewind(stdin);scanf(%c,&data.ATM);printf(输入商品号:(1-9));rewind(stdin);scanf(%c,&data.GOODS);printf(输入销售商品数量:);scanf(%f,&data.num);printf(输入销售价格:);scanf(%f,&data.price);data.total=data.num*data.price;fprintf(fp,%c%c%f%f%f,data.ATM,data.GOODS,data.num,data.price,data.total);fputc('\n',fp);printf(是否继续y/Y);rewind(stdin);scanf(%c,&flag);if(flag!='y'&&flag!='Y'){fclose(fp);return;}}}structNode*creatNode()//提取文件数据建成一个链表{charch;FILE*fp=NULL;fp=fopen(data.txt,r);structNode*h,*p1,*p2;9p2=(structNode*)malloc(sizeof(structNode));h=p2;fscanf(fp,%c%c,&p2-content.ATM,&p2-content.GOODS);fscanf(fp,%f%f%f,&p2-content.num,&p2-content.price,&p2-content.total);ch=fgetc(fp);while(!feof(fp)){p1=(structNode*)malloc(sizeof(structNode));fscanf(fp,%c%c,&p1-content.ATM,&p1-content.GOODS);fscanf(fp,%f,&p1-content.num);fscanf(fp,%f,&p1-content.price);fscanf(fp,%f,&p1-content.total);ch=fgetc(fp);p2-next=p1;p2=p1;}ch=fgetc(fp);fclose(fp);p2-next=NULL;if(h==NULL){printf(提取数据失败!);return0;}elsereturnh;}voidcreatatm()//根据收款机建立N个链表{inti=0;structNode*h;h=creatNode();while(n1[i]!=NULL){structNode*q,*p1=NULL,*p2,*H;p2=(structNode*)malloc(sizeof(structNode));H=p2;10q=h;while(q){if(q-content.ATM==n1[i]){p1=(structNode*)malloc(sizeof(structNode));p1-content=q-content;p2-next=p1;p2=p1;}q=q-next;}p2-next=NULL;H=H-next;atm[i]=H;i++;}return;}voidaddtotal()//计算各收款机收款总额并存储总额数据{inti=0;creatatm();floatTotal=0;structNode*q;while(iN){q=atm[i];while(q){Total+=q-content.total;q=q-next;}m1[i]=Total;i++;Total=0;}printf(\n);}11voidATMtotal()//每台收款机销售总额{addtotal();inti=0;while(iN){if(m1[i]!=0)//如果第i-1台收款机没有收到汇款,则不输出printf(%c号收款机收款总额为%6.2f\n,n1[i],m1[i]);i++;}}voidATMsort()//将收款机按销售总额排序链表{addtotal();intj,k;floattemp;structNode*Temp;for(j=0;jN;j++)for(k=j;kN;k++){if(m1[k]m1[j]){temp=m1[k];//对各收款机总金额排序m1[k]=m1[j];m1[j]=temp;Temp=atm[k];//对链表排序atm[k]=atm[j];atm[j]=Temp;k--;}}for(inti=0;iN;i++){if(m1[i]!=0)printf(%c号收款机总金额为%6.2f\n,atm[i]-content.ATM,m1[i]);}12}voidcreatgoods()//根据商品建立M个链表{inti=0;structNode*h;h=creatNode();while(n2[i]!=NULL){structNode*q,*p1=NULL,*p2,*H;p2=(structNode*)malloc(sizeof(structNode));H=p2;q=h;while(q){if(q-content.GOODS==n2[i]){p1=(structNode*)malloc(sizeof(structNode));p1-content=q-content;p2-next=p1;p2=p1;}q=q-next;}p2-next=NULL;H