#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