代码如下
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define MAX_NUM 1000
struct DATA_TYPE {
char strNo[11]; //商品编号(10个字符-数字或字母)
char strName[21]; //商品名称(10个中文或20个字母)
int inventory; //库存数量,当库为0时,根据statusOK的值,确定是【缺货】还是【下架】
int deleted;
};
int ReadFromFile(struct DATA_TYPE*);
int WriteToFile(struct DATA_TYPE*, int num_used);
int QueryByNo(struct DATA_TYPE*, char No[], int num_used);
int Stock_in(struct DATA_TYPE*, int num_used);
int Stock_list(struct DATA_TYPE*, int num_used);
int Stock_inquire(struct DATA_TYPE*, int num_used);
int Stock_out(struct DATA_TYPE*, int num_used);
int main(int argc, char* argv[]) { //开始
int num_used;
struct DATA_TYPE* pDatabase =
(struct DATA_TYPE*)malloc(sizeof(struct DATA_TYPE) * MAX_NUM);
if (pDatabase == NULL) {
printf("Error Found\n");
return -1;
}
num_used = ReadFromFile(pDatabase);
while (1) {
system("cls");
printf("欢迎进入仓库管理系统\n\n");
printf("1. 入库\n\n");
printf("2. 库存显示\n\n");
printf("3. 查询\n\n");
printf("4. 出库\n\n");
printf("0. 退出\n\n");
printf("请输入功能序号:\n\n");
char ch = _getch();
system("cls");
switch (ch) {
case '1':
num_used = Stock_in(pDatabase, num_used);
break;
case '2':
Stock_list(pDatabase, num_used);
break;
case '3':
Stock_inquire(pDatabase, num_used);
break;
case '4':
Stock_out(pDatabase, num_used);
break;
}
if (ch == '0')
break;
}
WriteToFile(pDatabase, num_used);
free(pDatabase);
return 0;
}
int ReadFromFile(struct DATA_TYPE* pDataBase) {
FILE* fp;
fp = fopen("d:\\mydatabase.dat", "rb");
if (fp == NULL) {
printf("Erro\n");
return 0;
}
int num = 0;
while ((fread((void*)&pDataBase[num], sizeof(struct DATA_TYPE), 1, fp) == 1)) {
num++;
}
fclose(fp);
return num;
}
int WriteToFile(struct DATA_TYPE* pDataBase, int num_used) {
FILE* fp;
fp = fopen("d:\\mydatabase.dat", "wb");
if (fp == NULL) {
printf("Erro\n");
return -1;
}
for (int i = 0; i < num_used; i++) {
if (pDataBase[i].deleted == 0)
fwrite(&pDataBase[i], sizeof(struct DATA_TYPE), 1, fp);
}
fclose(fp);
return 0;
}
int QueryByNo(struct DATA_TYPE* pDataBase, char No[], int num_used) {
int num = -1;
for (int i = 0; i < num_used; i++) {
if (!strcmp(pDataBase[i].strNo, No)) {
num = i;
break;
}
}
return num;
}
//1.入库
int Stock_in(struct DATA_TYPE* pDataBase, int num_used) {
char No[80];
while (1) {
printf("请输入商品编号(1~999)(输入000时 结束输入)\n");
scanf("%s", No);
if (!strcmp(No, "000")) {
break;
}
int num = QueryByNo(pDataBase, No, num_used);
if (num == -1) {
printf("请输入商品名字\n");
scanf("%s %d",
pDataBase[num_used].strName,
&pDataBase[num_used].inventory);
strcpy(pDataBase[num_used].strNo, No);
pDataBase[num_used].deleted = 0;
num_used++;
}
else {
printf("请输入库存数量\n");
int Inventory;
scanf("%d", &Inventory);
pDataBase[num].inventory = pDataBase[num].inventory + Inventory;
}
}
return num_used;
}
//2.显示
int Stock_list(struct DATA_TYPE* pDataBase, int num_used) {
for (int i = 0; i < num_used; i++) {
if (pDataBase[i].deleted == 0) {
printf("%s %s %d\n", pDataBase[i].strNo, pDataBase[i].strName, pDataBase[i].inventory);
}
}
printf("按下任意键返回主页面\n");
_getch();
return 0;
}
//3.查询
int Stock_inquire(struct DATA_TYPE* pDataBase, int num_used) {
printf("请输入该商品号:(1~999)\n");
char No[20];
scanf("%s", No);
for (int i = 0; i < num_used; i++) {
if (!strcmp(pDataBase[i].strNo, No)) {
if (pDataBase[i].deleted == 1)
printf("该商品已下架\n");
else {
printf("商品名:%s\n名称:%s\n库存量:%d\n",
pDataBase[i].strNo,
pDataBase[i].strName,
pDataBase[i].inventory);
}
break;
}
}
printf("按下任意键返回主页面\n");
_getch();
return 0;
}
//4.出库
int Stock_out(struct DATA_TYPE* pDataBase, int num_used) {
char No[80];
while (1) {
printf("请输入商品编号(1~999)(输入000时 结束输入)\n");
scanf("%s", No);
if (!strcmp(No, "000")) {
break;
}
int num = QueryByNo(pDataBase, No, num_used);
if (num == -1) {
printf("该商品不存在\n");
}
else {
printf("请输入出库数量\n");
int Inventory;
scanf("%d", &Inventory);
pDataBase[num].inventory = pDataBase[num].inventory - Inventory;
}
}
return num_used;
}
首先想问一下:
int ReadFromFile(struct DATA_TYPE* pDataBase) {
FILE* fp;
fp = fopen("d:\\mydatabase.dat", "rb");
if (fp == NULL) {
printf("Erro\n");
return 0;
}
int num = 0;
while ((fread((void*)&pDataBase[num], sizeof(struct DATA_TYPE), 1, fp) == 1)) {
num++;
}
fclose(fp);
return num;
}
int WriteToFile(struct DATA_TYPE* pDataBase, int num_used) {
FILE* fp;
fp = fopen("d:\\mydatabase.dat", "wb");
if (fp == NULL) {
printf("Erro\n");
return -1;
}
for (int i = 0; i < num_used; i++) {
if (pDataBase[i].deleted == 0)
fwrite(&pDataBase[i], sizeof(struct DATA_TYPE), 1, fp);
}
fclose(fp);
return 0;
}
int QueryByNo(struct DATA_TYPE* pDataBase, char No[], int num_used) {
int num = -1;
for (int i = 0; i < num_used; i++) {
if (!strcmp(pDataBase[i].strNo, No)) {
num = i;
break;
}
}
return num;
}
这部分代码是什么意思?
然后目前该代码存在以下问题:
1.进入入库功能后,首先跳出输入商品编号,然后出现输入商品数量,然后又会跳到输入商品数量,再随机出现商品名称或商品数量(就输入系统混乱)。输入商品名称后,就再也不会跳出别的提示了,除非输入000,才会跳出“输入000结束输入”这行提示,然后再输入一次000才能退出程序。
2.打开查看功能后,因为第一部分入库功能的混乱,于是录入的信息也是乱七八糟的,比如说上面入库跳出了三次输入商品编号,但是只有一次输入商品名称,于是就会出现一个商品出现三个商品编号。并且还有一个bug数量,-8xxxxxxxxxx很多位数这样的数字。
最后希望大佬能给出解决问题后的代码,谢谢。
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。