利用C語言簡單的實現庫存管理系統(本地檔案生成形式儲存)
問題描述:
庫存管理系統是廠家、商城、商場等的管理商品資訊不可缺少的部分,利用這個系統,可以更好地管理商品的資訊。
本系統的功能:
-
新增、修改、刪除庫存商品資訊,商品資訊包括:編號、名稱、類別、數量、產地等;
-
進貨或售出商品後,相應的庫存商品數量應該有所改變;
-
當某種商品庫存少於一定數量時,應該提醒進貨;
-
可以按商品名稱模糊查詢商品資訊
關鍵詞:庫存;商品資訊;數量變化;
(如果只是單純需要完整程式碼程式請直接看文章結尾附錄)
基礎設計:
1.資料結構設計
struct repertory { char id[10], 定義編號 name[10], 定義商品名稱 list[10], 定義商品類別 production[10]; 定義商品產地 int num; 定義商品數量 } per[N];
2.選單設計
1. 一級選單:即主選單。其中包括:1.新建;2.查詢;3.修刪;4.售出或進貨;5.退出。
2.二級選單
a:新建選單:包括:1、新建資訊庫;2、新增商品;3、返回。
b:查詢選單:包括:1、檢視資訊庫;2、查詢商品號;3、返回。
c:修刪選單:包括:1、修改商品資訊;2、刪除商品資訊;3返回。
d:售出或進貨選單:包括1、售出;2、進貨;3、返回。
3.函式設計
void menu(); 主選單 void add_menu(); 新建選單 void seek_menu(); 查詢選單 void change_menu(); 修刪選單 void add(); 新建資訊庫 void print(); 輸出商品資訊 void seek(); 查詢商品資訊 void del(); 刪除商品資訊 void charu(); 新增商品資訊 void change(); 修改商品資訊 void jinchu(); 售出或進貨 void load(): 讀取資訊 void save(); 儲存資訊
詳細設計
(1)新增商品模組
先建立商品資訊,定義整型變數i和n以及m,並且在本地檔案當中讀取出當前檔案裡所存在的結構體資料個數及m=load(),利用for迴圈在原有m數量上增加i個商品數量,完後進行一次儲存。隨後進行輸出當前資料庫的全部商品資訊。返回主函式選單。
(2)刪除商品模組
定義整型變數i,輸入商品號i,判斷是否有此商品strcmp(per[i].id,num)==0,如果有,for(k=i;k<m-1;k++){per[k]=per[k+1];} m--;save(m);在匹配與輸入相同的商品,使結構體變數當中的資料進行往前移並讓總商品數量m減少1,則刪除成功回到主函式。
(3)修改商品模組
定義字元型變數na、整型變數na1,如果讀取出來的m值為0則資訊庫為空,否則輸入要修改的商品,通過strcmp(per[i].id,c)==0判斷商品存在,否則進入後不修改,按‘-’返回,否則繼續輸入商品資訊然後可按‘-’號結束,返回目錄。
(4)商品查詢管理模組
建立輸出函式,當m=load()等於0,輸出“該資訊庫為空!!!”,返回主函式。當m不等於0,輸出資訊庫資訊,再判斷if(per[i].num < 3),如果是則輸出“數量太少請進貨”返回主函式
除錯與測試
系統測試是系統開發的一個重要階段,是系統保證質量的關鍵。如果在測試中不認真檢查,在後期維護過程中將會非常麻煩。
本系統測試資料過程如下。
先進入執行程式
輸入“1”,進入新建選單,再輸入“1”進入新建資訊庫。
請輸入用第個1商品資訊:
商品號:1
商品名稱:三星
商品類別:電子產品
數量:2
產地:瀋陽
是否繼續輸入:(1)是 (2)否 輸入“2”。
返回到主函式。
輸入“2”,進入檢視選單。再輸入“1”,進入檢視資訊庫,螢幕輸出
1 三星 電子產品 2 1瀋陽 數量太少請進貨
返回到主選單。
輸入“4”,進入售出或進貨選單。輸入“2”,按提示輸入商品號“1”,按提示依次輸入
數量:5
螢幕輸出
進貨成功!!!
返回到主選單。
輸入“2”,進入檢視選單。再輸入“1”,進入檢視資訊庫,螢幕輸出
1 三星 電子產品 2 1瀋陽
返回到主選單。
輸入“5”,進入退出程式。螢幕輸出
BYE BYE!!!
退出程式。
多次執行程式後,發現各個選單功能都可執行,在輸入錯誤商品號時,給出該商品不存在的提示,因此,該程式無錯誤可正確執行。
附錄 完整程式碼程式
#include<stdio.h>
#define N 20
#define PRESS_ANYKEY printf("請輸入任意鍵繼續……");getchar();getchar();
#include<string.h>
struct repertory
{
char id[10],name[10],list[10],production[10];
int num;
}per[N];
void menu()
{
printf("\t\t***************************************\n");
printf("\t\t* 庫存資訊管理系統 *\n");
printf("\t\t* 1、新建 *\n");
printf("\t\t* 2、查詢 *\n");
printf("\t\t* 3、修刪 *\n");
printf("\t\t* 4、售出或進貨 *\n");
printf("\t\t* 5、退出 *\n");
printf("\t\t***************************************\n");
}
void add_menu()
{
printf("\t\t<<<<<<<<<<<<<<新建>>>>>>>>>>>>>>>\n");
printf("\t\t 1、新建資訊庫 \n");
printf("\t\t 2、新增商品 \n");
printf("\t\t 3、返回 \n");
printf("\t\t<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>\n");
}
void seek_menu()
{
printf("\t\t<<<<<<<<<<<<<<檢視>>>>>>>>>>>>>>>\n");
printf("\t\t 1、檢視資訊庫 \n");
printf("\t\t 2、查詢商品號 \n");
printf("\t\t 3、返回 \n");
printf("\t\t<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>\n");
}
void change_menu()
{
printf("\t\t<<<<<<<<<<<<修改或刪除>>>>>>>>>>>>\n");
printf("\t\t 1、修改商品資訊 \n");
printf("\t\t 2、刪除商品資訊 \n");
printf("\t\t 3、返回 \n");
printf("\t\t<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>\n");
}
void jinchu_menu()
{
printf("\t\t<<<<<<<<<<<<進貨或出售>>>>>>>>>>>>\n");
printf("\t\t 1、出售 \n");
printf("\t\t 2、進貨 \n");
printf("\t\t 3、返回 \n");
printf("\t\t<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>\n");
}
char load();
void save(char m);
void add();
void charu();
void print();
void seek();
void change();
void del();
void jinchu();
char load()
{
int m=0;
FILE *fp;
if((fp = fopen("mchar","r"))==NULL)
{
fclose(fp);
}
else
{
m = fgetc(fp);
if(m<=0)
{
fclose(fp);
}
else
{
return (m);
fclose(fp);
}
}
}
void save(char m)
{
FILE*fp;
if((fp = fopen("mchar","w"))==NULL)
{
m=0;
fputc(m,fp);
fclose(fp);
}
else
{
fputc(m,fp);
fclose(fp);
fp=fopen("repertory_list","w");
fwrite(per,sizeof(struct repertory),m,fp);
fclose(fp);
}
}
void add()
{
char m = load();
int i,n,count=0;
char M;
printf("請輸入你需要增加的數量:");
scanf("%d",&n);
for(i=m;i<(m+n);i++)
{
count++;
printf("請輸入第%d個商品資訊",count);
printf("商品號:");
scanf("%s",&per[i].id);
printf("商品名稱:");
scanf("%s",&per[i].name);
printf("商品類別:");
scanf("%s",&per[i].list);
printf("商品數量:");
scanf("%d",&per[i].num);
printf("產地:");
scanf("%s",&per[i].production);
}
M=n+m;
save(M);
}
void charu()
{
char m=load();
int i;
i = m;
printf("商品號:");
scanf("%s",&per[i].id);
printf("商品名稱:");
scanf("%s",&per[i].name);
printf("商品類別:");
scanf("%s",&per[i].list);
printf("商品數量:");
scanf("%d",&per[i].num);
printf("產地:");
scanf("%s",&per[i].production);
m = m+1;
save(m);
}
void print()
{
char m=load();
int i;
if(m>0)
{
printf("編號\t名稱\t類別\t數量\t產地\t提醒\n");
for(i=0;i<m;i++)
{
printf("%s\t%s\t%s\t%d\t%s\t",per[i].id,per[i].name,per[i].list,per[i].num,per[i].production);
if(per[i].num < 3)
{
printf("數量太少\n");
}
else
{
printf("\n");
}
}
}
else
printf("庫存沒有商品\n");
}
void seek()
{
char j[5],m=load();int i;
printf("請輸入要查詢的名稱:");
scanf("%s",&j);
if(m<=0)
printf("當前資料庫沒有商品資訊\n");
else
for(i=0;i<m;i++)
{
if(strcmp(j,per[i].name)==0)
{
printf("編號\t名稱\t類別\t數量\t產地\n");
printf("%s\t%s\t%s\t%d\t%s\t\n", per[i].id,per[i].name,per[i].list,per[i].num,per[i].production);
}
}
}
void change()
{
char m =load();
char c[10];int c1;
int i,j=0;
if(m<=0)
printf("當前資料庫沒有資料");
else
printf("請輸入需要修改商品編號");
scanf("%s",&c);
for(i=0;i<m;i++)
{
if(strcmp(per[i].id,c)==0)
{
printf("查詢到的商品資訊如下\n");
printf("編號\t名稱\t類別\t數量\t產地\n");
printf("%s\t%s\t%s\t%d\t%s\t\n", per[i].id,per[i].name,per[i].list,per[i].num,per[i].production);
printf("如果某項資訊不想改動可以直接輸入-");
printf("把這件商品的名稱改為:");
scanf("%s",&c);
if (strcmp(c, "-"))
strcpy(per[i].name, c);
printf("把這件商品的商品類別改為:");
scanf("%s", &c);
if (strcmp(c, "-"))
strcpy(per[i].list, c);
printf("把這件商品的數量改為:");
scanf("%d", &c1);
if (strcmp(c, "-"))
per[i].num=c1;
printf("把這件商品的產地改為:");
scanf("%s", &c);
if (strcmp(c, "-"))
strcpy(per[i].production, c);
save(m);
break;
}
else
j++;
}
if(j>0)
printf("找不到該商品");
}
void del()
{
char num[5],m=load();int i,k;
if(m<0)
printf("當前資料庫沒有商品資訊");
else
printf("請輸入刪除的商品編號:");
scanf("%s",&num);
for(i=0;i<m;i++)
if(strcmp(per[i].id,num)==0)
{
for(k=i;k<m-1;k++)
{
per[k]=per[k+1];
}
m--;
save(m);
printf("資料已刪除");
break;
}
}
void jinchu()
{
char na[5],m=load();
int yu1,i,j,k;
jinchu_menu();
printf("請輸入序號:");
scanf("%d", &i);
switch(i)
{
case 1:
{
if(m<=0)
printf("\t\t該資訊庫為空!!!\n");
else
printf("請輸入要定的商品號:");
scanf("%s",&na);
for(j=0;j<m;j++)
{
if(strcmp(na,per[j].id)==0)
{
printf("已找到商品,請輸入要售出的商品數量:");
scanf("%d",&yu1);
if(yu1 <= 0)
{
printf("輸入的數量有誤");
}
else
if(per[i].num>=yu1)
{
per[i].num = per[i].num - yu1;
printf("\t\t出售成功\n");
save(m);
}
else
{
printf("商品數量不足");
}
break;
}
else
k++;
}
printf("商品不存在\n");
break;
}
case 2:
{
if(m<=0)
{
printf("\t\t該資訊庫為空!!!\n");
}
printf("請輸入要定的商品號:");
scanf("%s", &na);
for(j=0;j<m;j++)
{
if(strcmp(na,per[j].id)==0)
{
printf("已找到商品,請輸入要進貨商品數量:");
scanf("%d",&yu1);
if(yu1 <= 0)
{
printf("輸入的數量有誤");
}
else
per[i].num = per[i].num + yu1;
printf("\t\t進貨成功\n");
save(m);
break;
}
else
printf("商品不存在\n");
break;
}
}
}
}
void main()
{
register int i;
char m=0;
FILE *fp;
m=load();
if(m>0)
{
fp=fopen("repertory_list","r");
fread(per,sizeof(struct repertory),m,fp);
fclose(fp);
}
do
{
m = load();
menu();
printf("請選擇你需要操作的序號:");
scanf("%d",&i);
switch(i)
{
case 1:
add_menu();
printf("請選擇你需要操作的序號:");
scanf("%d",&i);
switch(i)
{
case 1:
add();
continue;
case 2:
charu();
print();
PRESS_ANYKEY
continue;
case 3:
break;
}continue;
case 2:
seek_menu();
printf("請選擇你需要操作的序號:");
scanf("%d",&i);
switch(i)
{
case 1:
print();
PRESS_ANYKEY
continue;
case 2:
seek();
case 3:
break;
}continue;
case 3:
change_menu();
printf("請選擇你需要操作的序號:");
scanf("%d",&i);
switch(i)
{
case 1:
change();
print();
PRESS_ANYKEY
continue;
case 2:
del();
print();
continue;
case 3:
break;
}continue;
case 4:
jinchu();
continue;
case 5:
printf("BYE BYE!\n");
PRESS_ANYKEY
}break;
}while(1);
}