基于C语言的卡丁车管理系统【控制台应用程序】

news2025/1/4 19:18:13

注意:需要提前创建对应的.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指向NULL
        return 0;
    }
    pNew->next = NULL; // 新节点的next指向NULL
    pNew->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指向NULL
        return 0;
    }
    pNew->next = NULL; // 新节点的next指向NULL
    pNew->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指向p
        p = 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指向p
        p = 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指向p
        p = 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指向p
        p = 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指向p
        p = 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指向p
        p = 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_person
        p_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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSDN充值、收费、会员

现在在CSDN上查阅资料经常碰到需要充值或变成会员才能继续阅读的情况&#xff0c;一直以为是博客作者为了赚钱而设置的&#xff0c;今天才知道原来是CSDN弄的&#xff0c;因为我在不登录的情况下查看自己的博文也需要充钱&#xff01;我可没有做过任何设置。

ElasticSearch7.10-分词器

文章目录 分词器1.字符过滤器1.介绍2.过滤html标签3.mappings过滤规则&#xff08;屏蔽非文明用语&#xff09;4.正则替换 2.自定义分词器1.代码2.查询 3.中文分词器1.下载ik分词器7.10.0版本&#xff08;跟es对应&#xff09;2.应用ik分词器1.进入插件目录下创建一个ik目录2.将…

Linux之ARM(MX6U)裸机篇----6.BSP工程管理实验

一&#xff0c;BSP工程管理 定义&#xff1a;是为了模块化整理代码&#xff0c;相同属性的文件存放在同一个目录下。 ①先mkdir多个文件夹er ②把共同.h文件转移到指定文件夹下 二&#xff0c;启动文件 .global _start /* 全局标号 *//** 描述&#xff1a; _start函数&am…

【kubernetes组件合集】深入解析Kubernetes组件之三:client-go

深入解析Kubernetes组件之三&#xff1a;client-go 目录 深入解析Kubernetes组件之三&#xff1a;client-go 引言 1. client-go简介 2. client-go的功能 2.1 资源操作 2.2 资源监听 2.3 认证和授权 2.4 错误处理和重试 2.5 扩展性和定制化 3. 使用client-go与Kubern…

【门铃工作原理】2021-12-25

缘由关于#门铃工作原理#的问题&#xff0c;如何解决&#xff1f;-嵌入式-CSDN问答 4 RST&#xff08;复位&#xff09;当此引脚接高电平时定时器工作&#xff0c;当此引脚接地时芯片复位&#xff0c;输出低电平。 按钮按下给电容器充电并相当与短路了R1改变了频率&#xff0c;按…

html+css+js网页设计 美食 美食3个页面(带js)

htmlcssjs网页设计 美食 美食3个页面(带js) 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&…

jenkins修改端口以及开机自启

修改Jenkins端口 方式一&#xff1a;通过配置文件修改&#xff08;以CentOS为例&#xff09; 找到配置文件&#xff1a;在CentOS系统中&#xff0c;通常可以在/etc/sysconfig/jenkins文件中修改Jenkins的配置。如果没有这个文件&#xff0c;也可以查看/etc/default/jenkins&…

vue-table-<td colspan=“2“>不生效

代码是2:1:4:1:4五分布局,效果却是如下: 因为这里的表格没有指定表格布局算法 /*设置表格布局算法*/ 2 table{ 3 table-layout:fixed; 4 } 这里需要了解table-layout属性值、定义和用法、固定表格布局、自动表格布局。 1定义和用法 tableLayout属性用来显示表格单元格、…

Windows系统提示ffmpeg.dll丢失怎么解决?

一、了解ffmpeg.dll文件 ffmpeg.dll是FFmpeg项目的一个动态链接库文件&#xff0c;FFmpeg是一个开源的多媒体处理框架&#xff0c;能够解码、编码、转码、混流、过滤和播放几乎所有已知格式的音频和视频文件。当Windows系统提示ffmpeg.dll丢失时&#xff0c;通常意味着某个需要…

QT:控件属性及常用控件(1)------核心控件及属性

一个图形化界面上的内容&#xff0c;不需要我们直接从零去实现 QT中已经提供了很多的内置控件&#xff1a; 按钮&#xff0c;文本框&#xff0c;单选按钮&#xff0c;复选按钮&#xff0c;下拉框等等。。。。。 文章目录 1.常用控件属性1.1 enabled1.2 geometry1.2.1 geometry…

使用Diffusion Models进行图像超分辩重建

Diffusion Models专栏文章汇总:入门与实战 前言:图像超分辨率重建是一个经典CV任务,其实LR(低分辨率)和 HR(高分辨率)图像仅在高频细节上存在差异。通过添加适当的噪声,LR 图像将变得与其 HR 对应图像无法区分。这篇博客介绍一种方式巧妙利用这个规律使用Diffusion Mod…

药片(药丸)和胶囊识别数据集,使用yolo,pasical voc xml, coco json格式标注,可识别药片和胶囊两种标签,2445张原始图片

药片(药丸)和胶囊识别数据集&#xff0c;使用yolo&#xff0c;pasical voc xml, coco json格式标注&#xff0c;可识别药片和胶囊两种标签&#xff0c;2445张原始图片 数据集分割 训练组80&#xff05; 1967图片 有效集13% 317图片 测试集7% 161图片 预处…

【生活】冬天如何选口罩(医用口罩,N95, KN95还是KP95?带不带呼吸阀门?带不带活性炭?)

&#x1f4a1;总结一下就是&#xff1a; 日常防护的话&#xff0c;医用口罩就可以啦。要是想长时间佩戴N95&#xff08;KN95&#xff09;口罩的话也可以. 在高风险环境&#xff08;像医院、疫情防控期间&#xff09;&#xff0c;一定要选不带呼吸阀门的N95口罩KN95&#xff09…

贪心算法概述

贪心算法总是作出当前看来最好的选择&#xff0c;是局部最优 可以使用贪心算法的问题一般具有两个重要的性质 贪心选择性质最优子结构性质 贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择来达到 其与动态规划的问题区别在于&#xff0c;动态规划算法通…

SD下载、安装、使用、卸载-Stable Diffusion整合包v4.10发布!

目录 前言概述 SD安装1、安装软件2、启动3、配置4、运行5、测试 导入SD模型【决定画风】常用模型下载安装模型 SD卸载SD文生图提示词提示词使用技巧提示词的高级使用技巧强调关键词 前言 我向来不喜欢搞一些没有用的概念&#xff0c;所以直接整理可能用到的东西。 sd简单的说…

【LeetCode】2506、统计相似字符串对的数目

【LeetCode】2506、统计相似字符串对的数目 文章目录 一、哈希表位运算1.1 哈希表位运算 二、多语言解法 一、哈希表位运算 1.1 哈希表位运算 每个字符串, 可用一个 int 表示. (每个字符 是 int 的一个位) 哈希表记录各 字符组合 出现的次数 步骤: 遇到一个字符串, 得到 ma…

【GO基础学习】gin的使用

文章目录 模版使用流程参数传递路由分组数据解析和绑定gin中间件 模版使用流程 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {// 1.创建路由r : gin.Default()// 2.绑定路由规则&#xff0c;执行的函数// gin.Context&#x…

溯源取证-手机取证-简单篇

好久没有写了&#xff0c;水一篇简单的 案例摘要&#xff1a; 我们目前正在调查一起谋杀案&#xff0c;目前已经获得了受害者的手机作为关键证据。在与证人和受害者核心圈子相关人员进行面谈后&#xff0c;您的目标是分析我们收集的信息&#xff0c;并努力追踪证据&#xff0…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(四)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 四、提示范式&#xff08;Explanation for Prompting Paradigm&#xff09; 随着语言模型规模的扩大&#xff0c;基于提示&#xff08;prom…

基于TCP的Qt网络通信

基于TCP的Qt网络通信 项目源码&#xff1a;https://github.com/say-Hai/TcpSocketLearn/tree/QTcpSocket 在标准C没有提供专门用于套接字通信的类&#xff0c;所以只能使用操作系统提供的基于C的API函数&#xff0c;但是Qt就不一样了&#xff0c;它是C的一个框架并且里边提供了…