JLU酒水管理系统初步实现(2022级软院课设)

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, &currentCustomer);
			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, &currentCustomer, &drinkHead);
			statusCode = 1;
		}
	}
	return statusCode;
}

#endif

总结

这个系统写的比较急,很多方面实现的不是很好,但是后来我进行了修改,支持从文件读写,特定用户,特定时段打折,保质期等都实现了。

不过仅仅作为给入门同学作参考,这个代码量和工程已经足够复杂了,实际上,本人对C语言了解不深,只是基于简单的OOP的思想设计了这个系统。

有其他想法欢迎和我沟通。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值