商品库存管理系统(c语言)

一、项目背景

​ 为了解决商品库存信息在日常生活中易于丢失、遗忘,不易保存和管理的问题,我们设计商品库存管理系统,来帮助商家方便地对商品信息进行增加、删除、修改等日常维护,并且能进行商品信息的查询,从而能更全面直观地了解到商品库存信息。

二、设计目的

  1. 如何实现菜单的显示、选择和响应等功能
  2. 如何将信息保存到指定的磁盘文件中,并通过操作文件指针和调用文件相关函数来实现对文件的读写操作
  3. 如何使用结构体封装商品属性信息
  4. 如何利用结构体数组记录多个商品信息
  5. 如何通过C语言实现基本的增、删、改、查等信息管理功能

三、项目功能需求

1、商品入库

能够录入商品编号、名称、数量、价格、生产日期、供货商等信息,并支持连续输入多个商品信息

2、商品出库

根据用户输入要进行出库操作的商品编号,如果存在该商品,则可以输入要出库的商品数量,实现出库操作

3、删除商品信息

根据用户输入要进行删除的商品编号,如果找到该商品,则将该编号所对应的商品名称等各项信息均删除

4、修改商品信息

根据用户输入的商品编号找到该商品,若该商品存在,则可以修改商品的各项信息

5、查询商品信息

可以显示所有商品的信息,也可以输入商品编号,查询某一个商品的信息

四、系统的功能结构图

在这里插入图片描述

五、功能模块介绍

1、商品入库模块

  • 自动显示系统中已有的商品信息,如果还没有商品,显示没有记录。提示用户是否需要入库
  • 用户输入需要入库的商品编号,系统自动判断该商品是否已经存在,若存在则无法入库;若不存在,则提示用户输入商品的相关信息
  • 一条商品的所有信息均输入完成之后,系统还会询问是否继续进行其他商品的入库操作

2、商品出库模块

  • 自动显示系统中已有的商品信息,并提示用户输入需要出库的商品编号
  • 系统自动判断该商品是否已经存在,若存在则提示用户输入出库的数量;若不存在,则提示用户找不到该商品,无法进行出库操作

3、删除商品模块

  • 自动显示系统中已有的商品信息,并提示用户输入需要删除的商品编号
  • 系统自动判断该商品是否已经存在,若存在则提示用户是否删除该商品;若不存在则提示无法找到该商品

4、修改商品模块

  • 自动显示系统中已有的商品信息,并提示用户输入需要修改的商品编号
  • 系统自动判断该商品是否已经存在,若存在则提示用户输入新的商品信息;若不存在则提示无法找到该商品

5、查询商品模块

  • 通过用户输入的商品编号来查找商品,若存在则提示用户是否显示商品所有信息,若不存在则提示无法找到该商品

6、显示商品模块

  • 负责将所有商品的信息列表显示出来

六、详细设计

1、主函数

主函数运行后,首先调用菜单响应函数ShowMenu实现菜单的显示。

程序流程图如下所示。

在这里插入图片描述

2、商品入库模块

函数功能设计

  • 在主菜单的界面中输入“1”,即可进入商品入库模块。
  • 首先展示系统中的商品信息,并提示用户是否录入,用户输入字符y或者字符Y,则可以进行数据录入。
  • 首先录入商品编号,如果输入的商品编号已经存在,系统会提示用户该商品已经存在;若商品是第一次入库,用户则需陆续输入商品的名称、生产商、生产日期、价格和数量信息。

3、商品出库模块

函数功能设计

  • 在主菜单的界面中输入“2”,即可进入商品出库模块。
  • 首先也展示系统中所有商品信息,并提示用户输入要出库的商品编号。
  • 一旦商品编号确实是系统中已有的商品编号,则可以对该商品的数量进行修改。
  • 用户可以输入要出库的商品数量,如果用户输入的数量比商品的实际库存还要大,则自动将商品库存变成0。
  • 最后显示出库操作后所有商品的信息列表。

4、删除商品模块

函数功能设计

  • 在主菜单的界面中输入“3”,即可进入删除商品模块。
  • 同样先显示所有商品信息,若文件不存在或者没有记录,则不能进行删除操作。
  • 程序提示用户输入要删除的商品编号,系统会自动将该编号对应的商品条目彻底从文件中删除,最后会显示删除后的商品信息列表。

5、修改商品模块

函数功能设计

  • 在主菜单的界面中输入“4”,即可进入修改商品模块。
  • 和商品出库模块的不同之处在于,商品出库仅修改商品库存量,而修改商品模块可以修改商品信息的各个字段的数据。
  • 程序提示用户输入要修改的商品编号,如果此编号的商品存在,系统会自动提示用户输入要修改的各项商品信息。
  • 最后显示修改后的所有商品信息。

6、查询商品模块

函数功能设计

  • 在主菜单的界面中输入“5”,即可进入查询商品模块。
  • 查询时根据用户输入的商品编号进行查询,若查询的商品存在,则会提示用户找到该商品,是否查看详细信息显示。
  • 用户选择是,则显示商品的各种信息。如果查不到该商品,则提示用户找不到商品信息。

7、显示商品模块

函数功能设计

  • 在主菜单的界面中输入“6”,即可显示所有商品信息。
  • 通过列表的方式,显示商品的各个属性,以及每一条商品记录。

七、代码

/*商品库存管理系统*/
#include<stdio.h>
#include<conio.h>  /*getch()函数用到的头文件*/
#include<stdlib.h> /*system(cls)函数用到的头文件*/

#define PRODUCT_LEN sizeof(struct Product) 
#define FORMAT "%-8d%-15s%-15s%-15s%-12.1lf%-8d\n"
#define DATA astPro[i].iId,astPro[i].acName,astPro[i].acProducer,astPro[i].acDate,astPro[i].dPrice,astPro[i].iAmount
struct Product                        /*定义商品结构体*/
{
	int  iId;                         /*商品代码*/
	char acName[15];                  /*商品名称*/
	char acProducer[15];              /*商品生产商*/
	char acDate[15];                  /*商品生产日期*/
	double dPrice;                    /*商品价格*/
	int  iAmount;                     /*商品数量*/
};
struct Product astPro[100];           /*定义结构体数组*/
/*******************************************************************************/
void ShowMenu();                      /*显示主菜单*/
void InputProduct();                  /*商品入库*/
void OutputProduct();                 /*商品出库*/
void DeleteProduct();                 /*删除商品*/
void ModifyProduct();                 /*修改商品*/
void SearchProduct();                 /*商品查询*/
int ShowProduct();                   /*显示商品*/


/*******************************************************************************/

void main()                           /*主函数*/
{
	int iItem;
	ShowMenu();
	scanf("%d", &iItem);              /*输入菜单项*/
	while (iItem)
	{
		switch (iItem)
		{
		case 1:InputProduct(); break;  /*商品入库*/
		case 2:OutputProduct(); break; /*商品出库*/
		case 3:DeleteProduct(); break; /*删除商品*/
		case 4:ModifyProduct(); break; /*修改商品*/
		case 5:SearchProduct(); break; /*搜索商品*/
		case 6:ShowProduct(); break;   /*显示商品*/
		default:printf("input wrong number"); /*错误输入*/
		}
		getch();                       /*读取键盘输入的任意字符*/
		ShowMenu();                    /*执行完功能再次显示菜单功能*/
		scanf("%d", &iItem);           /*输入菜单项*/
	}
}
/*******************************************************************************/
void ShowMenu()                        /*自定义函数实现菜单功能*/
{
	system("cls");
	printf("\n\n\n\n\n");
	printf("\t\t|---------------------PRODUCT-------------------|\n");
	printf("\t\t|\t 1. input record                        |\n");
	printf("\t\t|\t 2. output record                       |\n");
	printf("\t\t|\t 3. delete record                       |\n");
	printf("\t\t|\t 4. modify record                       |\n");
	printf("\t\t|\t 5. search record                       |\n");
	printf("\t\t|\t 6. show record                         |\n");
	printf("\t\t|\t 0. exit                                |\n");
	printf("\t\t|-----------------------------------------------|\n\n");
	printf("\t\t\tchoose(0-6):");
}
/*******************************************************************************/

void InputProduct()                                    /*商品入库函数*/
{
	int i, iMax = 0;                                   /*iMax记录文件中的商品记录条数*/
	char cDecide;                                      /*存储用户输入的是否入库的判断字符*/
	FILE *fp;                                          /*定义文件指针*/

	iMax = ShowProduct();

	if ((fp = fopen("product.txt", "ab")) == NULL)     /*追加方式打开一个二进制文件*/
	{
		printf("can not open file\n");                 /*提示无法打开文件*/
		return;
	}
	printf("press y/Y to input:");
	getchar();                                        /*把选择1之后输入的回车符取走*/
	cDecide = getchar();                              /*读一个字符*/
	while (cDecide == 'y' || cDecide == 'Y')          /*判断是否要录入新信息*/
	{
		printf("Id:");                                /*输入商品编号*/
		scanf("%d", &astPro[iMax].iId);
		for (i = 0; i<iMax; i++)
		if (astPro[i].iId == astPro[iMax].iId)      /*若该商品已存在*/
		{
			printf("the id is existing,press any key to continue!");
			getch();
			fclose(fp);                      /*关闭文件,结束input操作*/
			return;
		}
		printf("Name:");                             /*输入商品名称*/
		scanf("%s", &astPro[iMax].acName);
		printf("Producer:");                         /*输入商品生产商*/
		scanf("%s", &astPro[iMax].acProducer);
		printf("Date(Example 15-5-1):");             /*输入商品生产日期*/
		scanf("%s", &astPro[iMax].acDate);
		printf("Price:");                            /*输入商品价格*/
		scanf("%lf", &astPro[iMax].dPrice);
		printf("Amount:");                           /*输入商品数量*/
		scanf("%d", &astPro[iMax].iAmount);

		if (fwrite(&astPro[iMax], PRODUCT_LEN, 1, fp) != 1)  /*在文件末尾添加该商品记录*/
		{
			printf("can not save!\n");
			getch();                                 /*等待敲键盘,为了显示上一句话*/
		}
		else
		{
			printf("product Id %d is saved!\n", astPro[iMax].iId);/*成功入库提示*/
			iMax++;
		}
		printf("press y/Y to continue input:");      /*询问是否继续*/
		getchar();                                   /*把输入商品数量之后的回车符取走*/
		cDecide = getchar();                         /*判断是否为y/Y,继续循环*/
	}
	fclose(fp);                                      /*不再继续录入,关闭文件*/
	printf("Input is over!\n");
}

void OutputProduct()                               /*商品出库函数*/
{
	FILE *fp;
	int iId, i, iMax = 0, iOut = 0;             /*iId表示商品编号,iOut表示要出库的商品数量*/
	char cDecide;                                  /*存储用户输入的是否出库的判断字符*/

	iMax = ShowProduct();

	if (iMax <= -1)                                 /*若文件不存在,或者没有记录,不能进行出库操作*/
	{
		printf("please input first!");
		return;
	}

	printf("please input the id:");
	scanf("%d", &iId);                             /*输入要出库的商品编号*/
	for (i = 0; i < iMax; i++)
	{
		if (iId == astPro[i].iId)                   /*如果找到该商品*/
		{
			printf("find the product,press y/Y to output:");
			getchar();
			cDecide = getchar();
			if (cDecide == 'y' || cDecide == 'Y')   /*判断是否要进行出库*/
			{
				printf("input the amount to output:");
				scanf("%d", &iOut);
				astPro[i].iAmount = astPro[i].iAmount - iOut;
				if (astPro[i].iAmount < 0)          /*要出库的数量比实际库存量还小*/
				{
					printf("the amount is less than your input and the amount is 0 now!\n");
					astPro[i].iAmount = 0;          /*出库后的库存量置为0*/
				}
				if ((fp = fopen("product.txt", "rb+")) == NULL)     /*读写方式打开一个二进制文件,文件必须存在*/
				{
					printf("can not open file\n");  /*提示无法打开文件*/
					return;
				}
				fseek(fp, i*PRODUCT_LEN, 0);        /*文件指针移动到要出库的商品记录位置*/
				if (fwrite(&astPro[i], PRODUCT_LEN, 1, fp) != 1) /*写入该商品出库后的信息*/
				{
					printf("can not save file!\n");
					getch();
				}
				fclose(fp);
				printf("output successfully!\n");
				ShowProduct();                      /*显示出库后的所有商品信息*/
			}
			return;
		}
	}
	printf("can not find the product!\n");         /*如果没有找到该商品,提示用户*/
}

void DeleteProduct()                                /*删除商品函数*/
{
	FILE *fp;
	int i, j, iMax = 0, iId;

	iMax = ShowProduct();

	if (iMax <= -1)                                 /*若文件不存在,或者没有记录,不能进行出库操作*/
	{
		printf("please input first!");
		return;
	}

	printf("please input the id to delete:");
	scanf("%d", &iId);
	for (i = 0; i<iMax; i++)
	{
		if (iId == astPro[i].iId)                     /*检索是否存在要删除的商品*/
		{
			for (j = i; j < iMax; j++)
				astPro[j] = astPro[j + 1];
			iMax--;

			if ((fp = fopen("product.txt", "wb")) == NULL)  /*只写方式打开文件,文件存在则先删除并创建一个新文件*/
			{
				printf("can not open file\n");
				return;
			}
			for (j = 0; j<iMax; j++)             /*将新修改的信息写入指定的磁盘文件中*/
			if (fwrite(&astPro[j], PRODUCT_LEN, 1, fp) != 1)
			{
				printf("can not save!");
				getch();
			}
			fclose(fp);
			printf("delete successfully!\n");
			ShowProduct();                      /*显示删除后的所有商品信息*/
			return;
		}
	}
	printf("can not find the product!\n");
}


void ModifyProduct()                                /*修改商品函数*/
{
	FILE *fp;
	int i, iMax = 0, iId;

	iMax = ShowProduct();
	if (iMax <= -1)                                 /*若文件不存在,或者没有记录,不能进行出库操作*/
	{
		printf("please input first!");
		return;
	}

	printf("please input the id to modify:");
	scanf("%d", &iId);
	for (i = 0; i<iMax; i++)
	{
		if (iId == astPro[i].iId)                  /*检索记录中是否有要修改的商品*/
		{
			printf("find the product, you can modify!\n");
			printf("id:");
			scanf("%d", &astPro[i].iId);
			printf("Name:");
			scanf("%s", &astPro[i].acName);
			printf("Producer:");
			scanf("%s", &astPro[i].acProducer);
			printf("Date:");
			scanf("%s", &astPro[i].acDate);
			printf("Price:");
			scanf("%lf", &astPro[i].dPrice);
			printf("Amount:");
			scanf("%d", &astPro[i].iAmount);
			if ((fp = fopen("product.txt", "rb+")) == NULL)
			{
				printf("can not open\n");
				return;
			}
			fseek(fp, i*PRODUCT_LEN, 0);             /*将新修改的信息写入指定的磁盘文件中*/
			if (fwrite(&astPro[i], PRODUCT_LEN, 1, fp) != 1)
			{
				printf("can not save!");
				getch();
			}
			fclose(fp);
			printf("modify successful!\n");
			ShowProduct();                        /*显示修改后的所有商品信息*/
			return;
		}
	}
	printf("can not find information!\n");
}

void SearchProduct()                                 /*查找商品函数*/
{
	//FILE *fp;
	int iId, i, iMax = 0;
	char cDecide;

	iMax = ShowProduct();
	if (iMax <= -1)                                  /*若文件不存在,或者没有记录,不能进行出库操作*/
	{
		printf("please input first!");
		return;
	}

	printf("please input the id:");
	scanf("%d", &iId);
	for (i = 0; i<iMax; i++)
	if (iId == astPro[i].iId)                    /*查找输入的编号是否在记录中*/
	{
		printf("find the product,press y/Y to show:");
		getchar();
		cDecide = getchar();
		if (cDecide == 'y' || cDecide == 'Y')
		{
			printf("id      name           producer       date           price       amount\n");
			printf(FORMAT, DATA);            /*将查找出的结果按指定格式输出*/
			return;
		}
	}
	printf("can not find the product");          /*未找到要查找的信息*/
}


int ShowProduct()                              /*显示所有商品信息*/
{
	int i, iMax = 0;
	FILE *fp;
	if ((fp = fopen("product.txt", "rb")) == NULL)    /*只读方式打开一个二进制文件*/
	{
		printf("can not open file\n");                 /*提示无法打开文件*/
		return -1;
	}
	while (!feof(fp))                                  /*判断文件是否结束*/
	if (fread(&astPro[iMax], PRODUCT_LEN, 1, fp) == 1)
		iMax++;                                        /*统计文件中记录条数*/
	fclose(fp);                                        /*读完后及时关闭文件*/

	if (iMax == 0)                                     /*文件中没有记录时提示用户*/
		printf("No record in file!\n");
	else                                               /*文件中有记录时显示所有商品信息*/
	{
		printf("id      name           producer       date           price       amount\n");
		for (i = 0; i < iMax; i++)
		{
			printf(FORMAT, DATA);                      /*将信息按指定格式打印*/
		}
	}
	return iMax;
	fclose(fp);                                        /*读完后及时关闭文件*/
	if (iMax == 0)                                     /*文件中没有记录时提示用户*/
		printf("No record in file!\n");
	else                                               /*文件中有记录时显示所有商品信息*/
	{
		printf("id      name           producer       date           price       amount\n");
		for (i = 0; i < iMax; i++)
		{
			printf(FORMAT, DATA);                      /*将信息按指定格式打印*/
		}
	}
	return iMax;
}
  • 116
    点赞
  • 644
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
商品库存管理系统是一个非常常见的应用,可以用C语言来实现。下面是一个简单的商品库存管理系统C语言代码示例: ```c #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_ITEM_NUM 100 // 最大商品数量 // 商品结构体 typedef struct item { char name[50]; // 商品名称 int id; // 商品编号 int stock; // 商品库存 } Item; // 商品数组 Item items[MAX_ITEM_NUM]; int item_count = 0; // 添加商品 void add_item() { if (item_count >= MAX_ITEM_NUM) { printf("Error: 商品数量已达到上限。\n"); return; } Item item; printf("请输入商品名称:"); scanf("%s", item.name); printf("请输入商品编号:"); scanf("%d", &item.id); printf("请输入商品库存:"); scanf("%d", &item.stock); items[item_count++] = item; printf("商品添加成功!\n"); } // 查询商品 void query_item() { int id; printf("请输入商品编号:"); scanf("%d", &id); for (int i = 0; i < item_count; i++) { if (items[i].id == id) { printf("商品名称:%s\n", items[i].name); printf("商品编号:%d\n", items[i].id); printf("商品库存:%d\n", items[i].stock); return; } } printf("Error: 未找到该商品。\n"); } // 修改商品库存 void modify_stock() { int id, stock; printf("请输入商品编号:"); scanf("%d", &id); for (int i = 0; i < item_count; i++) { if (items[i].id == id) { printf("请输入新的库存数量:"); scanf("%d", &stock); items[i].stock = stock; printf("商品库存修改成功!\n"); return; } } printf("Error: 未找到该商品。\n"); } // 显示商品列表 void show_items() { printf("商品编号\t商品名称\t商品库存\n"); for (int i = 0; i < item_count; i++) { printf("%d\t%s\t%d\n", items[i].id, items[i].name, items[i].stock); } } int main() { int choice; while (1) { printf("商品库存管理系统\n"); printf("1. 添加商品\n"); printf("2. 查询商品\n"); printf("3. 修改商品库存\n"); printf("4. 显示商品列表\n"); printf("5. 退出系统\n"); printf("请选择操作:"); scanf("%d", &choice); switch (choice) { case 1: add_item(); break; case 2: query_item(); break; case 3: modify_stock(); break; case 4: show_items(); break; case 5: printf("Bye!\n"); return 0; default: printf("Error: 无效的选择。\n"); } } } ``` 该代码实现了一个简单的商品库存管理系统,包括添加商品、查询商品、修改商品库存和显示商品列表等功能。可以根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾亿-唯一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值