商品库存管理系统(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 系统测试

商品库存管理系统(C语言)_第1张图片 图1 商品库存管理系统

6 设计总结

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

你可能感兴趣的:(C++课程设计,c语言,算法,数据结构,课程设计)