题目:超市管理系统

要求:实现简单的超市商品信息管理,系统要求以菜单方式工作,因而根据题目要求,提供键盘式选择菜单实现功能选择,商品包括编号、名称、进价、年售价、库存址等(商品名称和编号不重复)。商品信息采用手动输入保存,所以应提供商品信息的输入、输出等操作;在程序中需要显示商品的信息,应提供显示等操作;要实现商品的进货和退货,应提供添加和删除商品信息(包括名称、编号、进价、售价、库存)等操作;要实现商品信息的销售,则要提供计算应收金额和实收金额以及对商品库存量进行改变的功能;要实现商品信息的查询(包括通过编号查询和名称查询两种方式),则要提供查找功能;要实现商品的排序(包括通过编号从小到大或售价从低到高,两种方式),则需要提供排序的功能。

系统以菜单方式工作。
商品信息录入功能。
商品信息显示功能。
商品进货功能。
商品退货功能。
商品销售功能。
商品查询方式:
(1)按商品编号查询;

(2)按商品名称查询。

8.商品排序方式:

(1)按商品编号从小到大排;

(2)按商品售价从低到高排。

总体设计
根据上面的需求分析,可以将这个系统设计分为以下模块:商品信息建立模块、商品信息显示模块、商品进货模块、商品退货模块、商品销售模块、商品查询模块、商品排序模块。

详细设计
1.数据信息
编号、名称、进价、售价、库存。

建立商品信息结构体,结构体成员包括:编号、名称、进价、售价、库存。

struct shangpin//商品信息的结构题库存{char bianhao[10];char mingcheng[10];int jinjia;int shoujia;int kucun;}num[N+2];

2.模块设计
1)建立模块:输入商品的编号、名称、进价、售价、库存的相关信息,通过自己定义的 void Jianlishangpinku();函数来实现。

void Jianlishangpinku()//建立商品库{int i;printf("请依次输入货物信息: \n");for (i = O;i < N; i++){//向文件中写入信息printf("------------------------------------\n");printf("第%d个商品: \n",i + 1);printf("编号:");scanf("%s",num[i].bianhao);//输入编号printf("名称:");scanf("%s",num[i].mingcheng);/输入名称printf("进价:");scanf("%d", &num[i].jinjia);/输入进价printf("售价:");scanf("%d", &num[i].shoujia);//输入售价printf("库存:");scanf("%d", &num[i].kucun);/输入库存printf("------------------------------------\n");}return;}

通过for循环对N个商品信息进行输入。

  1. 2)显示模块:浏览所有商品的相关信息,通过自己定义的void Xianshiquanbushangpinxinxi();函数来实现。
    void Xianshiquanbushangpinxinxi()//显示全部商品信息{int i;for (i = O; i <= N; i++){printf("---------------------------------\n");printf("编号:%s\n", num[i].bianhao);printf("名称:%s\n", num[i].mingcheng);printf("进价:%d\n", num[i].jinjia);printf("售价:%d\n", num[i].shoujia);printf("库存:%d\n", num[i].kucun);printf("---------------------------------\n");}return;}

    同样采用for循环对所有商品信息进行输出。

  2. 3)进货模块:可以通过输入的商品名称先检测是否有该商品,如果有则改变库存量,如果没有就建立新的商品信息,通过自己定义的void Jinhuo();函数来实现。
    void Jinhuo()//进货{int i;printf("输入进货商品:");scanf("%s",jiance.mingcheng);for (i = 0; i < N; i++){if (strcmp(num[i].mingcheng, jiance.mingcheng) == 0)/检测是否存在该商品{printf("存在该商品,输入库存量:");scanf("%d", &num[i].kucun);break;}if (i == N-1)/检测到第5件商品后发现无该商品则新建该商品{printf("-------------------------------------\n");printf("编号:");scanf("%s",num[i+1].bianhao);/输入编号printf("名称:");scanf("%s",num[i+1].mingcheng);/输入名称printf("进价:");scanf("%d", &num[i+1].jinjia);/输入进价printf("售价:");scanf("%d", &num[i+1].shoujia);//输入售价printf("库存:");scanf("%d", &num[i+1].kucun);/输入库存printf("--------------------------------------\n");

    通过strcmp对输入的商品与商品库中的商品进行比较,为0是即找到该商品,便对该商品库存量进行重新赋值,若不存在为0的情况则是因为商品库中无该商品,则建立新的商品信息。

    4)退货模块:退货方式有两种情况,一种是人为选择删除某项商品信息,通过输入商品名称实现,一种是检测库存量为零的商品再选择是否删除商品信息。该模块通过自己定义的void Tuihuo();函数来实现。

    void Tuihuo0//退货{int i,j,x,k=0;printf("输入退货商品名称:");scanf("%s",tui.name);for(i=0;i<=N;i++)/循环进行检测要退货的商品if (strcmp(num[i].mingcheng, tui.name) == 0)for(j=i;j<=N+1;j++)/对退的货物进行从后向前覆盖{strcpy(num[j].bianhao,num[j+1].bianhao);strcpy(num[j].mingcheng,num[j+1].mingcheng);num[j].jinjia=num[j+1].jinjia;num[j].shoujia=num[j+1].shoujia;num[j].kucun=num[j+1].kucun;}for(i=0;i<=N;i++)//检测是否有库存为0的商品{if(num[i].kucun==0){k++;/如果有库存为0的商品则k不为0,如果有商品为0的商品则输出该商品printf("------------------------------\n");printf("编号:%s\n", num[i].bianhao);printf("名称:%s\n", num[i].mingcheng);printf("进价:%d\n", num[i].jinjia);printf("售价:%d\n", num[i].shoujia);printf("库存:%d\n", num[i].kucun);printf("------------------------------\n");printf("是否删除该商品信息\n1:是\n2:否\n请选择:“);scanf("%d", &x);if(x==1)for(j=i;j<=N;j++)/若要删除该商品,则将该商品进行从后往前覆盖{strcpy(num[j].bianhao,num[j+1].bianhao);strcpy(num[j].mingcheng,num[j+1].mingcheng);num[j].jinjia=num[j+1].jinjia;num[j].shoujia=num[j+1].shoujia;num[j].kucun=num[j+1].kucun;}}}if(k==0)printf("无库存为0的商品\n");}

    退货同样采用strcmp进行比较,但不同的是退货时并不是以删除信息的方式进行,而是通过strcpy将该商品以后的商品信息进行向前覆盖,以此达到删除该商品信息的作用。

    5)销售模块:输入想要购买的商品编号以及想要购买的商品数量后进行应付金额计算,若实际付款金额小于应付金额,则显示交易失败,若交易成功,则将该商品的库存量减去销售量。通过自己定义的void Xiaoshou();函数来实现。

    void Xiaoshou()//商品销售{int i,n,p,q;printf("请输入购买商品的编号:");scanf("%s",sell.bianhao);printf("请输入购买商品的数量:");scanf("%d", &n);for(i=0;inum[i].kucun)/检测库存是否充足{scanf("库存不足");return;}p=num[i].shoujia;printf("应收金额:%d\n",n*p);/商品数量乘以售价printf("实际收款:");scanf("%d", &q);if(q<n*p)//检测实际收款是否与应收款相符{printf("交易失败");return;}elsenum[i].kucun=(num[i].kucun-n);/将库存减去销售量}

    采用for循环进行商品查找,再采用结构体中的库存成员对库存进行改变。

  3. 6)查询模块:输入想要查询的商品名称,然后显示所输入商品的信息(包括:编号、名称、进价、售价、库存)。通过自己定义的void Chaxun();来实现。
    void Chaxun()//查询输入的商品信息{int c,i;printf("请选择查询方式\n1:编号查询\n2:名称查询\n请选择:");scanf("%d", &c);if(c==1)/选择编号查询{printf("请输入商品编号:");scanf("%s",cha.bianhao);for(i=0;i<=N;i++)/循环查询到输入的编号信息{if(strcmp(num[i].bianhao,cha.bianhao)==0)break;}printf("------------------------------\n");printf("编号:%s\n", num[i].bianhao);printf("名称:%s\n", num[i].mingcheng);printf("进价:%d\n", num[i].jinjia);printf("售价:%d\n", num[i].shoujia);printf("库存:%d\n", num[i].kucun);printf("------------------------------\n");}if(c==2)/选择名称查询{printf("请输入商品名称:");scanf("%s",cha.mingcheng);for(i=0;i<=N;i++)/循环查询到输入的名称信息{if(strcmp(num[i].mingcheng,cha.mingcheng)==0)break;}printf("-------------------------------\n");printf("编号:%s\n", num[i].bianhao);printf("名称:%s\n", num[i].mingcheng);printf("进价:%d\n", num[i].jinjia);printf("售价:%d\n", num[i].shoujia);printf("库存:%d\n", num[i].kucun);printf("--------------------------------\n");}

    先采用if对想要查询的方式进行选择,再直接引用结构中的成员进行输出。

  4. 7)排序模块:输入想要查询的方式(包括通过编号查询和名称查询两种方式),然后根据所选方式进入相应的排序程序(选择排序法)。通过自己定义的void Pa
    if(x==1)/按商品编号排序(选择排序){for(j=0;j<N+1;j++) {for(i=j+1;i0){strcpy(pai.bianhao,num[i].bianhao);strcpy(num[i].bianhao,num[j].bianhao);strcpy(num[j].bianhao,pai.bianhao);strcpy(pai.mingcheng,num[i].mingcheng);strcpy(num[i].mingcheng,num[j].mingcheng);strcpy(num[j].mingcheng,pai.mingcheng);jinjia=num[i].jinjia;num[i].jinjia=num[j].jinjia;num[j].jinjia=jinjia;shoujia=num[i].shoujia;num[i].shoujia=num[i].shoujia;num[i].shoujia=shoujia;kucun=num[i].kucun;num[i].kucun=num[i].kucun;num[j].kucun=kucun;}}}}

    上图为按商品编号排序的程序,采用的是选择排序法,引用了程序开头定义的结构变量。

  5. 1)商品库的初始化:
    for(i=0;i<=N+1;i++)//初始化商品数据库{strcpy(num[i].bianhao,"88888");/编号strcpy(num[i].mingcheng, "88888");/名称num[i].jinjia=88888;//进价num[i].shoujia=88888;/售价num[i].kucun=88888;/库存}

    2)主菜单的显示和功能的选择:

    while(1)//主菜单显示和功能的循环{printf("欢迎使用超市管理系统\n");printf("\n**************\n");printf("1 建立数据库\n");printf("2显示部商品信息\n");printf("3 进货\n");printf("4 退货\n");printf("5商品销售\n");printf("6商品查询\n");printf("7商品排序\n");printf("************\n");printf("\n请选择: ");scanf("%d", &choice);while(1)/检验输入功能数字是否正确{if (choice 7)printf("输入错误,请重新输入。");break;}elsebreak;}switch (choice)/功能选择{case 1: Jianlishangpinku();break;case 2: Xianshiquanbushangpinxinxi(0;break;case 3:Jinhuo0);break;case 4:Tuihuo();break;case 5:Xiaoshou0;break;case 6:Chaxun();break;case 7: Paixu0;break;}}return 0;

    采用while(1){};对菜单进行重复打印(即每运行完一个函数就显示主菜单)并且每运行一个函数后都可以对下个要运行的函数进行选择(通过switch(choice){};实现),即每选择一次,程序就进入到相应的函数,函数运行完成后便跳出函数,进入到主函数进行再次选择。

  6. 完整代码如下:

    #include#include#define N 5struct shangpin//商品信息的结构题库存 {char bianhao[10];char mingcheng[10];int jinjia;int shoujia;int kucun;}num[N+2];struct jianceshangpin//检测时引用的商品名称 {char mingcheng[10];}jiance;struct tuihuo//退货时引用的商品名称 {char name[10];}tui;struct xiaoshou//销售时引用的商品编号 {char bianhao[10];}sell;struct chaxun//查询时引用的商品信息 {char bianhao[10];char mingcheng[10];}cha;struct paixu//排序时引用的中间变量 {char bianhao[10];char mingcheng[10];}pai;//声明函数 void Jianlishangpinku();void Xianshiquanbushangpinxinxi();void Jinhuo();void Tuihuo();void Xiaoshou();void Chaxun();void Paixu();int main(){int choice,i;for(i=0;i<=N+1;i++)//初始化商品数据库 {strcpy(num[i].bianhao,"88888");//编号 strcpy(num[i].mingcheng,"88888");//名称 num[i].jinjia=88888;//进价 num[i].shoujia=88888;//售价 num[i].kucun=88888;//库存 }while (1)//主菜单显示和功能的循环 {printf("欢迎使用超市管理系统\n");printf("\n*****************************************\n");printf("1 建立数据库\n");printf("2 显示全部商品信息\n");printf("3 进货\n");printf("4 退货\n");printf("5 商品销售\n");printf("6 商品查询\n");printf("7 商品排序\n");printf("*****************************************\n");printf("\n请选择:");scanf("%d", &choice);while (1)//检验输入功能数字是否正确 {if (choice 7){printf("输入错误,请重新输入。");break;}elsebreak;}switch (choice)//功能选择 {case 1:Jianlishangpinku();break;case 2:Xianshiquanbushangpinxinxi();break;case 3:Jinhuo();break;case 4:Tuihuo();break;case 5:Xiaoshou();break;case 6:Chaxun();break;case 7:Paixu();break;}}return 0; }void Jianlishangpinku()//建立商品库 {int i;printf("请依次输入货物信息:\n");for (i = 0; i < N; i++){//向文件中写入信息printf("--------------------------------------------------\n");printf("第%d个商品:\n", i + 1);printf("编号:");scanf("%s",num[i].bianhao);//输入编号 printf("名称:");scanf("%s",num[i].mingcheng);//输入名称printf("进价:");scanf("%d", &num[i].jinjia);//输入进价printf("售价:");scanf("%d", &num[i].shoujia);//输入售价printf("库存:");scanf("%d", &num[i].kucun);//输入库存 printf("---------------------------------------------------\n");}return;}void Xianshiquanbushangpinxinxi()//显示全部商品信息 {int i;for (i = 0; i <= N; i++){printf("-------------------------------------------\n");printf("编号:%s\n", num[i].bianhao);printf("名称:%s\n", num[i].mingcheng);printf("进价:%d\n", num[i].jinjia);printf("售价:%d\n", num[i].shoujia);printf("库存:%d\n", num[i].kucun);printf("-------------------------------------------\n");}return;}void Jinhuo()//进货 {int i;printf("输入进货商品:");scanf("%s",jiance.mingcheng);for (i = 0; i < N; i++){if (strcmp(num[i].mingcheng, jiance.mingcheng) == 0)//检测是否存在该商品 {printf("存在该商品,输入库存量:");scanf("%d", &num[i].kucun);break;}if (i == N-1)//检测到第5件商品后发现无该商品则新建该商品 {printf("--------------------------------------------------\n");printf("编号:");scanf("%s",num[i+1].bianhao);//输入编号printf("名称:");scanf("%s",num[i+1].mingcheng);//输入名称 printf("进价:");scanf("%d", &num[i+1].jinjia);//输入进价 printf("售价:");scanf("%d", &num[i+1].shoujia);//输入售价 printf("库存:");scanf("%d", &num[i+1].kucun);//输入库存 printf("---------------------------------------------------\n");}}}void Tuihuo()//退货 {int i,j,x,k=0;printf("输入退货商品名称:");scanf("%s",tui.name);for(i=0;i<=N;i++) //循环进行检测要退货的商品 {if (strcmp(num[i].mingcheng, tui.name) == 0)for(j=i;j<=N+1;j++)//对退的货物进行从后向前覆盖{strcpy(num[j].bianhao,num[j+1].bianhao);strcpy(num[j].mingcheng,num[j+1].mingcheng);num[j].jinjia=num[j+1].jinjia;num[j].shoujia=num[j+1].shoujia;num[j].kucun=num[j+1].kucun;}}for(i=0;i<=N;i++)//检测是否有库存为0的商品 {if(num[i].kucun==0){k++;//如果有库存为0的商品则k不为0,如果有商品为0的商品则输出该商品 printf("-------------------------------------------\n");printf("编号:%s\n", num[i].bianhao);printf("名称:%s\n", num[i].mingcheng);printf("进价:%d\n", num[i].jinjia);printf("售价:%d\n", num[i].shoujia);printf("库存:%d\n", num[i].kucun);printf("-------------------------------------------\n");printf("是否删除该商品信息\n1:是\n2:否\n请选择:"); scanf("%d",&x);if(x==1)for(j=i;j<=N;j++)//若要删除该商品,则将该商品进行从后往前覆盖 {strcpy(num[j].bianhao,num[j+1].bianhao);strcpy(num[j].mingcheng,num[j+1].mingcheng);num[j].jinjia=num[j+1].jinjia;num[j].shoujia=num[j+1].shoujia;num[j].kucun=num[j+1].kucun;}}}if(k==0)printf("无库存为0的商品\n"); }void Xiaoshou()//商品销售 {int i,n,p,q;printf("请输入购买商品的编号:");scanf("%s",sell.bianhao);printf("请输入购买商品的数量:");scanf("%d",&n);for(i=0;inum[i].kucun)//检测库存是否充足 {scanf("库存不足");return;} p=num[i].shoujia;printf("应收金额:%d\n",n*p);//商品数量乘以售价 printf("实际收款:");scanf("%d",&q);if(q<n*p)//检测实际收款是否与应收款相符 {printf("交易失败");return;}elsenum[i].kucun=(num[i].kucun-n);//将库存减去销售量 }void Chaxun()//查询输入的商品信息 {int c,i;printf("请选择查询方式\n1:编号查询\n2:名称查询\n请选择:"); scanf("%d",&c);if(c==1)//选择编号查询 {printf("请输入商品编号:");scanf("%s",cha.bianhao);for(i=0;i<=N;i++)//循环查询到输入的编号信息 {if(strcmp(num[i].bianhao,cha.bianhao)==0)break;}printf("-------------------------------------------\n");printf("编号:%s\n", num[i].bianhao);printf("名称:%s\n", num[i].mingcheng);printf("进价:%d\n", num[i].jinjia);printf("售价:%d\n", num[i].shoujia);printf("库存:%d\n", num[i].kucun);printf("-------------------------------------------\n");}if(c==2)//选择名称查询 {printf("请输入商品名称:");scanf("%s",cha.mingcheng);for(i=0;i<=N;i++)//循环查询到输入的名称信息 {if(strcmp(num[i].mingcheng,cha.mingcheng)==0)break;}printf("-------------------------------------------\n");printf("编号:%s\n", num[i].bianhao);printf("名称:%s\n", num[i].mingcheng);printf("进价:%d\n", num[i].jinjia);printf("售价:%d\n", num[i].shoujia);printf("库存:%d\n", num[i].kucun);printf("-------------------------------------------\n");}}void Paixu()//商品排序 {int x,i,j,jinjia,shoujia,kucun;printf("请选择排序的方法:\n1:按商品编号排序\n2:按商品价格排序\n请选择:");scanf("%d",&x);if(x==1)//按商品编号排序(选择排序) {for(j=0;j<N+1;j++){for(i=j+1;i0){strcpy(pai.bianhao,num[i].bianhao);strcpy(num[i].bianhao,num[j].bianhao);strcpy(num[j].bianhao,pai.bianhao);strcpy(pai.mingcheng,num[i].mingcheng);strcpy(num[i].mingcheng,num[j].mingcheng);strcpy(num[j].mingcheng,pai.mingcheng);jinjia=num[i].jinjia;num[i].jinjia=num[j].jinjia;num[j].jinjia=jinjia;shoujia=num[i].shoujia;num[i].shoujia=num[j].shoujia;num[j].shoujia=shoujia;kucun=num[i].kucun;num[i].kucun=num[j].kucun;num[j].kucun=kucun;} } }}if(x==2)//按商品售价排序(选择排序法) {for(j=0;j<N+1;j++){for(i=j+1;inum[i].shoujia){strcpy(pai.bianhao,num[i].bianhao);strcpy(num[i].bianhao,num[j].bianhao);strcpy(num[j].bianhao,pai.bianhao);strcpy(pai.mingcheng,num[i].mingcheng);strcpy(num[i].mingcheng,num[j].mingcheng);strcpy(num[j].mingcheng,pai.mingcheng);jinjia=num[i].jinjia;num[i].jinjia=num[j].jinjia;num[j].jinjia=jinjia;shoujia=num[i].shoujia;num[i].shoujia=num[j].shoujia;num[j].shoujia=shoujia;kucun=num[i].kucun;num[i].kucun=num[j].kucun;num[j].kucun=kucun;}} }}}