Data Structures 课设|XX订单管理系统(OMS)例程

发布时间:2024年01月15日

一、系统模块划分及功能介绍

1. 模块划分

本XX订单管理系统划分为用户(管理员)信息管理XX订单信息管理两个模块。“用户(管理员)信息管理”模块需要实现的功能主要有一级菜单渲染、用户注册及登录/退出;“XX订单信息管理”模块需要实现的功能主要有二级菜单渲染,对订单信息的增、删、改、查及系统的退出。

2. 功能介绍

① 菜单渲染(一级菜单–用户信息管理、二级菜单–订单信息管理);
② 用户登录功能;
② 用户注册功能;
③ 用户退出功能;
④ 添加订单信息:输入订单编号、订单名称、订单数量、订单价格、订单时间等信息,将其添加到二叉链表中;
⑤ 删除订单信息:根据订单编号,删除对应的订单信息;
⑥ 修改订单信息:根据订单编号查找,修改其订单名称等信息;
⑦ 查询订单信息:根据订单编号查找,输出订单详细信息;

二、数据结构选择

1. 用户(管理员)信息管理

在此模块选择的数据结构为顺序表,定义如下结构体:

//用户主体信息:用户名、密码
struct User{
	char name[20];
	char password[20];
};
//用户的数据存储结构 顺序表 
struct UserSeq{
	//存储的数据
	struct User users[200]; 
	//长度
	int length; 
}; 

2.XX订单信息管理

在此模块选择的数据结构为二叉排序树,定义如下结构体:

// 定义订单结构体
typedef struct Order {
    int id;//订单编号
    char product_name[50];//订单名称 
    int num; //订单数量 
    double amount;//订单金额 
    char time[20];//订单时间 
    struct Order *left;
    struct Order *right;
} Order;

三、功能实现

1.功能实现流程

图 3-1 功能实现流程图

2. 用户(管理员)信息管理

(1)注册

注册并将用户注册信息写入文件,这里涉及到文件操作
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");
}

(2)登录

登录后进入二级菜单
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");
	} 
	
}

(3)退出

用到switch语句,通过return跳出while循环中一级菜单的渲染,这里展示部分代码
case 3:
				system("cls");
				//退出 
				printf("Bye~");
				return;

3. 订单信息管理

(1)创建订单

// 创建新订单
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;
}

(2)添加订单

// 插入订单
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;
}

(3)删除订单

二叉排序树删除操作课程链接(YouTube)

// 查找最小节点
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;
}

(4)修改订单

// 修改订单
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);
    }
}

(5)查询订单

// 查询订单
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);//在右子树中递归找 
}

(6)输出订单

// 中序遍历打印订单
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);
}

(7)退出系统

case 6:
	            	system("cls");
	            	printf("欢迎您下次使用");
	                exit(0);

四、源码

1.源码列表

源码列表

2.源码资源链接(github)

oms课设源码(github)

五、运行及测试

1.一级菜单-用户信息管理

一级菜单-用户信息管理

2.用户注册

用户注册

3.用户登录

用户登录

4.用户退出

用户退出

5.添加订单

添加了3个订单信息

添加订单

6.删除订单

删除订单

7.修改订单

修改订单

8.查询订单

查询订单

9.输出订单

(1)输出

输出

(2)删除后输出

删除后输出

(3)修改后输出

修改后输出

10.程序退出

系统退出

文章来源:https://blog.csdn.net/weixin_74417136/article/details/135185002
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。