求帮加入一个按总成绩进行排序的模块

制作了一个学生综合评测系统,求帮忙插入一个按总成绩排序的动能模块


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT 100
#define FILE_NAME "students.txt"
struct Student {
    char name[20];
    char sex[10];
    int id;
    int banji;
    int score1;
    int score2;
    int score3;
};

int num_students = 0;

// 添加学生信息
void add_student() {
    struct Student student;
    printf("添加学生信息\n");
    printf("姓名:");
    scanf("%s", student.name);
    printf("性别:");
    scanf("%s", student.sex);
    printf("学号:");
    scanf("%d", &student.id);
    printf("班级:");
    scanf("%d", &student.banji);
    printf("成绩1:");
    scanf("%d", &student.score1);
    printf("成绩2:");
    scanf("%d", &student.score2);
    printf("成绩3:");
    scanf("%d", &student.score3);

    FILE* fp = fopen(FILE_NAME, "a"); // 以追加模式打开文件
    fprintf(fp, "%s %s %d %d %d %d %d\n", student.name,student.sex, student.id,student.banji, student.score1, student.score2, student.score3); // 写入数据
    fclose(fp);
    num_students++; // 学生数量加一
    printf("学生信息已添加\n");
}

void modify_student() {
    int target_id;
    printf("修改学生信息\n");
    printf("请输入要修改的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件
    FILE* tmp_fp = fopen("tmp.txt", "w"); // 以写模式打开临时文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name,&student.sex, &student.id,&student.banji, &student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf("原信息: %s %s %d %d %d %d %d\n", student.name, student.sex,student.id, student.banji,student.score1, student.score2, student.score3);
            printf("新姓名:");
            scanf("%s", student.name);
            printf("新成绩1:");
            scanf("%d", &student.score1);
            printf("新成绩2:");
            scanf("%d", &student.score2);
            printf("新成绩3:");
            scanf("%d", &student.score3);
            printf("修改后: %s %s %d %d %d %d %d\n", student.name,student.sex, student.id,student.id, student.banji, student.score1, student.score2, student.score3);
        }
        fprintf(tmp_fp, "%s %s %d %d %d %d %d\n", student.name,student.sex, student.id,student.id, student.banji, student.score1, student.score2, student.score3); // 将学生信息写入临时文件
    }

    fclose(fp);
    fclose(tmp_fp);

    remove(FILE_NAME); // 删除原文件
    rename("tmp.txt", FILE_NAME); // 将临时文件重命名

    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    } else {
        printf("学生信息已修改\n");
    }
}

void query_student() {
    int target_id;
    printf("查询学生信息\n");
    printf("请输入要查询的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name, &student.sex,&student.id, &student.banji,&student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf(" 姓名:%s\n性别:%s\n学号: %d\n班级:%d\n成绩1:%d\n成绩2:%d\n成绩3:%d\n", student.name, student.sex,student.id,student.banji, student.score1, student.score2, student.score3);
            break; // 找到目标学生后终止循环
        }
    }

    fclose(fp);

    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    }
}

void delete_student() {
    int target_id;
    printf("删除学生信息\n");
    printf("请输入要删除的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件
    FILE* tmp_fp = fopen("tmp.txt", "w"); // 以写模式打开临时文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name,&student.sex, &student.id,&student.banji, &student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf("已删除学生信息:%s %d %d %d %d\n", student.name,student.sex, student.id,student.banji, student.score1, student.score2, student.score3);
} else {
fprintf(tmp_fp, "%s %s %d %d %d %d %d\n", student.name,student.sex, student.id,student.banji, student.score1, student.score2, student.score3); // 将学生信息写入临时文件
}
}

fclose(fp);
fclose(tmp_fp);

remove(FILE_NAME); // 删除原文件
rename("tmp.txt", FILE_NAME); // 将临时文件重命名

if (!found) { // 如果没有找到目标学生
    printf("未找到学生\n");
} else {
    num_students--; // 学生数量减一
    printf("学生信息已删除\n");
}
}

void menu() {
    printf("\n请选择功能\n");
    printf("1. 添加学生信息\n");
    printf("2. 修改学生信息\n");
    printf("3. 查询学生信息\n");
    printf("4. 删除学生信息\n");
    printf("5. 显示所有学生的成绩信息\n");
    printf("0. 退出\n");
}

void show_all_scores() {
struct Student students[MAX_STUDENT];

FILE* fp = fopen(FILE_NAME, "r");

int i = 0;
while (fscanf(fp, "%s %s %d %d %d %d %d", students[i].name,&students[i].sex, &students[i].id,&students[i].banji, &students[i].score1, &students[i].score2, &students[i].score3) == 7) {
    i++;
}

fclose(fp);


printf("学号\t姓名\t性别\t班级\t课1\t课2\t课3\t总分\n");
for (int j = 0; j < i; j++) {
    int total_score = students[j].score1 + students[j].score2 + students[j].score3;
    printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t\n", students[j].id, students[j].name,students[j].sex,students[j].banji, students[j].score1, students[j].score2, students[j].score3, total_score);
}
}
struct student
{
    char name[20];
    int num;
    float score;
};

int main() {
    
int choice;
do {
printf("\n学生综合测评管理系统\n");
printf("1. 添加学生信息\n");
printf("2. 修改学生信息\n");
printf("3. 查询学生信息\n");
printf("4. 删除学生信息\n");
printf("5. 显示所有学生的成绩信息\n");
printf("0. 退出系统\n");
printf("请选择功能:");
scanf("%d", &choice);

    switch (choice) {
        case 1:
            add_student();
            break;
        case 2:
            modify_student();
            break;
        case 3:
            query_student();
            break;
        case 4:
            delete_student();
            break;
        case 5:
            show_all_scores();
            break;
        case 0:
            break;
        default:
            printf("无效的选择\n");
            break;
    }
} while (choice != 0);
return 0;}

TechWhizKid参考GPT回答:

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

#define MAX_STUDENT 100
#define FILE_NAME "students.txt"

struct Student {
    char name[20];
    char sex[10];
    int id;
    int banji;
    int score1;
    int score2;
    int score3;
    int total_score; // 总成绩
};

int num_students = 0;

// 添加学生信息
void add_student() {
    struct Student student;
    printf("添加学生信息\n");
    printf("姓名:");
    scanf("%s", student.name);
    printf("性别:");
    scanf("%s", student.sex);
    printf("学号:");
    scanf("%d", &student.id);
    printf("班级:");
    scanf("%d", &student.banji);
    printf("成绩1:");
    scanf("%d", &student.score1);
    printf("成绩2:");
    scanf("%d", &student.score2);
    printf("成绩3:");
    scanf("%d", &student.score3);

    FILE* fp = fopen(FILE_NAME, "a"); // 以追加模式打开文件
    fprintf(fp, "%s %s %d %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3); // 写入数据
    fclose(fp);
    num_students++; // 学生数量加一
    printf("学生信息已添加\n");
}

void modify_student() {
    int target_id;
    printf("修改学生信息\n");
    printf("请输入要修改的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件
    FILE* tmp_fp = fopen("tmp.txt", "w"); // 以写模式打开临时文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name, student.sex, &student.id, &student.banji, &student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf("原信息: %s %s %d %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3);
            printf("新姓名:");
            scanf("%s", student.name);
            printf("新成绩1:");
            scanf("%d", &student.score1);
            printf("新成绩2:");
            scanf("%d", &student.score2);
            printf("新成绩3:");
            scanf("%d", &student.score3);
            printf("修改后: %s %s %d %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3);
        }
        fprintf(tmp_fp, "%s %s %d %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3); // 将学生信息写入临时文件
    }

    fclose(fp);
    fclose(tmp_fp);

    remove(FILE_NAME); // 删除原文件
    rename("tmp.txt", FILE_NAME); // 将临时文件重命名

    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    } else {
        printf("学生信息已修改\n");
    }
}

void query_student() {
    int target_id;
    printf("查询学生信息\n");
    printf("请输入要查询的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name, student.sex, &student.id, &student.banji, &student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf(" 姓名:%s\n性别:%s\n学号: %d\n班级:%d\n成绩1:%d\n成绩2:%d\n成绩3:%d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3);
            break; // 找到目标学生后终止循环
        }
    }

    fclose(fp);

    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    }
}

void delete_student() {
    int target_id;
    printf("删除学生信息\n");
    printf("请输入要删除的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件
    FILE* tmp_fp = fopen("tmp.txt", "w"); // 以写模式打开临时文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name, student.sex, &student.id, &student.banji, &student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf("已删除学生信息:%s %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3);
        } else {
            fprintf(tmp_fp, "%s %s %d %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3); // 将学生信息写入临时文件
        }
    }

    fclose(fp);
    fclose(tmp_fp);

    remove(FILE_NAME); // 删除原文件
    rename("tmp.txt", FILE_NAME); // 将临时文件重命名

    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    } else {
        num_students--; // 学生数量减一
        printf("学生信息已删除\n");
    }
}

int compare_students(const void* a, const void* b) {
    const struct Student* studentA = (const struct Student*)a;
    const struct Student* studentB = (const struct Student*)b;

    return studentB->total_score - studentA->total_score; // 按总成绩降序排序
}

void show_all_scores() {
    struct Student students[MAX_STUDENT];

    FILE* fp = fopen(FILE_NAME, "r");

    int i = 0;
    while (fscanf(fp, "%s %s %d %d %d %d %d", students[i].name, students[i].sex, &students[i].id, &students[i].banji, &students[i].score1, &students[i].score2, &students[i].score3) == 7) {
        students[i].total_score = students[i].score1 + students[i].score2 + students[i].score3; // 计算总成绩
        i++;
    }

    fclose(fp);

    // 按总成绩降序排序
    qsort(students, i, sizeof(struct Student), compare_students);

    printf("学号\t姓名\t性别\t班级\t课1\t课2\t课3\t总分\n");
    for (int j = 0; j < i; j++) {
        printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t\n", students[j].id, students[j].name, students[j].sex, students[j].banji, students[j].score1, students[j].score2, students[j].score3, students[j].total_score);
    }
}

void menu() {
    printf("\n请选择功能\n");
    printf("1. 添加学生信息\n");
    printf("2. 修改学生信息\n");
    printf("3. 查询学生信息\n");
    printf("4. 删除学生信息\n");
    printf("5. 显示所有学生的成绩信息\n");
    printf("0. 退出\n");
}

int main() {
    int choice;
    do {
        printf("\n学生综合测评管理系统\n");
        printf("1. 添加学生信息\n");
        printf("2. 修改学生信息\n");
        printf("3. 查询学生信息\n");
        printf("4. 删除学生信息\n");
        printf("5. 显示所有学生的成绩信息\n");
        printf("0. 退出系统\n");
        printf("请选择功能:");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                add_student();
                break;
            case 2:
                modify_student();
                break;
            case 3:
                query_student();
                break;
            case 4:
                delete_student();
                break;
            case 5:
                show_all_scores();
                break;
            case 0:
                break;
            default:
                printf("无效的选择\n");
                break;
        }
    } while (choice != 0);

    return 0;
}


从文件读取学生信息后,根据总分排序数学结构,再写入文件即可。

补充如下:

 
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT 100
#define FILE_NAME "students.txt"
struct Student {
    char name[20];
    char sex[10];
    int id;
    int banji;
    int score1;
    int score2;
    int score3;
};
 
int num_students = 0;
 
// 添加学生信息
void add_student() {
    struct Student student;
    printf("添加学生信息\n");
    printf("姓名:");
    scanf("%s", student.name);
    printf("性别:");
    scanf("%s", student.sex);
    printf("学号:");
    scanf("%d", &student.id);
    printf("班级:");
    scanf("%d", &student.banji);
    printf("成绩1:");
    scanf("%d", &student.score1);
    printf("成绩2:");
    scanf("%d", &student.score2);
    printf("成绩3:");
    scanf("%d", &student.score3);
 
    FILE* fp = fopen(FILE_NAME, "a"); // 以追加模式打开文件
    fprintf(fp, "%s %s %d %d %d %d %d\n", student.name,student.sex, student.id,student.banji, student.score1, student.score2, student.score3); // 写入数据
    fclose(fp);
    num_students++; // 学生数量加一
    printf("学生信息已添加\n");
}
 
void modify_student() {
    int target_id;
    printf("修改学生信息\n");
    printf("请输入要修改的学生学号:");
    scanf("%d", &target_id);
 
    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件
    FILE* tmp_fp = fopen("tmp.txt", "w"); // 以写模式打开临时文件
 
    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name,&student.sex, &student.id,&student.banji, &student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf("原信息: %s %s %d %d %d %d %d\n", student.name, student.sex,student.id, student.banji,student.score1, student.score2, student.score3);
            printf("新姓名:");
            scanf("%s", student.name);
            printf("新成绩1:");
            scanf("%d", &student.score1);
            printf("新成绩2:");
            scanf("%d", &student.score2);
            printf("新成绩3:");
            scanf("%d", &student.score3);
            printf("修改后: %s %s %d %d %d %d %d\n", student.name,student.sex, student.id,student.id, student.banji, student.score1, student.score2, student.score3);
        }
        fprintf(tmp_fp, "%s %s %d %d %d %d %d\n", student.name,student.sex, student.id,student.id, student.banji, student.score1, student.score2, student.score3); // 将学生信息写入临时文件
    }
 
    fclose(fp);
    fclose(tmp_fp);
 
    remove(FILE_NAME); // 删除原文件
    rename("tmp.txt", FILE_NAME); // 将临时文件重命名
 
    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    } else {
        printf("学生信息已修改\n");
    }
}
 
void query_student() {
    int target_id;
    printf("查询学生信息\n");
    printf("请输入要查询的学生学号:");
    scanf("%d", &target_id);
 
    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件
 
    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name, &student.sex,&student.id, &student.banji,&student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf(" 姓名:%s\n性别:%s\n学号: %d\n班级:%d\n成绩1:%d\n成绩2:%d\n成绩3:%d\n", student.name, student.sex,student.id,student.banji, student.score1, student.score2, student.score3);
            break; // 找到目标学生后终止循环
        }
    }
 
    fclose(fp);
 
    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    }
}
 
void delete_student() {
    int target_id;
    printf("删除学生信息\n");
    printf("请输入要删除的学生学号:");
    scanf("%d", &target_id);
 
    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件
    FILE* tmp_fp = fopen("tmp.txt", "w"); // 以写模式打开临时文件
 
    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name,&student.sex, &student.id,&student.banji, &student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf("已删除学生信息:%s %d %d %d %d\n", student.name,student.sex, student.id,student.banji, student.score1, student.score2, student.score3);
} else {
fprintf(tmp_fp, "%s %s %d %d %d %d %d\n", student.name,student.sex, student.id,student.banji, student.score1, student.score2, student.score3); // 将学生信息写入临时文件
}
}
 
fclose(fp);
fclose(tmp_fp);
 
remove(FILE_NAME); // 删除原文件
rename("tmp.txt", FILE_NAME); // 将临时文件重命名
 
if (!found) { // 如果没有找到目标学生
    printf("未找到学生\n");
} else {
    num_students--; // 学生数量减一
    printf("学生信息已删除\n");
}
}
 
void menu() {
    printf("\n请选择功能\n");
    printf("1. 添加学生信息\n");
    printf("2. 修改学生信息\n");
    printf("3. 查询学生信息\n");
    printf("4. 删除学生信息\n");
    printf("5. 显示所有学生的成绩信息\n");
    printf("6. 按总分排序学生的成绩信息\n");
    printf("0. 退出\n");
}
//  按成绩总分从高到低排序学生结构,并重新写入文件
void sortStudent(){
    
    struct Student students[MAX_STUDENT];
 
    FILE* fp = fopen(FILE_NAME, "r");
     
    int i = 0;
    // 读取原有学生信息 
    while (fscanf(fp, "%s %s %d %d %d %d %d", students[i].name,&students[i].sex, &students[i].id,&students[i].banji, &students[i].score1, &students[i].score2, &students[i].score3) == 7) {
        i++;
    }
     
    fclose(fp);
    
    int * totalScore = (int *)malloc(sizeof(int)*i);
    
    // 计算每个学生的总分 
    for(int j=0;j<i;j++){
        
        totalScore[j]=(students[j].score1+students[j].score2+students[j].score3);
             
    }
    
    
    // 根据学生的总分,排序学生结构 
    for(int j=0;j<i-1;j++){
        
        for(int k=j+1;k<i;k++){
            
            if(totalScore[j]<totalScore[k]){
                
                int temp = totalScore[j];
                totalScore[j]=totalScore[k];
                totalScore[k]=temp;
                
                Student st = students[j];
                students[j]=students[k];
                students[k]=st;
                
                
            }
            
        }
    }
     // 将排序后的文件写入文件,如果排序后的信息要写入其他文件,修改下面的文件名即可
    FILE* fp1 = fopen(FILE_NAME, "w");
    printf("排序后的学生信息为;\n"); 
    // 打印排序后的学生信息,并将排序的学生信息写入文件 
    for(int j=0;j<i;j++){
          // 如果不需要写入文件,下面的fprintf()及相关文件操作代码可以去除
          fprintf(fp, "%s %s %d %d %d %d %d\n", students[j].name,students[j].sex, students[j].id,students[j].banji, 
          students[j].score1, students[j].score2, students[j].score3); // 写入数据
          printf(" %s %s %d %d %d %d %d\n", students[j].name,students[j].sex, students[j].id,students[j].banji, 
          students[j].score1, students[j].score2, students[j].score3);
    } 
      printf("排序后的学生信息已写入文件!\n");
      
    fclose(fp1);
    
    
    free(totalScore);
    totalScore=NULL;
    
    
    
    
} 
 
void show_all_scores() {
struct Student students[MAX_STUDENT];
 
FILE* fp = fopen(FILE_NAME, "r");
 
int i = 0;

while (fscanf(fp, "%s %s %d %d %d %d %d", students[i].name,&students[i].sex, &students[i].id,&students[i].banji, &students[i].score1, &students[i].score2, &students[i].score3) == 7) {
    i++;
}
 
fclose(fp);
 
 
printf("学号\t姓名\t性别\t班级\t课1\t课2\t课3\t总分\n");
for (int j = 0; j < i; j++) {
    int total_score = students[j].score1 + students[j].score2 + students[j].score3;
    printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t\n", students[j].id, students[j].name,students[j].sex,students[j].banji, students[j].score1, students[j].score2, students[j].score3, total_score);
}
}
struct student
{
    char name[20];
    int num;
    float score;
};
 
int main() {
    
int choice;
do {
printf("\n学生综合测评管理系统\n");
printf("1. 添加学生信息\n");
printf("2. 修改学生信息\n");
printf("3. 查询学生信息\n");
printf("4. 删除学生信息\n");
printf("5. 显示所有学生的成绩信息\n");
printf("6. 按总分排序学生的成绩信息\n");
printf("0. 退出系统\n");
printf("请选择功能:");
scanf("%d", &choice);
 
    switch (choice) {
        case 1:
            add_student();
            break;
        case 2:
            modify_student();
            break;
        case 3:
            query_student();
            break;
        case 4:
            delete_student();
            break;
        case 5:
            show_all_scores();
            break;
        case 6:
            sortStudent();
            break;          
        case 0:
            break;
        default:
            printf("无效的选择\n");
            break;
    }
} while (choice != 0);
return 0;}

img

新加一个模块是吧

img


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

#define MAX_STUDENT 100
#define FILE_NAME "students.txt"

struct Student {
    char name[20];
    char sex[10];
    int id;
    int banji;
    int score1;
    int score2;
    int score3;
    int total_score;
};

int num_students = 0;

// 添加学生信息
void add_student() {
    struct Student student;
    printf("添加学生信息\n");
    printf("姓名:");
    scanf("%s", student.name);
    printf("性别:");
    scanf("%s", student.sex);
    printf("学号:");
    scanf("%d", &student.id);
    printf("班级:");
    scanf("%d", &student.banji);
    printf("成绩1:");
    scanf("%d", &student.score1);
    printf("成绩2:");
    scanf("%d", &student.score2);
    printf("成绩3:");
    scanf("%d", &student.score3);

    FILE* fp = fopen(FILE_NAME, "a"); // 以追加模式打开文件
    fprintf(fp, "%s %s %d %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3); // 写入数据
    fclose(fp);
    num_students++; // 学生数量加一
    printf("学生信息已添加\n");
}

void modify_student() {
    int target_id;
    printf("修改学生信息\n");
    printf("请输入要修改的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件
    FILE* tmp_fp = fopen("tmp.txt", "w"); // 以写模式打开临时文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name, student.sex, &student.id, &student.banji, &student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf("原信息: %s %s %d %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3);
            printf("新姓名:");
            scanf("%s", student.name);
            printf("新成绩1:");
            scanf("%d", &student.score1);
            printf("新成绩2:");
            scanf("%d", &student.score2);
            printf("新成绩3:");
            scanf("%d", &student.score3);
            printf("修改后: %s %s %d %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3);
        }
        fprintf(tmp_fp, "%s %s %d %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3); // 将学生信息写入临时文件
    }

    fclose(fp);
    fclose(tmp_fp);

    remove(FILE_NAME); // 删除原文件
    rename("tmp.txt", FILE_NAME); // 将临时文件重命名

    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    }
    else {
        printf("学生信息已修改\n");
    }
}

void query_student() {
    int target_id;
    printf("查询学生信息\n");
    printf("请输入要查询的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name, student.sex, &student.id, &student.banji, &student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf(" 姓名:%s\n性别:%s\n学号: %d\n班级:%d\n成绩1:%d\n成绩2:%d\n成绩3:%d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3);
            break; // 找到目标学生后终止循环
        }
    }

    fclose(fp);

    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    }
}

void delete_student() {
    int target_id;
    printf("删除学生信息\n");
    printf("请输入要删除的学生学号:");
    scanf("%d", &target_id);

    FILE* fp = fopen(FILE_NAME, "r"); // 以只读模式打开文件
    FILE* tmp_fp = fopen("tmp.txt", "w"); // 以写模式打开临时文件

    struct Student student;
    int found = 0; // 标记是否找到目标学生
    while (fscanf(fp, "%s %s %d %d %d %d %d", student.name, student.sex, &student.id, &student.banji, &student.score1, &student.score2, &student.score3) == 7) { // 读取每个学生的信息
        if (student.id == target_id) { // 如果找到目标学生
            found = 1;
            printf("已删除学生信息:%s %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3);
        }
        else {
            fprintf(tmp_fp, "%s %s %d %d %d %d %d\n", student.name, student.sex, student.id, student.banji, student.score1, student.score2, student.score3); // 将学生信息写入临时文件
        }
    }

    fclose(fp);
    fclose(tmp_fp);

    remove(FILE_NAME); // 删除原文件
    rename("tmp.txt", FILE_NAME); // 将临时文件重命名

    if (!found) { // 如果没有找到目标学生
        printf("未找到学生\n");
    }
    else {
        num_students--; // 学生数量减一
        printf("学生信息已删除\n");
    }
}

int compare_students(const void* a, const void* b) {
    const struct Student* studentA = (const struct Student*)a;
    const struct Student* studentB = (const struct Student*)b;

    return studentB->total_score - studentA->total_score; // 按总成绩降序排序
}

void menu() {
    printf("\n请选择功能\n");
    printf("1. 添加学生信息\n");
    printf("2. 修改学生信息\n");
    printf("3. 查询学生信息\n");
    printf("4. 删除学生信息\n");
    printf("5. 显示所有学生的成绩信息\n");
    printf("6. 按总成绩排序\n");
    printf("0. 退出\n");
}

void show_all_scores() {
    struct Student students[MAX_STUDENT];

    FILE* fp = fopen(FILE_NAME, "r");

    int i = 0;
    while (fscanf(fp, "%s %s %d %d %d %d %d", students[i].name, students[i].sex, &students[i].id, &students[i].banji, &students[i].score1, &students[i].score2, &students[i].score3) == 7) {
        i++;
    }

    fclose(fp);

    printf("学号\t姓名\t性别\t班级\t课1\t课2\t课3\t总分\n");
    for (int j = 0; j < i; j++) {
        int total_score = students[j].score1 + students[j].score2 + students[j].score3;
        printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t\n", students[j].id, students[j].name, students[j].sex, students[j].banji, students[j].score1, students[j].score2, students[j].score3, total_score);
    }
}

void sort_all_scores() {
    struct Student students[MAX_STUDENT];

    FILE* fp = fopen(FILE_NAME, "r");

    int i = 0;
    while (fscanf(fp, "%s %s %d %d %d %d %d", students[i].name, students[i].sex, &students[i].id, &students[i].banji, &students[i].score1, &students[i].score2, &students[i].score3) == 7) {
        students[i].total_score = students[i].score1 + students[i].score2 + students[i].score3; // 计算总成绩
        i++;
    }

    fclose(fp);

    // 按总成绩排序
    qsort(students, i, sizeof(struct Student), compare_students);

    printf("学号\t姓名\t性别\t班级\t课1\t课2\t课3\t总分\n");
    for (int j = 0; j < i; j++) {
        printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t\n", students[j].id, students[j].name, students[j].sex, students[j].banji, students[j].score1, students[j].score2, students[j].score3, students[j].total_score);
    }
}

struct student1
{
    char name[20];
    int num;
    float score;
};

int main() {
    int choice;
    do {
        printf("\n学生综合测评管理系统\n");
        printf("1. 添加学生信息\n");
        printf("2. 修改学生信息\n");
        printf("3. 查询学生信息\n");
        printf("4. 删除学生信息\n");
        printf("5. 显示所有学生的成绩信息\n");
        printf("6. 按总成绩排序\n");
        printf("0. 退出系统\n");
        printf("请选择功能:");
        scanf("%d", &choice);

        switch (choice) {
        case 1:
            add_student();
            break;
        case 2:
            modify_student();
            break;
        case 3:
            query_student();
            break;
        case 4:
            delete_student();
            break;
        case 5:
            show_all_scores();
            break;
        case 6:
            sort_all_scores();
            break;
        case 0:
            break;
        default:
            printf("无效的选择\n");
            break;
        }
    } while (choice != 0);

    return 0;
}


参考给你个实现:

void show_all_scores() {
    struct Student students[MAX_STUDENT];

    FILE* fp = fopen(FILE_NAME, "r");

    int i = 0;
    while (fscanf(fp, "%s %s %d %d %d %d %d", students[i].name,&students[i].sex, &students[i].id,&students[i].banji, &students[i].score1, &students[i].score2, &students[i].score3) == 7) {
        i++;
    }

    fclose(fp);

    // 计算每个学生的总成绩
    for (int j = 0; j < i; j++) {
        students[j].score = students[j].score1 + students[j].score2 + students[j].score3;
    }

    // 使用冒泡排序按总成绩从高到低排序
    for (int j = 0; j < i - 1; j++) {
        for (int k = 0; k < i - j - 1; k++) {
            if (students[k].score < students[k + 1].score) {
                struct Student temp = students[k];
                students[k] = students[k + 1];
                students[k + 1] = temp;
            }
        }
    }

    printf("学号\t姓名\t性别\t班级\t课1\t课2\t课3\t总分\n");
    for (int j = 0; j < i; j++) {
        printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%.1f\n", students[j].id, students[j].name, students[j].sex, students[j].banji, students[j].score1, students[j].score2, students[j].score3, students[j].score);
    }
}

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7635835
  • 这篇博客你也可以参考下:初阶扫雷的保姆级教程,有这一篇就够了(万字讲解 适合初学者)
  • 除此之外, 这篇博客: 嵌入式软件学习问题汇总(一)什么是嵌入式?中的 哪些专业的朋友更适合嵌入式学习 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •   有的朋友本来是学外语专业的学文学专业的,感觉嵌入式是个未来的大趋势,就打算跨行学习,我觉得这不是不可但是很难,为什么难呢?你想想你跟学外语专业的,对计算机领域可能一窍不通,对一下基本的名次都没有太多的概念,你说你学起来难不难,固然很难,但不是不能学,也有很多跨行来做软件开发的一样可以做到很好。这个还是个人的,那么接下来分析一下那些专业更适合嵌入式的学习:自动化专业(我就是学这个专业的,想了解我的学习历程可以去看我的另一篇经验分享文章,写的很详细)、电子信息类专业、计算机类专业、测控类专业、机械电子类专业都可以。
      总的来说,我认为任何事物的学习最关键的都不是专业,你是不是这个专业的与你以后将要学习什么事物是没有必然联系的,有必然联系的是你自己的态度和你是不是对它有特别大的兴趣(尤其是技术性很强的学科,你不喜欢他,他就是再好你也不一定能学的进去),当前你能学到什么程度这取决于你的毅力,你会学的多快这取决于你的学习能力和专注程度,所以朋友们一旦决定要学习它,就请拼劲全力吧!

  • 您还可以看一下 韦语洋(Lccee)老师的一机一码加密、被破解自动销毁随时授权回收升级系列视频课程课程中的 学习好本套课程的方式小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    要实现学生按照总成绩排序的功能,可以按照以下步骤进行操作:

    1. 首先,需要在学生综合评测系统的代码中添加一个用于存储学生总成绩的字段。可以在学生信息的数据结构体中增加一个成绩字段。
    typedef struct {
        char name[20];
        int score;
        // 其他学生信息字段...
    } Student;
    
    1. 在读取学生信息时,需要计算学生的总成绩并将其保存到学生数据结构体的成绩字段中。假设学生的各项评分分别存储在不同的变量中,可以通过对这些评分进行加和来计算总成绩。
    // 假设有三个评分分别存储在变量score1、score2、score3中
    student.score = score1 + score2 + score3;
    
    1. 将所有学生的信息存储到一个学生数组中。
    Student students[N]; // N为学生总数
    
    1. 使用冒泡排序算法对学生进行按照总成绩降序排序。冒泡排序的基本思想是比较相邻的两个元素,如果顺序不对则交换位置,重复这个过程直到整个数组有序。
    for (int i = 0; i < N-1; i++) {
        for (int j = 0; j < N-i-1; j++) {
            if (students[j].score < students[j+1].score) {
                // 交换学生位置
                Student temp = students[j];
                students[j] = students[j+1];
                students[j+1] = temp;
            }
        }
    }
    
    1. 最后,按照排序后的顺序打印学生信息。
    for (int i = 0; i < N; i++) {
        printf("姓名:%s,总成绩:%d\n", students[i].name, students[i].score);
    }
    

    注意:上述代码仅为示例,具体实现需要根据学生综合评测系统的代码结构和需求进行调整。