当前位置: 首页 > news >正文

基于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语言的卡丁车管理系统【控制台应用程序】

注意&#xff1a;需要提前创建对应的.dat文件 本项目实现了数据的永久存储&#xff0c;有用户的注册、登录。 管理员对卡丁车的管理、查看预约用户、修改帐户权限。 用户对个人信息的管理、查看并预约卡丁车、卡丁车维修上报。 维修员对卡丁车的维修状态上报、个人信息管理。 …...

Docker 搭建 Gogs

Docker 搭建 Gogs 准备工作 先准备配置目录和持久化目录&#xff0c;举个栗子&#xff1a;mkdir -p /opt/module/gogs/{data,backup} 拉取官方Gogs镜像 # 拉取 gogs:0.13 docker pull gogs/gogs:0.13 # 拉取最新版 gogs 镜像 docker pull gogs/gogs启动一个临时容器【通过创…...

PostgreSQL的备份方式

PostgreSQL 提供多种方式进行备份&#xff0c;适用于不同需求的场景。常用的备份方法如下&#xff1a; 1. 逻辑备份&#xff08;pg_dump 和 pg_dumpall&#xff09; 1.1 使用 pg_dump 备份单个数据库 pg_dump 是 PostgreSQL 内置的逻辑备份工具&#xff0c;可以将数据库导出为…...

Springboot 3项目整合Knife4j接口文档(接口分组详细教程)

文章目录 前言一、Spring Boot 3.0整合Knife4j二、OpenApi 3注解的使用规范三、使用步骤 1.Spring Boot 3.0项目中使用knife4j2.在application.yml中添加knife4j相关配置3.设置WebMvc相关配置&#xff08;解决封装统一异常处理后doc.html无法打开的问题&#xff09;4.创建Knif…...

深入解析 Conda 安装的默认依赖包及其作用:conda create安装了哪些包(中英双语)

深入解析 Conda 安装的默认依赖包及其作用 当我们使用 Conda 创建新环境时&#xff0c;例如执行命令&#xff1a; conda create -n olmes python3.10Conda 会自动为我们安装一系列基础依赖包&#xff0c;保证 Python 环境能够正常运行。这些包不仅是我们开发的基础工具&#…...

Redis核心技术知识点全集

Redis数据结构和常用命令 1. String字符串2. Hash哈希3. List列表4. Set集合5. Sorted Set有序集合6. Redis常用命令参考Redis事务机制...

【Unity3D】ECS入门学习(九)SystemBase

SystemBase&#xff1a;支持主线程或多线程执行筛选实体任务。 主要介绍是内部成员&#xff1a;Entities的各种筛选方法&#xff0c;其内部成员还有EntityManager ForEach方法筛选&#xff0c;传递一个有参委托函数进去&#xff0c;参数ref xxx组件类&#xff08;可填多个&…...

【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始

模型部署系列文章 前置-docker 理解:【 0 基础 Docker 极速入门】镜像、容器、常用命令总结前置-http/gRPC 的理解: 【HTTP和gRPC的区别】协议类型/传输效率 /性能等对比【保姆级教程附代码】Pytorch (.pth) 到 TensorRT (.plan) 模型转化全流程【保姆级教程附代码(二)】Pytor…...

CertiK《Hack3d:2024年度安全报告》(附报告全文链接)

CertiK《Hack3d&#xff1a;2024年度安全报告》现已发布&#xff0c;本次报告深入分析了2024年Web3.0领域的安全状况。2024年损失总额超过23亿美元&#xff0c;同比增幅高达31.61%&#xff1b;其中&#xff0c;12月的损失金额最少。过去一年&#xff0c;网络钓鱼攻击和私钥泄露…...

TIOBE 指数 12 月排行榜公布,VB.Net排行第九

IT之家 12 月 10 日消息&#xff0c;TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标&#xff0c;评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎&#xff0c;今天 TIOBE 官网公布了 2024 年 12 月的编程语言排行榜&#xff0c;IT之家整理如下&#xff1a; …...

【网络协议】开放式最短路径优先协议OSPF详解(一)

OSPF 是为取代 RIP 而开发的一种无类别的链路状态路由协议&#xff0c;它通过使用区域划分以实现更好的可扩展性。 文章目录 链路状态路由协议OSPF 的工作原理OSPF 数据包类型Dijkstra算法、管理距离与度量值OSPF的管理距离OSPF的度量值 链路状态路由协议的优势拓扑结构路由器O…...

嵌入式Linux驱动开发的基本知识(驱动程序的本质、常见的设备类型、设备号的本质理解、设备实例的注册过程)

基本概念之什么是驱动程序()&#xff1f; 驱动程序本质上是代码逻辑的集合&#xff0c;通常用于管理、驱动多个设备实例。某个设备要想使用驱动程序&#xff0c;需要实例化相应的驱动程序的结构体&#xff0c;并在系统中注册&#xff0c;获得主设备号、次设备号&#xff0c;并…...

爱死机第四季(秘密关卡)4KHDR国语字幕

通过网盘分享的文件&#xff1a;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插件提供的一种方法&#xff0c;用于根据当前应用的语言环境来获取相应的翻译文本。 以下是一个简单的示例&#xff0c;展示如何在Vue I18n中定义消息&#xff1a; const i18n new VueI18n({locale: en, // 设置默认语言messages: {en: {collectionPlan: Collec…...

[C++刷题] 求回文素数

求回文素数 题目 素数回文数的个数 题目描述 求 11 11 11 到 n n n 之间&#xff08;包括 n n n&#xff09;&#xff0c;既是素数又是回文数的整数有多少个。 输入格式 一个大于 11 11 11 小于 10000 10000 10000 的整数 n n n。 输出格式 11 11 11 到 n n n 之…...

SQLALchemy如何将SQL语句编译为特定数据库方言

最近在一个使用fastapitortoise-orm的项目中&#xff0c;需要将orm的语句编译成特定数据库方言&#xff0c;但是查询了官方文档及一些资料却找不到合适的方法论&#x1f614;&#xff0c;于是乎我就把目光放到了sqlalchemy身上&#xff0c;东找西找给我找着了。话不多说&#x…...

[卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析

目录 [卫星遥感] 解密卫星目标跟踪&#xff1a;挑战与突破的深度剖析 1. 卫星目标跟踪的核心挑战 1.1 目标的高速与不确定性 1.2 卫星传感器的局限性 1.3 数据处理与融合问题 1.4 大尺度与实时性要求 2. 当前卫星目标跟踪的主流技术 2.1 卡尔曼滤波&#xff08;Kalman …...

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

存储器模式&#xff1a;在HAL库中&#xff0c;I2C有专门对存储器外设设置的库函数 I2C&#xff08;一&#xff09;&#xff1a;存储器模式的使用 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 …...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...