目录1 系统分析 (2)1.1 课程设计内容 (2)1.2 系统功能需求分析 (2)1.3 数据结构设计 (3)2 系统设计 (3)2.1 总体设计 (3)2.2 详细设计 (4)2.2.1 界面设计 (4)2.2.2 各功能模块的设计 (6)3 系统编码设计 (9)3.1 main函数 (9)4 系统运行 (22)5 总结 (26)1 系统分析1.1 课程设计内容商场商品信息管理系统1.2 系统功能需求分析本系统应具有以下功能:1、文件操作功能文件操作:可建立、打开、保存、关闭数据文件。
如果是新建的文件,可输入商品信息数据:数据包括商品编号、商品名、商品类别、商品数量、商品价格等。
2、数据输入功能输入进货信息:输入商品编号、数量完成进货操作。
输入销售信息:输入商品编号、数量完成销售操作,注意当销售数量大于商品数量时,应出现错误提示。
3、数据添加、修改、删除功能添加:添加一种或多种新商品,并能输入其商品信息。
修改:修改商品信息,可包括商品编号、名称、种类、数量和单价。
删除:删除一类或多类商品的所有信息。
4、计算功能可通过查询商品信息功能,自动计算并输出需要进货的商品信息。
5、查询功能可分别按商品编号、名称、类别和需要进货的商品进行查询。
6、排序功能可分别按商品编号、名称、类别等进行排序。
7、数据显示功能可分别浏览输入、查询和排序后的商品信息。
1.3 数据结构设计struct goods /*商品结构体*/{ long int num; /*商品编号*/char name[20]; /*商品名称*/char sort[20]; /*商品类别*/long int count; /*商品库存量*/long int price; /*商品单价*/}goods[200]; /*最多200个商品*/2 系统设计2.1 总体设计按系统分析的功能要求将系统划分为以下几个主要功能模块:一、文件管理⏹文件打开、关闭:对于刚输入或进行操作后的商品信息,在建立新的商品库存量后,可以把其保存在一个文件中,并对该文件可进行打开和关闭操作。
二、进出货管理⏹商品进货: 输入数据后商品信息能自动更新进行添加⏹商品销售: 输入数据后商品信息能自动更新进行减少三、商品数据管理⏹增加/删除商品: 添加或删除某条商品的信息⏹修改商品信息: 对某条商品的信息进行修改四、浏览商品信息管理⏹查询商品信息:可分别按商品编号、名称、类别或需要进货商品查询⏹排序商品信息: 可按商品编号、名称、类别分别排排序⏹浏览商品信息:可浏览输入、查询或排序后的数据。
(此处可用图形描述功能模块划分,类似下图)2.2 详细设计2.2.1 界面设计1、菜单设计⏹欢迎界面:⏹系统提示:商场商品信息管理系统商品数据管理浏信览息商管品理文件管理进出货管理打开关闭保存查询数据输入数据排序数据修改添加出货进货删除菜单设计:2、输入界面的设计3、信息显示界面的设计2.2.2 各功能模块的设计根据划分的功能模块,定义以下函数实现各功能:(这部分应介绍各函数的原型,各功能模块实现所用的算法,可用流程图描述)1、主函数main()定义主函数为空类型(void);利用选择结构(switch)实现在在主函数中的调用各个子函数,利用goto 和子函数中的return语句实现返回主菜单的循环。
声明各个子函数输出欢迎界面输出菜单switch(m)1 输入商品信息2 排序商品信息3 输入商品进货信息4 输入商品销售信息5 增加/删除商品6 修改商品信息7 查询商品信息8 浏览商品信息9 保存商品信息清屏幕2、子函数(1)void input():< 输入函数 >确定新的库存量n,输入商品信息,用for循环语句直到输入商品种类等于n,结束输入;(2)void sequence():< 排序函数 >对已有的商品进行排序,可按商品编号、名称、类别进行排序;(3)void purchase():< 进货函数 >进货函数主要是针对已有库存的商品,在原来的商品数量再增加:(4)void sale():< 销售函数 >要求用户输入所销售的编号,系统用for 循环查询该商品是否存在,不存在要求再进行输入,直到输入正确,输出销售商品:(5)void edit():< 添加/删除商品 >因为在进货函数已经实现对已有商品的数量的增加,此模块函数主要实现对新商品的添加或对旧商品的删除,并自动处理数据,可以在浏览中输出,用选择语句switch进行俩者操作的选择:(6)void correct():< 修改数据函数 >对有错误信息商品进行修改,输入需要修改的商品编号,用for 循环与if语句找到此商品,重新输入该商品的新信息,并输出:(7)void search():< 查询函数 >用switch(k)语句可分别按商品编号、名称、类别或需要进货商品查询;每个case 选择中均用for语句查找要查询的商品,并输出查询结果。
(8)void scan():< 浏览商品函数 >可分别进行浏览输入的商品信息、查询的商品信息、排序后商品信息,用switch 进行这三种方式的选择。
(9)void reserve():< 保存文件 >建立文件FILE *fp;char file[15]用来存放文件保存路径以及文件名,进行清屏,输入文件路径及文件名,利用fp=fopen("file","w+")实现创建并打开一个文件,并得到该文件的地址的功能,显示fprintf(fp,"商品编号\t商品名 \t 商品类别\t商品数量\t商品价格\n"); 最后输出已保存文件,程序中是由PR("商品编号\t商品名 \t商品类别\t商品数量\t商品价格\n");语句执行。
3 系统编码设计(这部分将代码列出,注意,每个函数开始处要介绍函数的功能,重要的代码应有注释,代码格式按锯齿式编排)3.1 main函数#include"stdio.h"#include"string.h"#include"stdlib.h"#define PR printf#define SC scanfstruct goods{long int num;char name[20];char sort[20];long int count;long int price;}goods[200];int k,n,i;void main (){void input();void sequence();void purchase();void sell();void edit();void correct();void search();void scan();void reserve();void exit();PR("\n******************************************************************\n *\t\t\t\t\t\t\t\t *\n");PR(" * ▏▎▍▌ ▋▊█ ▇▆▅▄ ▃▂▁*");PR("\n *\t\t\t\t\t\t\t\t *\n * Welcome\t\t\t\t\t\t *\n *\t\t\t\t\t\t\t\t *\n");PR(" *\t\t to go into ....\t\t\t\t * ");PR("\n *\t\t\t\t\t\t\t\t *\n");PR(" * -the Goods Information Manageaent System- *\n *\t\t\t\t\t\t\t\t *\n ");PR(" * ▁▂▃▄ ▅▆▇█ ▉▊▋▌ ▍▏*\n");PR(" *\t\t\t\t\t\t\t\t *\n ******************************************************************");PR("\n\n\tPlease press any key to continue:");getch();system("cls");PR("\n\n ---$-----$--------$----------$-----------$---------$-------$------$-----$---");PR("\n 系统使用--温馨提示:\n\n →商品编号、数量、单价:采用十进制数,规定长度最长为8位;\n\n →商品名称为26位字母组成字符串,长度最长为20位;\n\n\t →商品类别:以26个小写字母分别代表着26种商品类别;\n\n\t →该商品需要进货的库存量:count<50;\n");PR(" ---$-----$--------$----------$-----------$---------$-------$------$-----$---");PR(" \nplease press any key to continue");getch();system("cls"); /*清屏*/lp: for(i=0;i<1;i++)PR("\n\n——★—☆——★—☆——☆—★——☆—★——☆—☆——★—\n");PR("\n\t\t\t 商品信息管理系统\t\n\n");PR("\t 1 →输入商品信息\n\n");PR("\t 2 →排序商品信息\n\n");PR("\t 3 →输入进货信息\t\t6 →修改商品信息\n\n");PR("\t 4 →输入销售信息\t\t7 →查询商品信息\n\n");PR("\t 5 →增加/删除商品\t\t8 →浏览商品信息\n\n");PR("\t\t\t\t\t9 →保存商品信息\n\n");PR(" \t\t ——☆—★——☆—★——☆—☆——★—☆——★—☆——★—");/*菜单选择界面*/PR("\n\n");PR("\t请选择您所要的操作(或选择(0)退出):");SC("%d",&k);system("cls");switch(k) /*用switch语句实现功能选择*/{case 1: input();break;case 2: sequence();break;case 3: purchase();break;case 4: sell();break;case 5: edit();break;case 6: correct();break;case 7: search();break;case 8: scan();break;case 9: reserve();break;case 0: PR("\n\n\t / / / / / ^_^ \\ \\ \\ \\ \\ \n\n\t…………谢谢使用,欢迎再来,再见O(∩_∩)O…………");exit(0); /*退出系统*/default: puts("输入错误,请按任意健返回主菜单:\n"); break;}system("cls"); /*清屏*/goto lp; /*返回主界面*/}void input() /*功能1:输入商品信息*/{PR("\n 请输入需要建立新库存的商品种类数量:");SC("%d",&n);system("cls");PR("\n …………………………………………………………………………………………………\n");for(i=0;i<n;i++) /*用循环实现输入n个商品*/{PR("\n\t*请输入商品的编号:");SC("%ld",&goods[i].num);PR("\n\t 请输入商品的名称:");SC("%s",goods[i].name);PR("\n\t 请输入商品的种类:");SC("%s",goods[i].sort);PR("\n\t 请输入商品的数量:");SC("%d",&goods[i].count);PR("\n\t 请输入商品的单价:");SC("%d",&goods[i].price);PR("\n …………………………………………………………………………………………………\n");}PR("\tPlease press any key to continue:");getch();return; /*返回主界面*/}void sequence() /*功能2:排序商品信息*/{long temp;char p1[30],p2[30];for(k=0;k<n-1;k++) /*(1): 按编号排序*/for(i=0;i<n-k-1;i++) /*用起泡法排序*/if(goods[i].num>goods[i+1].num) /*按编号由小到大排序*/{temp=goods[i].num;goods[i].num=goods[i+1].num;goods[i+1].num=temp;strcpy(p1,goods[i].name);strcpy(goods[i].name,goods[i+1].name);strcpy(goods[i+1].name,p1);strcpy(goods[i].sort,goods[i+1].sort);strcpy(goods[i+1].sort,p2);}PR("--------------------------------------------------------------------------------");PR("\n\t\t按商品编号排序后的商品信息\n\n");PR("\t商品编号商品名称商品类别商品数量商品单价\n"); /*输出排序后商品信息*/for(i=0;i<n;i++){PR("\t %5ld %5s %5s %5ld %5ld\n",goods[i]. num,goods[i].name,goods[i].sort,goods[i].count,goods[i].price);}for(k=0;k<n-1;k++) /*(2): 按商品名称排序*/for(i=0;i<n-k-1;i++)if(strcmp(goods[i].name,goods[i+1].name)>0){strcpy(p1,goods[i].name);strcpy(goods[i].name,goods[i+1].name);strcpy(goods[i+1].name,p1);temp=goods[i].num;goods[i].num=goods[i+1].num;goods[i+1].num=temp;strcpy(p2,goods[i].sort);strcpy(goods[i].sort,goods[i+1].sort);strcpy(goods[i+1].sort,p2);}PR("--------------------------------------------------------------------------------");PR("\n\t\t按商品名称排序后的商品信息\n");PR("\n\t商品名称商品编号商品类别商品数量商品单价\n"); /*输出排序后商品信息*/for(i=0;i<n;i++){PR("\t %5s %5ld %5s %5ld %5ld\n",goods[i].nam e,goods[i].num,goods[i].sort,goods[i].count,goods[i].price);}for(k=0;k<n-1;k++) /*(3): 按商品类别排序*/for(i=0;i<n-k-1;i++) /*用起泡法排序*/if(strcmp(goods[i].sort,goods[i+1].sort)>0){strcpy(goods[i].sort,goods[i+1].sort);strcpy(goods[i+1].sort,p2);temp=goods[i].num;goods[i].num=goods[i+1].num;goods[i+1].num=temp;strcpy(p1,goods[i].name);strcpy(goods[i].name,goods[i+1].name);strcpy(goods[i+1].name,p1);}PR("--------------------------------------------------------------------------------");PR("\n\t\t按商品类别排序后的商品信息\n\n");PR("\t商品类别商品编号商品名称商品数量商品单价\n"); /*输出排序后商品信息*/for(i=0;i<n;i++){PR("\t %5s %5ld %5s %5ld %5ld\n",goods[i]. sort,goods[i].num,goods[i].name,goods[i].count,goods[i].price);}PR("--------------------------------------------------------------------------------");PR("please press any key to continue:");getch();return; /*返回主界面*/}void purchase() /*功能3:进货商品信息*/{long temp; /*定义临时变量表示刚进货的商品编号*/int j;PR("\n\t\5请输入刚进货的商品编号:");SC("%ld",&temp);PR("\n\t\5请输入刚进货的商品数量:");SC("%d",&j);PR("\n\n\n\tpress any key to contiue:");getch();system("cls");PR("\n\t输出进货后的商品信息:");for(i=0;i<n;i++) /*循环,寻找与进货相同的商品信息*/if(temp==goods[i].num)goods[i].count=goods[i].count+j; /*自动更改商品数量*/ PR("\n\t商品编号商品名商品类别商品数量商品价格");for(i=0;i<n;i++) /*循环,输出进货后的商品信息*/{PR("\n\t %4ld %4s %4s %ld %4ld",goods[i].num,g oods[i].name,goods[i].sort,goods[i].count,goods[i].price);}PR("\n\n\t\tPress any key to enter menu:");getch(); /*返回功能选择界面*/return;}void sell() /*功能4:销售商品信息*/{long temp; /*定义临时变量temp表示刚销售的商品编号*/int j;PR("\n\t\5请输入刚销售的商品编号:");SC("%ld",&temp);PR("\n\t\5请输入刚销售的商品数量:");SC("%d",&j);for(i=0;i<n;i++) /*循环,找到刚销售的商品信息*/{if(temp==goods[i].num){for(;j>goods[i].count;) /*如果销售额大于库存量,则出现错误提示*/{PR("\n\t售出数量大于商品原有数量,出现错误,请重新输入:");SC("%d",&j);}goods[i].count=goods[i].count-j; /*完成自动更改商品数量的功能*/}}PR("\n\tpress any key to contiue:");getch();system("cls"); /*清屏*/PR("\n\n *销售后商品信息:");PR("\n\t商品类别商品编号商品名称商品数量商品单价\n");for(i=0;i<n;i++) /*循环,输出销售后商品信息*/{PR("\t %4s %4ld %4s %4ld %4ld\n",goods[i ].sort,goods[i].num,goods[i].name,goods[i].count,goods[i].price);}PR("\n\tPress any key to enter menu:");getch();return; /*返回功能选择界面*/void edit() /*功能5:添加或删除商品信息*/{void add(); /*声明子函数*/void dele();PR("\n\t请选择:1.添加商品信息; 2.删除商品信息;");PR("\t*请输入1或2 继续:");SC("%d",&k);switch(k) /*用switch语句实现功能选择*/{case 1: add();break;case 2: dele();break;}getch();return; /*返回主菜单*/}void add() /*添加商品信息*/{/*定义子函数*/PR("\t*请输入所添加商品的商品编号:");SC("%ld",&goods[n].num);PR("\n\t请输入所添加商品的名称:");SC("%s",goods[n].name);PR("\n\t请输入所添加商品的类别:");SC("%s",goods[n].sort);PR("\n\t请输入所添加商品的数量:");SC("%d",&goods[n].count);PR("\n\t请输入所添加商品的价格:");SC("%d",&goods[n].price);n=n+1;PR("\n");}void dele() /*删除商品信息*/{/*定义子函数*/int temp; /*定义局部变量*/int j;for(i=0;i<n;i++){PR("\n\t商品编号商品名商品类别商品数量商品价格"); PR("\n\t %5ld %5s %5s %5ld %5ld",goods[i].n um,goods[i].name,goods[i].sort,goods[i].count,goods[i].price);PR("\n");PR("\n");PR("\n*请输入要删除的商品编号:");SC("%ld",&temp);PR("\n\n");for(i=0;i<n;i++){if(temp==goods[i].num){for(j=i;j<n;j++){goods[j].num=goods[j+1].num;strcpy(goods[j].name,goods[j+1].name);strcpy(goods[j].sort,goods[j+1].sort);goods[j].count=goods[j+1].count;goods[j].price=goods[j+1].price;}n=n-1; /*商品总库存量减少*/}}for(i=0;i<n;i++){PR("\n\t商品编号商品名商品类别商品数量商品价格"); /*输出删除后的商品信息*/PR("\n\t %5ld %5s %5s %5ld %5ld",goods[i].n um,goods[i].name,goods[i].sort,goods[i].count,goods[i].price);PR("\n");}PR("Please press any key to continue:");getch();return; /*返回主界面*/}void correct() /*功能6:修改商品信息*/{long temp; /*定义局部变量*/PR("\n\t请输入要修改的商品的编号:");SC("%ld",&temp); /*输入新的商品信息*/PR("\n");for(i=0;i<n;i++) /*保存新的商品信息*/{if(temp==goods[i].num){PR("\t请输入一个新的的商品编号:");SC("%ld",&goods[i].num);PR("\n\t请输入新的商品的名称:");SC("%s",goods[i].name);PR("\n\t请输入新的商品的类别:");SC("%s",goods[i].sort);PR("\n\t请输入新的商品的数量:");SC("%d",&goods[i].count);PR("\n\t请输入新的商品价格:");SC("%d",&goods[i].price);PR("\n");}}for(i=0;i<n;i++){PR("\n\t新的商品名称商品编号商品类别商品数量商品单价\n");PR("\t %4s %4ld %4s %4ld %4 ld",goods[i].name,goods[i].num,goods[i].sort,goods[i].count,goods[i].price);PR("\n");}PR("Please press any key to continue:"); /*返回功能选择界面*/getch();return; /*返回主菜单*/}void search() /*功能7:查询商品信息*/{int k; /*定义局部变量*/long temp1;char temp2[30],temp3[20];PR("\n\t\5按商品编号查询,请按1\t\t\t\5按商品名查询,请按2\n\t\5按商品类别查询,请按3\t\t\t\5查需要进货的商品,请按4\n");PR("\n\n\n\t\t\t请输入数字确定查询方式:");SC("%d",&k);PR("\n");PR("Press any key to continue:");getch();system("cls");switch(k) /*实现查询方式的选择*/{case 1:{ PR("\n\n\n\n\n\t\t请输入要查询的商品的编号:"); /*按商品编号查询*/SC("%ld",&temp1);system("cls"); /*清屏*/for(i=0;i<n;i++){if(temp1==goods[i].num){PR("\n");PR("\n\t商品编号商品名商品类别商品数量商品价格");PR("\n\t %5ld %5s %5s %5ld %5ld",goods[i].num,g oods[i].name,goods[i].sort,goods[i].count,goods[i].price);}}}break; /*跳出switch语句*/case 2:{ PR("\n\n\n\n\n\t\t请输入要查询的商品名:"); /*按商品名查询数据*/SC("%s",temp2);system("cls");for(i=0;i<n;i++){if(strcmp(temp2,goods[i].name)==0){PR("\n");PR("\n\t商品编号商品名商品类别商品数量商品价格");PR("\n\t %5ld %5s %5s %5ld %5ld",goods[i].num,g oods[i].name,goods[i].sort,goods[i].count,goods[i].price);}}}break; /*跳出switch语句*/case 3:{PR("\n\n\n\n\n\t\t请输入要查询的商品类别:"); /*按商品类别查询数据*/SC("%s",temp3);system("cls");for(i=0;i<n;i++){if(strcmp(temp3,goods[i].sort)==0){PR("\n");PR("\n\t商品编号商品名商品类别商品数量商品价格");PR("\n\t %5ld %5s %5s %5ld %5ld",goods[i].num,g oods[i].name,goods[i].sort,goods[i].count,goods[i].price);}}}break; /*跳出switch语句*/case 4:{int a=50;for(i=0;i<n;i++) /*查询需要进货的商品名*/{if(goods[i].count<a)PR("\n\t\t\4需要进货的商品名:%s 现有库存量:%ld\n",goods[i].name,goods[i].count);}}break; /*跳出switch语句*/}PR("\n\n\t\tPress any key to enter menu:");getch();return; /*返回主界面*/}void scan() /*功能8:浏览商品信息*/{PR("\n\t浏览输入的商品信息,请按1\n\n\t浏览查询的商品信息,请按2\n\n\t浏览排序后商品信息,请按3\n");PR("请选择:");SC("%d",&k);switch(k){case 1:{ PR("\t\t\t浏览输入的商品信息\n");PR("\t商品编号商品名商品类别商品数量商品价格\n");/*输出浏览商品信息*/for(i=0;i<n;i++){PR("\t%5ld %5s %5s %5ld %ld",goods[i].num,goods [i].name,goods[i].sort,goods[i].count,goods[i].price);PR("\n");}PR("Press any key to enter menu:");getch();return;}break; /*跳出switch语句*/case 2:{ PR("\t\t\t浏览查询的商品信息\n");PR("\t商品编号商品名商品类别商品数量商品价格\n");/*输出浏览商品信息*/for(i=0;i<n;i++){PR("\t%5ld %5s %5s %5ld %ld",goods[i].num,g oods[i].name,goods[i].sort,goods[i].count,goods[i].price);PR("\n");}PR("\nPress any key to enter menu:");getch();return;}break; /*跳出switch语句*/case 3:{ PR("\t\t\t浏览按商品编号排序的商品信息\n");PR("\t商品编号商品名商品类别商品数量商品价格\n");/*输出浏览商品信息*/for(i=0;i<n;i++){PR("\t%5ld %5s %5s %5ld %ld",goods[i].num,goods [i].name,goods[i].sort,goods[i].count,goods[i].price);PR("\n");}PR("\nPress any key to enter menu:");getch();return; /*返回主界面*/}break; /*跳出switch语句*/}}void reserve() /*功能9:保存文件*/{FILE *fp;char file[15]; /*用来存放文件保存路径以及文件名*/system("cls"); /*清屏*/PR("\n\t*请输入文件路径及文件名:");SC("%s",file);fp=fopen("file","w+"); /*创建并打开一个文件,并得到该文件的地址*/ fprintf(fp,"商品编号\t商品名\t商品类别\t商品数量\t商品价格\n");PR("商品编号\t商品名\t 商品类别\t 商品数量\t 商品价格\n");for(i=0;i<n;i++){fprintf(fp,"%ld\t\t%s\t\t%s\t\t%d\t\t%d\n",goods[i].num,goods[i].name,goods[i].sort,g oods[i].count,goods[i].price);PR("%ld\t\t%s\t\t%s\t\t%d\t\t%d\n",goods[i].num,goods[i].name,goods[i].sort,goods[i ].count,goods[i].price);}fclose(fp); /*关闭文件*/PR("文件已经保存!\n");getch();system("cls"); /*清屏*/}void quit() /*退出系统*/{exit(0);}4 系统运行1、输入新商品操作:首先由主菜单选择"1"进入运行input函数,清屏进入input函数界面,提示我们要进行商品信息的输入,包括商品编号、名称、种类、数量和单价,利用for 输入完成后,显示出“Please press any key to continue”,再按任意健可返回主菜单,其运行界面如下:2、商品排序操作:主菜单选择"2"可调用sequence函数,进入商品信息排序界面,其结果会自动显示出来,如下图所示:3、进出货操作:由主菜单选择"3"或"4",转入调用purchase 或sale函数中,清屏,出现进货或出货新页面,屏幕显示要求我们按照商品编号,输入需要进货的商品的数量,销售商品操作界面即要我们输入已销售商品的数量,当系统出现"please press any key to continue" 提示我们进出货操作已完成,数据已自动进行更改,按任意键可输出更新后的数据,再按任意键即可返回主菜单,其操作界面如下:4、添加或删除商品此模块操作的主要功能是实现对新商品的添加或删除,由主菜单选择"5"可进入选择页面,它提供了添加或删除商品的选择,如选择"1"进行添加商品,接下来只要按要求分别输入商品编号、商品名称、商品类别、商品数量和价格,系统就会自动按我们的输入进行保存,其保存结果可以在查询或浏览函数中输出,输入完毕后,系统显示提示,按任意键便可返回主菜单。