本XX订单管理系统划分为用户(管理员)信息管理和XX订单信息管理两个模块。“用户(管理员)信息管理”模块需要实现的功能主要有一级菜单渲染、用户注册及登录/退出;“XX订单信息管理”模块需要实现的功能主要有二级菜单渲染,对订单信息的增、删、改、查及系统的退出。
① 菜单渲染(一级菜单–用户信息管理、二级菜单–订单信息管理);
② 用户登录功能;
② 用户注册功能;
③ 用户退出功能;
④ 添加订单信息:输入订单编号、订单名称、订单数量、订单价格、订单时间等信息,将其添加到二叉链表中;
⑤ 删除订单信息:根据订单编号,删除对应的订单信息;
⑥ 修改订单信息:根据订单编号查找,修改其订单名称等信息;
⑦ 查询订单信息:根据订单编号查找,输出订单详细信息;
在此模块选择的数据结构为顺序表,定义如下结构体:
//用户主体信息:用户名、密码
struct User{
char name[20];
char password[20];
};
//用户的数据存储结构 顺序表
struct UserSeq{
//存储的数据
struct User users[200];
//长度
int length;
};
在此模块选择的数据结构为二叉排序树,定义如下结构体:
// 定义订单结构体
typedef struct Order {
int id;//订单编号
char product_name[50];//订单名称
int num; //订单数量
double amount;//订单金额
char time[20];//订单时间
struct Order *left;
struct Order *right;
} Order;
注册并将用户注册信息写入文件,这里涉及到文件操作
void registerUser(struct UserSeq* seq){
printf("请输入用户名:\n");
char name[20];
scanf("%s",&name);
printf("请输入密码:\n");
char password[20];
scanf("%s",&password);
//1、注册的信息写到顺序表中
strcpy(seq->users[seq->length].name,name);
strcpy(seq->users[seq->length].password,password);
seq->length++;
//2、注册信息往文件中追加一份
FILE* fp = fopen("users.txt","a");
fprintf(fp,"%s %s\n",name,password);
fclose(fp);
printf("注册成功!\n");
}
登录后进入二级菜单
void login(struct UserSeq* seq){
//1、需要输入用户名和密码
printf("请输入用户名:\n");
char name[20];
scanf("%s",&name);
printf("请输入密码:\n");
char password[20];
scanf("%s",&password);
//2、需要遍历seq顺序表,匹配用户输入的信息是否存在
int index = 0;
int flag = 0;//代表是否登录成功 0失败 1代表成功
for(index; index < seq->length; index++){
//判断用户输入的信息和顺序表当前index位置存储
//的用户信息是否匹配
if(strcmp(name,seq->users[index].name) == 0
&& strcmp(password,seq->users[index].password) == 0){
flag = 1;
break;
}
}
if(flag == 1){
//渲染二级菜单
printf("登录成功!\n");
Order *root = NULL;
while(1) {
printMenu02();//二级菜单
int choice, id, num;
double amount;
char product_name[50];
char time[20];
printf("请选择菜单项: ");
scanf("%d", &choice);
switch (choice) {
case 1:
system("cls");
printf("请输入您需要新增的订单详情:\n");
printf("订单编号:");
scanf("%d", &id);
printf("订单名称: ");
scanf("%s", product_name);
printf("订单数量: ");
scanf("%d", &num);
printf("订单金额: ");
scanf("%lf", &amount);
printf("订单时间: ");
scanf("%s", time);
root = insert_order(root, id, product_name, num, amount, time );
printf("新增完成!\n");
break;
case 2:
system("cls");
printf("请输入您需要删除的订单详情:\n");
printf("订单编号: ");
scanf("%d", &id);
// delete_order(root, id);
root = delete_order(root, id);
printf("删除完成!\n");
break;
case 3:
system("cls");
printf("请输入您需要修改的订单编号:\n");
printf("订单编号:");
scanf("%d", &id);
printf("订单名称: ");
scanf("%s", product_name);
printf("订单数量: ");
scanf("%d", &num);
printf("订单金额: ");
scanf("%lf", &amount);
printf("订单时间: ");
scanf("%s", time);
update_order(root, id, product_name, num, amount, time );
printf("修改完成!\n");
break;
case 4:
system("cls");
printf("请输入您需要查询的订单编号:\n");
printf("订单编号: ");
scanf("%d", &id);
root = search_order(root, id);
if (root != NULL) {
printf("订单编号: %d, 订单名称: %s, 订单数量: %d, 订单金额: %.2f元,订单时间:%s\n",
root->id, root->product_name, root->num, root->amount, root->time);
} else {
printf("很抱歉,未找到该订单!\n");
}
break;
case 5:
system("cls");
inorder_print(root);
printf("输出已完成!\n");
break;
case 6:
system("cls");
printf("欢迎您下次使用");
exit(0);
default:
printf("您选择的菜单有误,请重新选择!");
}
}
}else{
printf("用户名或者密码错误\n");
}
}
用到switch语句,通过return跳出while循环中一级菜单的渲染,这里展示部分代码
case 3:
system("cls");
//退出
printf("Bye~");
return;
// 创建新订单
Order* create_order(int id, char *product_name,
int num, double amount, char *time) {
//创建新的结点
Order *new_order = (Order *)malloc(sizeof(Order));
//将订单信息填入新结点
new_order->id = id;
strcpy(new_order->product_name, product_name);
new_order->num = num;
new_order->amount = amount;
strcpy(new_order->time, time);
//将当前结点左右孩子指针指向空(NULL)
new_order->left = NULL;
new_order->right = NULL;
//返回新结点
return new_order;
}
// 插入订单
Order* insert_order(Order *root, int id, char *product_name, int num, double amount, char *time) {
//该二叉排序树为空
if (root == NULL) {
// 则创建新结点
return create_order(id, product_name, num, amount, time);
}
// 要添加的订单编号<当前结点订单编号
if (id < root->id) {
// 则将其递归插入到当前结点的左子树
root->left = insert_order(root->left, id, product_name, num, amount, time);
} else if (id > root->id) {// 要添加的订单编号>当前结点订单编号
// 则将其递归插入到当前结点的右子树
root->right = insert_order(root->right, id, product_name, num, amount, time);
}
return root;
}
// 查找最小节点
Order* find_min(Order *root) {
while (root->left != NULL) {
root = root->left;
}
return root;
}
// 删除订单
Order* delete_order(Order *root, int id) {
if (root == NULL) return root;
if (id < root->id) {
root->left = delete_order(root->left, id);
} else if (id > root->id) {
root->right = delete_order(root->right, id);
} else {
if (root->left == NULL) {
Order *temp = root->right;
free(root);
return temp;
} else if (root->right == NULL) {
Order *temp = root->left;
free(root);
return temp;
}
Order *temp = find_min(root->right);
root->id = temp->id;
strcpy(root->product_name, temp->product_name);
root->num = temp->num;
root->amount = temp->amount;
strcpy(root->time, temp->time);
root->right = delete_order(root->right, temp->id);
}
return root;
}
// 修改订单
void update_order(Order *root, int id, char *product_name,
int num, double amount, char *time) {
if (root == NULL) return;
if (id < root->id) {
update_order(root->left, id, product_name, num, amount, time);
} else if (id > root->id) {
update_order(root->right, id, product_name, num, amount, time );
} else {
strcpy(root->product_name, product_name);
root->num = num;
root->amount = amount;
strcpy(root->time, time);
}
}
// 查询订单
Order* search_order(Order *root, int id) {
// 查找失败(结点为空(NULL),则返回NULL )
if (root == NULL )
return root;
// 查找成功 (要查找的订单编码==当前结点的订单编码 )
if(id == root->id)
return root;//返回当前结点
else if (id < root->id) //要查找的订单编码<当前结点的订单编码
return search_order(root->left, id);//在左子树中递归找
else//要查找的订单编码>当前结点的订单编码
return search_order(root->right, id);//在右子树中递归找
}
// 中序遍历打印订单
void inorder_print(Order *root) {
// 当前结点为空,则直接返回
if (root == NULL) return;
//先遍历左子树
inorder_print(root->left);
//遍历当前结点
printf("订单编号: %d, 订单名称: %s,订单数量:%d, 订单金额: %.2f元, 订单时间:%s\n",
root->id, root->product_name,root->num, root->amount, root->time);
//最后遍历右子树
inorder_print(root->right);
}
case 6:
system("cls");
printf("欢迎您下次使用");
exit(0);
添加了3个订单信息