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

1 设计目的

        让商家能够更方便地管理商品库存。

2 需求分析

        用户能够实现对商品的入库、出库、删除、修改和查询等功能。

3 总体设计

        商品库存管理系统存在以下模块,商品入库模块、商品出库模块、删除商品模块、修改商品模块、查询商品模块、显示商品模块。

4 详细设计与实现

        所有代码在一个文件中完成。

4.1 预处理及数据结构

        本系统使用了宏定义,并定义了结构体Product,代表商品,包含商品的各项属性信息;也定义了一个结构体数组的全局变量,用来保存商品信息。

//结构体
struct Product           /*定义商品结构体*/
{
	int iId;             /*商品代码*/
	char acName[15];     /*商品名称*/
	char acProducer[15]; /*商品生产商*/
	char acDate[15];     /*商品生产日期*/
	double dPrice;       /*商品价格*/
	int iAmount;         /*商品数量*/
};
//全局变量
struct Product astPro[100]; /*定义结构体数组*/

4.2 主函数

        主函数使用ShowMenu函数,显示主菜单,并提供选项。

void ShowMenu();     /*显示主菜单*/
int main()           /*主函数*/
{
	int iItem, ret;
	ShowMenu();
	ret = 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");/*错误输入*/
		}
		ret = _getch(); /*读取键盘输入的任意字符*/
		ShowMenu();     /*执行完功能再次显示菜单功能*/
		ret = scanf("%d", &iItem);/*输入菜单项*/
	}
	return 0;
}
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):");
}

4.3 商品入库模块

        将一条商品信息存入文件。

void InputProduct()    /*商品入库函数*/
{
	int i, iMax = 0, ret; /*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:");
	ret = getchar();     /*把选择1之后输入的回车符取走*/
	cDecide = getchar(); /*读一个字符*/
	/*判断是否要录入新信息*/
	while (cDecide == 'y' || cDecide == 'Y')
	{
		printf("Id:");   /*输入商品编号*/
		ret = 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!");
				ret = _getch();
				fclose(fp); /*关闭文件,结束input操作*/
				return;
			}
		}
		printf("Name:"); /*输入商品名称*/
		ret = scanf("%s", &astPro[iMax].acName);
		printf("Producer:"); /*输入商品生产商*/
		ret = scanf("%s", &astPro[iMax].acProducer);
		printf("Date(Example 15-5-1):"); /*输入商品生产日期*/
		ret = scanf("%s", &astPro[iMax].acDate);
		printf("Price:");    /*输入商品价格*/
		ret = scanf("%lf", &astPro[iMax].dPrice);
		printf("Amount:");   /*输入商品数量*/
		ret = scanf("%d", &astPro[iMax].iAmount);
		/*在文件末尾添加该商品记录*/
		if (fwrite(&astPro[iMax], PRODUCT_LEN, 1, fp) != 1)
		{
			printf("can not save!\n");
			ret = _getch();  /*等待按键,为了显示上一句话*/
		}
		else
		{
			/*成功入库提示*/
			printf("product Id %d is saved!\n", astPro[iMax].iId);
			iMax++;
		}
		printf("press y/Y to continue input:");/*询问是否继续*/
		ret = getchar();     /*把输入商品数量之后的回车符取走*/
		cDecide = getchar(); /*判断是否为y/Y,继续循环*/
	}
	fclose(fp);  /*不再继续录入,关闭文件*/
	printf("Input is over!\n");
}

4.4 商品出库模块

        减少对应商品的库存。

void OutputProduct()        /*商品出库函数*/
{
	FILE *fp;
	/*iId表示商品编号,iOut表示要出库的商品数量*/
	int iId, i, iMax = 0, iOut = 0;
	char cDecide; /*存储用户输入的是否出库的判断字符*/
	iMax = ShowProduct();
	if (iMax <= -1) /*若文件不存在,或者没有记录,不能进行出库操作*/
	{
		printf("please input first!");
		return;
	}
	printf("please input the id:");
	int ret = scanf("%d", &iId); /*输入要出库的商品编号*/
	for (i = 0; i < iMax; i++)
	{
		if (iId == astPro[i].iId) /*如果找到该商品*/
		{
			printf("find the product, press y/Y to output:");
			ret = getchar();
			cDecide = getchar();
			if (cDecide == 'y' || cDecide == 'Y') /*判断是否要进行出库*/
			{
				printf("input the amount to output:");
				ret = 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");
					ret = _getch();
				}
				fclose(fp);
				printf("output successfully!\n");
				ShowProduct(); /*显示出库后的所有商品信息*/
			}
			return;
		}
	}
	printf("can not find the product!\n");/*如果没有找到该商品,提示用户*/
}

4.5 删除商品模块

        删除一条商品信息记录。

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: ");
	int ret = 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!");
					ret = _getch();
				}
			}
			fclose(fp);
			printf("delete successfully!\n");
			ShowProduct(); /*显示删除后的所有商品信息*/
			return;
		}
	}
	printf("can not find the product!\n");
}

4.6 修改商品模块

        修改对应商品的所有信息。

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:");
	int ret = scanf("%d", &iId);
	for (i = 0; i < iMax; i++)
	{
		if (iId == astPro[i].iId) /*检索记录中是否有要修改的商品*/
		{
			printf("find the product, you can modify!\n");
			printf("id:");
			ret = scanf("%d", &astPro[i].iId);
			printf("Name:");
			ret = scanf("%s", &astPro[i].acName);
			printf("Producer:");
			ret = scanf("%s", &astPro[i].acProducer);
			printf("Date:");
			ret = scanf("%s", &astPro[i].acDate);
			printf("Price:");
			ret = scanf("%lf", &astPro[i].dPrice);
			printf("Amount:");
			ret = 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!");
				ret = _getch();
			}
			fclose(fp);
			printf("modify successfully!\n");
			ShowProduct();  /*显示修改后的所有商品信息*/
			return;
		}
	}
	printf("can not find information!\n");
}

4.7 查询商品模块

        在文件中查找商品。

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

4.8 显示商品模块

        将文件中的内容显示出来。

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("%-8s%-15s%-15s%-15s%-12s%-8s\n", "id", "name", "producer", "date", "price", "amount");
		for (i = 0; i < iMax; i++)
		{
			printf(FORMAT, DATA); /*将信息按指定格式打印*/
		}
	}
	return iMax;
}

5 系统测试

图1 商品库存管理系统

6 设计总结

  • 商品库存管理系统,使用了二进制文件的读写。
  • 商品库存管理系统,设计了用户界面。
  • 商品库存管理系统,使用了6个函数完成子功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/351683.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux中安装tomcat并启动运行web项目

在 Linux 中安装 Tomcat 并启动运行 Web 项目,您可以按照以下步骤进行操作: 1.下载和解压 Tomcat: 打开终端(Terminal)。 使用 wget 命令下载 Tomcat 压缩包。例如: wget https://downloads.apache.org/tomcat/tomcat-<version>/bin/apache-tomcat-<version&g…

ZK鉴权设计以及相关探讨

文章目录 1. zk的鉴权设计2. zk鉴权应用范围3. zk鉴权的常用方法4. 推荐配置5. 参考文档 鉴权&#xff0c;分别由鉴和权组成 鉴&#xff1a; 表示身份认证&#xff0c;认证相关用户是否存在以及相关的用户名和密码是否一致权&#xff1a; 完成身份的鉴后&#xff0c;还需要判断…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM平台编程第六天-Linux文件系统(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1VUc8cGI7bTtXuGepZZY3Ng?pwd1688 提取码&#xff1a;1688 上午&#xff1a;文件系统介绍 下午&#xff1a;文件系统的制作 教学内容&#xff1a; 在linux中文件分为二种&#xff1a; 根文件和普通文件&#xff1b; Linux以树状…

2024河南省公务员报名确认缴费流程

1、抢考点&#xff01;及时的报名确认以及缴费&#xff01; 2024年1月31日9∶00至2月40日17∶00前进行上传照片、选择考区和网上缴费。需要提醒各位考生的是&#xff0c;各个城市考点容量有限&#xff0c;需要尽早进行确认缴费选考点。每年都有因为报名确认较晚&#xff0c;未能…

云流量回溯在网络管理中的关键应用

云流量回溯是一种在云计算环境下的网络流量分析技术&#xff0c;它能够追踪和还原网络中的流量&#xff0c;为网络管理和安全监控提供了强大的支持。在本文中&#xff0c;我们将探讨云流量回溯的原理&#xff0c;并探讨其在实际网络管理中的关键应用。 1. 云流量回溯概述 云流量…

Docker数据卷挂载(以容器化Mysql为例)

数据卷 数据卷是一个虚拟目录&#xff0c;是容器内目录与****之间映射的桥梁 在执行docker run命令时&#xff0c;使用**-v 本地目录&#xff1a;容器目录**可以完成本地目录挂载 eg.Mysql容器的数据挂载 1.在根目录root下创建目录mysql及三个子目录&#xff1a; cd ~ pwd m…

嵌入式学习第十一天

1.数组和指针的关系: 1.一维数组和指针的关系: int a[5] {1, 2, 3, 4, 5}; int *p NULL; p &a[0]; p a; 数组的数组名a是指向数组第一个元素的一个指针常量 a &a[0] a 的类型可以理解为 int * 有两种情况除…

常见の算法链表问题

时间复杂度 1.链表逆序 package class04;import java.util.ArrayList; import java.util.List;public class Code01_ReverseList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {publi…

React16源码: React中commitAllHostEffects内部的commitDeletion的源码实现

commitDeletion 1 &#xff09;概述 在 react commit 阶段的 commitRoot 第二个while循环中调用了 commitAllHostEffects&#xff0c;这个函数不仅仅处理了新增节点&#xff0c;更新节点最后一个操作&#xff0c;就是删除节点&#xff0c;就需要调用 commitDeletion&#xff0…

行业应用 | Sophon AutoCV推动AI应用从模型生产到高效落地

随着技术市场和应用方向的逐渐成熟&#xff0c;人工智能与各行各业的结合和落地逐渐进入了深水区。 虽然由于行业规模化和应用普及度的限制&#xff0c;人工智能在“传统”行业的落地不如消费互联网行业&#xff0c;但是借助人工智能为“传统”行业的发展注入新能量一直是相关…

大文件传输之以太网UDP传输延迟解决方案

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业最宝贵的资产之一。随着企业规模的扩大和业务的全球化&#xff0c;大文件传输的需求日益增长&#xff0c;它不仅关系到企业内部数据的高效管理&#xff0c;也是与外部合作伙伴进行有效沟通的关键。然而&#xff0c;大文件…

STM32——创建HAL库工程

第一步 新建工程文件夹 所有文件夹存放的内容&#xff1a; 第二步 拷贝/新建工程相关文件 1、Drivers&#xff08;创建如下文件夹&#xff0c;除readme.txt&#xff09; 文件夹存放的内容&#xff1a; 2、Middlewares和output暂时不需要创建&#xff08;目前用不到&#x…

幻兽帕鲁一键开私服?超简单小白教程一看就会!

如何自建幻兽帕鲁服务器&#xff1f;基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了&#xff0c;一看就懂系列。本文是利用OOS中幻兽帕鲁扩展程序来一键部署幻兽帕鲁服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com分享官方基于阿里云服务器快速创建幻兽帕鲁服务器教程…

ARM常用汇编指令

文章目录 前言一、处理器内部数据传输指令MOV&#xff1a; 将数据从一个寄存器复制到另一个寄存器。MRS&#xff1a; 将特殊寄存器(CPSR,SPSR)中的数据传给通用寄存器。MSR&#xff1a; 将通用寄存器中的数据传给特殊寄存器(CPSR,SPSR)。 二、存储器访问指令LDR:用于从内存中加…

Shell脚本——函数的使用

一、函数 1.函数的作用 定义较为复杂的但是需要重复使用的内容&#xff0c;以便再次使用可以直接调用函数节约时间&#xff0c;提高效率 在编写脚本时&#xff0c;有些脚本可以反复使用&#xff0c;可以调用函数来解决&#xff0c;语句块定义成函数约等于别名 函数定义&…

51-17 视频理解串讲— MViT 论文精读

继TimeSformer模型之后&#xff0c;咱们再介绍两篇来自Facebook AI的论文&#xff0c;即Multiscale Vision Transformers以及改进版MViTv2: Improved Multiscale Vision Transformers for Classification and Detection。 由于本司大模型组最近组织阅读的论文较多&#xff0c;…

【iOS ARKit】同时开启前后摄像头BlendShapes

在上一节中已经了解了 iOS ARkit 进行BlendShapes的基本操作&#xff0c;这一小节继续实践同时开启前后摄像头进行人脸捕捉和世界追踪。 iOS设备配备了前后两个摄像头&#xff0c;在运行AR 应用时&#xff0c;需要选择使用哪个摄像头作为图像输人。最常见的AR 体验使用设备后置…

Java实现数字化社区网格管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5.1 查询企事业单位5.2 查询流动人口5.3 查询精准扶贫5.4 查询案件5.5 查询人口 六、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数字化社区网格管理系统&#xf…

Istio-gateway

一. gateway 在 Kubernetes 环境中&#xff0c;Kubernetes Ingress用于配置需要在集群外部公开的服务。但是在 Istio 服务网格中&#xff0c;更好的方法是使用新的配置模型&#xff0c;即 Istio Gateway&#xff0c;Gateway 允许将 Istio 流量管理的功能应用于进入集群的流量&…

MongoDB日期存储与查询、@Query、嵌套字段查询实战总结

缘由 MongoDB数据库如下&#xff1a; 如上截图&#xff0c;使用MongoDB客户端工具DataGrip&#xff0c;在filter过滤框输入{ profiles.alias: 逆天子, profiles.channel: }&#xff0c;即可实现昵称和渠道多个嵌套字段过滤查询。 现有业务需求&#xff1a;用Java代码来查询…
最新文章