C语言购物管理系统

发布于:2024-12-19 ⋅ 阅读:(15) ⋅ 点赞:(0)

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// 数据结构定义
typedef struct {
    int id;
    char name[50];
    double price;
    int stock;
} Product;

typedef struct {
    Product product;
    int quantity;
} CartItem;

typedef struct {
    int userID;
    char username[50];
    char password[50];
    int isAdmin; // 1: 管理员, 0: 普通用户
} User;

// 全局变量
Product products[100];
int productCount = 0;
CartItem cart[100];
int cartCount = 0;
User users[100];
int userCount = 0;
int currentUserID = -1;

// 文件路径
#define PRODUCT_FILE "products.txt"
#define USER_FILE "users.txt"

// 功能函数声明
void adminMenu();
void userMenu();
void loadProducts();
void saveProducts();
void loadUsers();
void saveUsers();
void login();
void registerUser();
void addProduct();
void deleteProduct();
void modifyProduct();
void viewProducts();
void addToCart();
void viewCart();
void checkout();
void clearCart();
void logAction(const char *action);

// 工具函数声明
int findProductById(int id);
int isUsernameAvailable(const char *username);
void flushInput();
int getIntegerInput(const char *prompt, int min, int max);
double getDoubleInput(const char *prompt, double min, double max);

// 主函数
int main() {
    // 加载数据
    loadProducts();
    loadUsers();

    printf("欢迎来到购物管理系统!\n");
    while (1) {
        printf("\n主菜单:\n");
        printf("1. 登录\n");
        printf("2. 注册\n");
        printf("3. 退出\n");

        int choice = getIntegerInput("请选择:", 1, 3);
        switch (choice) {
            case 1:
                login();
                break;
            case 2:
                registerUser();
                break;
            case 3:
                printf("感谢使用购物管理系统!再见!\n");
                exit(0);
        }
    }
    return 0;
}

// 管理员菜单
void adminMenu() {
    printf("欢迎,管理员!\n");
    while (1) {
        printf("\n管理员菜单:\n");
        printf("1. 添加商品\n");
        printf("2. 删除商品\n");
        printf("3. 修改商品\n");
        printf("4. 查看商品\n");
        printf("5. 注销登录\n");

        int choice = getIntegerInput("请选择:", 1, 5);
        switch (choice) {
            case 1:
                addProduct();
                break;
            case 2:
                deleteProduct();
                break;
            case 3:
                modifyProduct();
                break;
            case 4:
                viewProducts();
                break;
            case 5:
                currentUserID = -1;
                printf("已注销登录。\n");
                return;
        }
    }
}

// 用户菜单
void userMenu() {
    printf("欢迎,用户!\n");
    while (1) {
        printf("\n用户菜单:\n");
        printf("1. 查看商品\n");
        printf("2. 添加到购物车\n");
        printf("3. 查看购物车\n");
        printf("4. 结账\n");
        printf("5. 清空购物车\n");
        printf("6. 注销登录\n");

        int choice = getIntegerInput("请选择:", 1, 6);
        switch (choice) {
            case 1:
                viewProducts();
                break;
            case 2:
                addToCart();
                break;
            case 3:
                viewCart();
                break;
            case 4:
                checkout();
                break;
            case 5:
                clearCart();
                break;
            case 6:
                currentUserID = -1;
                printf("已注销登录。\n");
                return;
        }
    }
}

// 登录功能
void login() {
    char username[50], password[50];
    printf("请输入用户名:");
    scanf("%49s", username);
    printf("请输入密码:");
    scanf("%49s", password);

	int i=0;
    for (i = 0; i < userCount; i++) {
        if (strcmp(users[i].username, username) == 0 && strcmp(users[i].password, password) == 0) {
            currentUserID = users[i].userID;
            printf("登录成功!欢迎,%s。\n", username);
            if (users[i].isAdmin) {
                adminMenu();
            } else {
                userMenu();
            }
            return;
        }
    }
    printf("用户名或密码错误。\n");
}

// 注册功能
void registerUser() {
    char username[50], password[50];
    printf("请输入用户名:");
    scanf("%49s", username);

    if (!isUsernameAvailable(username)) {
        printf("用户名已被占用,请选择其他用户名。\n");
        return;
    }

    if (userCount >= 100) {
        printf("用户数量已达最大限制,无法注册新用户。\n");
        return;
    }

    printf("请输入密码:");
    scanf("%49s", password);

    User newUser = {userCount + 1, "", "", 0};
    strcpy(newUser.username, username);
    strcpy(newUser.password, password);

    users[userCount++] = newUser;
    saveUsers();
    printf("注册成功!请登录。\n");
}

// 判断用户名是否可用
int isUsernameAvailable(const char *username) {
	int i=0;
    for (i = 0; i < userCount; i++) {
        if (strcmp(users[i].username, username) == 0) {
            return 0;
        }
    }
    return 1;
}

// 添加商品
void addProduct() {
    if (productCount >= 100) {
        printf("商品数量已达最大限制,无法添加新商品。\n");
        return;
    }

    Product newProduct;
    newProduct.id = productCount + 1;
    printf("请输入商品名称:");
    scanf("%49s", newProduct.name);
    newProduct.price = getDoubleInput("请输入商品价格:", 0.01, 10000.0);
    newProduct.stock = getIntegerInput("请输入商品库存:", 1, 1000);

    products[productCount++] = newProduct;
    saveProducts();
    printf("商品添加成功!\n");
    logAction("添加商品");
}

// 删除商品
void deleteProduct() {
    int id = getIntegerInput("请输入要删除的商品ID:", 1, productCount);
    int index = findProductById(id);
    if (index == -1) {
        printf("未找到该商品。\n");
        return;
    }

	int i=0;
    for (i = index; i < productCount - 1; i++) {
        products[i] = products[i + 1];
    }
    productCount--;
    saveProducts();
    printf("商品删除成功!\n");
    logAction("删除商品");
}

// 修改商品
void modifyProduct() {
    int id = getIntegerInput("请输入要修改的商品ID:", 1, productCount);
    int index = findProductById(id);
    if (index == -1) {
        printf("未找到该商品。\n");
        return;
    }

    printf("请输入新的商品名称(当前:%s):", products[index].name);
    scanf("%49s", products[index].name);
    products[index].price = getDoubleInput("请输入新的商品价格:", 0.01, 10000.0);
    products[index].stock = getIntegerInput("请输入新的商品库存:", 1, 1000);

    saveProducts();
    printf("商品修改成功!\n");
    logAction("修改商品");
}

// 查看商品
void viewProducts() {
    printf("\n商品列表:\n");
    printf("ID\t名称\t价格\t库存\n");
    int i=0;
    for (i = 0; i < productCount; i++) {
        printf("%d\t%s\t%.2f\t%d\n", products[i].id, products[i].name, products[i].price, products[i].stock);
    }
}

// 添加到购物车
void addToCart() {
    int id = getIntegerInput("请输入要购买的商品ID:", 1, productCount);
    int index = findProductById(id);
    if (index == -1) {
        printf("未找到该商品。\n");
        return;
    }

    int quantity = getIntegerInput("请输入购买数量:", 1, products[index].stock);
    products[index].stock -= quantity;

    cart[cartCount].product = products[index];
    cart[cartCount].quantity = quantity;
    cartCount++;

    printf("已添加到购物车!\n");
    saveProducts();
}

// 查看购物车  
void viewCart() {  
    printf("\n购物车:\n");  
    printf("名称\t数量\t单价\t总价\n");  
    double total = 0.0;  
    int i=0;
    for (i = 0; i < cartCount; i++) {  
        double cost = cart[i].quantity * cart[i].product.price;  
        printf("%s\t%d\t%.2f\t%.2f\n", cart[i].product.name, cart[i].quantity, cart[i].product.price, cost);  
        total += cost;  
    }  
    printf("总金额:%.2f\n", total);  
}  

// 结账  
void checkout() {  
    double total = 0.0;  
    printf("\n结账:\n");  
    viewCart();  

    if (cartCount == 0) {  
        printf("购物车是空的,无法结账。\n");  
        return;  
    }  

    printf("是否确认结账? (y/n): ");  
    char confirm;  
    scanf(" %c", &confirm);  
    if (tolower(confirm) != 'y') {  
        printf("已取消结账。\n");  
        return;  
    }  

    // 清空购物车  
    clearCart();  
    printf("结账成功!感谢您的购物。\n");  
}  

// 清空购物车  
void clearCart() {  
    cartCount = 0;  
    printf("购物车已清空。\n");  
}  

// 保存操作记录  
void logAction(const char *action) {  
     
    printf("操作记录: %s\n", action);  
}  

// 文件加载和保存功能  
void loadProducts() {  
    FILE *file = fopen(PRODUCT_FILE, "r");  
    if (file) {  
        while (fscanf(file, "%d%49s%lf%d", &products[productCount].id, products[productCount].name, &products[productCount].price, &products[productCount].stock) == 4) {  
            productCount++;  
        }  
        fclose(file);  
    }  
}  

void saveProducts() {  
    FILE *file = fopen(PRODUCT_FILE, "w");  
    int i=0;
    for (i = 0; i < productCount; i++) {  
        fprintf(file, "%d %s %.2f %d\n", products[i].id, products[i].name, products[i].price, products[i].stock);  
    }  
    fclose(file);  
}  

void loadUsers() {  
    FILE *file = fopen(USER_FILE, "r");  
    if (file) {  
        while (fscanf(file, "%d%49s%49s%d", &users[userCount].userID, users[userCount].username, users[userCount].password, &users[userCount].isAdmin) == 4) {  
            userCount++;  
        }  
        fclose(file);  
    }  
}  

void saveUsers() {  
    FILE *file = fopen(USER_FILE, "w");  
    int i=0;
    for (i = 0; i < userCount; i++) {  
        fprintf(file, "%d %s %s %d\n", users[i].userID, users[i].username, users[i].password, users[i].isAdmin);  
    }  
    fclose(file);  
}  

// 工具函数实现  
int findProductById(int id) {  
	int i=0;
    for (i = 0; i < productCount; i++) {  
        if (products[i].id == id) {  
            return i;  
        }  
    }  
    return -1;   
}  

void flushInput() {  
    while (getchar() != '\n'); 
}  

int getIntegerInput(const char *prompt, int min, int max) {  
    int value;  
    while (1) {  
        printf("%s ", prompt);  
        scanf("%d", &value);  
        if (value >= min && value <= max) {  
            flushInput(); 
            return value;  
        } else {  
            printf("输入无效,请输入%d到%d之间的数字。\n", min, max);  
        }  
    }  
}  

double getDoubleInput(const char *prompt, double min, double max) {  
    double value;  
    while (1) {  
        printf("%s ", prompt);  
        scanf("%lf", &value);  
        if (value >= min && value <= max) {  
            flushInput();   
            return value;  
        } else {  
            printf("输入无效,请输入大于%.2f并小于%.2f的数字。\n", min, max);  
        }  
    }  
}  

项目所在目录下增加两个文件

products.txt

在这里插入图片描述
文件内容

1 Apple 1.00 50  
2 Banana 0.50 100  
3 Orange 0.80 75  
4 Milk 1.20 30  
5 Bread 1.50 20  
users.txt

在这里插入图片描述
文件内容

1 admin adminpass 1  
2 user1 user1pass 0  
3 user2 user2pass 0  

网站公告

今日签到

点亮在社区的每一天
去签到