基于C语言实现的仓库管理系统

nouveau

发布日期: 2018-11-05 10:24:37 浏览量: 6269
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

1 题目要求

该系统用于实现仓库管理,系统应支持入库、出库、库存查询以及打印。用户可自定库存警戒值,库存低于警戒值时以红字显示。仓库信息需要用文件存储。

2 需求分析

根据题目要求,由于货品信息存放在文件中,所以应该提供文件的读入、输出等操作;在程序中要浏览货品信息,应提供显示、查找、排序等操作;实现货物入库功能,要提供结构体的输入操作;实现统计功能,要提供相应的统计操作;实现修改功能,要提供修改操作;另外,还要提供键盘式菜单实现功能选择。

3 总体设计

根据上面的需求分析,可以将该系统的系统的设计分为大模块,即入库模块、出库模块、查询模块、排序模块、修改模块和统计模块等。

4 详细设计

4.1 主函数

  1. #include<stdio.h>
  2. #include<windows.h>
  3. #include<string.h>
  4. #include<conio.h>
  5. void main()
  6. {
  7. int sele;
  8. Re_file(); //读取货品信息
  9. sele=1;
  10. while(sele)
  11. {
  12. system("cls");
  13. printf("\n\n");
  14. printf("*********************************************\n");
  15. printf("* *\n");
  16. printf("* 1.入库 2.出库 *\n");
  17. printf("* *\n");
  18. printf("* 3.查询 4.排序 *\n");
  19. printf("* *\n");
  20. printf("* 5.修改 6.统计 *\n");
  21. printf("* *\n");
  22. printf("* 7.退出 *\n");
  23. printf("* *\n");
  24. printf("*********************************************\n");
  25. printf("请选择功能序号:");
  26. scanf("%d",&sele);
  27. switch(sele)
  28. {
  29. case 1:Stock_in();Display();break;
  30. case 2:Stock_out();Display();break;
  31. case 3:Query();break;
  32. case 4:Sort();Display();break;
  33. case 5:Modify();Display();break;
  34. case 6:Statistics();break;
  35. case 7:exit(0);sele=0;break;
  36. }
  37. printf("\n\n按任意键继续...\n");
  38. getch();
  39. }
  40. Wr_file();
  41. }

4.2 各功能模块设计

4.2.1 数据读入模块

单独看各组数据信息,货品名称是字符串,可以采用字符型数组;其他数据均可用整数存放。数据信息存放在文件中,一条记录对应一种货品的信息,既符合习惯也方便信息管理。把一种货品的相关信息作为结构体成员,如果要存放若干种货品的信息就要用结构体数组。

  1. typedef struct
  2. {
  3. int num; //货品编号
  4. char name[20]; //货品名称
  5. int stock; //原始库存
  6. int in; //入库数目
  7. int out; //出库数目
  8. int amount; //最终库存
  9. int warning_value; //警戒值
  10. int state; //库存状态(是否低于警戒值)
  11. }goods;
  12. goods s[M]; //用于存放货品信息
  13. goods r[M]; //用于存放入库货品信息
  14. goods t[M]; //用于存放出库货品信息

s[M]、r[M]、t[M]的M为货品种类数,程序中采用宏定义的方式,可以随时在源程序宏定义中修改。本程序中宏定义为:#define M 50。

  1. void Re_file() //读入原始库存文件
  2. {
  3. FILE*fp;
  4. N=0;
  5. fp=fopen("goods.txt","r");
  6. while(fscanf(fp,"%d%s%d%d%d%d%d",&s[N].num,&s[N].name,&s[N].stock,&s[N].in,&s[N].out,&s[N].amount,&s[N].warning_value)!=EOF)
  7. N++;
  8. fclose(fp);
  9. P=N;
  10. }

4.2.2 入库模块

该模块的功能是根据题目要求读入货品的入库数据。注意在主函数中已经读入了原始数据。

  1. void Stock_in() //读入入库文件
  2. {
  3. FILE*fp;
  4. int i,j;
  5. N=0;
  6. fp=fopen("stockin.txt","r");
  7. while(fscanf(fp,"%d%d",&r[N].num,&r[N].in)!=EOF)
  8. N++;
  9. fclose(fp);
  10. for(i=0;i<P;i++)
  11. {
  12. for(j=0;j<N;j++)
  13. {
  14. if(r[i].num==s[j].num)
  15. s[j].in=r[j].in;
  16. }
  17. }
  18. for(i=0;i<P;i++)
  19. s[i].amount=s[i].stock+s[i].in;
  20. }

4.2.3 出库模块

该模块的功能是根据题目要求读入货品的出库数据。注意在主函数中已经读入了原始数据。

  1. void Stock_out() //读入出库文件
  2. {
  3. FILE*fp;
  4. int i,j;
  5. N=0;
  6. fp=fopen("stockout.txt","r");
  7. while(fscanf(fp,"%d%d",&t[N].num,&t[N].out)!=EOF)
  8. N++;
  9. fclose(fp);
  10. for(i=0;i<P;i++)
  11. {
  12. for(j=0;j<N;j++)
  13. {
  14. if(t[i].num==s[j].num)
  15. s[j].out=t[j].out;
  16. }
  17. }
  18. for(i=0;i<P;i++)
  19. s[i].amount=s[i].stock+s[i].in-s[i].out;
  20. }

4.2.4 浏览模块

该模块的功能是显示所有货品的记录信息。根据货品库存数目是否低于警戒值,分别按红字显示和白字显示。采用SetConsoleTextAttribute函数改变输出字体颜色。

  1. void Display() //显示库存情况
  2. {
  3. int i,j;
  4. system("cls");
  5. Estimate();
  6. printf("货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值\n");
  7. for(i=0,j=1;i<P;i++,j++)
  8. {
  9. if(s[i].state==1) //库存值小于警戒值红字显示
  10. {
  11. HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  12. SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);
  13. printf("%-9d %-10s%-10d%-10d%-10d%-10d%-10d\n", s[i].num, s[i].name, s[i].stock, s[i].in, s[i].out, s[i].amount, s[i].warning_value);
  14. if(j%10==0&&j!=P) //控制每次显示十行
  15. {
  16. printf("按任意键继续...");
  17. getch();
  18. puts("\n");
  19. SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED| FOREGROUND_GREEN | FOREGROUND_BLUE);
  20. printf("货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值\n");
  21. }
  22. }
  23. else if(s[i].state==0) //库存值不小于警戒值白字显示
  24. {
  25. HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  26. SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED| FOREGROUND_GREEN | FOREGROUND_BLUE);
  27. printf("%-9d %-10s%-10d%-10d%-10d%-10d%-10d\n", s[i].num, s[i].name, s[i].stock, s[i].in, s[i].out, s[i].amount, s[i].warning_value);
  28. if(j%10==0&&j<P)
  29. {
  30. HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  31. SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED| FOREGROUND_GREEN | FOREGROUND_BLUE);
  32. printf("按任意键继续...");
  33. getch();
  34. puts("\n");
  35. printf("货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值\n");
  36. }
  37. }
  38. }
  39. }

4.4.5 判断模块

该模块用于判断货品库存数目是否小于警戒值并记录,多次在其他被模块调用。

  1. // 判断库存值是否小于警戒值
  2. void Estimate()
  3. {
  4. int i;
  5. for(i=0;i<P;i++)
  6. {
  7. if(s[i].amount>=s[i].warning_value)
  8. s[i].state=0;
  9. else if(s[i].amount<s[i].warning_value)
  10. s[i].state=1;
  11. }
  12. }

4.4.6 查询模块

该模块的功能是根据输入的货品名称或货号查找对应的记录,找到以后,显示货品记录。同时,库存数目小于警戒值以红字显示。

  1. // 查询货品
  2. void Query()
  3. {
  4. int k,m,i,j=-1;
  5. char n[20];
  6. system("cls");
  7. printf("\n\n");
  8. printf("*********************************************\n");
  9. printf("* *\n");
  10. printf("* *\n");
  11. printf("* *\n");
  12. printf("* 1.货品编号 2.货品名称 *\n");
  13. printf("* *\n");
  14. printf("* *\n");
  15. printf("* *\n");
  16. printf("*********************************************\n");
  17. printf("\n\n请输入查询选项:");
  18. scanf("%d",&k);
  19. if(k==1)
  20. {
  21. printf("请输入货品编号:");
  22. scanf("%d",&m);
  23. for(i=0;i<P;i++)
  24. {
  25. if(m==i)
  26. j=m-1;
  27. }
  28. }
  29. else if(k=2)
  30. {
  31. printf("请输入货品名称:");
  32. scanf("%s",&n);
  33. for(i=0;i<P;i++)
  34. {
  35. if(strcmp(n,s[i].name)==0)
  36. j=i;
  37. }
  38. }
  39. Estimate();
  40. if(j==-1)
  41. {
  42. printf("\n没有找到!\n");
  43. Printf_back();
  44. }
  45. else
  46. {
  47. if(s[j].state==1)
  48. {
  49. HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  50. SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);
  51. printf("货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值\n");
  52. printf("%-9d %-10s%-10d%-10d%-10d%-10d%-10d\n",s[j].num,s[j].name, s[j].stock,s[j].in,s[j].out,s[j].amount,s[j].warning_value);
  53. SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED| FOREGROUND_GREEN | FOREGROUND_BLUE);
  54. Printf_back();
  55. }
  56. else
  57. {
  58. HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  59. SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY |
  60. FOREGROUND_RED| FOREGROUND_GREEN |
  61. FOREGROUND_BLUE);
  62. printf("货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值\n");
  63. printf("%-9d %-10s%-10d%-10d%-10d%-10d%-10d\n",s[j].num,s[j].name, s[j].stock, s[j].in, s[j].out,s[j].amount,s[j].warning_value);
  64. Printf_back();
  65. }
  66. }
  67. }

4.4.7 排序模块

该模块的功能是将货品记录按照最终库存升序排列。这里按照冒泡法排序。排序完成后显示货品记录,显示完成后返回主菜单

  1. // 商品库存总量从小到大排序
  2. void Sort()
  3. {
  4. int i,j;
  5. goods t;
  6. for(i=0;i<P-1;i++)
  7. for(j=i+1;j<P;j++)
  8. {
  9. if(s[i].amount>s[j].amount)
  10. {
  11. t=s[i];
  12. s[i]=s[j];
  13. s[j]=t;
  14. }
  15. }
  16. Display();
  17. Printf_back();
  18. }

4.4.8 修改模块

该模块的功能是根据货品编号或货品名称找到要修改的记录,并提示用户修改该记录的哪部分信息(原始库存、入库数目、出库数目、警戒值),然后根据用户的选择修改相应的位置。最后显示货品信息供用户确认。

  1. // 修改货品信息
  2. void Modify()
  3. {
  4. int k,m,i,j=-1,t,h;
  5. char n[20];
  6. system("cls");
  7. printf("\n\n");
  8. printf("*********************************************\n");
  9. printf("* *\n");
  10. printf("* *\n");
  11. printf("* *\n");
  12. printf("* 1.货品编号 2.货品名称 *\n");
  13. printf("* *\n");
  14. printf("* *\n");
  15. printf("* *\n");
  16. printf("*********************************************\n");
  17. printf("\n\n请输入修改选项:");
  18. scanf("%d",&k);
  19. if(k==1)
  20. {
  21. printf("请输入货品编号:");
  22. scanf("%d",&m);
  23. for(i=0;i<P;i++)
  24. {
  25. if(m==i)
  26. j=m-1;
  27. }
  28. }
  29. else if(k==2)
  30. {
  31. printf("请输入货品名称:");
  32. scanf("%s",&n);
  33. for(i=0;i<P;i++)
  34. {
  35. if(strcmp(n,s[i].name)==0)
  36. j=i;
  37. }
  38. }
  39. if(j==-1)
  40. {
  41. printf("\n没有找到!\n");
  42. Printf_back();
  43. }
  44. else
  45. {
  46. printf("\n\n");
  47. printf("*********************************************\n");
  48. printf("* *\n");
  49. printf("* 1.原始库存 2.入库数目 *\n");
  50. printf("* *\n");
  51. printf("* 3.出库数目 4.警戒值 *\n");
  52. printf("* *\n");
  53. printf("*********************************************\n");
  54. printf("请选择修改选项:");
  55. scanf("%d",&t);
  56. if(t==1)
  57. {
  58. scanf("%d",&h);
  59. s[j].stock=h;
  60. }
  61. else if(t==2)
  62. {
  63. scanf("%d",&h);
  64. s[j].in=h;
  65. }
  66. else if(t==3)
  67. {
  68. scanf("%d",&h);
  69. s[j].out=h;
  70. }
  71. else if(t==4)
  72. {
  73. scanf("%d",&h);
  74. s[j].warning_value=h;
  75. }
  76. s[j].amount=s[j].stock+s[j].in-s[j].out;
  77. }
  78. printf("请确认核对货品信息:\n");
  79. Display();
  80. }

4.4.9 统计模块

该模块的功能是根据用户的选择统计货品总数或最终库存低于警戒值的货品种数。统计结束后将所有货品信息以文件形式输出。

  1. // 统计数目
  2. void Statistics()
  3. {
  4. int k,i,j,m=0,n=0;
  5. system("cls");
  6. printf("\n\n");
  7. printf("*********************************************\n");
  8. printf("* *\n");
  9. printf("* *\n");
  10. printf("* *\n");
  11. printf("* 1.库存总数 2.库存状态 *\n");
  12. printf("* *\n");
  13. printf("* *\n");
  14. printf("* *\n");
  15. printf("*********************************************\n");
  16. printf("\n\n请输入查询选项:");
  17. scanf("%d",&k);
  18. if(k==1)
  19. {
  20. for(i=0;i<P;i++)
  21. m=m+s[i].amount;
  22. printf("库存总数为:%d",m);
  23. }
  24. else if(k==2)
  25. {
  26. Estimate();
  27. for(j=0;j<P;j++)
  28. if(s[j].state==1)
  29. n=n+1;
  30. printf("低于库存警戒值的商品种数为:%d",n);
  31. }
  32. Wr_file();
  33. }

4.4.10 数据输出模块

该模块的功能是将货品信息写入文件。

  1. // 写输出文件
  2. int Wr_file()
  3. {
  4. FILE*fp;
  5. int i;
  6. fp=fopen("amount.txt","w");
  7. for(i=0;i<P;i++)
  8. fprintf(fp,"%-9d %-10s%-10d%-10d%-10d%-10d%-10d\n",s[i].num,s[i].name, s[i].stock,s[i].in,s[i].out,s[i].amount,s[i].warning_value);
  9. fclose(fp);
  10. return 1;
  11. }

5 上机操作

5.1 数据源

该程序的运行需要四个文件,三个用于读取货品信息,一个用于存储货品
息。goods.txt文件的格式如下:

  1. 货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值
  2. 1 A1 456 0 0 456 400
  3. 2 A2 23 0 0 23 100
  4. 3 A3 67 0 0 67 100
  5. 4 A4 104 0 0 104 100
  6. 5 A5 78 0 0 78 100

用于读取货品编号、货品名称、原始库存、警戒值等货品信息。

stockin.txt文件的格式如下:

  1. 货品编号 入库数目
  2. 1 57
  3. 3 78
  4. 4 80
  5. 5 23
  6. 6 10

用于读取入库信息。

stockout.txt文件的格式如下:

  1. 货品信息 出库数目
  2. 1 10
  3. 2 5
  4. 3 23
  5. 4 12
  6. 5 3

用于读取出库信息。

amount.txt文件用于存储货品信息。

5.2 编译、链接和运行

5.3 结果

主函数界面

入库模块

出库模块

查询模块

排序模块

修改模块

统计模块

6 总结

通过这次课程设计,我进一步理解和运用了结构化程序设计的思想方法,初步掌握了开发小型实用系统的基本方法,学会了调试较长的程序,能够利用流程图描述算法,进一步掌握和提高利用C语言进行程序设计的能力。

在程序的编写中,我们首先要构架好整体结构,然后再将各个模块的函数写出来。在写函数的过程中,我们要选择性地利用到所学的知识,如排序法、while循环、if语句等,实现相应的功能。一个较大的程序主要调试方法有分模块调试和分步调试。文件的数据格式很重要,要与程序读取的数据类型保持一致。程序调试通了以后,在修改其中的细节问题。

学习好C语言这门课,能为我们以后开发出更多实用的程序打下坚实的基础。要学好C语言这门课,我们平时就要勤于实践,锻炼自己的逻辑思维能力与整体构架能力。

上传的附件 cloud_download 仓库管理系统.7z ( 1.20mb, 1205次下载 )
error_outline 下载需要5点积分

keyboard_arrow_left上一篇 : 基于JAVA和MYSQL数据库实现的小型公司工资管理系统 基于JSP和MYSQL数据库实现的宾馆酒店信息管理系统 : 下一篇keyboard_arrow_right



nouveau
2018-11-05 10:25:01
使用C语言实现的仓库管理系统
nouveau
2019-01-02 09:31:55
附件给的就是完整源码啊
zz
2020-06-07 10:36:41
为什么我编译和连接都没问题,就是不能运行啊?

发送私信

花花世界,终归空寂

9
文章数
17
评论数
最近文章
eject