资源描述
C语言程序设计汇报
——物资管理系统
实习组员:
姓 名
学 号
贡献率(%)
e-mail
组长
吴 江
34%
组员
韩艺超
33%
黄杨洋
33%
专 业: 网络工程
班 级: 网092班
指导老师: 程 泽 凯
/12/12
课 题: 物资管理系统
问题描述:
建立物资管理信息系统,包含仓库内物资信息、入库信息、车库信息等,物资信息为物资编号、物资名称、规格类型、类别、计量单位等;入库信息为物资编号、物资名称、规格型号、类别、计量单位、数理、单价、金额、入库时间、经办人、保管人等;出库信息为物资编号、物资名称、规格型号、类别、计量单位、数理、单价、金额、领用时间、经办人、领用人等;物资余额信息为物资编号、物资名称、规格类型、类别、计量单位、数量、金额等。
功效要求:
(1)多种物资管理信息需要利用文件形式进行存放。
(2)输入功效:能够从键盘或文件中一次性输入多条信息;
(3)输出功效:可将入库、出库等信息打印输出或显示;
(4)查找功效:依据物资信息、或经办人、保管人等查找出所需信息;
(5)增加、删除、修改功效:完成物资信息多个更新;
(6)统计功效:完成入库、出库、库存等信息统计功效。
总体设计:
依据上面分析及题目要求能够分为以下六个模块(系统模块以下图1。)
物资管理系统
产品信息录入
产品信息查询
产品信息修改
产品信息统计
退出系统
产品信息输出
程序实现:
(一)主函数通常设计简练,用switch结构实现对各功效函数调用,其中包含input()、load()、output()、search()、count()、save()、quit()。(全部函数中用链表实现数据传输)
(二)各功效函数实现:
Input():
关键是为了输入商品编号,名称,数量,型号,单价,日期,实库存量,保管人,经办人等。以上物资信息均存放在以全局变量first为头指针链表中,每输入一组信息生成一个节点,并在函数结尾用if判定是否继续录入,若需要则调用input()函数本身,若不需要则退出。
请输入第 1th中商品信息 :
number: 1234567
name: apple
storekeeper: zhangsan
quantity: kg
price: 3/kg
… …
input()
{ char flag='N';
addr_product *last=NULL;
addr_product *new_addr=(addr_product*)malloc(sizeof(addr_product));
printf("\n****************************************************************\n");
printf(" input ");
printf("\n****************************************************************\n");
memset(new_addr,0,sizeof(addr_product));
new_addr->next=NULL;
if(first==NULL)
{
first=new_addr;
}
else
{
last=get_last(first);
last->next=new_addr;
}
scanf_product(&(new_addr->pro));
getchar();
printf("\n>continue?(Y/N)");
flag=getchar();
if(flag=='Y'||flag=='y')
{
input();
}
printf("\n*************************************************************\n\n");
}
Show():
显示全部入库物资信息,经过遍历链表每一个节点实现。
show()
{
addr_product *p=first;
printf("\n*****************************************************************\n\n");
printf(" show ");
printf("\n******************************************************************\n");
if(p==NULL)
{
printf("none product");
}
else
{
while(p!=NULL)
{
print_product(&(p->pro));
p=p->next;
}
}
getchar();
getchar();
printf("\n***********************************************************\n\n");
}
Search():
查询函数,可依据物资编号,名称,保管人等信息进行查询,遍历链表,将输入信息和链表节点中信息进行比对,若找到则将查询结果用printf_product()函数输出。
search()
{ int n,flag;
printf("\n****************************************************************\n\n");
printf(" search ");
printf("\n******************************************************************\n");
do
{
puts("\n\t\t****************search menu***************\n\n");
puts("\t\t\t1.search-by-name");
puts("\t\t\t2.search-by-number");
puts("\t\t\t3.search-by-storekeeper");
puts("\t\t\t4.back");
puts("\n\n\t\t***************************************\n");
printf("function choose [1-4]:[ ]\b\b");
scanf("%d",&n);
if(n<1||n>4)
{
flag=1;
getchar();
}
else flag=0;
}while(flag==1);
switch(n)
{
case 1:search_by_name();break;
case 2:search_by_number();break;
case 3:search_by_storekeeper();break;
case 4:getch();
}
printf("\n*************************************************************\n\n");
}
Search()函数提供三种查询方法:编号、名称、保管人
search_by_name()
{
int count=0;
char input='N';
char name[MAX_name]={0};
addr_product *p=first;
printf("\n\n search_by_name \n\n");
printf("\nplease enter the name you want search:");
scanf("%s",name);
while(p!=NULL)
{ if(strcmp(p->pro.name,name)==0)
{
print_product(&(p->pro));
count++;
}
p=p->next;
}
if(count==0)
{
printf("\ncan not find %s.\n",name);
}
printf("\n>continue?(Y/N)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
search();
}
}
search_by_number()
{
int count=0;
char input='N';
char number[MAX_name]={0};
addr_product *p=first;
printf("\n\n search_by_number \n\n");
printf("please enter the number you want search:");
scanf("%s",number);
while(p!=NULL)
{ if(strcmp(p->pro.number,number)==0)
{
print_product(&(p->pro));
count++;
}
p=p->next;
}
if(count==0)
{
printf("can not find %s.\n",number);
}
printf("\n>continue?(Y/N)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
search();
}
}
search_by_storekeeper()
{
int count=0;
char input='N';
char storekeeper[MAX_name]={0};
addr_product *p=first;
printf("\n\n search_by_storekeeper \n\n");
printf("please enter the storekeeper you want search:");
scanf("%s",storekeeper);
while(p!=NULL)
{ if(strcmp(p->pro.storekeeper,storekeeper)==0)
{
print_product(&(p->pro));
count++;
}
p=p->next;
}
if(count==0)
{
printf("can not find %s.\n",storekeeper);
}
printf("\n>continue?(Y/N)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
search();
}
}
Output ( ):
和物资出库相关函数,首先输入出库物资名称及数量,然后在链表中找到对应物资,将其数量减去出库数量。
output()
{
char name[MAX_name]={0};
char input='N';
int quantity;
int count=0;
addr_product *p=first;
printf("\n*****************************************************************\n");
printf(" output ");
printf("\n*****************************************************************\n");
printf("please enter information of output product!\n");
printf("name:");
scanf("%s",name);
printf("\nquantity:");
scanf("%d",&quantity);
while(p!=NULL)
{ if(strcmp(p->pro.name,name)==0)
{
p->pro.quantity-=quantity;
count++;
}
p=p->next;
}
if(count==0)
{
printf("can not find %s.\n",name);
}
printf("\n>continue?(Y/N)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
output();
}
printf("\n***********************************************************\n\n");
}
Count ():
统计函数,统计库存物资信息并显示。将原链表中名称相同物资合并(即数量相加),然后赋值在以first_cp为头指针新链表中。完成后先调用show()函数显示结果,然后调用save()函数保留到文件中。
count()
{
int count=0;
addr_product *cp=NULL;
addr_product *first_cp=NULL,*last_cp=NULL;
addr_product *p=first;
addr_product *new_addr=(addr_product*)malloc(sizeof(addr_product));
memset(new_addr,0,sizeof(addr_product));
printf("\n****************************************************************\n");
printf(" count ");
printf("\n****************************************************************\n");
first_cp=new_addr;
first_cp->next=NULL;
if(cp==NULL)
{
cp=new_addr;
cp->pro=p->pro;
cp->next=NULL;
}
p=p->next;
do{
count=0;
do{
cp=first_cp;
if(strcmp(p->pro.name,cp->pro.name)==0)
{
cp->pro.quantity+=p->pro.quantity;
count=1;
cp=cp->next;
break;
}
else
{
cp=cp->next;
}
}while(cp!=NULL);
if(count==0)
{ last_cp=get_last(first_cp);
last_cp=(addr_product*)malloc(sizeof(addr_product));
memset(last_cp,0,sizeof(addr_product));
cp=last_cp;
cp->pro=p->pro;
cp->next=NULL;
}
p=p->next;
}while(p!=NULL);
p=first_cp;
printf("resault!\n");
while(p!=NULL)
{
print_product(&(p->pro));
p=p->next;
}
save(first_cp);
getchar();
getchar();
printf("\n***********************************************************\n\n");
}
Save ():
保留函数,用文件存放物资信息。
save(addr_product *from)
{
FILE *fp;
char file[100];
addr_product *p=from;
printf("\n*****************************************************************\n");
printf(" save ");
printf("\n*****************************************************************\n");
printf("please enter name of file!:");
scanf("%s",file);
fp=fopen(file,"w");
while(p!=NULL)
{
fprintf(fp,"number:%s\nname:%s\nstorekeeper:%s\nquantity:%d\nprice:%d\n",
p->pro.number,p->pro.name, p->pro.storekeeper, p->pro.quantity,p->pro.price);
p=p->next;
}
fclose(fp);
printf("\n\nsuccessful save.\nany key return to menu\n");
getchar();
getchar();
printf("\n*************************************************************\n\n");
}
辅助函数:
Scanf_product()
键入产品信息,将键入信息赋值到指针微p节点中。;
scanf_product(product* p)
{
printf("Please enter the massage of product!\n");
printf("Please enter number(longest permition %d):\n",MAX_name-1);
scanf("%s",p->number);
printf("Please enter name(longest permition %d):\n",MAX_name-1);
scanf("%s",p->name);
printf("Please enter storekeeper(longest permition %d):\n",MAX_name-1);
scanf("%s",p->storekeeper);
printf("Please enter quantity(longest permition %d):\n",MAX_name-1);
scanf("%d",&(p->quantity));
printf("Please enter price(longest permition %d):\n",MAX_name-1);
scanf("%d",&(p->price));
}
pintf_product()
输出产品信息;
print_product(product* p)
{
printf("\n\n************************************************************\n");
printf("\nnumber:%s",p->number);
printf("\nname:%s",p->name);
printf("\nstorekeeper:%s",p->storekeeper);
printf("\nquantity:%d",p->quantity);
printf("\nprice:%d\n",p->price);
printf("\n************************************************************\n\n");
}
get_last()
得到链表最终一个结点指针;
addr_product* get_last( addr_product* from)
{
addr_product* p=from;
while(p->next!=NULL)
{
p=p->next;
}
return p;
}
程序及运行结果截图:
#include<stdio.h>
#include<stdlib.h>
#define MAX_name 15
#define MAX_number 15
typedef struct _product
{ char number[MAX_number];
char name[MAX_name];
char storekeeper[MAX_name];
int quantity;
int price;
}product;
typedef struct _addr_product
{ product pro;
struct _addr_product *next;
}addr_product;
char menu[]=
"+=======================================================================+\n"
"| Material management system |\n"
"+-----------------------------------------------------------------------------------------------------------------------+\n"
"| 1 input |\n"
"| 2 load |\n"
"| 3 show |\n"
"| 4 search |\n"
"| 5 output |\n"
"| 6 count |\n"
"| 7 save |\n"
"| 8 exit |\n"
"+=======================================================================+\n" ;
addr_product *first=NULL;
addr_product* get_last( addr_product* from)
{
addr_product* p=from;
while(p->next!=NULL)
{
p=p->next;
}
return p;
}
scanf_product(product* p)
{
printf("Please enter the massage of product!\n");
printf("Please enter number(longest permition %d):\n",MAX_name-1);
scanf("%s",p->number);
printf("Please enter name(longest permition %d):\n",MAX_name-1);
scanf("%s",p->name);
printf("Please enter storekeeper(longest permition %d):\n",MAX_name-1);
scanf("%s",p->storekeeper);
printf("Please enter quantity(longest permition %d):\n",MAX_name-1);
scanf("%d",&(p->quantity));
printf("Please enter price(longest permition %d):\n",MAX_name-1);
scanf("%d",&(p->price));
}
print_product(product* p)
{
printf("\n\n************************************************************\n");
printf("\nnumber:%s",p->number);
printf("\nname:%s",p->name);
printf("\nstorekeeper:%s",p->storekeeper);
printf("\nquantity:%d",p->quantity);
printf("\nprice:%d\n",p->price);
printf("\n************************************************************\n\n");
}
input()
{ char flag='N';
addr_product *last=NULL;
addr_product *new_addr=(addr_product*)malloc(sizeof(addr_product));
printf("\n*****************************************************************\n");
printf(" input ");
printf("\n*****************************************************************\n");
memset(new_addr,0,sizeof(addr_product));
new_addr->next=NULL;
if(first==NULL)
{
first=new_addr;
}
else
{
last=get_last(first);
last->next=new_addr;
}
scanf_product(&(new_addr->pro));
getchar();
printf("\n>continue?(Y/N)");
flag=getchar();
if(flag=='Y'||flag=='y')
{
input();
}
printf("\n***********************************************************\n\n");
}
load()
{ addr_product *p=NULL;
addr_product *last=NULL;
FILE *fp=NULL;
FILE *PRODUCT_FILE=NULL;
int count=0;
p=(addr_product*)malloc(sizeof(addr_product));
memset(p,0,sizeof(addr_product));
p->next=NULL;
fp=fopen(PRODUCT_FILE,"rb");
while(fread(&(p->next),sizeof(addr_product),1,fp)==1)
{ if(first==NULL)
{
first=p;
}
else
{
last=get_last(p);
last->next=p;
}
count++;
fseek(fp,count*sizeof(addr_product),0);
p=(addr_product*)malloc(sizeof(addr_product));
memset(p,0,sizeof(
展开阅读全文