收藏 分销(赏)

商品销售管理.docx

上传人:xrp****65 文档编号:8898462 上传时间:2025-03-07 格式:DOCX 页数:29 大小:168.60KB
下载 相关 举报
商品销售管理.docx_第1页
第1页 / 共29页
商品销售管理.docx_第2页
第2页 / 共29页
点击查看更多>>
资源描述
湖北汽车工业学院电气与信息工程学院         《C语言程序设计》 课设报告     项目: 商品销售管理 班级: 姓名: 成绩:       一、需求分析 1、问题 根据需求,该系统所应包含的信息有以下一些: 商品的基本信息: 商品编号,商品名称,商品产地,商品库存。 顾客的基本信息: 顾客代码,购买数量,销售日期 根据需求,该系统所应实现的功能有以下一些: 各种基本数据的录入。如:销售基本信息录入。 基于各种数据的查询。例如输入张三姓名,查询顾客张三的销售信息。 数据导出:将销售中信息导出到指定文件。 2、系统 采用C语言实现,开发环境为VC,可以运行在操作系统windows98及以上皆可。 3、运行要求 能不受限制的录入销售信息 界面友好,操作方便,例如删除前需要提示用户是否删除 容错性强,例如数据导出时,如果文件不存在需要提示用户。 二、总体设计 1、系统流程设计 根据系统要求,设计如下的系统流程 2、系统模块设计 根据系统的功能设计,如下模块 销售系统 输入顾客购买货物的信息并保存 根据产品编号查询产品的销售历史 计算时间段内各个产品的销售总额 根据顾客姓名查询购买历史 显示所有顾客的姓名 读入货物当前库存信息并显示 主界面模块:完成系统菜单的显示 功能选择模块:根据用户的选择,完成其相应的功能。 商品信息录入:完成用户从文件读入库存信息。 销售信息录入:完成用户从界面输入销售信息。 根据编号查询历史:完成用户从界面输入商品编号,在系统查询符合条件的销售信息,并在界面上显示的功能。 根据顾客查询历史:完成用户从界面输入顾客姓名,查询该客户的购买历史。显示顾客姓名:完成用户从界面查看所有顾客姓名。 三、详细设计 1、数据结构设计 根据系统要求,系统中需要保存的数据有商品,销售和顾客的信息,其结构如下: 数据项名称 数据项系统表示 数据类型 数据长度 备注 产品编号 num 整型 4 产品名称 name 字符串 20 产品价格 price 浮点型 4 产品产地 prodplace 字符串 40 产品库存 amount 整型 4 初始1000 由于知道商品有10种,则采用结构体数组来保存商品信息 使用C语言创建的结构体(和结构体数组)如下: struct production_list{ int num; char name[20]; float price; char prodplace[40]; int amount; }production[10]; 为了能实现不受限制的保存和查看销售信息,采用链表的结构保存销售的信息,在增加销售的基本信息时,创建一个销售的节点,将其插入到链表中,其数据结构如下: 数据项名称 数据项系统表示 数据类型 数据长度 备注 顾客代码 num 整型 4 顾客姓名 name 字符型 10 产品名称 pro_name 字符型 20 销售数量 amount 整型 4 销售日期 time 字符型 10 使用C语言创建的结构体如下: struct sell_information{ int num; char name[10]; char pro_name[20]; int amount; char time[10]; struct sell_information *next; }; 2、界面设计 主界面: 根据系统要求,设计一个字符界面,显示系统的菜单,为了体现友好性,将在每个菜单前显示该菜单项对应的数字 用户输入菜单项前面的数字,主菜单消失,进入该模块的相应界面,进行相应的操作,完成后,回到主界面。 读入产品信息界面: 在光标下输入销售的信息,用空格将信息隔开 销售界面: 输入销售信息,保存在链表中。 根据产品编号查询产品销售历史界面: 计算各个时段的销售额界面: 输入起始时间和终止时间计算销售额 根据顾客姓名查询购买历史界面: 输入顾客姓名,即导出顾客购买信息。 顾客姓名显示: 选择该功能将显示所有顾客姓名 3、模块实现 主界面实现: 主函数中用 printf("\t\t***************T1023-9徐孟玲*******************\t\t”); printf("\t\t***************T1023-9徐孟玲*******************\t\t”); printf("\t\t*\t1.读入产品当前库存信息并显示 *\n\n"); printf("\t\t*\t2.键盘输入顾客购买产品的信息并保存 *\n\n"); printf("\t\t*\t3.根据产品编号查询产品销售历史 *\n\n"); printf("\t\t*\t4.计算各时间段产品销售总额 *\n\n"); printf("\t\t*\t5.根据顾客姓名查询购买历史 *\n\n"); printf("\t\t*\t6.显示所有顾客姓名 *\n\n"); printf("\t\t*\t7.显示当前仓库信息 *\n\n"); printf("\t\t*\t0.退出查询系统 *\n\n"); printf("\t\t***********************************************\n"); printf("\n\n"); printf("\t\t请输入你的选择:"); 实现。 scanf("%d",&choice); printf("\n*****************************************\n"); switch(choice){ case 1:system("cls");Readdata();break; case 2:system("cls");head=sell(head);break; case 3:system("cls");getshopingdata(head);break; case 4:system("cls");sell_total(head);break; case 5:system("cls");getnamedata(head);break; case 6:system("cls");list_custome(head);break; case 7:system("cls");list_store();break; 进行功能选择。 定义新节点 打印主界面 选择功能 实现各个功能 退出程序 模块流程: 对应函数:void main() 读入产品当前库存模块实现: 模块说明:从文件中读取已经写好的产品信息,存入数组production[10] 模块流程: 打开产品信息文件 数据写入相应成员 关闭文件回主菜单 i<10 假 真 对应函数:void Readdata() 键盘输入顾客购买产品的信息模块实现: 模块说明:从键盘按提示输入销售信息,并且存入链表中,在输入的时候调用判断函数来判断输入数据的合法性,以确保数据存储的正确性。 模块流程: 代入头结点 存入结点 回主菜单 flag 假 真 键入销售信息 continue 真 假 对应函数:struct sell_information * sell(struct sell_information *head) 判断输入信息模块实现: 模块说明:对输入的数据进行合法性判断,若不合法,提示用户重新输入 模块流程: 代入销售信息 判断编号 判断日期 判断每月的天数 判断闰年 全真 有假 flag=1 flag=0 返回flag 判断库存 对应函数:int DateAmountProname(struct sell_information *p) 判断编号模块: 模块说明:对销售功能中输入的编号与productin[10].num进行对比,如果存在,返回1,不存在则返回0。 编号存入a[10] i=0 回主菜单 i<10 假 真 c= strcmp(a,production[i].name c 真 假 flag=1 flag=0 模块流程: 对应函数:int judge_proname(char *p) 判断库存量模块: 模块说明:对当期仓库信息进行判断,若超出库存量返回0,否则返回1。 库存量存入a[10] i=0 回主菜单 i<10 假 真 c= strcmp(a,production[i].name c 真 假 flag=1 flag=0 对应函数:int jugde_amount(int amount,char *p) 判断日期模块: 模块说明:把日期的年月日进行分别判断,还有对每个月,以及闰年对二月的影响等做出相应的判断。 年月日分别存入all_year,all_month,all_day 回主菜单 all_month=1,3,5,7,8,10,12 假 真 all_day<=31 all_month=2 真 假 all_day<=28 all_day<=30 all_year闰年 all_day<=29 真 假 flag=1 flag=0 真 假 对应函数:int Judge_date(char *p) int NumberDay(int Complete_year,int Complete_month,int Complete_day) int Isleapyear(int year) 根据产品编号查询产品销售历史模块: 模块说明:输入产品编号,查看该产品销售的历史信息,若商品存在会显示相应信息,若不存在则会提示出错。 模块流程: 输入客户姓名 打销售信息 存在 真 假 返回主菜单 输入产品编号 打印产品信息 存在 真 假 返回主菜单 对应函数:void getshopingdata(struct sell_information *head) 根据顾客姓名查询购买历史模块: 模块说明:输入产顾客姓名,查看该顾客的购买历史信息,若鼓了存在会显示相应信息,若不存在则会提示出错。 模块流程: 对应函数:void getnamedata(struct sell_information *head) 计算各时间段产品销售总额模块: 模块说明:输入需要查询总额的时间起始点和终止点,计算这段时间销售的总额。 模块流程: sum=0 输入起始日期和终止日期 查找符合日期的节点 sum+=对应商品销售量*价格 输出sum 返回主菜单 对应函数:void getnamedata(struct sell_information *head) 显示所有顾客姓名模块: sum=0 输入起始日期和终止日期 查找符合日期的节点 sum+=对应商品销售量*价格 输出sum 返回主菜单 四、测试结果 1、录入销售测试 测试数据: 输入小样 湖北汽车工业学院, 13872839461,8241470 测试结果: 程序运行出现错误,如下 原因 电话输入的长度超过了电话表示的长度 测试数据: 输入张吴波 湖北汽车工业学院, 13872839461 测试结果: 程序运行正常,正确的插入到链表的最后位置 测试数据: 输入:张吴波 湖北汽车工业学院 8241470 425 测试结果: 程序运行不正常,可以将张吴波 湖北汽车工业学院, 8241470插入到链表的最后位置,但是425不能保存 原因:使用了scanf(“%s”),将空格作为截止符 2、修改销售测试 测试数据:在系统中存在4个名称为li的销售 测试结果:输入修改的姓名 li ,显示了第一个姓名为li的销售信息,输入修改后的信息:张吴波 湖北汽车工业学院 13872839461将第一个姓名为li的销售修改成功 测试数据:在系统中不存在名称为张三的销售,输入后,提示姓名不存在,如下图 3、导入销售测试 测试数据:输入C:\dd.tst路径(系统中不存在该文件) 测试结果:提示不能打开文件,不能导入 回车后程序结束 原因:不能打开文件文件使用了exit函数 测试数据:输入C:\data.txt路径(系统中该文件,格式符合程序要求) 测试结果:提示能将文件中的数据正确导入 data.txt的文件内容如下: 12 li xing 88888 zhang xxx 1222 zhou yi 88999 li xing 88888 zhang xxx 1222 zhou yi 88999 li xing 88888 zhang xxx 1222 zhou yi 88999 li xing 88888 zhang xxx 1222 zhou yi 88999 测试数据:输入C:\data1.txt路径(系统中该文件,格式不符合程序要求) 测试结果:提示能将文件中的数据正确导入,但导入的数据不正确 查询结果,数据未正确导入 data1.txt文件内容如下: li xing zhang xxx 1222 zhou yi zhou ccccccc 88999 查询模块测试: 略 删除模块测试 略 五、实训总结: 实训感想 对系统开发的总结(设计亮点,存在的不足,需要改进的地方) (略) 六、附录 程序源代码 //头文件 #include<stdio.h> #include<stdlib.h> #include<string.h> struct production_list { int num; char name[20]; float price; char prodplace[40]; int amount; }production[10]; struct time { int year; int month; int day; }ymd; struct sell_information{ char name[10]; char pro_name[20]; int amount; char time[10];/*(2009-01-02)*/ struct sell_information *next;/*链表指针指向下一个*/ }; void Readdata(); struct sell_information * sell(struct sell_information *head); void getnamedata(struct sell_information *head); void getshopingdata(struct sell_information *head); int n[10]={1000,1000,1000,1000,1000,1000,1000,1000,1000,1000}; int DateAmountProname(struct sell_information *p); /*1.读入货物当前库存信息并显示*/ void Readdata() { FILE *fp; int i=0; if((fp=fopen("productions information.txt","r"))==NULL) { printf("文件打开错误!\n"); exit(0); } while(i<10) { fscanf(fp,"%6d%s%f%s%d",&production[i].num,production[i].name,&production[i].price,production[i].prodplace,&production[i].amount); printf("%6d\t\t%s\t\t%6.2f\t\t%s\t\t%6d\n",production[i].num,production[i].name,production[i].price,production[i].prodplace,production[i].amount); i++; }; printf("\n"); if(fclose(fp)) { printf("!\n"); exit(0); } } /*2.键盘输入顾客购买货物的信息并保存*/ struct sell_information * sell(struct sell_information *head) { struct sell_information *p1,*p2,*p3; int n; int m; do{ if(head->next!=NULL) { p1=(struct sell_information *)malloc (sizeof (struct sell_information)); p3=head->next; head->next=p1; p1->next=p3; } else { p3=p1=p2=(struct sell_information *)malloc (sizeof (struct sell_information)); head->next=p1; p2->next=NULL; } do { printf("\t\t\t\t请输入顾客信息:\n"); printf("*******************************************************************************\n"); printf("请输入顾客姓名\t:"); scanf("%s",&p1->name); printf("请输入顾客所购货物名称\t:"); scanf("%s",p1->pro_name); printf("请输入顾客购物数量:"); scanf("%d",&p1->amount); printf("请输入顾客购物时间:"); scanf("%s",p1->time); printf("\n"); if(DateAmountProname(p1)) { printf("输入正确!请按0继续下面的步骤!\n"); scanf("%d",&n); } else printf("输入错误!请重新输入!"); if(n==0) break; }while(1); printf("*******************************************************************************\n"); printf("如果想停止购买,请按0,如果要继续入库,请按其它数字键\n"); scanf("%d",&m); if(m==0) break; }while(1); return head; } /*判断输入信息是否正确*/ int DateAmountProname(struct sell_information *p) { int Judge_date(char *p); int judge_proname(char *p); int jugde_amount(amount,pro_name); if(Judge_date(p->time)&&judge_proname(p->pro_name)&&jugde_amount(p->amount,p->pro_name)) return 1; else return 0; } /*判断编号*/ int judge_proname(char *p) { int i=0,flag; char a[10]; while(*p) a[i++]=*p++; a[i]=0; for(i=0;i<10;i++) { if(strcmp(a,production[i].name)==0) { flag=1; break; } } if(i==10) flag=0; return flag; } int jugde_amount(int amount,char *p) { int i=0; int flag; char a[10]; while(*p) a[i++]=*p++; a[i]=0; for(i=0;i<10;i++) if(strcmp(a,production[i].name)==0) { flag=1; n[i]-=amount; break; } if(n[i]>0) return 1; else return 0; } /*判断日期是否合法*/ int Judge_date(char *p) { int i=0; char s[5]; char m[3]; char n[3]; int NumberDay(int Complete_year,int Complete_month,int Complete_day); int all_year; int all_month; int all_day; char date[10]; while(*p) date[i++]=*p++; date[i]=0; if(i==10 && date[4]=='-' && date[7]=='-') { for(i=0; i<4; i++ ) { s[i]=date[i]; } s[i]=0; all_year=atoi(s); /*把前4位保存到年里*/ for(i=5; i<7; i++ ) { m[i-5]=date[i]; } m[i-5]=0; all_month=atoi(m); /*把第5-7位转化保存到月成员中*/ for(i=8; i<10; i++ ) { n[i-8]=date[i]; } n[i-8]=0; all_day=atoi(n); /*把后两位保存到日成员中*/ } else { printf("日期格式有误请从新输入!!!\n"); return 0; } if(NumberDay(all_year,all_month,all_day)) return 1; else { printf("输入的天数或年份或月份有误请从来!!!\n"); return 0; } } /*功能:判断每月的天数是否合法*/ int NumberDay(int Complete_year,int Complete_month,int Complete_day) { int Isleapyear(int year);/*判断闰年函数*/ int t[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; /*定义数组*/ if(Isleapyear(Complete_year)) { if(Complete_month!=2) { if(Complete_month<=12&&Complete_day<=t[Complete_month]) return 1; else return 0; } else { if(Complete_month<=12&&Complete_day<=t[Complete_month]+1) return 1; else return 0; } } else { if(Complete_month<=12&&Complete_day<=t[Complete_month]) return 1; else return 0; } } /*功能:判断闰年*/ int Isleapyear(int year) { int leap; leap=((year%4==0 && year%100!=0) || year%400==0);/*闰年条件*/ return leap; } /*3.根据产品编号查询货物销售历史*/ void getshopingdata(struct sell_information *head) { int number; char s[20]; char pro_name[20]="a"; char *b=pro_name; int Judge_proname(int p,char *); struct sell_information *p1=head; printf("请输入产品编号:"); scanf("%d",&number); if(Judge_proname(number,b)) { strcpy(s,pro_name); printf("该代号产品的名称是:%s",s); p1->next; } else printf("产品代号不存在!"); while(p1!=NULL)/*链表的遍历过程*/ { if(strcmp(s,p1->pro_name)==0) { printf("**********************************************\n"); printf("\t\t\t\t顾客购买信息为\n"); printf("顾客姓名: 产品名称: 购物数量: 购物时间:\n"); printf("%-10s%-20s%-10d%-10s\n",p1->name,p1->pro_name,p1->amount,p1->time); printf("**********************************************\n"); } else printf("产品未出售,没有销售记录!"); p1=p1->next; } } int Judge_proname(int p, char *b) { int i; int flag=0; for(i=0;i<10;i++) { if(production[i].num==p) { flag=1; strcpy(b,production[i].name); break; } } return flag; } /*4.计算各时间段产品销售总额*/ void sell_total(struct sell_information *head) { struct sell_information *p1=head; int s_year,s_month,s_day,e_year,e_month,e_day,i,j; char s[5]; char m[3]; char n[3]; int all_year; int all_month; int all_day; char date[10]; float sum=0; printf("请输入起始日期:"); scanf("%d-%d-%d",&s_year,&s_month,&s_day); printf("请输入终止日期:"); scanf("%d-%d-%d",&e_year,&e_month,&e_day); while(p1!=NULL)/*链表的遍历过程*/ { for(i=0; i<10; i++ ) date[i]=p1->time[i]; for(i=0; i<4; i++ ) { s[i]=date[i]; } s[i]=0; all_year=atoi(s); /*把前4位保存到年里*/ for(i=5; i<7; i++ ) { m[i-5]=date[i]; } m[i-5]=0; all_month=atoi(m); /*把第5-7位转化保存到月成员中*/ for(i=8; i<10; i++ ) { n[i-8]=date[i]; } n[i-8]=0; all_day=atoi(n); /*把后两位保存到日成员中*/ if(all_year>s_year&&all_year<e_year||all_year<s_yea
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服