summary 19 vs2017中scanf的不安全问题

解决方法:

1.在代码首行加上 #define _CRT_SECURE_NO_WARNINGS

2.在项目properties --> C/C++ --> preprocesor  --> preprocessor definitions  -->加上 _CRT_SECURE_NO_WARNINGS。

#include "user.h" // 生成唯一ID函数 static int generate_product_id() { static int counter = 1000; return ++counter; } /* 新增农产品 */ Product* operator_add_product(Product* head) { Product* new_node = (Product*)malloc(sizeof(Product)); if (!new_node) { printf("内存分配失败!\n"); return head; } printf("请输入产品ID: "); scanf("%d", &new_node->id); getchar(); // 清空输入缓冲区 printf("请输入产品名称: "); fgets(new_node->name, 30, stdin); new_node->name[strcspn(new_node->name, "\n")] = '\0'; // 去除换行符 printf("请输入产品类型: "); fgets(new_node->type, 20, stdin); new_node->type[strcspn(new_node->type, "\n")] = '\0'; printf("请输入价格: "); scanf("%f", &new_node->price); printf("请输入库存数量: "); scanf("%d", &new_node->stock_quantity); getchar(); printf("请输入产品描述: "); fgets(new_node->description, 100, stdin); new_node->description[strcspn(new_node->description, "\n")] = '\0'; new_node->next = head; return new_node; }//添加农产品 Product* operator_delete_product(Product* head, int target_id) { Product *current = head, *prev = NULL; while (current) { if (current->id == target_id) { if (prev) { prev->next = current->next; } else { head = current->next; } free(current); printf("成功删除ID为%d的产品\n", target_id); return head; } prev = current; current = current->next; } printf("未找到ID为%d的产品\n", target_id); return head; }//删除农产品 void operator_search_product(Product* head, int target_id) { Product* current = head; while (current) { if (current->id == target_id) { printf("\n=== 产品详情 ===\n"); printf("ID: %d\n", current->id); printf("名称: %s\n", current->name); printf("类型: %s\n", current->type); printf("价格: %.2f\n", current->price); printf("库存: %d\n", current->stock_quantity); printf("描述: %s\n", current->description); return; } current = current->next; } printf("未找到ID为%d的产品\n", target_id); }//查询农产品 void operator_modify_product(Product* head, int target_id) { Product* current = head; while (current) { if (current->id == target_id) { printf("请输入新的产品名称: "); fgets(current->name, 30, stdin); current->name[strcspn(current->name, "\n")] = '\0'; printf("请输入新的产品类型: "); fgets(current->type, 20, stdin); current->type[strcspn(current->type, "\n")] = '\0'; printf("请输入新的价格: "); scanf("%f", &current->price); printf("请输入新的库存数量: "); scanf("%d", &current->stock_quantity); getchar(); printf("请输入新的产品描述: "); fgets(current->description, 100, stdin); current->description[strcspn(current->description, "\n")] = '\0'; printf("产品信息更新成功!\n"); return; } current = current->next; } printf("未找到ID为%d的产品\n", target_id); }//修改农产品 void operator_statistics(Product* head) { float total_value = 0; int total_quantity = 0; Product* current = head; while (current) { total_quantity += current->stock_quantity; total_value += current->stock_quantity * current->price; current = current->next; } printf("\n=== 统计结果 ===\n"); printf("总库存数量: %d\n", total_quantity); printf("总库存价值: %.2f\n", total_value); }//统计农产品 void operator_summary(Product* head) { printf("\n=== 产品汇总 ===\n"); Product* current = head; int count = 1; while (current) { printf("%d. [ID:%d] %s (%s) 库存:%d\n", count++, current->id, current->name, current->type, current->stock_quantity); current = current->next; } if (count == 1) { printf("当前没有产品记录\n"); } }//汇总农产品 Member* operator_add_member(Member* head) { Member* new_mem = (Member*)malloc(sizeof(Member)); if (!new_mem) { printf("内存分配失败!\n"); return head; } // 输入编号 printf("请输入社员编号: "); scanf("%d", &new_mem->id); getchar(); // 清除输入缓冲区 // 输入姓名 printf("请输入姓名: "); fgets(new_mem->name, sizeof(new_mem->name), stdin); new_mem->name[strcspn(new_mem->name, "\n")] = '\0'; // 输入身份证号 printf("请输入身份证号: "); fgets(new_mem->id_card, sizeof(new_mem->id_card), stdin); new_mem->id_card[strcspn(new_mem->id_card, "\n")] = '\0'; // 输入手机号 printf("请输入手机号: "); fgets(new_mem->phone, sizeof(new_mem->phone), stdin); new_mem->phone[strcspn(new_mem->phone, "\n")] = '\0'; // 输入加入日期 printf("请输入加入日期: "); fgets(new_mem->join_date, sizeof(new_mem->join_date), stdin); new_mem->join_date[strcspn(new_mem->join_date, "\n")] = '\0'; // 插入链表头部 new_mem->next = head; return new_mem; }//增加社员 Member* operator_delete_member(Member* head, int target_id) { if (!head) { printf("当前没有社员记录\n"); return NULL; } Member *curr = head, *prev = NULL; while (curr) { if (curr->id == target_id) { if (prev) { prev->next = curr->next; } else { head = curr->next; } free(curr); printf("成功删除社员%d\n", target_id); return head; } prev = curr; curr = curr->next; } printf("未找到社员%d\n", target_id); return head; }//删除社员 void operator_modify_member(Member* head, int target_id) { Member* curr = head; while (curr) { if (curr->id == target_id) { printf("\n=== 修改社员 %d ===\n", target_id); printf("1. 修改姓名\n2. 修改手机号\n3. 修改入股金额\n4. 修改作物信息\n请选择: "); int choice; scanf("%d", &choice); getchar(); switch(choice) { case 1: printf("新姓名: "); fgets(curr->name, 30, stdin); curr->name[strcspn(curr->name, "\n")] = '\0'; break; case 2: printf("新手机号: "); fgets(curr->phone, 12, stdin); curr->phone[strcspn(curr->phone, "\n")] = '\0'; break; case 3: printf("新入股金额: "); scanf("%f", &curr->investment); getchar(); break; case 4: printf("新作物信息: "); fgets(curr->crops, 50, stdin); curr->crops[strcspn(curr->crops, "\n")] = '\0'; break; default: printf("无效选择\n"); } return; } curr = curr->next; } printf("未找到社员%d\n", target_id); }//修改社员信息 void print_member_details(Member* m); void operator_search_member(Member* head, int mode) { if (!head) { printf("当前没有社员记录\n"); return; } printf("\n=== 查询方式 ===\n"); printf("1.按编号查询\n2.按姓名查询\n请选择: "); scanf("%d", &mode); getchar(); char search_key[30]; int found = 0; if (mode == 1) { printf("请输入社员编号: "); int target_id; scanf("%d", &target_id); getchar(); Member* curr = head; while (curr) { if (curr->id == target_id) { print_member_details(curr); found = 1; break; } curr = curr->next; } } else if (mode == 2) { printf("请输入社员姓名: "); fgets(search_key, 30, stdin); search_key[strcspn(search_key, "\n")] = '\0'; Member* curr = head; while (curr) { if (strcmp(curr->name, search_key) == 0) { print_member_details(curr); found = 1; } curr = curr->next; } } if (!found) printf("未找到匹配记录\n"); } // 辅助打印函数 void print_member_details(Member* m) { printf("\n=== 社员详情 ===\n"); printf("编号: %d\n", m->id); printf("姓名: %s\n", m->name); printf("身份证: %s\n", m->id_card); printf("手机号: %s\n", m->phone); printf("入股金额: %.2f\n", m->investment); printf("种植作物: %s\n", m->crops); printf("加入日期: %s\n", m->join_date); }//查询社员 void operator_statistics_member(Member* head) { if (!head) { printf("当前没有社员记录\n"); return; } int total = 0; float total_invest = 0; Member* curr = head; while (curr) { total++; total_invest += curr->investment; curr = curr->next; } printf("\n=== 统计结果 ===\n"); printf("总社员数: %d\n", total); printf("总入股金额: %.2f\n", total_invest); printf("平均入股金额: %.2f\n", total_invest/total); }//统计社员信息 void operator_summary_member(Member* head) { if (!head) { printf("当前没有社员记录\n"); return; } printf("\n=== 社员汇总 ===\n"); printf("%-6s%-15s%-12s%-20s\n", "ID", "姓名", "手机号", "入股金额"); Member* curr = head; while (curr) { printf("%-6d%-15s%-12s%-20.2f\n", curr->id, curr->name, curr->phone, curr->investment); curr = curr->next; } }//汇总社员信息 // 添加库存记录 void operator_add_inventory_record() { InventoryRecord* new_record = (InventoryRecord*)malloc(sizeof(InventoryRecord)); if (!new_record) { printf("内存分配失败!\n"); return; } // 自动生成记录ID static int last_id = 0; new_record->record_id = ++last_id; // 输入基本信息 printf("输入农产品编号: "); scanf("%d", &new_record->product_id); getchar(); printf("选择操作类型(0-入库 1-出库 2-损耗): "); int type; scanf("%d", &type); new_record->op_type = (OperationType)type; getchar(); printf("输入变动数量: "); scanf("%d", &new_record->quantity); getchar(); printf("输入操作日期(YYYY-MM-DD): "); fgets(new_record->date, sizeof(new_record->date), stdin); new_record->date[strcspn(new_record->date, "\n")] = '\0'; printf("输入操作员姓名: "); fgets(new_record->operator, sizeof(new_record->operator), stdin); new_record->operator[strcspn(new_record->operator, "\n")] = '\0'; // 插入链表头部 new_record->next = inventory_head; inventory_head = new_record; printf("记录添加成功!\n"); } // 删除库存记录 void operator_delete_inventory_record(int target_id) { InventoryRecord *current = inventory_head, *prev = NULL; while (current) { if (current->record_id == target_id) { if (prev) { prev->next = current->next; } else { inventory_head = current->next; } free(current); printf("记录%d已删除!\n", target_id); return; } prev = current; current = current->next; } printf("未找到记录%d!\n", target_id); } // 修改库存记录 void operator_modify_inventory_record(int target_id) { InventoryRecord* current = inventory_head; while (current) { if (current->record_id == target_id) { printf("修改数量(当前值%d,直接回车跳过): ", current->quantity); char input[20]; fgets(input, sizeof(input), stdin); if (strlen(input) > 1) { current->quantity = atoi(input); } printf("修改日期(当前值%s): ", current->date); fgets(input, sizeof(input), stdin); if (strlen(input) > 1) { strncpy(current->date, input, 10); current->date[10] = '\0'; } printf("记录%d修改完成!\n", target_id); return; } current = current->next; } printf("未找到记录%d!\n", target_id); } // 查询库存记录 void operator_query_inventory_records() { int choice; printf("查询方式:\n1.按记录ID\n2.按农产品ID\n3.按日期范围\n4.按操作类型\n选择: "); scanf("%d", &choice); getchar(); InventoryRecord* current = inventory_head; int count = 0; switch (choice) { case 1: { int target_id; printf("输入记录ID: "); scanf("%d", &target_id); while (current) { if (current->record_id == target_id) { printf("[ID:%d] 产品:%d 类型:%d 数量:%d 日期:%s 操作员:%s\n", current->record_id, current->product_id, current->op_type, current->quantity, current->date, current->operator); count++; break; } current = current->next; } break; } case 2: { int product_id; printf("输入农产品ID: "); scanf("%d", &product_id); while (current) { if (current->product_id == product_id) { printf("[ID:%d] 类型:%d 数量:%d 日期:%s\n", current->record_id, current->op_type, current->quantity, current->date); count++; } current = current->next; } break; } case 3: { char start[11], end[11]; printf("输入开始日期(YYYY-MM-DD): "); fgets(start, sizeof(start), stdin); start[strcspn(start, "\n")] = '\0'; printf("输入结束日期(YYYY-MM-DD): "); fgets(end, sizeof(end), stdin); end[strcspn(end, "\n")] = '\0'; while (current) { if (strcmp(current->date, start) >= 0 && strcmp(current->date, end) <= 0) { printf("[ID:%d] 产品:%d 类型:%d 数量:%d 日期:%s\n", current->record_id, current->product_id, current->op_type, current->quantity, current->date); count++; } current = current->next; } break; } case 4: { int type; printf("输入操作类型(0-入库 1-出库 2-损耗): "); scanf("%d", &type); while (current) { if (current->op_type == type) { printf("[ID:%d] 产品:%d 数量:%d 日期:%s\n", current->record_id, current->product_id, current->quantity, current->date); count++; } current = current->next; } break; } default: printf("无效选择!\n"); return; } printf("共找到%d条记录\n", count); } // 统计汇总 void operator_inventory_summary() { int product_id; printf("输入要统计的农产品ID: "); scanf("%d", &product_id); int total_in = 0, total_out = 0, total_loss = 0; InventoryRecord* current = inventory_head; while (current) { if (current->product_id == product_id) { switch (current->op_type) { case INBOUND: total_in += current->quantity; break; case OUTBOUND: total_out += abs(current->quantity); break; case LOSS: total_loss += abs(current->quantity); break; } } current = current->next; } printf("\n=== 产品%d库存汇总 ===\n", product_id); printf("总入库量: %d\n", total_in); printf("总出库量: %d\n", total_out); printf("总损耗量: %d\n", total_loss); printf("当前库存: %d\n", total_in - total_out - total_loss); } // 生成唯一订单ID int generate_order_id() { static int counter = 1000; return counter++; } int date_compare(const char* date1, const char* date2); // 辅助函数:打印销售记录 void print_sales_record(SalesRecord* record); // 添加销售记录 void operator_add_sales_record() { SalesRecord* new_record = (SalesRecord*)malloc(sizeof(SalesRecord)); new_record->order_id = generate_order_id(); printf("输入农产品编号: "); scanf("%d", &new_record->product_id); printf("输入买家编号: "); scanf("%d", &new_record->buyer_id); printf("输入销售数量: "); scanf("%f", &new_record->quantity); printf("输入销售单价: "); scanf("%f", &new_record->unit_price); new_record->total_amount = new_record->quantity * new_record->unit_price; printf("输入销售日期(YYYY-MM-DD): "); scanf("%19s", new_record->sale_date); new_record->status = ORDER_PENDING; new_record->next = sales_head; sales_head = new_record; printf("订单%d添加成功!\n", new_record->order_id); } //删除销售记录 void operator_delete_sales_record(int order_id) { SalesRecord *current = sales_head, *prev = NULL; while (current) { if (current->order_id == order_id) { if (prev) prev->next = current->next; else sales_head = current->next; free(current); printf("订单%d已删除!\n", order_id); return; } prev = current; current = current->next; } printf("未找到订单%d!\n", order_id); } //修改销售记录 void operator_modify_sales_record(int order_id) { SalesRecord* current = sales_head; while (current) { if (current->order_id == order_id) { printf("输入新数量: "); scanf("%f", &current->quantity); current->total_amount = current->quantity * current->unit_price; printf("输入新状态(0-3): "); scanf("%d", (int*)&current->status); printf("订单%d修改完成!\n", order_id); return; } current = current->next; } printf("未找到订单%d!\n", order_id); } // 查询销售记录 void operator_query_sales() { int choice; printf("查询方式:\n1.按订单号\n2.按产品\n3.按买家\n4.按日期范围\n5.按状态\n选择: "); scanf("%d", &choice); int count = 0; SalesRecord* current = sales_head; time_t start_t = 0, end_t = 0; switch (choice) { case 1: { int target_id; printf("输入订单号: "); scanf("%d", &target_id); while (current) { if (current->order_id == target_id) { print_sales_record(current); count++; break; } current = current->next; } break; } case 2: { int product_id; printf("输入农产品编号: "); scanf("%d", &product_id); while (current) { if (current->product_id == product_id) { print_sales_record(current); count++; } current = current->next; } break; } case 3: { int buyer_id; printf("输入买家编号: "); scanf("%d", &buyer_id); while (current) { if (current->buyer_id == buyer_id) { print_sales_record(current); count++; } current = current->next; } break; } case 4: { char start_date[20], end_date[20]; printf("输入起始日期(YYYY-MM-DD): "); scanf("%19s", start_date); printf("输入结束日期(YYYY-MM-DD): "); scanf("%19s", end_date); while (current) { if (date_compare(current->sale_date, start_date) >= 0 && date_compare(current->sale_date, end_date) <= 0) { print_sales_record(current); count++; } current = current->next; } break; } case 5: { int status; printf("输入状态(0-3): "); scanf("%d", &status); while (current) { if (current->status == status) { print_sales_record(current); count++; } current = current->next; } break; } default: printf("无效选择!\n"); return; } printf("共找到%d条销售记录\n", count); } // 统计销售数据 void operator_sales_statistics() { float total_sales = 0; int status_counts[4] = {0}; SalesRecord* current = sales_head; while (current) { total_sales += current->total_amount; status_counts[current->status]++; current = current->next; } printf("\n=== 销售统计 ===\n"); printf("总销售额: %.2f\n", total_sales); printf("订单状态分布:\n"); printf(" 待处理: %d\n", status_counts[ORDER_PENDING]); printf(" 已发货: %d\n", status_counts[ORDER_SHIPPED]); printf(" 已完成: %d\n", status_counts[ORDER_COMPLETED]); printf(" 已取消: %d\n", status_counts[ORDER_CANCELED]); } // 辅助函数:打印销售记录 void print_sales_record(SalesRecord* record) { const char* status_names[] = {"待处理", "已发货", "已完成", "已取消"}; printf("[订单%d] 产品:%d 买家:%d\n 数量:%.2f 单价:%.2f 总金额:%.2f\n 状态:%s 日期:%s\n", record->order_id, record->product_id, record->buyer_id, record->quantity, record->unit_price, record->total_amount, status_names[record->status], record->sale_date); } // 辅助函数:获取状态名称 const char* get_status_name(OrderStatus status) { static const char* names[] = {"待处理", "已发货", "已完成", "已取消"}; return names[status]; } // 日期比较函数 int date_compare(const char* date1, const char* date2) { return strcmp(date1, date2); } //添加买家 void operator_add_buyer() { Buyer* new_buyer = (Buyer*)malloc(sizeof(Buyer)); static int last_id = 1000; new_buyer->buyer_id = ++last_id; printf("输入买家名称: "); fgets(new_buyer->name, 50, stdin); new_buyer->name[strcspn(new_buyer->name, "\n")] = '\0'; printf("选择类型(0-个人/1-企业): "); int type; scanf("%d", &type); getchar(); new_buyer->buyer_type = (BuyerType)type; printf("输入联系方式: "); fgets(new_buyer->contact, 30, stdin); new_buyer->contact[strcspn(new_buyer->contact, "\n")] = '\0'; printf("输入收货地址: "); fgets(new_buyer->address, 100, stdin); new_buyer->address[strcspn(new_buyer->address, "\n")] = '\0'; new_buyer->next = buyer_head; buyer_head = new_buyer; printf("买家%d添加成功!\n", new_buyer->buyer_id); } //删除买家 void operator_delete_buyer(int target_id) { Buyer *current = buyer_head, *prev = NULL; while (current) { if (current->buyer_id == target_id) { if (prev) prev->next = current->next; else buyer_head = current->next; free(current); printf("买家%d已删除!\n", target_id); return; } prev = current; current = current->next; } printf("未找到买家%d!\n", target_id); } //修改买家信息 void operator_modify_buyer(int target_id) { Buyer* current = buyer_head; while (current) { if (current->buyer_id == target_id) { printf("修改名称(当前值: %s): ", current->name); char input[50]; fgets(input, 50, stdin); if (strlen(input) > 1) { input[strcspn(input, "\n")] = '\0'; strcpy(current->name, input); } printf("修改类型(当前值: %d): ", current->buyer_type); int type; scanf("%d", &type); getchar(); current->buyer_type = (BuyerType)type; printf("修改联系方式(当前值: %s): ", current->contact); fgets(current->contact, 30, stdin); current->contact[strcspn(current->contact, "\n")] = '\0'; printf("买家%d修改完成!\n", target_id); return; } current = current->next; } printf("未找到买家%d!\n", target_id); } //查询买家信息 void operator_query_buyers() { int choice; printf("查询方式:\n1.按ID\n2.按名称\n3.按类型\n4.按地址关键字\n选择: "); scanf("%d", &choice); getchar(); int count = 0; Buyer* current = buyer_head; switch (choice) { case 1: { int target_id; printf("输入买家ID: "); scanf("%d", &target_id); while (current) { if (current->buyer_id == target_id) { printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name); count++; break; } current = current->next; } break; } case 2: { char keyword[50]; printf("输入名称关键字: "); fgets(keyword, 50, stdin); keyword[strcspn(keyword, "\n")] = '\0'; while (current) { if (strstr(current->name, keyword)) { printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name); count++; } current = current->next; } break; } case 3: { int type; printf("选择类型(0-个人/1-企业): "); scanf("%d", &type); while (current) { if (current->buyer_type == type) { printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name); count++; } current = current->next; } break; } case 4: { char keyword[100]; printf("输入地址关键字: "); fgets(keyword, 100, stdin); keyword[strcspn(keyword, "\n")] = '\0'; while (current) { if (strstr(current->address, keyword)) { printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name); count++; } current = current->next; } break; } default: printf("无效选择!\n"); return; } printf("共找到%d条记录\n", count); } // 统计买家信息 void operator_buyer_statistics() { int individual_count = 0, enterprise_count = 0; Buyer* current = buyer_head; while (current) { if (current->buyer_type == INDIVIDUAL) { individual_count++; } else { enterprise_count++; } current = current->next; } printf("\n=== 买家统计 ===\n"); printf("个人买家数量: %d\n", individual_count); printf("企业买家数量: %d\n", enterprise_count); printf("总买家数量: %d\n", individual_count + enterprise_count); } // 辅助打印函数 void print_buyer(Buyer* buyer) { printf("[ID:%d] 名称:%s\n 类型:%s\n 联系方式:%s\n 地址:%s\n", buyer->buyer_id, buyer->name, buyer->buyer_type == INDIVIDUAL ? "个人" : "企业", buyer->contact, buyer->address); } 根据这些代码写出操作人员菜单
05-31
#ifndef Users_H #define Users_H #include "common.h" // 用户角色枚举 typedef enum { ROLE_ADMIN, // 管理员 ROLE_OPERATOR, // 操作员 ROLE_FINANCE // 财务人员 } UserRole; // 权限标志位(使用位域优化存储) typedef struct { unsigned int user_manage : 1; // 用户管理权限 unsigned int product_manage : 1; // 农产品管理 unsigned int member_manage : 1; // 社员管理 unsigned int inventory_manage : 1;// 库存管理 unsigned int sales_manage : 1; // 销售管理 unsigned int finance_manage : 1; // 财务管理 } Permissions; // 用户结构体 typedef struct User { int user_id; // 用户ID char username[32]; // 用户名(限制长度) char password[64]; // 密码(预留加密空间) UserRole role; // 用户角色 Permissions perm; // 权限配置 struct User* next; // 链表指针 } User; typedef enum LoginState { LOGGED_OUT, LOGGED_IN } LoginState; // 全局状态变量 extern User* current_user; extern LoginState login_state; // 全局用户链表头指针 User* user_list = NULL; const char* get_role_name(UserRole role); #endif #ifndef Sales_H #define Sales_H #include "common.h" // 订单状态枚举 typedef enum { ORDER_PENDING, // 待处理 ORDER_SHIPPED, // 已发货 ORDER_COMPLETED, // 已完成 ORDER_CANCELED // 已取消 } OrderStatus; // 销售记录结构体 typedef struct SalesRecord { int order_id; // 订单编号(唯一) int product_id; // 关联的农产品编号 int buyer_id; // 关联的买家编号 float quantity; // 销售数量(支持小数) float unit_price; // 单价 float total_amount; // 总金额(quantity * unit_price) OrderStatus status; // 订单状态 char sale_date[20]; // 销售日期(格式:YYYY-MM-DD) struct SalesRecord* next; // 链表指针 } SalesRecord; SalesRecord* sales_list = NULL; void add_sales_record();// 添加销售记录 void delete_sales_record();// 删除销售记录 void modify_sales_record();// 修改销售记录 void query_sales();// 查询销售记录 void sales_statistics();// 统计销售数据 #endif #ifndef Product_H #define Product_H #include "common.h" typedef struct Product { int id;//农产品编号 char name[30];//农产品名称 char type[20];//农产品类型 float price;//单价 char description[100];//农产品描述 int stock_quantity;//库存数量 struct Product *next;//指向下一个节点 }Product; //创建农产品结构体 Product* product_list = NULL; Product* add_product(Product* head); //添加农产品信息 Product* delete_product(Product* head, int target_id); //删除农产品信息 void search_product(Product* head, int target_id); //查询农产品信息 void modify_product(Product* head, int target_id); //修改农产品信息 void statistics(Product* head); //统计农产品信息 void summary(Product* head); //汇总农产品信息 #endif #ifndef MENU_H #define MENU_H #include "common.h" // 函数原型声明 void admin_main_menu(void); void operator_main_menu(void); void finance_management_menu(void); void role_based_menu(); User* add_user(); int delete_user(); void modify_permissions(); User* find_user_by_id(); void display_all_users(); User* current_user = NULL; LoginState login_state = LOGGED_OUT; #endif #ifndef Member_H #define Member_H #include "common.h" typedef struct Member { int id; // 社员编号 char name[30]; // 社员姓名 char id_card[19]; // 身份证号(18位+结束符) char phone[12]; // 联系方式(11位手机号) float investment; // 入股金额 char crops[50]; // 种植作物信息(多个作物用逗号分隔) char join_date[11]; // 加入日期(YYYY-MM-DD格式) struct Member *next; // 链表指针 } Member; //创建社员结构体 Member* member_list = NULL; Member* add_member(Member* head); //添加社员信息 Member* delete_member(Member* head, int target_id); //删除社员信息 void modify_member(Member* head, int target_id); //修改社员信息 void search_member(Member* head, int mode); //查询社员信息 void statistics_member(Member* head); //统计社员信息 void summary_member(Member* head); //汇总社员信息 #endif #ifndef Inventory_H #define Inventory_H #include "common.h" typedef enum { INBOUND, // 入库 OUTBOUND, // 出库 LOSS // 损耗 } OperationType; // 库存记录结构体 typedef struct InventoryRecord { int record_id; // 记录编号(唯一标识) int product_id; // 关联的农产品编号 OperationType op_type; // 操作类型 int quantity; // 变动数量(正数表示增加,负数表示减少) char date[11]; // 操作日期(YYYY-MM-DD格式) char operator[20]; // 操作员姓名/ID struct InventoryRecord* next; // 链表指针 } InventoryRecord; InventoryRecord* inventory_list = NULL; void add_inventory_record(); void delete_inventory_record(int target_id); void modify_inventory_record(int target_id); void query_inventory_records(); void inventory_summary(); #endif #ifndef Finance_H #define Finance_H #include "common.h" // 财务类型 typedef enum { FINANCE_INCOME, // 收入(关联销售订单) FINANCE_EXPENSE, // 支出(关联采购/损耗) } FinanceType; // 财务记录结构体 typedef struct FinancialRecord { int record_id; // 记录编号(唯一) FinanceType type; // 财务类型 double amount; // 金额(支持正负) char record_date[20]; // 日期(YYYY-MM-DD) int related_order; // 关联的销售订单ID(收入时使用) int related_stock; // 关联的库存记录ID(支出时使用) char operator[20]; // 操作员ID struct FinancialRecord* next; // 链表指针 } FinancialRecord; void add_finance_record();// 添加财务记录 void delete_finance_record();// 删除财务记录 void modify_finance_record();// 修改财务记录 void query_finance();// 查询财务记录 void finance_statistics();// 统计财务数据 // 验证函数原型 int validate_finance_date(const char* date); int validate_amount(double amount); int validate_finance_type(FinanceType type); #endif #ifndef Common_H #define Common_H #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <time.h> #include <ctype.h> #include "product.h" #include "member.h" #include "inventory.h" #include "buyer.h" #include "sales.h" #include "finance.h" #include "user.h" #endif #include "user.h" // 添加新用户(返回新用户指针) User* add_user(const char* username, const char* password, UserRole role) { // 检查用户名是否已存在 User* current = user_list; while (current != NULL) { if (strcmp(current->username, username) == 0) { printf("错误:用户名 '%s' 已存在!\n", username); return NULL; } current = current->next; } // 创建新用户节点 User* new_user = (User*)malloc(sizeof(User)); if (!new_user) { perror("内存分配失败"); exit(EXIT_FAILURE); } // 自动生成用户ID(找最大值+1) static int last_id = 1000; new_user->user_id = ++last_id; // 设置基础信息 strncpy(new_user->username, username, sizeof(new_user->username)-1); strncpy(new_user->password, password, sizeof(new_user->password)-1); new_user->role = role; new_user->next = NULL; // 设置默认权限(根据角色) memset(&new_user->perm, 0, sizeof(Permissions)); switch(role) { case ROLE_ADMIN: new_user->perm = (Permissions){1,1,1,1,1,1}; // 所有权限 break; case ROLE_OPERATOR: new_user->perm = (Permissions){0,1,1,1,1,0}; // 业务操作权限 break; case ROLE_FINANCE: new_user->perm = (Permissions){0,0,0,0,0,1}; // 仅财务权限 break; } // 插入链表头部 if (user_list == NULL) { user_list = new_user; } else { new_user->next = user_list; user_list = new_user; } printf("用户 %s 添加成功!ID:%d\n", username, new_user->user_id); return new_user; } // 删除用户(按用户ID) int delete_user(int user_id) { User *current = user_list, *prev = NULL; while (current != NULL) { if (current->user_id == user_id) { if (prev == NULL) { // 删除头节点 user_list = current->next; } else { prev->next = current->next; } free(current); printf("用户 ID %d 已删除\n", user_id); return 1; } prev = current; current = current->next; } printf("未找到用户 ID %d\n", user_id); return 0; } // 修改用户权限(按用户ID) void modify_permissions(int user_id, Permissions new_perm) { User* user = find_user_by_id(user_id); if (user) { if (user->role == ROLE_ADMIN) { printf("警告:管理员权限可修改!\n"); return; } user->perm = new_perm; printf("用户 %d 权限已更新\n", user_id); } else { printf("用户 ID %d 存在\n", user_id); } } // 查询用户(按用户ID) User* find_user_by_id(int user_id) { User* current = user_list; while (current != NULL) { if (current->user_id == user_id) { return current; } current = current->next; } return NULL; } // 显示所有用户信息 void display_all_users() { printf("\n%-8s %-20s %-12s %s\n", "用户ID", "用户名", "角色", "权限"); printf("-------------------------------------------------\n"); User* current = user_list; while (current != NULL) { // 角色名称转换 const char* role_str = ""; switch(current->role) { case ROLE_ADMIN: role_str = "管理员"; break; case ROLE_OPERATOR: role_str = "操作员"; break; case ROLE_FINANCE: role_str = "财务"; break; } // 权限详情转换 char perm_buf[100]; snprintf(perm_buf, sizeof(perm_buf), "用户:%d 产品:%d 社员:%d 库存:%d 销售:%d 财务:%d", current->perm.user_manage, current->perm.product_manage, current->perm.member_manage, current->perm.inventory_manage, current->perm.sales_manage, current->perm.finance_manage); printf("%-8d %-20s %-12s %s\n", current->user_id, current->username, role_str, perm_buf); current = current->next; } printf("-------------------------------------------------\n"); } #include "buyer.h" void print_buyer(Buyer* buyer); //打印函数 //添加买家 void add_buyer(){ Buyer* new_buyer = (Buyer*)malloc(sizeof(Buyer)); static int last_id = 1000; new_buyer->buyer_id = ++last_id; printf("输入买家名称: "); fgets(new_buyer->name, 50, stdin); new_buyer->name[strcspn(new_buyer->name, "\n")] = '\0'; printf("选择类型(0-个人/1-企业): "); int type; scanf("%d", &type); getchar(); new_buyer->buyer_type = (BuyerType)type; printf("输入联系方式: "); fgets(new_buyer->contact, 30, stdin); new_buyer->contact[strcspn(new_buyer->contact, "\n")] = '\0'; printf("输入收货地址: "); fgets(new_buyer->address, 100, stdin); new_buyer->address[strcspn(new_buyer->address, "\n")] = '\0'; new_buyer->next = buyer_head; buyer_head = new_buyer; printf("买家%d添加成功!\n", new_buyer->buyer_id); } //删除买家 void delete_buyer(int target_id) { Buyer *current = buyer_head, *prev = NULL; while (current) { if (current->buyer_id == target_id) { if (prev) prev->next = current->next; else buyer_head = current->next; free(current); printf("买家%d已删除!\n", target_id); return; } prev = current; current = current->next; } printf("未找到买家%d!\n", target_id); } //修改买家信息 void modify_buyer(int target_id) { Buyer* current = buyer_head; while (current) { if (current->buyer_id == target_id) { printf("修改名称(当前值: %s): ", current->name); char input[50]; fgets(input, 50, stdin); if (strlen(input) > 1) { input[strcspn(input, "\n")] = '\0'; strcpy(current->name, input); } printf("修改类型(当前值: %d): ", current->buyer_type); int type; scanf("%d", &type); getchar(); current->buyer_type = (BuyerType)type; printf("修改联系方式(当前值: %s): ", current->contact); fgets(current->contact, 30, stdin); current->contact[strcspn(current->contact, "\n")] = '\0'; printf("买家%d修改完成!\n", target_id); return; } current = current->next; } printf("未找到买家%d!\n", target_id); } //查询买家信息 void query_buyers() { int choice; printf("查询方式:\n1.按ID\n2.按名称\n3.按类型\n4.按地址关键字\n选择: "); scanf("%d", &choice); getchar(); int count = 0; Buyer* current = buyer_head; switch (choice) { case 1: { int target_id; printf("输入买家ID: "); scanf("%d", &target_id); while (current) { if (current->buyer_id == target_id) { printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name); count++; break; } current = current->next; } break; } case 2: { char keyword[50]; printf("输入名称关键字: "); fgets(keyword, 50, stdin); keyword[strcspn(keyword, "\n")] = '\0'; while (current) { if (strstr(current->name, keyword)) { printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name); count++; } current = current->next; } break; } case 3: { int type; printf("选择类型(0-个人/1-企业): "); scanf("%d", &type); while (current) { if (current->buyer_type == type) { printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name); count++; } current = current->next; } break; } case 4: { char keyword[100]; printf("输入地址关键字: "); fgets(keyword, 100, stdin); keyword[strcspn(keyword, "\n")] = '\0'; while (current) { if (strstr(current->address, keyword)) { printf("[ID:%d] 名称:%s\n", current->buyer_id, current->name); count++; } current = current->next; } break; } default: printf("无效选择!\n"); return; } printf("共找到%d条记录\n", count); } // 统计买家信息 void buyer_statistics() { int individual_count = 0, enterprise_count = 0; Buyer* current = buyer_head; while (current) { if (current->buyer_type == INDIVIDUAL) { individual_count++; } else { enterprise_count++; } current = current->next; } printf("\n=== 买家统计 ===\n"); printf("个人买家数量: %d\n", individual_count); printf("企业买家数量: %d\n", enterprise_count); printf("总买家数量: %d\n", individual_count + enterprise_count); } // 辅助打印函数 void print_buyer(Buyer* buyer) { printf("[ID:%d] 名称:%s\n 类型:%s\n 联系方式:%s\n 地址:%s\n", buyer->buyer_id, buyer->name, buyer->buyer_type == INDIVIDUAL ? "个人" : "企业", buyer->contact, buyer->address); } #include "finance.h" // 生成唯一财务记录ID int generate_finance_id() { static int counter = 5000; return counter++; } void print_finance_record(FinancialRecord* record);// 辅助打印函数 // 添加财务记录 void add_finance_record() { FinancialRecord* new_record = (FinancialRecord*)malloc(sizeof(FinancialRecord)); new_record->record_id = generate_finance_id(); printf("财务类型 (0-收入 1-支出): "); scanf("%d", (int*)&new_record->type); printf("金额: "); scanf("%lf", &new_record->amount); printf("日期(YYYY-MM-DD): "); scanf("%19s", new_record->record_date); if (new_record->type == FINANCE_INCOME) { printf("关联销售订单ID: "); scanf("%d", &new_record->related_order); } else { printf("关联库存记录ID: "); scanf("%d", &new_record->related_stock); } new_record->next = finance_head; finance_head = new_record; printf("财务记录%d添加成功!\n", new_record->record_id); } //删除财务记录 void delete_finance_record(int record_id) { FinancialRecord *current = finance_head, *prev = NULL; while (current) { if (current->record_id == record_id) { if (prev) prev->next = current->next; else finance_head = current->next; free(current); printf("记录%d已删除!\n", record_id); return; } prev = current; current = current->next; } printf("未找到记录%d!\n", record_id); } // 修改财务记录 void modify_finance_record(int record_id) { FinancialRecord* current = finance_head; while (current) { if (current->record_id == record_id) { // 修改类型 printf("当前类型: %d 输入新类型 (0-收入 1-支出): ", current->type); int new_type; scanf("%d", &new_type); if (new_type >= FINANCE_INCOME && new_type <= FINANCE_EXPENSE) { current->type = new_type; } // 修改金额 printf("当前金额: %.2f 输入新金额: ", current->amount); double new_amount; scanf("%lf", &new_amount); current->amount = new_amount; printf("记录%d修改完成!\n", record_id); return; } current = current->next; } printf("未找到记录%d!\n", record_id); } // 查询财务记录 void query_finance() { int choice; printf("查询方式:\n1.按记录号\n2.按类型\n3.按日期范围\n4.按金额范围\n选择: "); scanf("%d", &choice); int count = 0; FinancialRecord* current = finance_head; switch (choice) { case 1: { int target_id; printf("输入记录号: "); scanf("%d", &target_id); while (current) { if (current->record_id == target_id) { print_finance_record(current); count++; break; } current = current->next; } break; } case 2: { int type; printf("类型 (0-收入 1-支出): "); scanf("%d", &type); while (current) { if (current->type == type) { print_finance_record(current); count++; } current = current->next; } break; } case 3: { char start_date[20], end_date[20]; printf("起始日期(YYYY-MM-DD): "); scanf("%19s", start_date); printf("结束日期(YYYY-MM-DD): "); scanf("%19s", end_date); while (current) { if (strcmp(current->record_date, start_date) >= 0 && strcmp(current->record_date, end_date) <= 0) { print_finance_record(current); count++; } current = current->next; } break; } case 4: { double min, max; printf("最小金额: "); scanf("%lf", &min); printf("最大金额: "); scanf("%lf", &max); while (current) { if (current->amount >= min && current->amount <= max) { print_finance_record(current); count++; } current = current->next; } break; } default: printf("无效选择!\n"); return; } printf("共找到%d条财务记录\n", count); } // 统计财务数据 void finance_statistics() { double total_income = 0, total_expense = 0; FinancialRecord* current = finance_head; while (current) { if (current->type == FINANCE_INCOME) { total_income += current->amount; } else { total_expense += current->amount; } current = current->next; } printf("\n=== 财务统计 ===\n"); printf("总收入: %.2f\n", total_income); printf("总支出: %.2f\n", total_expense); printf("净利润: %.2f\n", total_income + total_expense); } // 辅助打印函数 void print_finance_record(FinancialRecord* record) { printf("[记录%d] 类型:%s 金额:%.2f\n 日期:%s 关联ID:%d\n", record->record_id, record->type == FINANCE_INCOME ? "收入" : "支出", record->amount, record->record_date, record->type == FINANCE_INCOME ? record->related_order : record->related_stock); } #include "inventory.h" // 库存记录链表头指针 InventoryRecord* inventory_head = NULL; // 添加库存记录 void add_inventory_record() { InventoryRecord* new_record = (InventoryRecord*)malloc(sizeof(InventoryRecord)); if (!new_record) { printf("内存分配失败!\n"); return; } // 自动生成记录ID static int last_id = 0; new_record->record_id = ++last_id; // 输入基本信息 printf("输入农产品编号: "); scanf("%d", &new_record->product_id); getchar(); printf("选择操作类型(0-入库 1-出库 2-损耗): "); int type; scanf("%d", &type); new_record->op_type = (OperationType)type; getchar(); printf("输入变动数量: "); scanf("%d", &new_record->quantity); getchar(); printf("输入操作日期(YYYY-MM-DD): "); fgets(new_record->date, sizeof(new_record->date), stdin); new_record->date[strcspn(new_record->date, "\n")] = '\0'; printf("输入操作员姓名: "); fgets(new_record->operator, sizeof(new_record->operator), stdin); new_record->operator[strcspn(new_record->operator, "\n")] = '\0'; // 插入链表头部 new_record->next = inventory_head; inventory_head = new_record; printf("记录添加成功!\n"); } // 删除库存记录 void delete_inventory_record(int target_id) { InventoryRecord *current = inventory_head, *prev = NULL; while (current) { if (current->record_id == target_id) { if (prev) { prev->next = current->next; } else { inventory_head = current->next; } free(current); printf("记录%d已删除!\n", target_id); return; } prev = current; current = current->next; } printf("未找到记录%d!\n", target_id); } // 修改库存记录 void modify_inventory_record(int target_id) { InventoryRecord* current = inventory_head; while (current) { if (current->record_id == target_id) { printf("修改数量(当前值%d,直接回车跳过): ", current->quantity); char input[20]; fgets(input, sizeof(input), stdin); if (strlen(input) > 1) { current->quantity = atoi(input); } printf("修改日期(当前值%s): ", current->date); fgets(input, sizeof(input), stdin); if (strlen(input) > 1) { strncpy(current->date, input, 10); current->date[10] = '\0'; } printf("记录%d修改完成!\n", target_id); return; } current = current->next; } printf("未找到记录%d!\n", target_id); } // 查询库存记录 void query_inventory_records() { int choice; printf("查询方式:\n1.按记录ID\n2.按农产品ID\n3.按日期范围\n4.按操作类型\n选择: "); scanf("%d", &choice); getchar(); InventoryRecord* current = inventory_head; int count = 0; switch (choice) { case 1: { int target_id; printf("输入记录ID: "); scanf("%d", &target_id); while (current) { if (current->record_id == target_id) { printf("[ID:%d] 产品:%d 类型:%d 数量:%d 日期:%s 操作员:%s\n", current->record_id, current->product_id, current->op_type, current->quantity, current->date, current->operator); count++; break; } current = current->next; } break; } case 2: { int product_id; printf("输入农产品ID: "); scanf("%d", &product_id); while (current) { if (current->product_id == product_id) { printf("[ID:%d] 类型:%d 数量:%d 日期:%s\n", current->record_id, current->op_type, current->quantity, current->date); count++; } current = current->next; } break; } case 3: { char start[11], end[11]; printf("输入开始日期(YYYY-MM-DD): "); fgets(start, sizeof(start), stdin); start[strcspn(start, "\n")] = '\0'; printf("输入结束日期(YYYY-MM-DD): "); fgets(end, sizeof(end), stdin); end[strcspn(end, "\n")] = '\0'; while (current) { if (strcmp(current->date, start) >= 0 && strcmp(current->date, end) <= 0) { printf("[ID:%d] 产品:%d 类型:%d 数量:%d 日期:%s\n", current->record_id, current->product_id, current->op_type, current->quantity, current->date); count++; } current = current->next; } break; } case 4: { int type; printf("输入操作类型(0-入库 1-出库 2-损耗): "); scanf("%d", &type); while (current) { if (current->op_type == type) { printf("[ID:%d] 产品:%d 数量:%d 日期:%s\n", current->record_id, current->product_id, current->quantity, current->date); count++; } current = current->next; } break; } default: printf("无效选择!\n"); return; } printf("共找到%d条记录\n", count); } // 统计汇总 void inventory_summary() { int product_id; printf("输入要统计的农产品ID: "); scanf("%d", &product_id); int total_in = 0, total_out = 0, total_loss = 0; InventoryRecord* current = inventory_head; while (current) { if (current->product_id == product_id) { switch (current->op_type) { case INBOUND: total_in += current->quantity; break; case OUTBOUND: total_out += abs(current->quantity); break; case LOSS: total_loss += abs(current->quantity); break; } } current = current->next; } printf("\n=== 产品%d库存汇总 ===\n", product_id); printf("总入库量: %d\n", total_in); printf("总出库量: %d\n", total_out); printf("总损耗量: %d\n", total_loss); printf("当前库存: %d\n", total_in - total_out - total_loss); } #include "member.h" Member* add_member(Member* head) { Member* new_mem = (Member*)malloc(sizeof(Member)); if (!new_mem) { printf("内存分配失败!\n"); return head; } // 输入编号 printf("请输入社员编号: "); scanf("%d", &new_mem->id); getchar(); // 清除输入缓冲区 // 输入姓名 printf("请输入姓名: "); fgets(new_mem->name, sizeof(new_mem->name), stdin); new_mem->name[strcspn(new_mem->name, "\n")] = '\0'; // 输入身份证号 printf("请输入身份证号: "); fgets(new_mem->id_card, sizeof(new_mem->id_card), stdin); new_mem->id_card[strcspn(new_mem->id_card, "\n")] = '\0'; // 输入手机号 printf("请输入手机号: "); fgets(new_mem->phone, sizeof(new_mem->phone), stdin); new_mem->phone[strcspn(new_mem->phone, "\n")] = '\0'; // 输入加入日期 printf("请输入加入日期: "); fgets(new_mem->join_date, sizeof(new_mem->join_date), stdin); new_mem->join_date[strcspn(new_mem->join_date, "\n")] = '\0'; // 插入链表头部 new_mem->next = head; return new_mem; }//增加社员 Member* delete_member(Member* head, int target_id) { if (!head) { printf("当前没有社员记录\n"); return NULL; } Member *curr = head, *prev = NULL; while (curr) { if (curr->id == target_id) { if (prev) { prev->next = curr->next; } else { head = curr->next; } free(curr); printf("成功删除社员%d\n", target_id); return head; } prev = curr; curr = curr->next; } printf("未找到社员%d\n", target_id); return head; }//删除社员 void modify_member(Member* head, int target_id) { Member* curr = head; while (curr) { if (curr->id == target_id) { printf("\n=== 修改社员 %d ===\n", target_id); printf("1. 修改姓名\n2. 修改手机号\n3. 修改入股金额\n4. 修改作物信息\n请选择: "); int choice; scanf("%d", &choice); getchar(); switch(choice) { case 1: printf("新姓名: "); fgets(curr->name, 30, stdin); curr->name[strcspn(curr->name, "\n")] = '\0'; break; case 2: printf("新手机号: "); fgets(curr->phone, 12, stdin); curr->phone[strcspn(curr->phone, "\n")] = '\0'; break; case 3: printf("新入股金额: "); scanf("%f", &curr->investment); getchar(); break; case 4: printf("新作物信息: "); fgets(curr->crops, 50, stdin); curr->crops[strcspn(curr->crops, "\n")] = '\0'; break; default: printf("无效选择\n"); } return; } curr = curr->next; } printf("未找到社员%d\n", target_id); }//修改社员信息 void print_member_details(Member* m); void search_member(Member* head, int mode) { if (!head) { printf("当前没有社员记录\n"); return; } printf("\n=== 查询方式 ===\n"); printf("1.按编号查询\n2.按姓名查询\n请选择: "); scanf("%d", &mode); getchar(); char search_key[30]; int found = 0; if (mode == 1) { printf("请输入社员编号: "); int target_id; scanf("%d", &target_id); getchar(); Member* curr = head; while (curr) { if (curr->id == target_id) { print_member_details(curr); found = 1; break; } curr = curr->next; } } else if (mode == 2) { printf("请输入社员姓名: "); fgets(search_key, 30, stdin); search_key[strcspn(search_key, "\n")] = '\0'; Member* curr = head; while (curr) { if (strcmp(curr->name, search_key) == 0) { print_member_details(curr); found = 1; } curr = curr->next; } } if (!found) printf("未找到匹配记录\n"); } // 辅助打印函数 void print_member_details(Member* m) { printf("\n=== 社员详情 ===\n"); printf("编号: %d\n", m->id); printf("姓名: %s\n", m->name); printf("身份证: %s\n", m->id_card); printf("手机号: %s\n", m->phone); printf("入股金额: %.2f\n", m->investment); printf("种植作物: %s\n", m->crops); printf("加入日期: %s\n", m->join_date); }//查询社员 void statistics_member(Member* head) { if (!head) { printf("当前没有社员记录\n"); return; } int total = 0; float total_invest = 0; Member* curr = head; while (curr) { total++; total_invest += curr->investment; curr = curr->next; } printf("\n=== 统计结果 ===\n"); printf("总社员数: %d\n", total); printf("总入股金额: %.2f\n", total_invest); printf("平均入股金额: %.2f\n", total_invest/total); }//统计社员信息 void summary_member(Member* head) { if (!head) { printf("当前没有社员记录\n"); return; } printf("\n=== 社员汇总 ===\n"); printf("%-6s%-15s%-12s%-20s\n", "ID", "姓名", "手机号", "入股金额"); Member* curr = head; while (curr) { printf("%-6d%-15s%-12s%-20.2f\n", curr->id, curr->name, curr->phone, curr->investment); curr = curr->next; } }//汇总社员信息 #include "menu.h" // 管理员主菜单 void admin_main_menu() { int choice; do { printf("\n==== 管理员主菜单 ====\n"); printf("1. 用户管理\n"); printf("2. 退出登录\n"); printf("请选择操作: "); scanf("%d", &choice); getchar(); // 清除输入缓冲区 switch(choice) { case 1: user_management_menu(); break; case 2: printf("已退出登录\n"); return; default: printf("无效选择,请重新输入!\n"); } } while (1); } // 用户管理子菜单 void user_management_menu() { int sub_choice; do { printf("\n--- 用户管理 ---\n"); printf("1. 添加用户\n"); printf("2. 删除用户\n"); printf("3. 修改权限\n"); printf("4. 查询用户\n"); printf("5. 显示所有用户\n"); printf("6. 返回上级\n"); printf("请选择操作: "); scanf("%d", &sub_choice); getchar(); switch(sub_choice) { case 1: add_user(); break; case 2: delete_user(); break; case 3: modify_permissions(); break; case 4: find_user_by_id(); break; case 5: display_all_users(); break; case 6: return; default: printf("无效选择!\n"); } } while (1); } // 显示主菜单 void operator_main_menu (){ int system_running = 1; while (system_running) { clear_screen(); printf("\n=== 农产品合作社管理系统 ===\n"); printf("1. 农产品管理\n"); printf("2. 社员管理\n"); printf("3. 库存管理\n"); printf("4. 销售管理\n"); printf("5. 买家管理\n"); printf("0. 退出系统\n"); printf("请选择操作:"); int choice; scanf("%d", &choice); getchar(); // 清除输入缓冲区 switch (choice) { case 1: product_management_menu(); break; case 2: member_management_menu(); break; case 3: inventory_management_menu(); break; case 4: sales_management_menu(); break; case 5: buyer_management_menu(); break; case 0: system_running = 0; break; default: printf("无效选择,请重新输入!\n"); getchar(); // 等待用户确认 } } } void product_management_menu() { int sub_running = 1; while (sub_running) { clear_screen(); printf("\n=== 农产品管理 ===\n"); printf("1. 添加农产品\n"); printf("2. 删除农产品\n"); printf("3. 修改农产品\n"); printf("4. 查询农产品\n"); printf("5. 统计汇总\n"); printf("6. 显示所有产品\n"); printf("0. 返回主菜单\n"); printf("请选择操作:"); int choice, target_id; scanf("%d", &choice); getchar(); switch (choice) { case 1: product_head = add_product(product_head); break; case 2: printf("输入要删除的产品ID: "); scanf("%d", &target_id); product_head = delete_product(product_head, target_id); break; case 3: printf("输入要修改的产品ID: "); scanf("%d", &target_id); modify_product(product_head, target_id); break; case 4: printf("输入要查询的产品ID: "); scanf("%d", &target_id); search_product(product_head, target_id); break; case 5: statistics(product_head); break; case 6: summary(product_head); break; case 0: sub_running = 0; break; default: printf("无效选择!\n"); } printf("\n按任意键继续..."); getchar(); } } void member_management_menu(){ int choice; int running = 1; while (running) { printf("\n=== 社员管理系统 ===\n"); printf("1. 添加社员\n"); printf("2. 删除社员\n"); printf("3. 修改社员\n"); printf("4. 查询社员\n"); printf("5. 统计信息\n"); printf("6. 汇总显示\n"); printf("0. 返回主菜单\n"); printf("请选择操作:"); int target_id; switch (choice) { case 1: member_head = add_member(member_head); break; case 2: if (member_head) { target_id = safe_input_int("请输入要删除的社员编号: "); member_head = delete_member(member_head, target_id); } else { printf("当前没有社员记录!\n"); } break; case 3: if (member_head) { target_id = safe_input_int("请输入要修改的社员编号: "); modify_member(member_head, target_id); } else { printf("当前没有社员记录!\n"); } break; case 4: if (member_head) { int mode = safe_input_int("请选择查询方式(1-编号 2-姓名): "); search_member(member_head, mode); } else { printf("当前没有社员记录!\n"); } break; case 5: statistics_member(member_head); break; case 6: summary_member(member_head); break; case 0: running = 0; break; default: printf("无效选择,请重新输入!\n"); } if (choice != 0) { printf("\n按任意键继续..."); getchar(); // 等待用户确认 } } } void inventory_management_menu() { int sub_running = 1; while (sub_running) { clear_screen(); printf("\n=== 库存管理 ===\n"); printf("1. 添加库存记录\n"); printf("2. 删除库存记录\n"); printf("3. 修改库存记录\n"); printf("4. 查询库存记录\n"); printf("5. 库存统计\n"); printf("0. 返回主菜单\n"); printf("请选择操作:"); int choice, target_id; scanf("%d", &choice); getchar(); switch (choice) { case 1: add_inventory_record(); break; case 2: printf("输入要删除的记录ID: "); scanf("%d", &target_id); delete_inventory_record(target_id); break; case 3: printf("输入要修改的记录ID: "); scanf("%d", &target_id); modify_inventory_record(target_id); break; case 4: query_inventory_records(); break; case 5: inventory_summary(); break; case 0: sub_running = 0; break; default: printf("无效选择!\n"); } printf("\n按任意键继续..."); getchar(); } } // 买家管理主菜单 void buyer_management_menu() { int choice; int sub_running = 1; while (sub_running) { system("clear || cls"); // 清屏命令 printf("\n=== 买家管理系统 ===\n"); printf("1. 添加买家\n"); printf("2. 删除买家\n"); printf("3. 修改买家信息\n"); printf("4. 查询买家\n"); printf("5. 买家统计\n"); printf("6. 显示所有买家\n"); printf("0. 返回主菜单\n"); printf("请选择操作: "); choice = safe_input_int(""); int target_id; switch (choice) { case 1: add_buyer(buyer_head); break; case 2: if (buyer_head) { target_id = safe_input_int("请输入要删除的买家ID: "); delete_buyer(buyer_head, target_id); } else { printf("当前没有买家记录!\n"); } break; case 3: if (buyer_head) { target_id = safe_input_int("请输入要修改的买家ID: "); modify_buyer(buyer_head, target_id); } else { printf("当前没有买家记录!\n"); } break; case 4: query_buyers(buyer_head); break; case 5: buyer_statistics(buyer_head); break; case 6: print_all_buyers(buyer_head); break; case 0: sub_running = 0; break; default: printf("无效选择,请重新输入!\n"); } if (choice != 0) { printf("\n操作完成,按回车键继续..."); getchar(); // 等待用户确认 } } } void sales_management_menu(SalesRecord** head) { int choice; int sub_running = 1; while (sub_running) { system("clear || cls"); printf("\n=== 销售记录管理系统 ===\n"); printf("1. 添加销售记录\n"); printf("2. 删除销售记录\n"); printf("3. 修改销售记录\n"); printf("4. 查询销售记录\n"); printf("5. 销售统计\n"); printf("6. 显示所有记录\n"); printf("0. 返回主菜单\n"); printf("请选择操作: "); int target_id; switch (choice) { case 1: add_sales_record(sales_head); break; case 2: if (sales_head) { target_id = safe_input_int("请输入要删除的订单号: "); delete_sales_record(sales_head, target_id); } else { printf("当前没有销售记录!\n"); } break; case 3: if (sales_head) { target_id = safe_input_int("请输入要修改的订单号: "); modify_sales_record(sales_head, target_id); } else { printf("当前没有销售记录!\n"); } break; case 4: query_sales(sales_head); break; case 5: sales_statistics(sales_head); break; case 6: print_all_sales(sales_head); break; case 0: sub_running = 0; break; default: printf("无效选择,请重新输入!\n"); } if (choice != 0) { printf("\n操作完成,按回车键继续..."); while (getchar() != '\n'); // 清空输入缓冲区 getchar(); } } } int safe_input_int(const char* prompt) { char buffer[128]; int value; while (1) { printf("%s", prompt); if (fgets(buffer, sizeof(buffer), stdin)) { if (sscanf(buffer, "%d", &value) == 1) { return value; } } printf("无效输入,请重新输入整数!\n"); } } void finance_management_menu() { int choice; do { system("clear || cls"); printf("\n=== 财务管理系统 ===\n"); printf("1. 添加财务记录\n"); printf("2. 删除财务记录\n"); printf("3. 修改财务记录\n"); printf("4. 查询财务记录\n"); printf("5. 财务统计\n"); printf("6. 显示所有记录\n"); printf("0. 返回主菜单\n"); printf("请选择操作: "); int target_id; switch (choice) { case 1: add_finance_record(finance_head); break; case 2: if (finance_head) { target_id = safe_input_int("请输入要删除的记录号: "); delete_finance_record(finance_head, target_id); } else { printf("当前没有财务记录!\n"); } break; case 3: if (finance_head) { target_id = safe_input_int("请输入要修改的记录号: "); modify_finance_record(finance_head, target_id); } else { printf("当前没有财务记录!\n"); } break; case 4: personnel_query_finance(finance_head); break; case 5: personnel_finance_statistics(finance_head); break; case 6: print_all_finance(finance_head); break; case 0: break; default: printf("无效选择,请重新输入!\n"); } if (choice != 0) { printf("\n按回车键继续..."); while (getchar() != '\n'); // 清空输入缓冲区 getchar(); } } while (choice != 0); } // 获取角色名称的辅助函数 const char* get_role_name(UserRole role) { static const char* names[] = { "管理员", "操作员", "财务人员" }; return names[role]; } #include "product.h" Product* add_product(Product* head) { Product* new_node = (Product*)malloc(sizeof(Product)); if (!new_node) { printf("内存分配失败!\n"); return head; } printf("请输入产品ID: "); scanf("%d", &new_node->id); getchar(); // 清空输入缓冲区 printf("请输入产品名称: "); fgets(new_node->name, 30, stdin); new_node->name[strcspn(new_node->name, "\n")] = '\0'; // 去除换行符 printf("请输入产品类型: "); fgets(new_node->type, 20, stdin); new_node->type[strcspn(new_node->type, "\n")] = '\0'; printf("请输入价格: "); scanf("%f", &new_node->price); printf("请输入库存数量: "); scanf("%d", &new_node->stock_quantity); getchar(); printf("请输入产品描述: "); fgets(new_node->description, 100, stdin); new_node->description[strcspn(new_node->description, "\n")] = '\0'; new_node->next = head; return new_node; }//添加农产品 Product* delete_product(Product* head, int target_id) { Product *current = head, *prev = NULL; while (current) { if (current->id == target_id) { if (prev) { prev->next = current->next; } else { head = current->next; } free(current); printf("成功删除ID为%d的产品\n", target_id); return head; } prev = current; current = current->next; } printf("未找到ID为%d的产品\n", target_id); return head; }//删除农产品 void search_product(Product* head, int target_id) { Product* current = head; while (current) { if (current->id == target_id) { printf("\n=== 产品详情 ===\n"); printf("ID: %d\n", current->id); printf("名称: %s\n", current->name); printf("类型: %s\n", current->type); printf("价格: %.2f\n", current->price); printf("库存: %d\n", current->stock_quantity); printf("描述: %s\n", current->description); return; } current = current->next; } printf("未找到ID为%d的产品\n", target_id); }//查询农产品 void modify_product(Product* head, int target_id) { Product* current = head; while (current) { if (current->id == target_id) { printf("请输入新的产品名称: "); fgets(current->name, 30, stdin); current->name[strcspn(current->name, "\n")] = '\0'; printf("请输入新的产品类型: "); fgets(current->type, 20, stdin); current->type[strcspn(current->type, "\n")] = '\0'; printf("请输入新的价格: "); scanf("%f", &current->price); printf("请输入新的库存数量: "); scanf("%d", &current->stock_quantity); getchar(); printf("请输入新的产品描述: "); fgets(current->description, 100, stdin); current->description[strcspn(current->description, "\n")] = '\0'; printf("产品信息更新成功!\n"); return; } current = current->next; } printf("未找到ID为%d的产品\n", target_id); }//修改农产品 void statistics(Product* head) { float total_value = 0; int total_quantity = 0; Product* current = head; while (current) { total_quantity += current->stock_quantity; total_value += current->stock_quantity * current->price; current = current->next; } printf("\n=== 统计结果 ===\n"); printf("总库存数量: %d\n", total_quantity); printf("总库存价值: %.2f\n", total_value); }//统计农产品 void summary(Product* head) { printf("\n=== 产品汇总 ===\n"); Product* current = head; int count = 1; while (current) { printf("%d. [ID:%d] %s (%s) 库存:%d\n", count++, current->id, current->name, current->type, current->stock_quantity); current = current->next; } if (count == 1) { printf("当前没有产品记录\n"); } }//汇总农产品 #include "sales.h" // 生成唯一订单ID int generate_order_id() { static int counter = 1000; return counter++; } int date_compare(const char* date1, const char* date2);// 日期比较函数 const char* get_status_name(OrderStatus status);// 辅助函数:获取状态名称 void print_sales_record(SalesRecord* record);// 辅助函数:获取状态名称 // 添加销售记录 void add_sales_record() { SalesRecord* new_record = (SalesRecord*)malloc(sizeof(SalesRecord)); new_record->order_id = generate_order_id(); printf("输入农产品编号: "); scanf("%d", &new_record->product_id); printf("输入买家编号: "); scanf("%d", &new_record->buyer_id); printf("输入销售数量: "); scanf("%f", &new_record->quantity); printf("输入销售单价: "); scanf("%f", &new_record->unit_price); new_record->total_amount = new_record->quantity * new_record->unit_price; printf("输入销售日期(YYYY-MM-DD): "); scanf("%19s", new_record->sale_date); new_record->status = ORDER_PENDING; new_record->next = sales_head; sales_head = new_record; printf("订单%d添加成功!\n", new_record->order_id); } //删除销售记录 void delete_sales_record(int order_id) { SalesRecord *current = sales_head, *prev = NULL; while (current) { if (current->order_id == order_id) { if (prev) prev->next = current->next; else sales_head = current->next; free(current); printf("订单%d已删除!\n", order_id); return; } prev = current; current = current->next; } printf("未找到订单%d!\n", order_id); } //修改销售记录 void modify_sales_record(int order_id) { SalesRecord* current = sales_head; while (current) { if (current->order_id == order_id) { printf("输入新数量: "); scanf("%f", &current->quantity); current->total_amount = current->quantity * current->unit_price; printf("输入新状态(0-3): "); scanf("%d", (int*)&current->status); printf("订单%d修改完成!\n", order_id); return; } current = current->next; } printf("未找到订单%d!\n", order_id); } // 查询销售记录 void query_sales() { int choice; printf("查询方式:\n1.按订单号\n2.按产品\n3.按买家\n4.按日期范围\n5.按状态\n选择: "); scanf("%d", &choice); int count = 0; SalesRecord* current = sales_head; time_t start_t = 0, end_t = 0; switch (choice) { case 1: { int target_id; printf("输入订单号: "); scanf("%d", &target_id); while (current) { if (current->order_id == target_id) { print_sales_record(current); count++; break; } current = current->next; } break; } case 2: { int product_id; printf("输入农产品编号: "); scanf("%d", &product_id); while (current) { if (current->product_id == product_id) { print_sales_record(current); count++; } current = current->next; } break; } case 3: { int buyer_id; printf("输入买家编号: "); scanf("%d", &buyer_id); while (current) { if (current->buyer_id == buyer_id) { print_sales_record(current); count++; } current = current->next; } break; } case 4: { char start_date[20], end_date[20]; printf("输入起始日期(YYYY-MM-DD): "); scanf("%19s", start_date); printf("输入结束日期(YYYY-MM-DD): "); scanf("%19s", end_date); while (current) { if (date_compare(current->sale_date, start_date) >= 0 && date_compare(current->sale_date, end_date) <= 0) { print_sales_record(current); count++; } current = current->next; } break; } case 5: { int status; printf("输入状态(0-3): "); scanf("%d", &status); while (current) { if (current->status == status) { print_sales_record(current); count++; } current = current->next; } break; } default: printf("无效选择!\n"); return; } printf("共找到%d条销售记录\n", count); } // 统计销售数据 void sales_statistics() { float total_sales = 0; int status_counts[4] = {0}; SalesRecord* current = sales_head; while (current) { total_sales += current->total_amount; status_counts[current->status]++; current = current->next; } printf("\n=== 销售统计 ===\n"); printf("总销售额: %.2f\n", total_sales); printf("订单状态分布:\n"); printf(" 待处理: %d\n", status_counts[ORDER_PENDING]); printf(" 已发货: %d\n", status_counts[ORDER_SHIPPED]); printf(" 已完成: %d\n", status_counts[ORDER_COMPLETED]); printf(" 已取消: %d\n", status_counts[ORDER_CANCELED]); } // 辅助函数:打印销售记录 void print_sales_record(SalesRecord* record) { const char* status_names[] = {"待处理", "已发货", "已完成", "已取消"}; printf("[订单%d] 产品:%d 买家:%d\n 数量:%.2f 单价:%.2f 总金额:%.2f\n 状态:%s 日期:%s\n", record->order_id, record->product_id, record->buyer_id, record->quantity, record->unit_price, record->total_amount, status_names[record->status], record->sale_date); } // 辅助函数:获取状态名称 const char* get_status_name(OrderStatus status) { static const char* names[] = {"待处理", "已发货", "已完成", "已取消"}; return names[status]; } // 日期比较函数 int date_compare(const char* date1, const char* date2) { return strcmp(date1, date2); } #include "common.h" int user_management_menu(); void role_based_menu(); void admin_main_menu(); void operator_main_menu (); void finance_management_menu(); void initialize_system(); User* user_login(); void free_resources(); FinancialRecord* finance_head = NULL; Buyer* buyer_head = NULL; InventoryRecord* inventory_head = NULL; Member* member_head = NULL; Product* product_head = NULL; SalesRecord* sales_head = NULL; // 登录验证函数 int login_system() { char username[32]; char password[64]; printf("\n======== 农业合作社管理系统 ========\n"); printf("用户名: "); fgets(username, sizeof(username), stdin); username[strcspn(username, "\n")] = '\0'; // 去除换行符 printf("密码: "); fgets(password, sizeof(password), stdin); password[strcspn(password, "\n")] = '\0'; // 遍历用户链表查找匹配 User* p = user_list; while (p != NULL) { if (strcmp(p->username, username) == 0 && strcmp(p->password, password) == 0) { current_user = p; login_state = LOGGED_IN; return 1; } p = p->next; } printf("登录失败,用户名或密码错误!\n"); return 0; } // 主菜单控制流程 void main_menu() { int choice; do { printf("\n==== 主菜单 ====\n"); printf("1. 登录系统\n"); printf("2. 退出程序\n"); printf("请选择操作: "); scanf("%d", &choice); getchar(); // 清除输入缓冲区 switch(choice) { case 1: if (login_system()) { role_based_menu(); } break; case 2: printf("系统已退出\n"); exit(0); default: printf("无效选择,请重新输入!\n"); } } while (1); } // 角色菜单分发器 void role_based_menu() { while (login_state == LOGGED_IN) { printf("\n===== 欢迎 %s [%s] =====\n", current_user->username, get_role_name(current_user->role)); switch(current_user->role) { case ROLE_ADMIN: admin_main_menu(); break; case ROLE_OPERATOR: operator_main_menu(); break; case ROLE_FINANCE: finance_management_menu(); break; default: printf("未知用户角色!\n"); login_state = LOGGED_OUT; } } } int main() { initialize_system(); current_user = user_login(); if (current_user) { printf("\n欢迎您,%s!\n", current_user->username); switch (current_user->role) { case ROLE_ADMIN: admin_main_menu(); break; case ROLE_OPERATOR: operator_main_menu(); break; case ROLE_FINANCE: finance_management_menu(); break; default: printf("未知用户角色!\n"); } } else { printf("登录失败,系统退出!\n"); } // 释放内存资源 free_resources(); return 0; } 这一大段全部代码有哪些错误
05-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值