仓储管理系统 完整代码和详细代码注释

简介: 仓储管理系统 完整代码和详细代码注释

仓储管理系统

【基本功能】

把货品信息表抽象成一个线性表,货品信息(包括ID、货品名、定价、数量等)作为线性表的一个元素,实现:按ID、货品名分别查找某货品信息(包括ID、货品名、定价、数量等);收录货品(如果货品在帐中已有,则只将总库存量增加。否则插入新增信息);售出货品(如果帐中还有存货,则只将总库存量减少。如果库存为0,则提示售出失败);清除货品(删除该货品信息)、修改货品(ID、货品名和单价);排序(按定价排序--采用冒泡排序、按数量排序--采用快排)等功能。

【基本要求】

(1)分别采用单链表和顺序表实现相应功能。

(2)编写一个测试主函数,测试所实现的功能。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 货品信息结构体
typedef struct {
    int id;  // 货品ID
    char name[50];  // 货品名称
    float price;  // 货品价格
    int quantity;  // 货品数量
} Product;
// 线性表结构体
typedef struct {
    Product *data;  // 指向存储货品信息的数组的指针
    int length;  // 当前存储的货品信息数量
    int capacity;  // 数组的容量
} List;
// 初始化线性表
void initList(List *list) {
    list->data = (Product *)malloc(sizeof(Product) * 10);  // 初始分配存储空间
    list->length = 0;  // 初始长度为0
    list->capacity = 10;  // 初始容量为10
}
// 扩容线性表
void expandList(List *list) {
    list->data = (Product *)realloc(list->data, sizeof(Product) * (list->capacity + 10));  // 重新分配更大的存储空间
    list->capacity += 10;  // 更新容量
}
// 插入货品信息
void insertProduct(List *list, Product product) {
    int i;
    // 判断货品是否已存在
    for (i = 0; i < list->length; i++) {
        if (list->data[i].id == product.id) {
            // 货品已存在,增加库存量
            list->data[i].quantity += product.quantity;
            return;
        }
    }
    // 货品不存在,插入新增信息
    if (list->length >= list->capacity) {
        expandList(list);  // 如果存储空间不足,扩容
    }
    list->data[list->length++] = product;  // 插入新的货品信息
}
// 删除货品信息
void deleteProduct(List *list, int id) {
    int i;
    for (i = 0; i < list->length; i++) {
        if (list->data[i].id == id) {
            // 将最后一个元素覆盖要删除的元素
            list->data[i] = list->data[list->length - 1];
            list->length--;  // 更新长度
            return;
        }
    }
    printf("货品不存在\n");
}
// 修改货品信息
void modifyProduct(List *list, int id, char name[], float price) {
    int i;
    for (i = 0; i < list->length; i++) {
        if (list->data[i].id == id) {
            strcpy(list->data[i].name, name);  // 修改名称
            list->data[i].price = price;  // 修改价格
            return;
        }
    }
    printf("货品不存在\n");
}
// 按ID查找货品信息
void searchById(List *list, int id) {
    int i;
    for (i = 0; i < list->length; i++) {
        if (list->data[i].id == id) {
            printf("ID: %d, 货品名: %s, 定价: %.2f, 数量: %d\n", list->data[i].id, list->data[i].name, list->data[i].price,
                list->data[i].quantity);
            return;
        }
    }
    printf("货品不存在\n");
}
// 按货品名查找货品信息
void searchByName(List *list, char name[]) {
    int i;
    for (i = 0; i < list->length; i++) {
        if (strcmp(list->data[i].name, name) == 0) {
            printf("ID: %d, 货品名: %s, 定价: %.2f, 数量: %d\n", list->data[i].id, list->data[i].name, list->data[i].price,
                list->data[i].quantity);
            return;
        }
    }
    printf("货品不存在\n");
}
// 售出货品
void sellProduct(List *list, int id) {
    int i;
    for (i = 0; i < list->length; i++) {
        if (list->data[i].id == id) {
            if (list->data[i].quantity > 0) {
                list->data[i].quantity--;
                printf("售出成功\n");
            } else {
                printf("售出失败,库存为0\n");
            }
            return;
        }
    }
    printf("货品不存在\n");
}
// 按定价排序(冒泡排序)
void sortByPrice(List *list) {
    int i, j;
    for (i = 0; i < list->length - 1; i++) {
        for (j = 0; j < list->length - i - 1; j++) {
            if (list->data[j].price > list->data[j + 1].price) {
                // 交换元素
                Product temp = list->data[j];
                list->data[j] = list->data[j + 1];
                list->data[j + 1] = temp;
            }
        }
    }
}
// 按数量排序(快速排序)
void quickSortByQuantity(Product *data, int left, int right) {
    if (left >= right) {
        return;
    }
    int i = left;
    int j = right;
    Product pivot = data[left];
    while (i < j) {
        while (i < j && data[j].quantity >= pivot.quantity) {
            j--;
        }
        data[i] = data[j];
        while (i < j && data[i].quantity <= pivot.quantity) {
            i++;
        }
        data[j] = data[i];
    }
    data[i] = pivot;
    quickSortByQuantity(data, left, i - 1);
    quickSortByQuantity(data, i + 1, right);
}
// 显示货品信息
void showProducts(List *list) {
    int i;
    for (i = 0; i < list->length; i++) {
        printf("ID: %d, 货品名: %s, 定价: %.2f, 数量: %d\n", list->data[i].id, list->data[i].name, list->data[i].price,
            list->data[i].quantity);
    }
}
int main() {
    List list;
    initList(&list);
    // 菜单循环
    while (1) {
        printf("\n===============\n");
        printf("1. 收录货品\n");
        printf("2. 删除货品\n");
        printf("3. 修改货品\n");
        printf("4. 按ID查找货品\n");
        printf("5. 按货品名查找货品\n");
        printf("6. 售出货品\n");
        printf("7. 按定价排序\n");
        printf("8. 按数量排序\n");
        printf("9. 显示货品信息\n");
        printf("0. 退出\n");
        printf("===============\n");
        printf("请选择操作:");
        int choice;
        scanf("%d", &choice);
        getchar(); // 处理输入缓冲区的换行符
        if (choice == 1) {
            Product product;
            printf("请输入货品ID:");
            scanf("%d", &product.id);
            getchar();
            printf("请输入货品名:");
            fgets(product.name, 50, stdin);
            product.name[strlen(product.name) - 1] = '\0'; // 去掉末尾的换行符
            printf("请输入货品定价:");
            scanf("%f", &product.price);
            printf("请输入货品数量:");
            scanf("%d", &product.quantity);
            insertProduct(&list, product);
            printf("收录成功\n");
        } else if (choice == 2) {
            int id;
            printf("请输入要删除的货品ID:");
            scanf("%d", &id);
            deleteProduct(&list, id);
        } else if (choice == 3) {
            int id;
            printf("请输入要修改的货品ID:");
            scanf("%d", &id);
            getchar();
            char name[50];
            printf("请输入新的货品名:");
            fgets(name, 50, stdin);
            name[strlen(name) - 1] = '\0'; // 去掉末尾的换行符
            float price;
            printf("请输入新的货品定价:");
            scanf("%f", &price);
            modifyProduct(&list, id, name, price);
        } else if (choice == 4) {
            int id;
            printf("请输入要查找的货品ID:");
            scanf("%d", &id);
            searchById(&list, id);
        } else if (choice == 5) {
            char name[50];
            printf("请输入要查找的货品名:");
            getchar();
            fgets(name, 50, stdin);
            name[strlen(name) - 1] = '\0'; // 去掉末尾的换行符
            searchByName(&list, name);
        } else if (choice == 6) {
            int id;
            printf("请输入要售出的货品ID:");
            scanf("%d", &id);
            sellProduct(&list, id);
        } else if (choice == 7) {
            sortByPrice(&list);
            printf("按定价排序完成\n");
        } else if (choice == 8) {
            quickSortByQuantity(list.data, 0, list.length - 1);
            printf("按数量排序完成\n");
        } else if (choice == 9) {
            showProducts(&list);
        } else if (choice == 0) {
            break;
        } else {
            printf("无效的选择\n");
        }
    }
    free(list.data);  // 释放内存
return 0;


目录
相关文章
|
6天前
|
人工智能 小程序 前端开发
小程序模版|家政服务小程序源码
小程序模版|家政服务小程序源码
|
6天前
|
存储 Java 数据库
基于springboot的医院信息管理系统(程序+代码+文档)
基于springboot的医院信息管理系统(程序+代码+文档)
|
6天前
|
前端开发 Java 数据库连接
java项目-如何实现酒店预定管理系统
java项目-如何实现酒店预定管理系统
|
9月前
|
安全
交易所系统开发规则案例丨需求分析丨功能设计丨详细步骤丨源码逻辑
Before developing a digital currency exchange system, a detailed requirement analysis is required. Firstly, it is necessary to clarify the types of digital currencies and trading varieties that the system needs to support. Secondly, it is necessary to determine the user roles and permission manageme
|
10月前
|
SQL 缓存 前端开发
JavaWeb实现酒店预定管理系统附代码以及使用效果演示
JavaWeb实现酒店预定管理系统附代码以及使用效果演示
55 0
JavaWeb实现酒店预定管理系统附代码以及使用效果演示
|
8月前
|
安全
上门按摩预约系统开发方案项目/案例详细/需求逻辑/流程设计/源码功能
Implement a user authentication mechanism to ensure the authenticity and security of user identities.
|
8月前
|
存储 安全 前端开发
预约上门按摩项目系统开发详细流程/案例介绍/功能逻辑/需求方案/源码模式
确定系统的目标用户,例如个人用户或企业用户。 - 确定系统的核心功能,如用户注册和登录、服务列表和预约管理、支付和评价反馈等。 - 确定技术平台和开发语言,如Web应用还是移动应用,以及开发语言和框架的选择。 - 制定项目计划,并确定开发阶段和时间安排。
|
10月前
|
SQL 安全 算法
项目实战7——在线人员列表逻辑混乱反例
项目实战7——在线人员列表逻辑混乱反例
63 0
|
10月前
信息系统开发与管理思维导图
信息系统开发与管理思维导图
75 0
|
区块链 数据安全/隐私保护 UED
什么是3M系统开发?3M互助系统开发源码Demo展示
什么是3M系统开发?3M互助系统开发源码Demo展示