基于C语言的卡丁车管理系统【控制台应用程序】
注意:需要提前创建对应的.dat文件
本项目实现了数据的永久存储,有用户的注册、登录。
管理员对卡丁车的管理、查看预约用户、修改帐户权限。
用户对个人信息的管理、查看并预约卡丁车、卡丁车维修上报。
维修员对卡丁车的维修状态上报、个人信息管理。
登录信息页面
login.h
//
// Created by SGCNB666 on 2024/12/27.
//#ifndef GO_KARTS_LOGIN_H
#define GO_KARTS_LOGIN_H#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 账户机构提
typedef struct User
{char username[20]; // 用户名char password[20]; // 密码char permission; // 权限
}User;// 用户个人信息
typedef struct UserPerson
{char name[20]; //用户名char phone[15]; //电话int kart_booknot; //预约卡丁车编号
}UserPerson;// 用户链表
typedef struct UserList
{User data; // 用户信息struct UserList *next; // 指向下一个用户
}UserList;// 用户个人信息链表
typedef struct UserPersonList
{UserPerson data; //用户个人信息struct UserPersonList *next; //指向下一个用户个信息
}UserPersonList;/*** 登录验证* */
UserList* user(UserList *head);/*** 注册* */
int enroll_user(UserList **head);/*** 插入用户* */
int init_user_list(UserList **head, User user);/*** 用户信息的添加* */
void add_user_person(UserPersonList **head, UserList *user);/*** 创建用户个人信息* */
int init_user_Person_list(UserPersonList **head, UserPerson *userPerson);/*** 销毁用户列表* */
void destroy_user_list(UserList *head);/*** 销毁用户个人信息列表* */
void destroy_user_person_list(UserPersonList *head);/*** 保存用户列表到文件* */
void save_user_file(UserList *head);/*** 保存用户个人信息列表到文件* */
void save_user_person_file(UserPersonList *head);/*** 从文件加载用户列表* */
void load_user_file(UserList **head);/*** 从文件加载用户个人信息列表* */
void load_user_person_file(UserPersonList **head);/*** 程序欢迎界面* */
void login_welcome();/*** 登录主界面* */
UserList* login(UserList **head);/*** 输出用户列表* */
void print_user_list(UserList *head);#endif //GO_KARTS_LOGIN_H
login.c
#include "login.h"/*** 登录验证* */
UserList* user(UserList *head)
{UserList *p = head; // p指向头节点User user; // 用户信息printf("请输入用户名:");scanf("%s", user.username); // 输入用户名printf("请输入密码:");scanf("%s", user.password); // 输入密码while(p) // 遍历链表{if(!strcmp(p->data.username, user.username) && !strcmp(p->data.password, user.password)) // 用户名和密码都正确{return p;}p = p->next; // p指向下一个节点}return NULL;
}/*** 注册* */
int enroll_user(UserList **head)
{User user; // 用户信息UserList *p = *head; // p指向头节点int flag = 1; // 标志位while(flag) // 循环输入用户名{printf("请输入用户名:");scanf("%s", user.username); // 输入用户名while (p){if(!strcmp(p->data.username, user.username)) // 用户名已存在{printf("用户名已存在,请重新输入!\n");flag = 1;break;}flag = 0; // 没有找到相同的用户名,更改标志位p = p->next; // p指向下一个节点}p = *head; // p重新指向头节点}printf("请输入密码:");scanf("%s", user.password); // 输入密码if(strcmp(user.username, "admin")) // 如果是管理员,管理员有且仅有admin一个{user.permission = 'A'; // 管理员权限}else{user.permission = 'U'; // 否则是用户权限}if( init_user_list(head, user) ) // 插入用户{return -1;}return 0;
}/*** 插入用户* */
int init_user_list(UserList **head, User user)
{UserList *pNew = (UserList *)malloc(sizeof (UserList)); // 分配内存UserList *p = *head; // p指向头节点if(!pNew) // 分配内存失败{perror("内存分配失败!");return -1;}if(*head != NULL) // 链表不为空{while(p->next) // 遍历链表{p = p->next; // p指向下一个节点}p->next = pNew; // p指向新节点pNew->data = user; // 插入用户信息pNew->next = NULL; // 新节点的next指向NULLreturn 0;}pNew->next = NULL; // 新节点的next指向NULLpNew->data = user; // 插入用户信息*head = pNew; // 头节点指向新节点return 0;
}/*** 用户信息的添加* */
void add_user_person(UserPersonList **head, UserList *user)
{UserPersonList *p = *head; // p指向头节点while(p) // 遍历链表{if(!strcmp(p->data.name, user->data.username)) // 找到相同的用户名{return;}p = p->next; // p指向下一个节点}UserPerson userPerson; // 用户个人信息printf("您是第一次登录,请完善个人信息\n");strcpy(userPerson.name ,user->data.username); // 用户名userPerson.kart_booknot = 0; // 默认没有预约,默认为0,1表示已经被预约printf("请输入您的手机号:");scanf("%s", userPerson.phone); // 手机号while (getchar()!= '\n');init_user_Person_list(head, &userPerson); // 插入用户个人信息return;
}/*** 创建用户个人信息* */
int init_user_Person_list(UserPersonList **head, UserPerson *userPerson)
{UserPersonList *pNew = (UserPersonList *)malloc(sizeof (UserPersonList)); // 分配内存UserPersonList *p = *head; // p指向头节点if(!pNew) // 分配内存失败{perror("内存分配失败!");return -1;}if(*head != NULL) // 链表不为空{while(p->next) // 遍历链表{p = p->next; // p指向下一个节点}p->next = pNew; // p指向新节点pNew->data = *userPerson; // 插入用户个人信息pNew->next = NULL; // 新节点的next指向NULLreturn 0;}pNew->next = NULL; // 新节点的next指向NULLpNew->data = *userPerson; // 插入用户个人信息*head = pNew; // 头节点指向新节点return 0;
}/*** 销毁用户列表* */
void destroy_user_list(UserList *head)
{UserList *p = head, *q = NULL; // p指向头节点,q指向p的前一个节点while(p) // 遍历链表,指针尾随{q = p; // q指向pp = p->next; // p指向下一个节点free(q); // 释放q}
}/*** 销毁用户个人信息列表* */
void destroy_user_person_list(UserPersonList *head)
{UserPersonList *p = head, *q = NULL; // p指向头节点,q指向p的前一个节点while(p) // 遍历链表,指针尾随{q = p; // q指向pp = p->next; // p指向下一个节点free(q); // 释放q}
}/*** 保存用户列表到文件* */
void save_user_file(UserList *head)
{FILE *fp; // 文件指针fp = fopen("login_user.dat", "wb"); // 以二进制方式打开文件if(!fp) // 文件打开失败{perror("文件打开失败");return;}UserList *p = head; // p指向头节点while(p) // 遍历链表{fwrite(&(p->data), sizeof(User), 1, fp); // 写入文件,每次写入一个用户信息p = p->next; // p指向下一个节点}printf("保存成功!\n");fclose(fp); // 关闭文件
}/*** 保存用户个人信息列表到文件* */
void save_user_person_file(UserPersonList *head)
{FILE *fp; // 文件指针fp = fopen("person_info.dat", "wb"); // 以二进制方式打开文件if(!fp) // 文件打开失败{perror("文件打开失败");return;}UserPersonList *p = head; // p指向头节点while(p) // 遍历链表{fwrite(&(p->data), sizeof(UserPerson), 1, fp); // 写入文件,每次写入一个用户信息p = p->next; // p指向下一个节点}printf("保存成功!\n");fclose(fp); // 关闭文件
}/*** 从文件加载用户列表* */
void load_user_file(UserList **head)
{FILE *fp; // 文件指针fp = fopen("login_user.dat", "rb"); // 以二进制方式打开文件if(!fp) // 文件打开失败{perror("文件打开失败");return;}User user; // 用户信息while(fread(&user, sizeof (User), 1, fp) == 1 ) // 读取文件,每次读取一个用户信息{init_user_list(head, user); // 读取用户列表}fclose(fp); // 关闭文件
}/*** 从文件加载用户个人信息列表* */
void load_user_person_file(UserPersonList **head)
{FILE *fp; // 文件指针fp = fopen("person_info.dat", "rb"); // 以二进制方式打开文件if(!fp){perror("文件打开失败");return;}UserPerson userPerson1; // 用户信息while(fread(&userPerson1, sizeof (UserPerson), 1, fp) == 1 ) // 读取文件,每次读取一个用户信息{init_user_Person_list( head,&userPerson1); // 读取用户列表}fclose(fp); // 关闭文件
}/*** 程序欢迎界面* */
void login_welcome()
{system("clear"); // 清屏printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ ┃\n");printf("┃ 欢迎进入卡丁车管理系统有系统 ┃\n");printf("┃ ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("按任意键继续...\n");getchar();
}/*** 登录主界面* */
UserList* login(UserList **head)
{printf("登录页面\n");UserList* p = NULL; // p指向头节点char ch;while(1){system("clear"); // 清屏printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.登录 2.注册 3.退出 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':p = user(*head);if( p ){printf("登录成功!\n");return p;}else{printf("密码错误,登录失败!\n");}break;case '2':enroll_user(head);break;case '3':{return NULL;}break;case '4':print_user_list(*head);break;default:printf("输入错误,请重新输入!\n");break;}while (getchar() != '\n');printf("按任意键继续...\n");getchar();}
}/*** 打印用户列表* */
void print_user_list(UserList *head)
{UserList *p = head;while(p){printf("用户名:%s\n", p->data.username);printf("密码:%s\n", p->data.password);printf("权限:%c\n", p->data.permission);p = p->next;}
}
登录后页面
home_face.h
//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_HOME_FACE_H
#define GO_KARTS_HOME_FACE_H#include <stdio.h>
#include "login.h"
#include "user.h"
#include "admin.h"
#include "repair.h"/*** 显示管理员主页面*/
void admin_home(UserPersonList* head_person,KartNode** head, UserList* head_user);/*** 显示用户主页面*/
void user_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List);/*** 显示维修员主页面*/
void repair_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List);/*** 卡丁车信息界面* */
void karts_info(KartNode** head);/*** 权限管理页面* */
void user_info(UserList* head);/*** 卡丁车预约界面* */
void katrs_book(UserPerson* head_person,KartNode* head_kart);/*** 个人信息管理界面* */
void user_person(UserPerson* userPerson, UserList* user_List);/*** 卡丁车报修界面* */
void karts_repair(KartNode* head_kart);/*** 修改密码* */
void change_password(UserList* user);#endif //GO_KARTS_HOME_FACE_H
home_face.c
//
// Created by SGCNB666 on 2024/12/31.
//#include "home_face.h"/*** 显示管理员主界面* */
void admin_home(UserPersonList* head_person,KartNode** head_kart, UserList* head_user)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("管理员主页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.卡丁车信息管理 3.权限管理 4.删除用户 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':save_user_person_file(head_person);save_user_file(head_user);return;break;case '2':karts_info( head_kart);break;case '3':user_info(head_user);break;case '4':delete_User(&head_user, &head_person);break;default:printf("输入错误,请重新输入!\n");break;}while (getchar() != '\n');printf("按任意键继续...\n");getchar();}}/*** 显示用户主页面*/
void user_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List)
{while (getchar() != '\n');UserPersonList *p = head_person;KartNode *p_kart = head_kart;while(p){if(strcmp(p->data.name,user_List->data.username)==0){break;}p = p->next;}UserPerson *userPerson = &(p->data);while(1){system("clear"); // 清屏char ch;while (getchar()!= '\n');printf("用户主页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.卡丁车预约管理 3.个人信息管理 ┃\n");printf("┃ 4.卡丁车报修 5.卡丁车信息查询 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':user_kart_booknot_save(head_person,head_kart);return;break;case '2':katrs_book(&p->data,p_kart);break;case '3':user_person(&p->data,user_List);break;case '4':user_kart_repair(&p->data,p_kart);break;case '5':print_Kart_list(p_kart);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar()!= '\n');getchar();}}/*** 显示维修员主页面*/
void repair_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List)
{while (getchar() != '\n');UserPersonList *p = head_person;KartNode *p_kart = head_kart;while(p){if(strcmp(p->data.name,user_List->data.username)==0){break;}p = p->next;}UserPerson *userPerson = &(p->data);while (1){system("clear"); // 清屏char ch;printf("维修员主页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.卡丁车报修管理 3.个人信息管理 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':user_kart_booknot_save(head_person,head_kart);return;break;case '2':karts_repair(head_kart);break;case '3':user_person(&p->data,user_List);break;default:printf("输入错误,请重新输入!\n");break;}}}
/*** 卡丁车信息界面* */
void karts_info(KartNode** head)
{load_Kart_file(head);while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("卡丁车信息管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.保存退出 2.增加卡丁车信息 3.删除卡丁车信息 ┃\n");printf("┃ 4.修改卡丁车信息 5.查询卡丁车信息 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':save_Kart_file(*head);return;break;case '2':enroll_Kart(head);break;case '3':delete_Kart(head);break;case '4':modify_Kart(*head);break;case '5':print_Kart_list(*head);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');getchar();}
}/*** 权限管理页面* */
void user_info(UserList* head)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("权限身份管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.保存退出 2.修改用户权限身份标识 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':save_user_file(head);return;break;case '2':revise_User_perm(head);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 卡丁车预约界面* */
void katrs_book(UserPerson* userPerson,KartNode* head_kart)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("预约管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.卡丁车预约 3.卡丁车预约取消 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':return;break;case '2':user_kart_booknot(userPerson,head_kart);break;case '3':user_kart_booknot_cancel(userPerson,head_kart);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 个人信息管理界面* */
void user_person(UserPerson* userPerson, UserList* user_List)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("个人信管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.查看个人信息 3.修改个人信息 4.修改密码 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':save_user_file(user_List);return;break;case '2':if(user_List->data.permission == 'R'){print_repair_info(userPerson);}else{print_user_info(userPerson);}break;case '3':revise_user_info(userPerson);break;case '4':change_password(user_List);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 卡丁车报修界面* */
void karts_repair(KartNode* head_kart)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("卡丁车报修管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.退出 2.查看待报修卡丁车 3.上报维修完成或无法维修进行报废处理 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':save_Kart_file(head_kart);return;break;case '2':repair_karts_info(head_kart);break;case '3':report_repair_info(head_kart);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 修改密码* */
void change_password(UserList* user)
{printf("请输入新密码:");scanf("%s",user->data.password);return;
}
管理员功能页面
admin.h
//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_ADMIN_H
#define GO_KARTS_ADMIN_H
#include <stdio.h>
#include <stdlib.h>
#include "login.h"// 赛车结构体
typedef struct Kart
{int kart_id; // 赛车编号char repair_not; // 是否需要维修char kart_name[20]; // 赛车名称char kart_type[20]; // 赛车类型char kart_color[20]; // 赛车颜色char book_not; // 是否被预定char user_name[20]; // 预定用户
}Kart;// 卡丁车链表
typedef struct KartNode
{Kart data;struct KartNode *next;
}KartNode;/*** 添加卡丁车信息* */
void enroll_Kart(KartNode **head);
/*** 添加卡丁车节点* */
void init_Kart_List(KartNode **head, Kart data);/*** 销毁卡丁车列表* */
void destroy_Kart_list(KartNode *head);/*** 保存卡丁车列表到文件* */
void save_Kart_file(KartNode *head);/*** 从文件加载卡丁车列表* */
void load_Kart_file(KartNode **head);/*** 查询卡丁车列表* */
void print_Kart_list(KartNode *head);/*** 删除卡丁车* */
void delete_Kart(KartNode **head);/*** 修改卡丁车信息* */
void modify_Kart(KartNode *head);/*** 修改用户权限身份* */
void revise_User_perm(UserList *head);/*** 删除用户* */
void delete_User(UserList **head, UserPersonList **head_person);/*** 删除用户信息* */
void delete_User_Person(UserList *head, UserPersonList **head_person);#endif //GO_KARTS_ADMIN_H
admin.c
//
// Created by SGCNB666 on 2024/12/31.
//#include "admin.h"/*** 添加卡丁车信息* */
void enroll_Kart(KartNode **head)
{int id; // 生成卡丁车编号KartNode *p = *head; // p指向头节点if(!p) // 链表为空{id = 1001;}else{while(p){id = p->data.kart_id + 1; // 生成卡丁车编号p = p->next; // p指向下一个节点}}Kart new_kart;new_kart.kart_id = id; // 生成卡丁车编号new_kart.repair_not = '0'; // 初始化是否维修,默认不需要维修new_kart.book_not = '0'; // 初始化是否预约,默认不需要预约new_kart.user_name[0] = '\0'; // 初始化预约人为空printf("添加编号为%d的车辆信息\n", id);printf("请输入卡丁车名称:");scanf("%s", new_kart.kart_name); // 输入卡丁车名称printf("请输入卡丁车类型:");scanf("%s", new_kart.kart_type); // 输入卡丁车类型printf("请输入卡丁车颜色:");scanf("%s", new_kart.kart_color); // 输入卡丁车颜色init_Kart_List(head, new_kart);
}/*** 添加卡丁车节点* */
void init_Kart_List(KartNode **head, Kart data)
{KartNode *pNew = (KartNode *)malloc(sizeof(KartNode)); // 分配内存if(!pNew) // 分配内存失败{perror("内存分配失败\n");return;}KartNode *p = *head; // p指向头节点if(*head != NULL) // 链表不为空{while(p->next) // 找到链表的尾节点{p = p->next; // p指向下一个节点}p->next = pNew; // 尾节点指向新节点pNew->data = data; // 新节点数据赋值pNew->next = NULL; // 新节点指向空return;}pNew->next = NULL; // 新节点指向空pNew->data = data; // 新节点数据赋值*head = pNew; // 头节点指向新节点return;
}/*** 销毁卡丁车列表* */
void destroy_Kart_list(KartNode *head)
{KartNode *p = head, *q = NULL; // p指向头节点,q指向尾节点while(p) // 遍历链表{q = p; // q指向pp = p->next; // p指向下一个节点free(q); // 释放内存}
}/*** 保存卡丁车列表到文件* */
void save_Kart_file(KartNode *head)
{FILE *fp = fopen("karts_info.dat", "wb"); // 以二进制方式打开文件if(!fp) // 打开文件失败{perror("文件打开失败!");return;}KartNode *p = head; // p指向头节点while(p) // 遍历链表{fwrite( &p->data, sizeof (Kart), 1, fp); // 写入文件p = p->next;}printf("保存成功!\n");fclose(fp); // 关闭文件return;
}/*** 从文件加载卡丁车列表* */
void load_Kart_file(KartNode **head)
{FILE *fp = fopen("karts_info.dat", "rb"); // 以二进制方式打开文件if(!fp) // 打开文件失败{perror("文件打开失败!");return;}Kart data; // 卡丁车信息while(fread(&data, sizeof (Kart), 1, fp)) // 读取文件{init_Kart_List(head, data); // 添加卡丁车节点}fclose(fp); // 关闭文件
}/*** 查询卡丁车列表* */
void print_Kart_list(KartNode *head)
{KartNode *p = head; // p指向头节点if(!p){printf("卡丁车列表为空!\n");return;}printf("卡丁车编号\t卡丁车名称\t卡丁车类型\t卡丁车颜色\t是否维修或报废\t是否预约\t预约人\n");while(p) // 遍历链表{printf("%d\t\t", p->data.kart_id);printf("%s\t\t", p->data.kart_name);printf("%s\t\t", p->data.kart_type);printf("%s\t\t", p->data.kart_color);if(p->data.repair_not == '0'){printf("%c(无损坏)\t", p->data.repair_not);}else if(p->data.repair_not == '1'){printf("%c(报修中)\t", p->data.repair_not);}else{printf("%c(已报废)\t", p->data.repair_not);}printf("%c\t\t", p->data.book_not);printf("%s\t\t\n", p->data.user_name);p = p->next; // p指向下一个节点}
}/*** 删除卡丁车* */
void delete_Kart(KartNode **head)
{KartNode *p = *head; // p指向头节点if(!p) // 链表为空{printf("卡丁车列表为空!\n");}int id;printf("请输入要删除的卡丁车编号:");scanf("%d", &id); // 输入卡丁车编号KartNode *q = NULL; // q置空while(p) // 遍历链表,指针尾随{ if(id == p->data.kart_id){if(p == *head) // 要删除的是头节点{*head = p->next; // 头节点后移free(p); // 释放内存return;}else{q->next = p->next; // 前一个节点指向后一个节点free(p); // 释放内存return;}}q = p; // q指向pp = p->next; // p指向下一个节点}printf("卡丁车编号不存在!\n");return;
}/*** 修改卡丁车信息* */
void modify_Kart(KartNode *head)
{KartNode *p = head, *q = NULL; // p指向头节点,q指向尾节点if(!p) // 链表为空{printf("卡丁车列表为空!\n");}int id; // 卡丁车编号printf("请输入要修改的卡丁车编号:");scanf("%d", &id); // 输入卡丁车编号while(p) // 遍历链表{if(id == p->data.kart_id) // 找到了要修改的卡丁车{while(1) // 循环修改卡丁车信息{printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.全部修改 2.是否维修 3.卡丁车名称 ┃\n");printf("┃ 4.卡丁车类型 5.卡丁车颜色 6.预约用户名 ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");while(getchar() != '\n'); // 清空缓冲区printf("请选择:\n");char ch;scanf("%c", &ch); // 输入选择while(getchar() != '\n'); // 清空缓冲区switch(ch){case '1':printf("请输入卡丁车名称:");scanf("%s", p->data.kart_name);printf("请输入卡丁车类型:");scanf("%s", p->data.kart_type);printf("请输入卡丁车颜色:");scanf("%s", p->data.kart_color);while(getchar() != '\n');printf("请输入是否维修:");scanf("%c", &p->data.repair_not);while(getchar() != '\n');printf("请输入预约用户名:");scanf("%s", p->data.user_name);p->data.book_not = '1';while(getchar() != '\n');return;break;case '2':printf("请输入是否维修:");scanf("%c", &p->data.repair_not);while(getchar() != '\n');return;break;case '3':printf("请输入卡丁车名称:");scanf("%s", p->data.kart_name);while(getchar() != '\n');return;break;case '4':printf("请输入卡丁车类型:");scanf("%s", p->data.kart_type);while(getchar() != '\n');return;break;case '5':printf("请输入卡丁车颜色:");scanf("%s", p->data.kart_color);while(getchar() != '\n');return;break;case '6':printf("请输入预约用户名:");scanf("%s", p->data.user_name);p->data.book_not = '1';while(getchar() != '\n');return;break;default:printf("不存在该选项,请重新输入!\n");}printf("按回车健继续...");getchar();}}q = p; // q指向pp = p->next; // p指向下一个节点}printf("卡丁车编号不存在!\n");return;
}/*** 修改用户权限身份* */
void revise_User_perm(UserList *head)
{UserList *p = head; // p指向头节点if(!p) // 链表为空{printf("用户列表为空!\n");return;}char username[20]; // 用户名printf("请输入要修改权限的用户名:");scanf("%s", username); // 输入用户名while(getchar() != '\n');if(strcmp(username, "admin") == 0) // 要修改的是admin用户{printf("admin用户是管理员,不能修改权限!\n");return;}while(p) // 遍历链表{if(strcmp(username, p->data.username) == 0) // 找到了要修改的用户{printf("开始修改用户权限:('A'是普通用户,'R'是维修员)\n");scanf("%c", &p->data.permission);printf("修改成功!\n");printf("%s, %s, %c\n", p->data.username, p->data.password, p->data.permission);return;}p = p->next; // p指向下一个节点}printf("用户不存在!\n");return;
}/*** 删除用户* */
void delete_User(UserList **head, UserPersonList **head_person)
{printf("请输入想要删除的用户名:\n");char username[20];scanf("%s", username);while(getchar()!= '\n');UserList *p = *head;if(strcmp(username, "admin") == 0) // 要删除的是admin用户{printf("admin用户是管理员,不能删除!\n");return;}if(!p) // 链表为空{printf("用户列表为空!\n");return;}if(strcmp(username, p->data.username) == 0) // 要删除的是头节点{delete_User_Person(*head, head_person); // 删除用户信息*head = p->next; // 头节点后移free(p); // 释放内存return;}UserList *q = NULL;while(p) // 遍历链表{if(strcmp(username, p->data.username) == 0) // 找到了要删除的用户{ delete_User_Person(*head, head_person); // 删除用户信息q->next = p->next; // 前一个节点指向后一个节点free(p); // 释放内存return;}q = p; // q指向pp = p->next; // p指向下一个节点}printf("该用户不存在!\n");return;
}/*** 删除用户信息* */
void delete_User_Person(UserList *user, UserPersonList **head_person)
{UserList *p_user = user; // p_user指向头节点UserPersonList *p_person = *head_person; // p_person指向头节点if(strcmp(p_user->data.username,p_person->data.name) == 0) // 要删除的是头节点{*head_person = p_person->next; // 头节点后移free(p_person); // 释放内存return;}UserPersonList *q_person = NULL; // q_person指向尾节点while(p_person) // 遍历链表{if(strcmp(p_user->data.username,p_person->data.name) == 0) // 找到了要删除的用户{q_person->next = p_person->next; // 前一个节点指向后一个节点free(p_person); // 释放内存return;}q_person = p_person; // q_person指向p_personp_person = p_person->next; // p_person指向下一个节点}printf("该用户不存在!\n");return;
}
用户功能页面
user.h
//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_USER_H
#define GO_KARTS_USER_H#include "admin.h"
#include "login.h"/*** 卡丁车预约* */
void user_kart_booknot(UserPerson *userPerson,KartNode *kart);/*** 卡丁车查询* */
void user_kart_booknot_query(KartNode *kart);/*** 卡丁车预约取消* */
void user_kart_booknot_cancel(UserPerson *userPerson,KartNode *kart);/*** 卡丁车预约信息保存* */
void user_kart_booknot_save(UserPersonList *head,KartNode *kart);/*** 卡丁车预约信息加载* */
void user_kart_booknot_load(UserPersonList **head);/*** 卡丁车报修* */
void user_kart_repair(UserPerson *userPerson,KartNode *kart);/*** 个人信息查询* */
void print_user_info(UserPerson *userPerson);/*** 个人信息修改* */
void revise_user_info(UserPerson *userPerson);#endif //GO_KARTS_USER_H
user.c
//
// Created by SGCNB666 on 2024/12/31.
//#include "user.h"/*** 卡丁车预约* */
void user_kart_booknot(UserPerson *userPerson,KartNode *kart)
{KartNode *p = kart; // p指向头节点while(p) // 遍历链表{if(!strcmp(userPerson->name,p->data.user_name)) // 判断是否预约过{printf("您已经预约了卡丁车!\n");return;}p = p->next; // p指向下一个节点}p = kart; // p重新指向头节点print_Kart_list(p); // 打印卡丁车列表printf("请输入要预约的卡丁车编号:");int num; // 输入的编号scanf("%d", &num); // 输入编号while(getchar() != '\n');while(p) // 遍历链表{if(p->data.kart_id == num) // 找到了{p->data.book_not = '1'; // 预约成功userPerson->kart_booknot = num; // 修改用户个人信息strcpy(p->data.user_name ,userPerson->name); // 修改车辆信息printf("预约成功!\n");return;}p = p->next;}printf("查询不到该编号的卡丁车!\n");return;
}/*** 卡丁车预约查询* */
void user_kart_booknot_query(KartNode *kart)
{KartNode *p = kart; // p指向头节点print_Kart_list(kart); // 打印卡丁车列表
}/*** 卡丁车预约取消* */
void user_kart_booknot_cancel(UserPerson *userPerson,KartNode *kart)
{KartNode *p = kart; // p指向头节点print_Kart_list(p); // 打印卡丁车列表printf("请输取消预约的卡丁车编号:");int num; // 输入的编号scanf("%d", &num);while(getchar() != '\n'); // 清空缓冲区while(p) // 遍历链表{ if(p->data.kart_id == num) // 找到了{p->data.book_not = '0'; // 取消预约成功userPerson->kart_booknot = 0; // 修改用户个人信息strcpy(p->data.user_name ,""); // 修改车辆信息printf("取消预约成功!\n"); return;}p = p->next; // p指向下一个节点}printf("查询不到该编号的卡丁车!\n");return;
}/*** 卡丁车预约信息保存* */
void user_kart_booknot_save(UserPersonList *head,KartNode *kart)
{save_user_person_file(head); // 保存用户个人信息列表到文件save_Kart_file(kart); // 保存卡丁车列表到文件
}/*** 卡丁车预约信息加载* */
void user_kart_booknot_load(UserPersonList **head)
{load_user_person_file(head); // 加载用户个人信息列表
}/*** 卡丁车报修* */
void user_kart_repair(UserPerson *userPerson,KartNode *kart)
{KartNode *p = kart; // p指向头节点print_Kart_list(p); // 打印卡丁车列表printf("请输入要报修的卡丁车编号:");int num; // 输入的编号scanf("%d", &num); // 输入编号while(getchar() != '\n');while(p) // 遍历链表{if(p->data.kart_id == num) // 找到了{p->data.repair_not = '1'; // 报修成功printf("报修成功!\n");return;}p = p->next; // p指向下一个节点}printf("查询不到该编号的卡丁车!\n");return;
}/*** 个人信息查询* */
void print_user_info(UserPerson *userPerson)
{printf("个人信息如下:\n");printf("用户名:%s\n", userPerson->name);printf("手机号:%s\n", userPerson->phone);printf("预约卡丁车编号:%d\n", userPerson->kart_booknot);return;
}/*** 个人信息修改* */
void revise_user_info(UserPerson *userPerson)
{printf("请输入新的手机号:");scanf("%s", userPerson->phone); // 输入新的手机号while(getchar()!= '\n');return;
}
维修员功能实现
repair.h
//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_REPAIR_H
#define GO_KARTS_REPAIR_H#include "admin.h"
#include "user.h"
#include "login.h"/*** 显示维修员信息* */
void print_repair_info(UserPerson *userPerson);/*** 显示待维修的车辆信息* */
void repair_karts_info(KartNode *head);/*** 上报维修情况* */
void report_repair_info(KartNode *head);#endif //GO_KARTS_REPAIR_H
repair.c
//
// Created by SGCNB666 on 2024/12/31.
//#include "repair.h"/*** 显示维修员信息* */
void print_repair_info(UserPerson *userPerson)
{printf("个人信息如下:\n");printf("用户名:%s\n", userPerson->name);printf("手机号:%s\n", userPerson->phone);return;
}/*** 显示待维修的车辆信息* */
void repair_karts_info(KartNode *head)
{KartNode *p = head; // p指向头节点if(!p) // 如果链表为空{printf("卡丁车列表为空!\n");return;}while(p) // 遍历链表{if (p->data.repair_not == '1') // 如果需要维修{printf("编号:%d\t\t", p->data.kart_id);printf("名称:%s\t\t", p->data.kart_name);printf("类型:%s\t\t", p->data.kart_type);printf("颜色:%s\t\n", p->data.kart_color);}p = p->next; // p指向下一个节点}
}/*** 上报维修情况* */
void report_repair_info(KartNode *head)
{KartNode *p = head; // p指向头节点if(!p) // 如果链表为空{printf("卡丁车列表为空!\n");return;}printf("请输入你想上报的卡丁车编号:");int id; // 输入的编号scanf("%d", &id); // 输入编号while(getchar() != '\n');while(p) // 遍历链表{if(id == p->data.kart_id) // 找到了{while(getchar()!= '\n');printf("请输入维修情况(1:报废无法维修,2:维修完成):");char ch;scanf("%c", &ch); // 输入维修情况if(ch == '1'){p->data.repair_not = '3';printf("维修完成!\n");}else if(ch == '2'){p->data.repair_not = '0';printf("维修完成!\n");}else{printf("不存在该选项!\n");}return;}p = p->next; // p指向下一个节点}printf("卡丁车编号不存在!\n");return;
}
主函数main.c
/*************************************************************************> File Name: main.c> Author: sgc> Description: 卡丁车管理系统> Created Time: 2024年12月30日 星期一 17时53分14秒************************************************************************/#include <stdio.h>
#include "login.h"
#include "home_face.h"
#include "admin.h"int main(int argc,char *argv[])
{UserList *head_user = NULL;KartNode *head_kart = NULL;UserPersonList *head_person = NULL;load_user_file(&head_user); // 加载用户列表login_welcome(); // 显示欢迎界面UserList *p = NULL;p = login(&head_user); // 登录主界面if(!p) // 判断是否是正常登录{save_user_file(head_user);return 0;}save_user_file(head_user); // 保存用户列表到文件// 显示管理员主界面if(p->data.permission == 'U') // 管理员{load_user_person_file(&head_person); // 加载用户个人信息列表save_user_person_file(head_person); // 保存用户个人信息列表到文件admin_home( head_person,&head_kart,head_user); // 管理员主界面}else if(p->data.permission == 'A') // 普通用户{load_user_person_file(&head_person); // 加载用户个人信息列表add_user_person(&head_person, p); // 添加用户个人信息save_user_person_file(head_person); // 保存用户个人信息列表到文件load_Kart_file(&head_kart); // 加载卡丁车列表user_home(head_person,head_kart,p); // 用户主界面}else if(p->data.permission == 'R') // 维修员{load_user_person_file(&head_person); // 加载用户个人信息列表add_user_person(&head_person, p); // 添加用户个人信息save_user_person_file(head_person); // 保存用户个人信息列表到文件load_Kart_file(&head_kart); // 加载卡丁车列表repair_home(head_person,head_kart,p); // 维修员主界面}else // 其他{printf("权限错误!请联系管理员进行修改!\n");}destroy_user_list(head_user); // 销毁用户列表destroy_user_person_list(head_person); // 销毁用户个人信息列表destroy_Kart_list(head_kart); // 销毁卡丁车列表return 0;
}相关文章:
基于C语言的卡丁车管理系统【控制台应用程序】
注意:需要提前创建对应的.dat文件 本项目实现了数据的永久存储,有用户的注册、登录。 管理员对卡丁车的管理、查看预约用户、修改帐户权限。 用户对个人信息的管理、查看并预约卡丁车、卡丁车维修上报。 维修员对卡丁车的维修状态上报、个人信息管理。 …...
Docker 搭建 Gogs
Docker 搭建 Gogs 准备工作 先准备配置目录和持久化目录,举个栗子:mkdir -p /opt/module/gogs/{data,backup} 拉取官方Gogs镜像 # 拉取 gogs:0.13 docker pull gogs/gogs:0.13 # 拉取最新版 gogs 镜像 docker pull gogs/gogs启动一个临时容器【通过创…...
PostgreSQL的备份方式
PostgreSQL 提供多种方式进行备份,适用于不同需求的场景。常用的备份方法如下: 1. 逻辑备份(pg_dump 和 pg_dumpall) 1.1 使用 pg_dump 备份单个数据库 pg_dump 是 PostgreSQL 内置的逻辑备份工具,可以将数据库导出为…...
Springboot 3项目整合Knife4j接口文档(接口分组详细教程)
文章目录 前言一、Spring Boot 3.0整合Knife4j二、OpenApi 3注解的使用规范三、使用步骤 1.Spring Boot 3.0项目中使用knife4j2.在application.yml中添加knife4j相关配置3.设置WebMvc相关配置(解决封装统一异常处理后doc.html无法打开的问题)4.创建Knif…...
深入解析 Conda 安装的默认依赖包及其作用:conda create安装了哪些包(中英双语)
深入解析 Conda 安装的默认依赖包及其作用 当我们使用 Conda 创建新环境时,例如执行命令: conda create -n olmes python3.10Conda 会自动为我们安装一系列基础依赖包,保证 Python 环境能够正常运行。这些包不仅是我们开发的基础工具&#…...
Redis核心技术知识点全集
Redis数据结构和常用命令 1. String字符串2. Hash哈希3. List列表4. Set集合5. Sorted Set有序集合6. Redis常用命令参考Redis事务机制...
【Unity3D】ECS入门学习(九)SystemBase
SystemBase:支持主线程或多线程执行筛选实体任务。 主要介绍是内部成员:Entities的各种筛选方法,其内部成员还有EntityManager ForEach方法筛选,传递一个有参委托函数进去,参数ref xxx组件类(可填多个&…...
【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始
模型部署系列文章 前置-docker 理解:【 0 基础 Docker 极速入门】镜像、容器、常用命令总结前置-http/gRPC 的理解: 【HTTP和gRPC的区别】协议类型/传输效率 /性能等对比【保姆级教程附代码】Pytorch (.pth) 到 TensorRT (.plan) 模型转化全流程【保姆级教程附代码(二)】Pytor…...
CertiK《Hack3d:2024年度安全报告》(附报告全文链接)
CertiK《Hack3d:2024年度安全报告》现已发布,本次报告深入分析了2024年Web3.0领域的安全状况。2024年损失总额超过23亿美元,同比增幅高达31.61%;其中,12月的损失金额最少。过去一年,网络钓鱼攻击和私钥泄露…...
TIOBE 指数 12 月排行榜公布,VB.Net排行第九
IT之家 12 月 10 日消息,TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标,评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎,今天 TIOBE 官网公布了 2024 年 12 月的编程语言排行榜,IT之家整理如下: …...
【网络协议】开放式最短路径优先协议OSPF详解(一)
OSPF 是为取代 RIP 而开发的一种无类别的链路状态路由协议,它通过使用区域划分以实现更好的可扩展性。 文章目录 链路状态路由协议OSPF 的工作原理OSPF 数据包类型Dijkstra算法、管理距离与度量值OSPF的管理距离OSPF的度量值 链路状态路由协议的优势拓扑结构路由器O…...
嵌入式Linux驱动开发的基本知识(驱动程序的本质、常见的设备类型、设备号的本质理解、设备实例的注册过程)
基本概念之什么是驱动程序()? 驱动程序本质上是代码逻辑的集合,通常用于管理、驱动多个设备实例。某个设备要想使用驱动程序,需要实例化相应的驱动程序的结构体,并在系统中注册,获得主设备号、次设备号,并…...
爱死机第四季(秘密关卡)4KHDR国语字幕
通过网盘分享的文件:love_death_robot 链接: https://pan.baidu.com/s/1bG3Xtdopenil2O_y93hY_g?pwd8kib 提取码: 8kib...
kubelet状态错误报错
journalctl -xeu kubelet 执行后的日志如下: -- -- The process exit code is exited and its exit status is 1. Jan 02 14:20:06 iv-ydipyqxfr4wuxjsij0bd systemd[1]: kubelet.service: Failed with result exit-code. -- Subject: Unit failed -- Defined-By: system…...
<div>{{ $t(“collectionPlan“) }}</div> 中的$t是什么
$t是Vue I18n插件提供的一种方法,用于根据当前应用的语言环境来获取相应的翻译文本。 以下是一个简单的示例,展示如何在Vue I18n中定义消息: const i18n new VueI18n({locale: en, // 设置默认语言messages: {en: {collectionPlan: Collec…...
[C++刷题] 求回文素数
求回文素数 题目 素数回文数的个数 题目描述 求 11 11 11 到 n n n 之间(包括 n n n),既是素数又是回文数的整数有多少个。 输入格式 一个大于 11 11 11 小于 10000 10000 10000 的整数 n n n。 输出格式 11 11 11 到 n n n 之…...
SQLALchemy如何将SQL语句编译为特定数据库方言
最近在一个使用fastapitortoise-orm的项目中,需要将orm的语句编译成特定数据库方言,但是查询了官方文档及一些资料却找不到合适的方法论😔,于是乎我就把目光放到了sqlalchemy身上,东找西找给我找着了。话不多说&#x…...
[卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析
目录 [卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析 1. 卫星目标跟踪的核心挑战 1.1 目标的高速与不确定性 1.2 卫星传感器的局限性 1.3 数据处理与融合问题 1.4 大尺度与实时性要求 2. 当前卫星目标跟踪的主流技术 2.1 卡尔曼滤波(Kalman …...
I2C(一):存储器模式:stm32作为主机对AT24C02写读数据
存储器模式:在HAL库中,I2C有专门对存储器外设设置的库函数 I2C(一):存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…...
scrapy 教程
Scrapy Tutorial In this tutorial, we’ll assume that Scrapy is already installed on your system. If that’s not the case, see Installation guide. We are going to scrape quotes.toscrape.com, a website that lists quotes from famous authors. This tutorial …...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
