C语言学生管理系统(全部代码,复制即用)

news2024/11/18 21:25:47

文章目录

  • 前言
  • 功能
  • 运行截图
  • 所有代码

前言

无套路,均已上机通过,求个关注求个赞,提供答疑解惑服务。

功能

本课题要求用C语言编写某班级学生学情管理系统。对一个有若干个学生的学院,每个学生有N门课程,系统实现对学生情况的管理。学生信息包括:学号、姓名、班级、身高、体重、身体健康,各门课程的成绩、家庭住址、本人联系电话、紧急联系人及联系电话、本人QQ号、本人特长、本人智育排名、任课教师姓名及手机号等信息。系统要求能够实现以下功能:

  • 1、 信息录入:建立学生情况记录数据库;
  • 2、 显示:按照学号顺序显示所有学生信息记录;
  • 3、 增加记录:增加学生的信息记录;
  • 4、 修改(要求先输入密码):可修改某个学生的基本信息(学号不可改变)。
  • 5、 删除:删除一个或多个学生的记录;
  • 6、 检索:可按“学号”、“姓名”或者“手机号”查询学生的记录,可提供模糊检索;
  • 7、 成绩统计:可显示某门课程最高成绩及其名单、最差成绩及其名单、平均成绩、及格人数、不及格人数、及格率;
  • 8、 智育排名序:按照智育排名排序,并将学生信息按顺序显示。

运行截图

在这里插入图片描述

所有代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char studentID[20];
    char name[20];
    float height;
    float weight;
    char address[50];
    char phoneNumber[15];
    char emergencyContact[20];
    char emergencyPhoneNumber[15];
    char qqNumber[15];
    char specialSkills[50];
    int intelligenceRank;
    char teacherName[20];
    char teacherPhoneNumber[15];
} Student;

typedef struct {
    char courseName[20];
    float score;
} Course;

typedef struct StudentNode {
    Student data;
    Course *courses; // 课程成绩数组
    struct StudentNode *next;
} StudentNode;

// Function Declarations
void displayMenu();

void loadStudentsFromFile(StudentNode **head);

void saveStudentsToFile(StudentNode *head);

void addStudentRecord(StudentNode **head);

void displayAllStudents(StudentNode *head);

void modifyStudentRecord(StudentNode *head);

void deleteStudentRecord(StudentNode **head);

void searchStudentRecord(StudentNode *head);

void gradeStatistics(StudentNode *head);

void rankByIntelligence(StudentNode *head);

void searchByStudentID(StudentNode *head, const char *targetID);

void searchByName(StudentNode *head, const char *targetName);

void freeMemory(StudentNode *head);

void searchByPhoneNumber(StudentNode *head, const char *targetPhoneNumber);

void gradeStatistics(StudentNode *head);

void gradeStatistics(StudentNode *head);

void searchByName(StudentNode *head, const char *targetName);

void gradeStatistics(StudentNode *head);

int main() {
    StudentNode *head = NULL;
    loadStudentsFromFile(&head);

    int choice;
    do {
        displayMenu();
        printf("请输入你的选择: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                addStudentRecord(&head);
                break;
            case 2:
                displayAllStudents(head);
                break;
            case 3:
                modifyStudentRecord(head);
                break;
            case 4:
                deleteStudentRecord(&head);
                break;
            case 5:
                searchStudentRecord(head);
                break;
            case 6:
                gradeStatistics(head);
                break;
            case 7:
                rankByIntelligence(head);
                break;
            case 8:
                saveStudentsToFile(head);
                break;
            case 0:
                printf("程序退出。再见!\n");
                break;
            default:
                printf("无效的选择,请重试。\n");
        }

    } while (choice != 0);

    freeMemory(head);

    return 0;
}

void displayMenu() {
    printf("\n===== 学生信息管理系统 =====\n");
    printf("1. 添加学生记录\n");
    printf("2. 显示所有学生\n");
    printf("3. 修改学生记录\n");
    printf("4. 删除学生记录\n");
    printf("5. 搜索学生记录\n");
    printf("6. 成绩统计\n");
    printf("7. 智育排名\n");
    printf("8. 将学生信息保存到文件\n");
    printf("0. 退出\n");
}

void loadStudentsFromFile(StudentNode **head) {
    FILE *file = fopen("students.txt", "r");
    if (file == NULL) {
        printf("打开文件读取错误。\n");
        return;
    }

    while (!feof(file)) {
        StudentNode *newStudent = (StudentNode *) malloc(sizeof(StudentNode));
        if (newStudent == NULL) {
            printf("内存分配错误。\n");
            fclose(file);
            return;
        }

        fscanf(file, "学号: %s\n", newStudent->data.studentID);
        if (feof(file)) {
            free(newStudent);
            break; // 避免读取到文件末尾多分配一个节点
        }

        fscanf(file, "姓名: %s\n", newStudent->data.name);
        fscanf(file, "身高: %f\n", &newStudent->data.height);
        fscanf(file, "体重: %f\n", &newStudent->data.weight);
        fscanf(file, "地址: %s\n", newStudent->data.address);
        fscanf(file, "联系电话: %s\n", newStudent->data.phoneNumber);
        fscanf(file, "紧急联系人: %s\n", newStudent->data.emergencyContact);
        fscanf(file, "紧急联系电话: %s\n", newStudent->data.emergencyPhoneNumber);
        fscanf(file, "QQ号: %s\n", newStudent->data.qqNumber);
        fscanf(file, "特长: %s\n", newStudent->data.specialSkills);
        fscanf(file, "智育排名: %d\n", &newStudent->data.intelligenceRank);
        fscanf(file, "任课教师姓名: %s\n", newStudent->data.teacherName);
        fscanf(file, "任课教师联系电话: %s\n", newStudent->data.teacherPhoneNumber);

        newStudent->courses = (Course *) malloc(3 * sizeof(Course)); // 假设每个学生有三门课程
        if (newStudent->courses == NULL) {
            printf("内存分配错误。\n");
            free(newStudent);
            fclose(file);
            return;
        }

        for (int i = 0; i < 3; i++) { // 假设每个学生有三门课程
            fscanf(file, "课程: %s, 成绩: %f\n", newStudent->courses[i].courseName, &newStudent->courses[i].score);
        }

        newStudent->next = *head;
        *head = newStudent;
    }

    fclose(file);
}

void saveStudentsToFile(StudentNode *head) {
    FILE *file = fopen("students.txt", "w");
    if (file == NULL) {
        printf("打开文件写入错误。\n");
        return;
    }

    StudentNode *current = head;
    while (current != NULL) {
        fprintf(file, "学号: %s\n", current->data.studentID);
        fprintf(file, "姓名: %s\n", current->data.name);
        fprintf(file, "身高: %.2f\n", current->data.height);
        fprintf(file, "体重: %.2f\n", current->data.weight);
        fprintf(file, "地址: %s\n", current->data.address);
        fprintf(file, "联系电话: %s\n", current->data.phoneNumber);
        fprintf(file, "紧急联系人: %s\n", current->data.emergencyContact);
        fprintf(file, "紧急联系电话: %s\n", current->data.emergencyPhoneNumber);
        fprintf(file, "QQ号: %s\n", current->data.qqNumber);
        fprintf(file, "特长: %s\n", current->data.specialSkills);
        fprintf(file, "智育排名: %d\n", current->data.intelligenceRank);
        fprintf(file, "任课教师姓名: %s\n", current->data.teacherName);
        fprintf(file, "任课教师联系电话: %s\n", current->data.teacherPhoneNumber);

        for (int i = 0; i < 3; i++) { // 假设每个学生有三门课程
            fprintf(file, "课程: %s, 成绩: %.2f\n", current->courses[i].courseName, current->courses[i].score);
        }

        fprintf(file, "\n");

        current = current->next;
    }

    fclose(file);
}

void addStudentRecord(StudentNode **head) {
    StudentNode *newStudent = (StudentNode *) malloc(sizeof(StudentNode));
    if (newStudent == NULL) {
        printf("内存分配错误。\n");
        return;
    }

    printf("输入学号: ");
    scanf("%s", newStudent->data.studentID);

    // 检查是否已存在相同学号的记录,避免重复
    StudentNode *current = *head;
    while (current != NULL) {
        if (strcmp(current->data.studentID, newStudent->data.studentID) == 0) {
            printf("错误: 学号已存在。\n");
            free(newStudent);
            return;
        }
        current = current->next;
    }

    printf("输入姓名: ");
    scanf("%s", newStudent->data.name);
    printf("输入身高: ");
    scanf("%f", &newStudent->data.height);
    printf("输入体重: ");
    scanf("%f", &newStudent->data.weight);
    printf("输入地址: ");
    scanf("%s", newStudent->data.address);
    printf("输入联系电话: ");
    scanf("%s", newStudent->data.phoneNumber);
    printf("输入紧急联系人: ");
    scanf("%s", newStudent->data.emergencyContact);
    printf("输入紧急联系电话: ");
    scanf("%s", newStudent->data.emergencyPhoneNumber);
    printf("输入QQ号: ");
    scanf("%s", newStudent->data.qqNumber);
    printf("输入特长: ");
    scanf("%s", newStudent->data.specialSkills);
    printf("输入智育排名: ");
    scanf("%d", &newStudent->data.intelligenceRank);
    printf("输入任课教师姓名: ");
    scanf("%s", newStudent->data.teacherName);
    printf("输入任课教师联系电话: ");
    scanf("%s", newStudent->data.teacherPhoneNumber);

    newStudent->courses = (Course *) malloc(3 * sizeof(Course)); // 假设每个学生有三门课程
    if (newStudent->courses == NULL) {
        printf("内存分配错误。\n");
        free(newStudent);
        return;
    }

    for (int i = 0; i < 3; i++) { // 假设每个学生有三门课程
        printf("输入第 %d 门课程名称: ", i + 1);
        scanf("%s", newStudent->courses[i].courseName);
        printf("输入第 %d 门课程成绩: ", i + 1);
        scanf("%f", &newStudent->courses[i].score);
    }

    newStudent->next = *head;
    *head = newStudent;
    printf("学生记录添加成功。\n");
}

void displayAllStudents(StudentNode *head) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    printf("\n===== 所有学生 =====\n");
    StudentNode *current = head;
    while (current != NULL) {
        printf("学号: %s\n", current->data.studentID);
        printf("姓名: %s\n", current->data.name);
        printf("身高: %.2f\n", current->data.height);
        printf("体重: %.2f\n", current->data.weight);
        printf("地址: %s\n", current->data.address);
        printf("联系电话: %s\n", current->data.phoneNumber);
        printf("紧急联系人: %s\n", current->data.emergencyContact);
        printf("紧急联系电话: %s\n", current->data.emergencyPhoneNumber);
        printf("QQ号: %s\n", current->data.qqNumber);
        printf("特长: %s\n", current->data.specialSkills);
        printf("智育排名: %d\n", current->data.intelligenceRank);
        printf("任课教师姓名: %s\n", current->data.teacherName);
        printf("任课教师联系电话: %s\n", current->data.teacherPhoneNumber);

        for (int i = 0; i < 3; i++) { // 假设每个学生有三门课程
            printf("课程: %s, 成绩: %.2f\n", current->courses[i].courseName, current->courses[i].score);
        }

        printf("\n");

        current = current->next;
    }
}

void modifyStudentRecord(StudentNode *head) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    char targetID[20];
    printf("请输入要修改的学生学号: ");
    scanf("%s", targetID);

    StudentNode *current = head;
    while (current != NULL) {
        if (strcmp(current->data.studentID, targetID) == 0) {
            printf("学生找到,现在可以进行修改。\n");
            printf("请输入新的姓名: ");
            scanf("%s", current->data.name);
            printf("请输入新的身高: ");
            scanf("%f", &current->data.height);
            printf("请输入新的体重: ");
            scanf("%f", &current->data.weight);
            printf("请输入新的地址: ");
            scanf("%s", current->data.address);
            printf("请输入新的联系电话: ");
            scanf("%s", current->data.phoneNumber);
            printf("请输入新的紧急联系人: ");
            scanf("%s", current->data.emergencyContact);
            printf("请输入新的紧急联系电话: ");
            scanf("%s", current->data.emergencyPhoneNumber);
            printf("请输入新的QQ号: ");
            scanf("%s", current->data.qqNumber);
            printf("请输入新的特长: ");
            scanf("%s", current->data.specialSkills);
            printf("请输入新的智育排名: ");
            scanf("%d", &current->data.intelligenceRank);
            printf("请输入新的任课教师姓名: ");
            scanf("%s", current->data.teacherName);
            printf("请输入新的任课教师联系电话: ");
            scanf("%s", current->data.teacherPhoneNumber);

            for (int i = 0; i < 3; i++) {
                printf("请输入新的第 %d 门课程名称: ", i + 1);
                scanf("%s", current->courses[i].courseName);
                printf("请输入新的第 %d 门课程成绩: ", i + 1);
                scanf("%f", &current->courses[i].score);
            }

            printf("学生信息修改成功。\n");
            return;
        }
        current = current->next;
    }

    printf("未找到学生学号为 %s 的记录。\n", targetID);
}

void deleteStudentRecord(StudentNode **head) {
    if (*head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    char targetID[20];
    printf("请输入要删除的学生学号: ");
    scanf("%s", targetID);

    StudentNode *current = *head;
    StudentNode *prev = NULL;

    while (current != NULL) {
        if (strcmp(current->data.studentID, targetID) == 0) {
            if (prev == NULL) {
                *head = current->next;
            } else {
                prev->next = current->next;
            }

            free(current->courses);
            free(current);
            printf("学生信息删除成功。\n");
            return;
        }

        prev = current;
        current = current->next;
    }

    printf("未找到学生学号为 %s 的记录。\n", targetID);
}

void searchStudentRecord(StudentNode *head) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    int choice;
    printf("请选择搜索方式:\n");
    printf("1. 按学号搜索\n");
    printf("2. 按姓名搜索\n");
    printf("3. 按手机号搜索\n");
    printf("请输入你的选择: ");
    scanf("%d", &choice);

    char target[20];
    switch (choice) {
        case 1:
            printf("请输入要搜索的学生学号: ");
            scanf("%s", target);
            searchByStudentID(head, target);
            break;
        case 2:
            printf("请输入要搜索的学生姓名: ");
            scanf("%s", target);
            searchByName(head, target);
            break;
        case 3:
            printf("请输入要搜索的学生手机号: ");
            scanf("%s", target);
            searchByPhoneNumber(head, target);
            break;
        default:
            printf("无效的选择。\n");
            break;
    }
}

void searchByPhoneNumber(StudentNode *head, const char *targetPhoneNumber) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    int found = 0;
    StudentNode *current = head;
    while (current != NULL) {
        if (strcmp(current->data.phoneNumber, targetPhoneNumber) == 0 ||
            strcmp(current->data.emergencyPhoneNumber, targetPhoneNumber) == 0) {
            printf("\n===== 学生信息 =====\n");
            printf("学号: %s\n", current->data.studentID);
            printf("姓名: %s\n", current->data.name);
            printf("身高: %.2f\n", current->data.height);
            printf("体重: %.2f\n", current->data.weight);
            printf("地址: %s\n", current->data.address);
            printf("联系电话: %s\n", current->data.phoneNumber);
            printf("紧急联系人: %s\n", current->data.emergencyContact);
            printf("紧急联系电话: %s\n", current->data.emergencyPhoneNumber);
            printf("QQ号: %s\n", current->data.qqNumber);
            printf("特长: %s\n", current->data.specialSkills);
            printf("智育排名: %d\n", current->data.intelligenceRank);
            printf("任课教师姓名: %s\n", current->data.teacherName);
            printf("任课教师联系电话: %s\n", current->data.teacherPhoneNumber);

            for (int i = 0; i < 3; i++) {
                printf("课程: %s, 成绩: %.2f\n", current->courses[i].courseName, current->courses[i].score);
            }

            found = 1;
            break;
        }
        current = current->next;
    }

    if (!found) {
        printf("未找到联系电话为 %s 的学生记录。\n", targetPhoneNumber);
    }
}

void gradeStatistics(StudentNode *head) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    char courseName[20];
    printf("请输入要统计的课程名称: ");
    scanf("%s", courseName);

    int countPass = 0;
    int countFail = 0;
    float sum = 0.0;
    float maxScore = -1.0;
    float minScore = 101.0;
    StudentNode *current = head;

    while (current != NULL) {
        for (int i = 0; i < 3; i++) {
            if (strcmp(current->courses[i].courseName, courseName) == 0) {
                float score = current->courses[i].score;
                sum += score;

                if (score >= 60.0) {
                    countPass++;
                } else {
                    countFail++;
                }

                if (score > maxScore) {
                    maxScore = score;
                }

                if (score < minScore) {
                    minScore = score;
                }
            }
        }
        current = current->next;
    }

    if (countPass + countFail == 0) {
        printf("该课程暂无学生成绩。\n");
    } else {
        float average = sum / (countPass + countFail);
        float passRate = (float)countPass / (countPass + countFail) * 100.0;

        printf("\n===== 成绩统计 =====\n");
        printf("最高分: %.2f\n", maxScore);
        printf("最低分: %.2f\n", minScore);
        printf("平均分: %.2f\n", average);
        printf("及格人数: %d\n", countPass);
        printf("不及格人数: %d\n", countFail);
        printf("及格率: %.2f%%\n", passRate);
    }
}

void rankByIntelligence(StudentNode *head) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    // 计算链表长度
    int count = 0;
    StudentNode *current = head;
    while (current != NULL) {
        count++;
        current = current->next;
    }

    // 将链表数据提取到数组中以便排序
    Student *students = (Student *)malloc(count * sizeof(Student));
    if (students == NULL) {
        printf("内存分配错误。\n");
        return;
    }

    current = head;
    for (int i = 0; i < count; i++) {
        students[i] = current->data;
        current = current->next;
    }

    // 使用冒泡排序按照智育排名排序
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - i - 1; j++) {
            if (students[j].intelligenceRank < students[j + 1].intelligenceRank) {
                // 交换两个学生的位置
                Student temp = students[j];
                students[j] = students[j + 1];
                students[j + 1] = temp;
            }
        }
    }

    // 显示排序结果
    printf("\n===== 智育排名 =====\n");
    for (int i = 0; i < count; i++) {
        printf("排名 %d:\n", i + 1);
        printf("学号: %s\n", students[i].studentID);
        printf("姓名: %s\n", students[i].name);
        printf("智育排名: %d\n", students[i].intelligenceRank);
        printf("\n");
    }

    free(students);
}

void freeMemory(StudentNode *head) {
    while (head != NULL) {
        StudentNode *temp = head;
        head = head->next;
        free(temp->courses);
        free(temp);
    }
}

void searchByStudentID(StudentNode *head, const char *targetID) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    int found = 0;
    StudentNode *current = head;
    while (current != NULL) {
        if (strcmp(current->data.studentID, targetID) == 0) {
            printf("\n===== 学生信息 =====\n");
            printf("学号: %s\n", current->data.studentID);
            printf("姓名: %s\n", current->data.name);
            printf("身高: %.2f\n", current->data.height);
            printf("体重: %.2f\n", current->data.weight);
            printf("地址: %s\n", current->data.address);
            printf("联系电话: %s\n", current->data.phoneNumber);
            printf("紧急联系人: %s\n", current->data.emergencyContact);
            printf("紧急联系电话: %s\n", current->data.emergencyPhoneNumber);
            printf("QQ号: %s\n", current->data.qqNumber);
            printf("特长: %s\n", current->data.specialSkills);
            printf("智育排名: %d\n", current->data.intelligenceRank);
            printf("任课教师姓名: %s\n", current->data.teacherName);
            printf("任课教师联系电话: %s\n", current->data.teacherPhoneNumber);

            for (int i = 0; i < 3; i++) {
                printf("课程: %s, 成绩: %.2f\n", current->courses[i].courseName, current->courses[i].score);
            }

            found = 1;
            break;
        }
        current = current->next;
    }

    if (!found) {
        printf("未找到学号为 %s 的学生记录。\n", targetID);
    }
}

void searchByName(StudentNode *head, const char *targetName) {
    if (head == NULL) {
        printf("无可用学生记录。\n");
        return;
    }

    int found = 0;
    StudentNode *current = head;
    while (current != NULL) {
        if (strcmp(current->data.name, targetName) == 0) {
            printf("\n===== 学生信息 =====\n");
            printf("学号: %s\n", current->data.studentID);
            printf("姓名: %s\n", current->data.name);
            printf("身高: %.2f\n", current->data.height);
            printf("体重: %.2f\n", current->data.weight);
            printf("地址: %s\n", current->data.address);
            printf("联系电话: %s\n", current->data.phoneNumber);
            printf("紧急联系人: %s\n", current->data.emergencyContact);
            printf("紧急联系电话: %s\n", current->data.emergencyPhoneNumber);
            printf("QQ号: %s\n", current->data.qqNumber);
            printf("特长: %s\n", current->data.specialSkills);
            printf("智育排名: %d\n", current->data.intelligenceRank);
            printf("任课教师姓名: %s\n", current->data.teacherName);
            printf("任课教师联系电话: %s\n", current->data.teacherPhoneNumber);

            for (int i = 0; i < 3; i++) {
                printf("课程: %s, 成绩: %.2f\n", current->courses[i].courseName, current->courses[i].score);
            }

            found = 1;
            break;
        }
        current = current->next;
    }

    if (!found) {
        printf("未找到姓名为 %s 的学生记录。\n", targetName);
    }
}


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

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

相关文章

Java学习:初入Java

1.Java文件扩展名 .class&#xff1a;字节码文件&#xff0c;通过JVM虚拟机译码执行相关程序&#xff0c;java的跨平台依靠的就是JVM&#xff0c;不同平台有不同类型的JVM。 .java&#xff1a;Java源文件&#xff0c;存放Java源代码&#xff0c;一份Java源文件可能有多个类&…

GIt的应用

一、Git概述 1.1 什么是git git 是一个代码协同管理工具&#xff0c;也称之为代码版本控制工具&#xff0c;代码版本控制或管理的工具用的最多的主要 是 svn 、 git 。 SVN 是采用的同步机制&#xff0c;即本地的代码版本和服务器的版本保持一致&#xff08;提交版本时&…

ansible 备忘清单(一)

笔者&#xff1a; 把以前的手写笔记电子化吧&#xff0c;顺便当作复习。 基础命令 命令 参数 备注 ansible --version 查看版本号 ansible-doc --help 查看帮助信息 -l &#xff5c;--list 查看所有模块 -s 查看模块摘要 Ansible servers -I &#xff5c;-…

AI大模型引领未来智慧科研暨ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

数据结构:单调栈

1.单调栈 单调栈是一种数据结构&#xff0c;其中存放的数据应该是有序的&#xff0c;所以单调栈也有单调递减栈和单调递增栈 单调递增栈&#xff1a;栈顶到栈底的元素大小是从小到大 单调递减栈&#xff1a;栈顶到栈底的元素大小是从大到小 单调栈主要就是用来求一个给定序列中…

【Proteus】swjtu西南交大微机原理与接口技术课设:8086 最小模式下的最简硬件核设计

一、实验目的 让学生深入理解计算机硬件的基本组成结构、工作原理和设计方法&#xff0c;掌握 16 位微处理 器&#xff08;如 8086&#xff09;的内部结构和原理&#xff0c;并能够通过实际操作实现对其功能的在线调试和验证。 这样可以加深对计算机系统的认识和理解&#xff…

技术太难,人工太慢,这才是最牛的温湿度监控工具!

随着科技的不断进步和各行业的发展&#xff0c;温湿度监控已经成为确保产品质量、维护设备安全以及提高工作环境效能的关键工具。 在这个信息时代&#xff0c;实时、精准的温湿度数据监测不仅为企业带来了飞速的发展&#xff0c;也为行业发展注入了新的活力。 客户案例 医疗行…

Checkpoint 执行机制原理解析

在介绍Checkpoint的执行机制前&#xff0c;我们需要了解一下state的存储&#xff0c;因为state是Checkpoint进行持久化备份的主要角色。Checkpoint作为Flink最基础也是最关键的容错机制&#xff0c;Checkpoint快照机制很好地保证了Flink应用从异常状态恢复后的数据准确性。同时…

golang连接mysql的第一个程序(最新)

不想多说话&#xff0c;先把golang和mysql连接好&#xff0c;环境配置好&#xff0c;然后直接上代码就行了&#xff0c;代码可直接运行。 package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql" )func main() {// MySQL …

nvm 的安装及使用 (Node版本管理器)

目录 1、nvm 介绍 2、nvm安装 3、nvm 使用 4、node官网可以查看node和npm对应版本 5、nvm安装指定版本node 6、安装cli脚手架 1、nvm 介绍 NVM 全称 node.js version management &#xff0c;专门针对 node 版本进行管理的工具&#xff0c;通过它可以安装和切换不同版本的…

【SpringCloud笔记】(11)消息驱动之Stream

Stream 技术背景 底层不同模块可能使用不同的消息中间件&#xff0c;这就导致技术的切换&#xff0c;微服务的维护及开发变得麻烦起来 概述 官网&#xff1a; https://spring.io/projects/spring-cloud-stream#overview https://cloud.spring.io/spring-cloud-static/spring…

在Go语言中处理HTTP文件上传

大家好&#xff0c;我是你们可爱又迷人的编程小助手&#xff0c;今天要带你们一起探讨在Go语言中如何处理HTTP文件上传&#xff0c;让我们把这场技术之旅变得轻松有趣吧&#xff01; 首先&#xff0c;想象一下这个场景&#xff1a;你是一个网站的开发者&#xff0c;用户们急切…

pycharm 工具栏不见了

新版pycharm后&#xff0c; 菜单栏和工具栏不见了 目录 我发现的解决方法&#xff1a; 其他旧版的解决方法&#xff1a; 我发现的解决方法&#xff1a; 其他旧版的解决方法&#xff1a; 另外&#xff0c;一些使用pycharm的新手可能会由于不熟悉软件的功能而误操作&#xff…

文件夹共享(普通共享和高级共享的区别)防火墙设置(包括了jdk安装和Tomcat)

文章目录 一、共享文件1.1为什么需要配置文件夹共享功能&#xff1f;1.2配置文件共享功能1.3高级共享和普通共享的区别&#xff1a; 二、防火墙设置2.1先要在虚拟机上安装JDK和Tomcat供外部访问。2.2设置防火墙&#xff1a; 一、共享文件 1.1为什么需要配置文件夹共享功能&…

springboot对接WebSocket实现消息推送

1.修改pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 2.增加配置WebSocketConfig.java import org.springframework.context.annotation.Bean…

接口测试工具——ApiFox使用初体验 postman导出和ApiFox导入

目录 ApiFox使用初体验初步使用从postman导出到apifox导入 IDEA简单测试Postman测试工具post请求 接口测试工具swaggerKnife4j1.引入依赖2.配置3.常用注解4.接口测试 JMeter什么是JMeter?JMeter安装配置1.官网下载2.下载后解压3.汉语设置 JMeter的使用方法1.新建线程组2.设置参…

智能监控平台/视频共享融合系统EasyCVR海康设备国标GB28181接入流程

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

基于springboot的数码论坛系统设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 摘 要 网络的广泛应用给…

laravel api资源的问题记录

resource 转换层 可以帮助我们转换一些字段的结果&#xff0c;类似前端的filter。 可以使用比如对象或者模型的形式来处理&#xff0c;但使用sql查询会导致n1的问题。如图&#xff1a; 层次嵌套很多&#xff0c;而且很深&#xff0c;这样虽然开发方便了&#xff0c;但是维护就…

Mysql(5日志备份恢复)

一.日志管理 MySQL 的日志默认保存位置为 /usr/local/mysql/data 先看下mysql的日志文件有无&#xff1a; 修改配置文件添加&#xff1a;错误日志&#xff0c;用来记录当MySQL启动、停止或运行时发生的错误信息&#xff0c;默认已开启 修改配置文件添加&#xff1a;通用查…