帮忙完善一个仓库管理系统 C语言

代码如下

#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很多位数这样的数字。

最后希望大佬能给出解决问题后的代码,谢谢。

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。