JLU酒水管理系统初步实现
导言
各种管理系统显然是入门coding的经典选择,而由于本人某位JLU
的同学在完成该课设的过程中出现了一点问题,向本人求助,本人修完Bug以后顺便完成了他们的酒水系统的初步设计。现在一看,自己的代码能力相对于大一还是提高了的,感觉可以给同学们做一点参考。
当然,由于我没有看到完整的要求(我看到的要求我会放在下面),所以我只写了一个初步的版本,实现的功能在下面会给出总结。
欢迎零基础同学参考,指正和学习,不接受任何形式的copy。
欢迎访问我的blog,点这进入我的blog,你可以在里面找到本文及本人联系方式。
要求
- 请你的团队实现一个酒水批发管理系统,能够处理顾客购买需求,并同时维护库存管理。
- 完成管理系统的设计和实现工作。请按照人性化的方式设计具体功能,如:增加信息仅含有部分数据,灵活的数据输入方式,软件使用人员操作失误,用户希望的多样化的查询和统计方式,清晰美观的输出方式,合理划分为多个源文件。
- 参考样例
1)假定销售10种酒水:农夫山泉、汇源、青岛啤酒、舍得、五粮液等。每种酒水可能有不同口味、包装、销售价格。
例如农夫山泉品牌包括饮用水、以及茶π等各种饮料;不同厂家的饮用水可能也会细分为天然水、矿泉水、纯净水、弱碱水等;相同成分的酒水可能也包括不同单件容量(单件380ml或550ml等)或包装大小(每箱6件、12件或24件等)。
2)本题只考虑批发,不含零售。客户均为具体营业网点而非个人,需要管理客户信息,以区分不同级别的客户。商品包装类型以箱(或其他合理单位)为
主。但由于可能涉及退换货,也需要考虑包装细节。
3)对于不同等级的客户、不同促销时段,设置不同的价格,可能含有赠品。
4)批发过程中,会出现一定的损耗(如外包装破损、箱内个别单件损坏等因素造成的打折出售或归为赠品)。 - 我没有完全按照要求实现,避免出现抄袭(笑)
IDE
小熊猫c++
download: https://royqh1979.gitee.io/redpandacpp/
非常适合入门的同学使用,不需要配置环境变量等,支持代码补全。
大致设计
界面
基于命令行实现,通过输入数字进行选择。
菜单的设计
我设计了如下的菜单页面
支持4个系统的选择,通过输入相应数据进入相关功能。
销售系统的设计
这里实现一个简单的设计,暂时不包括打折。
系统先展示现在的酒水和库存,并且请求用户进行登录。
如果登录成功,且购买订单合理,则可以进行购买行为,否则响应异常,返回菜单。
库存系统的设计
系统展示现在的酒水和库存即可。
会员系统的设计
我设计了如下的菜单页面
可以进行选择。
然后可以根据登录的账号的不同,进行查询信息和修改密码,与此同时,我们可以进行账号的注册和注销。![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/bffa2350645701a2d33866a946129a45.png#pic_center
退货系统的设计
我们先进行用户的验证,然后根据订单号检索订单,如果订单存在且属于登录的用户,那么我们可以完成退货。(注意库存的增加)
核心结构体设计
定义了几个结构体和链表,用于管理一个酒水店的库存、客户和订单信息。其中,结构体包括饮品(Drink)、客户(Customer)和订单(Order),链表包括饮品库存(DrinkNode)、客户信息(CustomerNode)和订单信息(OrderNode)。以下是各结构体的属性:
Drink
:品牌、口味、包装、单价、库存数量等Customer
:编号、名称、联系人、联系电话、级别、密码等Order
:编号、客户信息、饮品信息、数量、单价等DrinkNode
:饮品信息链表节点等CustomerNode
:客户信息链表节点等OrderNode
:订单信息、状态等
我们可以使用这些结构体实现上面的功能。
核心函数设计
在菜单中我设计了下面的函数:
initDrinkList
:初始化饮品链表initCustomerList
:初始化顾客链表initOrderList
:初始化订单链表addDrink
:将饮品添加到饮品链表的尾部addCustomer
:将顾客添加到顾客链表的尾部addOrder
:将订单添加到订单链表的尾部deleteDrink
:从饮品链表中删除指定饮品deleteCustomer
:从顾客链表中删除指定顾客deleteOrder
:从订单列表中删除特定订单findCustomerByName
:根据输入的用户名判断用户是否存在,若存在返回该用户节点指针findDrinkByName
:根据输入的饮品品牌判断饮品是否存在,若存在返回该饮品节点指针
其他系统基于这些函数和结构体实现。
各模块实际代码
sys_manage.c
主程序
#include "sys_manage.h"
#include "sys_sale.h"
#include "sys_stock.h"
#include "sys_vip.h"
#include "sys_return.h"
int main(){
// 初始化饮品链表
DrinkNode *drinkList;
initDrinkList(&drinkList);
// 初始化顾客链表
CustomerNode *customerList;
initCustomerList(&customerList);
// 初始化订单链表
OrderNode *orderList;
initOrderList(&orderList);
// 添加三名顾客到顾客链表中
Customer customer1 = {1, "张三", "张经理", "13912345678", 1, "123456"};
addCustomer(&customerList, customer1);
Customer customer2 = {2, "李四", "李经理", "13987654321", 2, "654321"};
addCustomer(&customerList, customer2);
Customer customer3 = {3, "王五", "王经理", "13812345678", 3, "111111"};
addCustomer(&customerList, customer3);
// 展示所有顾客信息
showAllCustomers(customerList);
// 添加三种酒水
Drink d1 = {"Budweiser", "Lager", "Can", 2.5, 100};
addDrink(&drinkList, d1, 100);
Drink d2 = {"Corona", "Lager", "Bottle", 3.0, 50};
addDrink(&drinkList, d2, 50);
Drink d3 = {"Jack Daniel's", "Whiskey", "Bottle", 30.0, 10};
addDrink(&drinkList, d3, 10);
while(1){
system("cls");
printf("|--------欢迎使用管理系统--------|\n");
printf("| 1--销售系统 |\n");
printf("|--------------------------------|\n");
printf("| 2--库存系统 |\n");
printf("|--------------------------------|\n");
printf("| 3--会员系统 |\n");
printf("|--------------------------------|\n");
printf("| 4--退货系统 |\n");
printf("|--------------------------------|\n");
printf("| 5--退出系统 |\n");
printf("|--------------------------------|\n");
printf(" 请选择:");
int chooseSys = 0;
scanf("%d",&chooseSys);
int statusCode;
switch (chooseSys) {
case 1:
statusCode = sys_sale(drinkList,orderList,customerList);
switch (statusCode) {
case 1:
printf("操作成功,返回系统菜单界面\n");
break;
case 2:
printf("顾客未找到,请试着重新操作\n");
break;
case 3:
printf("密码错误,请试着重新操作\n");
break;
default:
printf("出现未知错误\n");
break;
}
system("pause");
break;
case 2:
statusCode = sys_stock(drinkList);
if(statusCode == 1){
printf("以上是酒水的库存\n");
}
else{
printf("库存中没有任何酒水\n");
}
system("pause");
break;
case 3:
statusCode = sys_vip(drinkList,orderList,customerList);
if(statusCode == 0)
printf("异常退出会员界面\n");
else
printf("正常返回到菜单\n");
system("pause");
break;
case 4:
statusCode = sys_return(orderList,customerList,drinkList);
switch (statusCode) {
case 1:
printf("操作成功,返回系统菜单界面\n");
break;
case 2:
printf("顾客未找到,请试着重新操作\n");
break;
case 3:
printf("密码错误,请试着重新操作\n");
break;
default:
printf("出现未知错误\n");
break;
}
system("pause");
break;
case 5:
exit(0);
default:
printf("输入无效\n");
system("pause");
break;
}
}
return 0;
}
sys_manage.h
核心结构体和函数所在的头文件
部分函数没有给出具体实现,想要完整版本联系我本人。
#ifndef SYS_MANAGE_H
#define SYS_MANAGE_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
// 表示酒水的结构体,包括品牌、口味、包装、单价、库存等属性
typedef struct Drink {
char brand[50];
char flavor[50];
char packaging[50];
double price;
int stock;
} Drink;
// 表示客户的结构体,包括客户编号、客户名称、联系人、联系电话、客户级别等属性
typedef struct Customer {
int id;
char name[50];
char contact[50];
char phone[20];
int level;
char password[20];
} Customer;
// 表示订单的结构体,包括订单编号、客户信息、酒水信息、数量、单价等属性
typedef struct Order {
int id;
Customer customer;
Drink drink;
int quantity;
double price;
} Order;
// 一个链表结构体表示酒水库存,每个节点表示一种酒水,包括酒水信息、库存数量等属性
typedef struct DrinkNode {
Drink drink;
int quantity;
struct DrinkNode *next;
} DrinkNode;
// 一个链表结构体表示客户信息,每个节点表示一个客户,包括客户信息、订单信息等属性
typedef struct CustomerNode {
Customer customer;
Order order;
struct CustomerNode *next;
} CustomerNode;
// 一个链表结构体表示订单信息,每个节点表示一个订单,包括订单信息、订单状态等属性
typedef struct OrderNode {
Order order;
int status;
struct OrderNode *next;
} OrderNode;
/***************************************************************
@brief 初始化饮品链表
@param head 饮品链表头节点的地址
**************************************************************/
void initDrinkList(DrinkNode **head) {
*head = NULL;
}
/***************************************************************
@brief 初始化顾客链表
@param head 顾客链表头节点的地址
**************************************************************/
void initCustomerList(CustomerNode **head) {
*head = NULL;
}
/***************************************************************
@brief 初始化订单链表
@param head 订单链表头节点的地址
**************************************************************/
void initOrderList(OrderNode **head) {
*head = NULL;
}
/***************************************************************
@brief 添加饮品到饮品链表尾部
@param head 饮品链表头节点的地址
@param drink 待添加的饮品
@param quantity 待添加的饮品数量
**************************************************************/
void addDrink(DrinkNode **head, Drink drink, int quantity) {
DrinkNode *newNode = (DrinkNode*)malloc(sizeof(DrinkNode));
newNode->drink = drink;
newNode->quantity = quantity;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
return;
}
DrinkNode *temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
/***************************************************************
@brief 添加顾客到顾客链表尾部
@param head 顾客链表头节点的地址
@param customer 待添加的顾客
**************************************************************/
void addCustomer(CustomerNode **head, Customer customer) {
CustomerNode *newNode = (CustomerNode*)malloc(sizeof(CustomerNode));
newNode->customer = customer;
newNode->order = (Order) {
0
};
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
return;
}
CustomerNode *temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
/***************************************************************
@brief 添加订单到订单链表尾部
@param head 订单链表头节点的地址
@param order 待添加的订单
**************************************************************/
void addOrder(OrderNode **head, Order order) {
OrderNode *newNode = (OrderNode*)malloc(sizeof(OrderNode));
newNode->order = order;
newNode->status = 0;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
return;
}
OrderNode *temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
/***************************************************************
@brief 从饮品链表中删除指定饮品
@param head 饮品链表头节点的地址
@param drink 待删除的饮品
**************************************************************/
void deleteDrink(DrinkNode **head, Drink drink);
/***************************************************************
@brief 从顾客链表中删除指定顾客
@param head 顾客链表头节点的地址
@param customer 待删除的顾客
**************************************************************/
void deleteCustomer(CustomerNode **head, Customer customer);
/***************************************************************
@brief 从订单列表中删除特定订单
@param head 指向订单链表头指针的指针
@param order 要删除的订单
**************************************************************/
void deleteOrder(OrderNode **head, int orderid) {
OrderNode *temp = *head;
OrderNode *prev = NULL;
while (temp != NULL) {
if (temp->order.id == orderid) {
if (prev == NULL) {
*head = temp->next;
} else {
prev->next = temp->next;
}
free(temp);
return;
}
prev = temp;
temp = temp->next;
}
}
/***************************************************************
@brief 根据输入的用户名判断用户是否存在,若存在返回该用户节点指针
@param head 顾客链表头结点
@param name 待查找的用户名
@return 若用户存在则返回该用户节点,否则返回 NULL
**************************************************************/
CustomerNode* findCustomerByName(CustomerNode *head, char *name) {
CustomerNode *current = head; // 从头节点开始遍历
while (current != NULL) {
if (strcmp(current->customer.name, name) == 0) { // 比较用户名
return current; // 存在则返回该节点指针
}
current = current->next; // 遍历下一个节点
}
return NULL; // 未找到则返回 NULL
}
/***************************************************************
@brief 根据输入的饮品品牌判断饮品是否存在,若存在返回该饮品节点指针
@param head 饮品链表头结点
@param brand 待查找的饮品品牌
@return 若饮品存在则返回该饮品节点,否则返回 NULL
*************************************************************/
DrinkNode* findDrinkByName(DrinkNode *head, char *brand) {
DrinkNode *current = head; // 从头节点开始遍历
while (current != NULL) {
if (strcmp(current->drink.brand, brand) == 0) { // 比较饮品品牌
return current; // 存在则返回该节点指针
}
current = current->next; // 遍历下一个节点
}
return NULL; // 未找到则返回 NULL
}
#endif
sys_sale.h
销售系统所在的头文件
#ifndef SYS_SALE_H
#define SYS_SALE_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sys_manage.h"
/***************************************************************
@brief 顾客下订单并消费
@param drinkHead 饮品链表头结点
@param orderHead 订单链表头结点
@param customerNode 指向当前顾客结点的指针
**************************************************************/
void placeOrder(DrinkNode *drinkHead, OrderNode **orderHead, CustomerNode **customerNode) {
// 询问客户想要的饮品
printf("请输入想要的饮品品牌:\n");
char brand[50];
scanf("%s", brand);
// 查找饮品是否存在
DrinkNode *drinkNode = drinkHead;
while (drinkNode != NULL) {
if (strcmp(drinkNode->drink.brand, brand) == 0) {
break;
}
drinkNode = drinkNode->next;
}
if (drinkNode == NULL) {
printf("很抱歉,我们没有该饮品。\n");
return;
}
// 询问客户想要购买的数量
printf("请输入购买数量:\n");
int quantity;
scanf("%d", &quantity);
// 检查库存是否足够
if (drinkNode->quantity < quantity) {
printf("很抱歉,库存不足。\n");
return;
}
// 计算订单总价
double totalPrice = drinkNode->drink.price * quantity;
// 生成订单编号
static int orderId = 1;
// 创建订单
Order order = {
.id = orderId++,
.customer = (*customerNode)->customer,
.drink = drinkNode->drink,
.quantity = quantity,
.price = totalPrice
};
// 更新饮品库存
drinkNode->quantity -= quantity;
// 添加订单到订单链表
addOrder(orderHead, order);
// 更新顾客的订单信息
(*customerNode)->order = order;
// 输出订单信息
printf("下单成功!订单编号:%d,饮品:%s,数量:%d,总价:%.2lf。\n", order.id, order.drink.brand, order.quantity, order.price);
}
/***************************************************************
@brief 展示所有酒水信息
@param head 酒水链表头结点
**************************************************************/
void showAllDrinks(DrinkNode *head) {
DrinkNode *current = head;
while (current != NULL) {
printf("***************************************************************\n");
printf("品牌:%s\t", current->drink.brand);
printf("口味:%s\t", current->drink.flavor);
printf("包装:%s\t", current->drink.packaging);
printf("单价:%.2lf元\t", current->drink.price);
printf("库存:%d瓶\n", current->quantity);
printf("***************************************************************\n");
current = current->next;
}
}
/***************************************************************
@brief 消费系统入口
@param drinkhead 酒水链表头结点
@param orderHead 订单链表头结点
**************************************************************/
int sys_sale(DrinkNode* drinkHead, OrderNode* orderHead, CustomerNode* customerHead) {
int statusCode = 1;
showAllDrinks(drinkHead);
printf("请输入客户名\n");
char name[50];
scanf("%s", name);
CustomerNode* currentCustomer = findCustomerByName(customerHead, name);
if (currentCustomer == NULL) {
statusCode = 2;
} else {
char password[20];
printf("请输入密码\n");
scanf("%s", password);
if (strcmp(currentCustomer->customer.password, password) != 0 ) {
statusCode = 3;
} else {
placeOrder(drinkHead, &orderHead, ¤tCustomer);
statusCode = 1;
}
return statusCode;
}
}
#endif
sys_stock.h
库存系统所在的头文件
#ifndef SYS_STOCK_H
#define SYS_STOCK_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sys_manage.h"
#include "sys_sale.h"
/***************************************************************
@brief 库存系统入口
@param drinkhead 酒水链表头结点
**************************************************************/
int sys_stock(DrinkNode* drinkHead) {
int statusCode = 1;
if (drinkHead != NULL)
showAllDrinks(drinkHead);
else
statusCode = 0;
return statusCode;
}
#endif
sys_vip.h
会员系统所在的头文件
#ifndef SYS_VIP_H
#define SYS_VIP_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sys_manage.h"
/***************************************************************
@brief 展示所有顾客信息
@param head 指向链表头节点指针的指针
**************************************************************/
void showAllCustomers(CustomerNode *head) {
CustomerNode *current = head;
while (current != NULL) {
printf("编号:%d\t", current->customer.id);
printf("名称:%s\t", current->customer.name);
printf("联系人:%s\t", current->customer.contact);
printf("电话:%s\t", current->customer.phone);
printf("等级:%d级\n", current->customer.level);
current = current->next;
}
}
/***************************************************************
@brief 根据输入的用户名查询该用户的信息并展示
@param head 顾客链表头结点
@return 若用户存在则返回 1,否则返回 0
**************************************************************/
int searchCustomerByName(CustomerNode *head) {
int statusCode;
printf("请输入客户名\n");
char name[50];
scanf("%s", name);
CustomerNode *targetNode = findCustomerByName(head, name); // 查找该用户
if (targetNode != NULL) { // 如果找到该用户
char password[20];
printf("请输入密码\n");
scanf("%s", password);
if (strcmp(targetNode->customer.password, password) != 0 ) {
statusCode = 3;
} else {
printf("编号:%d\t", targetNode->customer.id);
printf("名称:%s\t", targetNode->customer.name);
printf("联系人:%s\t", targetNode->customer.contact);
printf("电话:%s\t", targetNode->customer.phone);
printf("等级:%d级\n", targetNode->customer.level);
statusCode = 1; // 返回1表示操作成功
}
} else { // 如果未找到该用户
statusCode = 2; // 返回0表示该用户不存在
}
return statusCode;
}
/***************************************************************
@brief 根据输入的用户名修改该用户的密码
@param head 顾客链表头结点
@return 若用户存在则返回 1,否则返回 0
**************************************************************/
int modifyCustomerPassword(CustomerNode *head) {
int statusCode;
printf("请输入客户名\n");
char name[50];
scanf("%s", name);
CustomerNode *targetNode = findCustomerByName(head, name); // 查找该用户
if (targetNode != NULL) { // 如果找到该用户
char oldPassword[20], newPassword[20], newPasswordConfirm[20];
printf("请输入旧密码\n");
scanf("%s", oldPassword);
if (strcmp(targetNode->customer.password, oldPassword) != 0 ) {
statusCode = 3; // 返回3表示密码错误
} else {
printf("请输入新密码\n");
scanf("%s", newPassword);
printf("请再次输入新密码\n");
scanf("%s", newPasswordConfirm);
if (strcmp(newPassword, newPasswordConfirm) != 0) {
statusCode = 4; // 返回4表示两次输入密码不一致
} else {
strcpy(targetNode->customer.password, newPassword); // 修改用户密码
statusCode = 1; // 返回1表示操作成功
}
}
} else { // 如果未找到该用户
statusCode = 2; // 返回2表示该用户不存在
}
return statusCode;
}
/***************************************************************
@brief 向顾客链表中添加新顾客
@param head 顾客链表头节点的地址
@return 若添加成功则返回 1,否则返回 0
**************************************************************/
int addNewCustomer(CustomerNode **head) {
Customer newCustomer;
printf("\n请输入顾客编号:");
scanf("%d", &newCustomer.id);
printf("\n请输入顾客姓名:");
scanf("%s", newCustomer.name);
printf("\n请输入联系人:");
scanf("%s", newCustomer.contact);
printf("\n请输入联系电话:");
scanf("%s", newCustomer.phone);
printf("\n请输入顾客级别:");
scanf("%d", &newCustomer.level);
printf("\n请输入密码:");
scanf("%s", newCustomer.password);
// 创建新的顾客节点
CustomerNode *newNode = (CustomerNode*)malloc(sizeof(CustomerNode));
newNode->customer = newCustomer;
newNode->order = (Order) {
0
};
newNode->next = NULL;
// 如果链表为空,将头节点指向新节点
if (*head == NULL) {
*head = newNode;
return 1;
}
// 在链表末尾添加新节点
CustomerNode *temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
return 1;
}
/***************************************************************
@brief 会员系统入口
@param drinkhead 酒水链表头结点
@param orderHead 订单链表头结点
**************************************************************/
int sys_vip(DrinkNode* drinkHead, OrderNode* orderHead, CustomerNode* customerHead) {
while (1) {
system("cls");
printf("|--------欢迎进入会员管理--------|\n");
printf("| 1--查询信息 |\n");
printf("|--------------------------------|\n");
printf("| 2--修改密码 |\n");
printf("|--------------------------------|\n");
printf("| 3--注册账号 |\n");
printf("|--------------------------------|\n");
printf("| 4--注销账号 |\n");
printf("|--------------------------------|\n");
printf("| 5--返回菜单 |\n");
printf("|--------------------------------|\n");
printf(" 请选择:");
int ModuleIndex;
scanf("%d", &ModuleIndex);
if (ModuleIndex == 1) {
int statusCode1 = searchCustomerByName(customerHead);
switch (statusCode1) {
case 1:
printf("操作成功,返回会员管理界面\n");
break;
case 2:
printf("顾客未找到,请试着重新操作\n");
break;
case 3:
printf("密码错误,请试着重新操作\n");
break;
default:
printf("出现未知错误\n");
break;
}
system("pause");
}
if (ModuleIndex == 2) {
int statusCode2 = modifyCustomerPassword(customerHead);
switch (statusCode2) {
case 1:
printf("操作成功,返回会员管理界面\n");
break;
case 2:
printf("顾客未找到,请试着重新操作\n");
break;
case 3:
printf("密码错误,请试着重新操作\n");
break;
default:
printf("出现未知错误\n");
break;
}
system("pause");
}
if (ModuleIndex == 3) {
int statusCode3 = addNewCustomer(&customerHead);
switch (statusCode3) {
case 0:
printf("添加失败\n");
break;
case 1:
printf("添加成功\n");
break;
default:
printf("出现未知错误\n");
break;
}
system("pause");
}
if (ModuleIndex == 5){
return 1;
}
}
return 0;
}
#endif
sys_return.h
退货系统所在的头文件
#ifndef SYS_RETURN_H
#define SYS_RETURN_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sys_manage.h"
/***************************************************************
@brief 顾客退货
@param orderHead 订单链表头结点
@param customerNode 指向当前顾客结点的指针
**************************************************************/
void returnOrder(OrderNode *orderHead, CustomerNode **customerNode, DrinkNode ** drinkHead) {
// 询问客户要退货的订单编号
printf("请输入要退货的订单编号:\n");
int orderId;
scanf("%d", &orderId);
// 查找订单是否存在
OrderNode *orderNode = orderHead;
while (orderNode != NULL) {
printf("%d",orderNode->order.id);
if (orderNode->order.id == orderId) {
break;
}
orderNode = orderNode->next;
}
if (orderNode == NULL) {
printf("很抱歉,订单不存在。\n");
return;
}
// 检查订单是否属于当前顾客
if (strcmp(orderNode->order.customer.name, (*customerNode)->customer.name) != 0) {
printf("很抱歉,您无法退货该订单。\n");
return;
}
// 更新饮品库存
DrinkNode *drinkNode = findDrinkByName(*drinkHead, orderNode->order.drink.brand);
drinkNode->quantity += orderNode->order.quantity;
// 更新订单链表
deleteOrder(&orderHead, orderId);
// 更新顾客的订单信息
(*customerNode)->order.id = 0;
(*customerNode)->order.quantity = 0;
(*customerNode)->order.price = 0;
// 输出退货信息
printf("退货成功!订单编号:%d,饮品:%s,数量:%d,总价:%.2lf。\n", orderNode->order.id, orderNode->order.drink.brand, orderNode->order.quantity, orderNode->order.price);
}
/***************************************************************
@brief 退货系统入口
@param orderHead 订单链表头结点
@param customerHead 顾客链表头结点
**************************************************************/
int sys_return(OrderNode* orderHead, CustomerNode* customerHead, DrinkNode * drinkHead) {
int statusCode = 1;
printf("请输入客户名:\n");
char name[50];
scanf("%s", name);
CustomerNode* currentCustomer = findCustomerByName(customerHead, name);
if (currentCustomer == NULL) {
statusCode = 2;
} else {
char password[20];
printf("请输入密码:\n");
scanf("%s", password);
if (strcmp(currentCustomer->customer.password, password) != 0 ) {
statusCode = 3;
} else {
returnOrder(orderHead, ¤tCustomer, &drinkHead);
statusCode = 1;
}
}
return statusCode;
}
#endif
总结
这个系统写的比较急,很多方面实现的不是很好,但是后来我进行了修改,支持从文件读写,特定用户,特定时段打折,保质期等都实现了。
不过仅仅作为给入门同学作参考,这个代码量和工程已经足够复杂了,实际上,本人对C语言了解不深,只是基于简单的OOP的思想设计了这个系统。
有其他想法欢迎和我沟通。