【功能】:建立一商店存货管理系统,要求每次出货时取进货时间最早且最接近保质期中止时间的货物。
分步实施:
1. 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;
2. 完成最低要求:建立一个文件,包括5个种类的货物情况,能对商品信息进行扩充(追加),修改和删除以及简单的排序;
3. 进一步要求:扩充商品数量,以及完成系统查询功能。有兴趣的同学可以自己扩充系统功能。
要求:1)界面友好,函数功能要划分好
2)总体设计应画一流程图
3)程序要加必要的注释
4)要提供程序测试方案
5)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
- #define MAXSIZE 1024
- typedef struct
- {
- char name[30]; //商品名称
- char bianhao[20]; //商品编号
- int num; //商品数量
- int importdate; //进货日期
- int producedate; //生产日期
- int deaddate; //保质期
- }datatype;
- typedef struct
- {
- datatype data[MAXSIZE];
- int last;
- }SeqList;
- SeqList *L;
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- void index();
- void menu();
- SeqList *init_SeqList();
- int Insert_SeqList(SeqList *L,int i,datatype x);
- int Delete_SeqList(SeqList *L,datatype x,int i);
- int Location_SeqList(SeqList *L,datatype x);
- void ruku(SeqList *L,datatype x);
- void print(SeqList *L); //打印商品信息
- void savefile(SeqList *L);
- void readfile(SeqList *L);
- void sort(SeqList *L);
- void main()
- {
- SeqList *L;
- datatype x;
- index();
- L=init_SeqList(); //顺序表的起始地址
- int sel,flag=1;
- while(flag)
- {
- system("color 48");
- system("cls");
- menu();
- scanf("%d",&sel);
- switch(sel)
- {
- case 1:
- printf("名称 编号 数目 生产日期 进货日期 保质期\n");
- scanf("%s %s %d %d %d %d",x.name,x.bianhao,&x.num,&x.producedate,&x.importdate,&x.deaddate);
- ruku(L,x);
- system("pause");
- break;
- case 2:
- int p,q,n;
- printf("请输入商品名称 出仓数目\n");
- scanf("%s %d",x.name,&n);
- p=Location_SeqList(L,x);
- if(x.num<n)
- printf("库存不足");
- else
- q=Delete_SeqList(L,x,p);
- if(q==1)
- printf("出库成功!\n\n");
- system("pause");
- break;
- case 3:
- int j;
- printf("请输入名称:\n");
- scanf("%s",x.name);
- j=Location_SeqList(L,x);
- if(j!=-1)
- {
- printf("名称:%s 编号:%s 数目: %d 生产日期: %d 进货日期: %d 保质期: %d",L->data[j].name,L->data[j].bianhao,L->data[j].num,L->data[j].producedate,
- L->data[j].importdate,L->data[j].deaddate);
- }
- else
- printf("没有该商品信息!");
- system("pause");
- break;
- case 4:
- print(L);
- system("pause");
- break;
- case 5:
- int k,i;
- printf("请输入要插入的名称 编号 位置 生产日期 进货日期 保质期\n");
- scanf("%s %s %d %d %d %d",x.name,x.bianhao,&i,&x.producedate,&x.importdate,&x.deaddate);
- k=Insert_SeqList(L,i,x);
- if(k==1)
- printf("插入成功!\n");
- system("pause");
- break;
- case 6:
- printf("按进货时间先后进行排序!\n");
- sort(L);
- print(L);
- system("pause");
- break;
- case 7:
- printf("保存到文件中...");
- savefile(L);
- system("pause");
- break;
- case 8:
- printf("从文件中读取数据信息...");
- readfile(L);
- system("pause");
- break;
- case 0:
- flag=0;
- }
-
- }
- }
- void index()
- {
- system("color 20");
- char input;
- printf("\n\n\n");
- printf("\n\t\t\t******************************\n\n");
- printf("\n\t\t\t*欢迎进入商店库存信息管理系统*\n\n");
- printf("\n\t\t\t******************************\n\n\n");
- printf("请按任意键进入主菜单...");
- input=getchar();
- }
- void menu()
- {
- printf("\t\t\t***********主菜单*************\n");
- printf("\t\t\t 1.商品信息入库 \n");
- printf("\t\t\t 2.商品出库 \n");
- printf("\t\t\t 3.一种商品信息查询 \n");
- printf("\t\t\t 4.全部商品信息浏览 \n");
- printf("\t\t\t 5.商品信息插入 \n");
- printf("\t\t\t 6.按商品进货时间排序 \n");
- printf("\t\t\t 7.保存数据到文件 \n");
- printf("\t\t\t 8.从文件中读取数据 \n");
- printf("\t\t\t 0.退出系统 \n");
- printf("\t\t\t*************End**************\n");
- printf("请进行操作选择:");
- }
- //顺序表的初始化
- SeqList *init_SeqList()
- {
- SeqList *L;
- L=(SeqList *)malloc(sizeof(SeqList));
- L->last=-1;
- return L;
- }
- //顺序表中的插入
- /*算法思想
- 1)将ai~an顺序向后移动,为新元素让出位置
- 2)将x置入空出的第i个位置
- 3)修改last指针(相当于修改表长),使之仍指向最后一个元素
- */
- int Insert_SeqList(SeqList *L,int i,datatype x)
- {
- int j;
- if(L->last==MAXSIZE-1) /*表空间已满,不能插入*/
- {
- printf("表满");
- return(-1);
- }
- if(i<0||i>L->last+1) /*检查插入位置的正确性*/
- {
- printf("位置错");
- return(0);
- }
- for(L->last;j>=i;j--)
- L->data[j+1]=L->data[j]; /*结点移动*/
- L->data[i]=x; /*新元素插入*/
- L->last++; /*last仍指向最后元素*/
- return 1; /*插入成功,返回*/
- }
- int Delete_SeqList(SeqList *L,datatype x,int i)
- {
- int j;
- if(i<0||i>L->last)
- {
- printf("不存在第i个元素");
- return 0;
- }
- for(j=i+1;j<=L->last;j++)
- L->data[j-1]=L->data[j]; //向上移动
- L->last--; //删除成功
- return 1;
- }
- //顺序表中的按值查找
- int Location_SeqList(SeqList *L,datatype x)
- {
- int i=0;
- while(i<=L->last&&strcmp(L->data[i].name,x.name)!=0)
- i++;
- if(i>L->last)
- return -1;
- else
- return i;
- }
- void ruku(SeqList *L,datatype x)
- {
- int i,k;
- i=Location_SeqList(L,x);
- printf("i=%d\n\n",i);
- if(i!=-1)
- {
- L->data[i].num+=x.num; //增加商品数量
- printf("商品信息已经入库!");
- }
- else{
- int i=0;
- while(strcmp(L->data[i].bianhao,x.bianhao)!=0&&i<=L->last)
- i++;
- k=Insert_SeqList(L,i,x);
- if(k==1)
- printf("商品信息已经入库!");
- }
- }
- void print(SeqList *L)
- {
- int i;
- for(i=0;i<L->last;i++)
- {
- printf("名称:%s 编号:%s 数目: %d 生产日期: %d 进货日期: %d 保质期: %d\n",L->data[i].name,L->data[i].bianhao,L->data[i].num,L->data[i].producedate,
- L->data[i].importdate,L->data[i].deaddate);
- }
- }
- void savefile(SeqList *L) //将所有数据保存到文件
- {
- int i;
- FILE *fp;
- if((fp=fopen("F:\\product.txt","w"))==NULL) //rt+ 读写打开一个文本文件,允许读和写。
- {
- printf("Cannot open the file!\n");
- system("pause");
- return;
- }
- while(i<=L->last)
- {
- fprintf(fp,"%-5s, %d %d %d",L->data[i].name,L->data[i].importdate,L->data[i].producedate,L->data[i].deaddate);
- i++;
- }
- fclose(fp);
- printf("\t\t\t保存成功!\n");
- }
- void readfile(SeqList *L) //打开文件
- {
- FILE *fp;
- L->last=0;
- if((fp=fopen("F:\\product.txt","r+"))==NULL) // r+ 打开可读写的文件,该文件必须存在。
- {
- printf("\t\t\tCannot open the file\n");
- system("pause");
- return;
- }
- while(!feof(fp))
- {
- L->last++;
- fscanf(fp,"%s%s%d%d",L->data[L->last].name,&L->data[L->last].producedate,&L->data[L->last].producedate,L->data[L->last].deaddate);
- }
- L->last--;
- fclose(fp);
- printf("\t\t\t读取文件成功!\n");
- }
- void sort(SeqList *L) //冒泡排序数据
- {
- int i,j;
- int swap;
- for(i=0;i<L->last;i++)
- {
- swap=0;
- for(j=1;j<L->last-i;i++)
- {
- L->data[0]=L->data[j+1];
- L->data[j+1]=L->data[j];
- L->data[j]=L->data[0];
- swap=1; /*置交换标志*/
- }
- if(swap==0)
- break;
- }
- printf("排序结束!\n");
- }
文件保存有点问题,待完善。。。
阅读(1833) | 评论(0) | 转发(0) |