物资管理系统程序设计
本程序在VC++ 6.0上运行无误!!!
一、题目要求:
主程序中,应提供文字交互菜单界面。要求包含以下几个功能模块:
(1).信息输入模块input():建立物资管理数据总文件,完成对物资原库存信息的录入,并将其存放在指定的文件(product.txt)。
(2).信息查找模块search():采用如下方式进行查找,若找到,则输出该物资的相关信息;否则,输出提示信息,如“NO FOUND!!!”。
1).按产品信息查询;
2).按进货信息查询并统计(统计某年某月进的某种产品数量,产品种类); 3).按产品名称和规模查询并统计;
(3).新物资入库模块:在原文件插入新物资信息。
(4).领料模块:查找所领取物资信息,若满足领料的要求,请登记领取物资名称,领料的日期,所领数量(领料后对库存修改)。
(5).打印功能模块:
1).打印领料单;
2).打印物资库存清单。
二、需求分析
(1)、库存和领料信息以文本文件的方式存放在两个文件里,提供相应的输入输出操作。 (2)、提供库存几种方式的查找。 (3)、提供库存的建立、插入。 (4)、能查找满足领货要求的信息,并修改库存、领货文本文件。
三、总体设计
根据要求可以将系统设计为七大模块。
物 资 管 理 系 统 输入 查找 插入 领料 打印 退出 四、详细设计
1、主函数
主函数只调用主菜单函数。
2、主菜单函数
[程序]
//********主函数********
void menu() { int n,w=0; printf(\ printf(\ printf(\ 显示各个模块的入口供用户选择 printf(\ scanf(\ do { 输入n if(n>6||n<1) { Y printf(\ }
scanf(\ 判断n是否属于1-6 } else w=1;
}while(w!=1); Y switch(n)
{ 根据n的值调用各个功能模块函数 case 1:input();break; 输入
case 2:search_menu();break; 查找菜单 流程图 case 3:insert();break; 插入 case 4:lend();break; 领货
case 5:print_menu();break; 打印菜单 case 6:exit(0); 退出 }
3、输入模块
[数据结构]
所输入的数据在磁盘上以文本文件的形式保存,名字为product.txt! 在程序中以链表的形式储存!结构体如下: struct date /*日期结构体*/ {
int year; int month; int day; };
struct product /*库存货物结构体*/ {
char p_name[20]; /*货物名称*/ long int p_num; /*物资编号 char size[4]; /*物资规格*/ struct date in_date; /*进货日期*/ long int max_s; /*最大库存量*/ long int min_s; /*最小库存量*/ long int real_s; /*实际库存量*/ struct product *next;/*节点指针*/ };
/*输入函数*/
[分析]:以只写的方式打开文件"product.txt",在do—while循环中输入各种货物的信息。以输入flag植的方式判断是否结束循环。结束循环后调用主菜单函数!
[程序代码] 流程图
void input()
{ 定义文件指针fp、库存结构体p及标记循环flag void menu(); int flag; struct product p;
FILE *fp; 打开文件 if((fp=fopen(\ 打开库存文件 printf(\ 输入货物信息,写入文件 do Y
{ 继续输入 printf(\ printf(\ N 关闭文件 scanf(\
&p.p_num ,p.size,&p.in_date.year,&p.in_date.month,&p.in_date.day,&p.max_s,&p.min_s,&p.real_s);
fprintf(fp,\
y,p.max_s,p.min_s,p.real_s); 写入库存文件 printf(\
判断是否继续输入
scanf(\ }while(flag==1); fclose(fp); }
menu(); 回主菜单
4.插入模块
[需求分析]
该模块的功能是仓库管理员追加新的货物信息,从键盘逐条输入,并逐条写入指定文本文件。文件打开方式为“a+”。
[流程图]
以a+方式打开文件
按指定格式输入一条记录
写入文件 回到主菜单 [程序代码]
/*插入*/ void insert() {
void menu(); struct product p; FILE *fp; if((fp=fopen(\ printf(\ printf(\ printf(\ scanf(\date.day,&p.max_s,&p.min_s,&p.real_s);
fprintf(fp,\e.day,p.max_s,p.min_s,p.real_s);
menu(); }
5、查询模块
[需求分析]
在本模块,提供三种方式查询,分别是按名称查询,按日期查询,按规格查询!首先在菜单函数中提供三种查询方式的入口。
首先在菜单函数中调用建立库存链表函数,将文件中的信息存入链表,以方便查询!在各个查询函数中,利用链表查询,并统计满足要求的记录条数!
5-1 查找菜单
在查找菜单中,提供几种查找方式的入口。 [流程图]
建立库存链表
提示并输入选择
N
满足条件
Y
进入各查询函数
/*货物库存列表建立*/ struct product* build_list() { int i;
struct product *head,*p,*p1,*p2; FILE *fp;
if((head=(struct product*)malloc(sizeof(struct product)))==NULL) printf(\p=head; p1=head;
if((fp=fopen(\ 只读方式打开文件 { printf(\}
for(i=0;!feof(fp);i++) 读取数据并存入链表 {
fscanf(fp,\h,&p->in_date.day,&p->max_s,&p->min_s,&p->real_s);
p->next=NULL; p1->next=p; p1=p; p2=(struct product*)malloc(sizeof(struct product)); p=p2; } }
fclose(fp); 关闭文件
return(head); 返回头节点指针
[程序代码]
void search_menu() 查找菜单 { void menu(); int n,w; struct product *head; head=build_list(); printf(\ printf(\ printf(\ printf(\ scanf(\ 输入选择 do { if(n>4||n<1) { printf(\ scanf(\