C语言设计有没有人帮一下

对一个班级同学的形成性成绩进行排序输出,具体要求:
定义一个结构体类型存储学生学号和所有的测试成绩及平均分,通过文件操作读取相关数据,计算每位同学的平均成绩,并按平均成绩排序,将排序后的结果输出到文件中保存起来,其中数据读取、计算平均分、排序和输出分别采用函数实现。
三、实验要求

  1. 回顾与复习课程相关知识点,确定该成绩管理系统的功能与实现目标,分析任务需求,确定组成程序的函数模块;绘制程序流程图,完成程序代码设计和实现;提交本实验报告。
    基本要求:采用结构体类型存储学生学号、37次测试成绩(9次课前测、9次课后测、9次课后任务、9次实验和1次阶段性测试),以及平均分;采用函数实现数据读取、计算平均分、排序和输出。
    数据格式:第1行为人数n,如:一个班有n=44人,则第一行为数值44;从第2行到n+1行为n位同学的成绩信息,其中:每行信息包含38列,分别为学号和37次测试成绩,以逗号分隔。各列的具体含义如下:第1列为学号,第2-37列为36次课前测、课后测、课后任务、实验成绩,第38列为阶段性测试1成绩。

计算方法:平均分=所有37次测试成绩的平均值。
排序方法:要求使用冒泡排序算法,按加权均分由大到小排序。
计算输出:除学号外,所有成绩均采用单精度(float)浮点数进行定义和计算;输出仅输出到屏幕,无需输出至文件。输出格式同输入的文件数据格式类似,无需输出第一行人数,37次成绩仅输出整数部分,每行的最后增加一列为“平均分”列(平均分列保留2位小数)。

不知道你采纳了楼上的答案没有,没有满意的话,下班之后可以给你撸一个能用的代码。
好的更新一下相关内容,你可以根据我的这些代码进行修改完善,实验结果如下

img

img

代码:

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

#define N 37 //定义常量N为37为测试成绩

//定义一个结构体类型,名为student
struct student
{
    int id; //学号,整数类型
    float scores[N]; //37次测试成绩,单精度浮点数类型的数组
    float average; //平均分,单精度浮点数类型
};

//定义一个函数,计算一个student类型的变量的平均分
void calculate_average(struct student *s)
{
    int i; //定义循环变量i
    float sum = 0; //定义和变量sum,并初始化为0
    for (i = 0; i < N; i++) //循环37次
    {
        sum += s->scores[i]; //累加s的每一次测试成绩到sum中
    }
    s->average = sum / N; //计算s的平均分,并赋值给s->average
}

//定义一个函数,打印一个student类型的变量的所有信息
void print_student(struct student *s)
{
    int i; //定义循环变量i
    printf("学号:%d\n", s->id); //打印s的学号
    printf("测试成绩:\n"); //打印提示信息
    for (i = 0; i < N; i++) //循环37次
    {
        printf("%.0f,", s->scores[i]); //打印s的每一次测试成绩,并保留两位小数
        if ((i + 1) % 9 == 0) //如果是每9次一行,就打印一个换行符
        {
            printf("\n");
        }
    }
    printf("平均分:%.2f\n", s->average); //打印s的平均分,并保留两位小数
}

//定义一个函数,从文件中读取数据,并存储到一个student类型的数组中,返回数组的长度
int read_data_from_file(const char *filename, struct student **array)
{
    FILE *fp; //定义文件指针fp
    int n; //定义班级人数n
    int i, j; //定义循环变量i和j

    fp = fopen(filename, "r"); //以只读模式打开文件filename,并赋值给fp
    if (fp == NULL) //如果fp为空,说明打开文件失败
    {
        printf("无法打开文件%s\n", filename); //打印错误信息
        return -1; //返回-1,表示出错
    }

    fscanf(fp, "%d", &n); //从文件中读取班级人数n

    *array = (struct student *)malloc(n * sizeof(struct student)); //动态分配内存空间给array指向的指针,大小为n个student类型的大小

    for (i = 0; i < n; i++) //循环n次,读取每个学生的数据
    {
        fscanf(fp, "%d,", &(*array)[i].id); //从文件中读取学号,并赋值给(*array)[i].id,注意后面有一个逗号,表示跳过逗号
        for (j = 0; j < N; j++) //循环37次,读取每次测试成绩
        {
            fscanf(fp, "%f,", &(*array)[i].scores[j]); //从文件中读取测试成绩,并赋值给(*array)[i].scores[j],注意后面有一个逗号,表示跳过逗号
        }
        calculate_average(&(*array)[i]); //调用calculate_average函数,计算平均分,并赋值给(*array)[i].average
    }

    fclose(fp); //关闭文件

    return n; //返回数组的长度n
}


//定义一个函数,对一个student类型的数组按照平均分进行排序,使用冒泡排序算法
void sort_by_average(struct student *array, int n)
{
    int i, j; //定义循环变量i和j
    struct student temp; //定义一个临时变量temp,用来交换元素
    for (i = 0; i < n - 1; i++) //循环n-1次
    {
        for (j = 0; j < n - 1 - i; j++) //循环n-1-i次
        {
            if (array[j].average < array[j + 1].average) //如果array[j]的平均分小于array[j+1]的平均分,说明顺序不对
            {
                temp = array[j]; //把array[j]赋值给temp
                array[j] = array[j + 1]; //把array[j+1]赋值给array[j]
                array[j + 1] = temp; //把temp赋值给array[j+1]
            }
        }
    }
}


//定义主函数
int main()
{
    struct student *array; //定义一个student类型的指针,用来指向数组
    int n; //定义数组的长度n
    int i;
    n = read_data_from_file("studen_score.txt", &array); //调用read_data_from_file函数,从"studen_score.txt"文件中读取数据,并存储到array指向的数组中,返回数组的长度n

    if (n > 0) //如果n大于0,说明读取成功
    {
        printf("读取成功,共%d个学生的数据。\n", n); //打印成功信息
        sort_by_average(array, n); //调用sort_by_average函数,对array指向的数组按照平均分进行排序
        printf("排序成功,按照平均分由大到小排序。\n"); //打印成功信息
        for (i = 0; i < n; i++) //循环n次,打印每个学生的数据
        {
            print_student(&array[i]); //调用print_student函数,打印array[i]指向的学生的所有信息
        }
        free(array); //释放动态分配的内存空间
    }

    return 0; //返回0,表示程序正常结束
}

资料链接:
https://download.csdn.net/download/weixin_44317448/87758143

下面是用C语言实现一个班级同学形成性成绩排名的程序,包括读取数据、计算平均分、排序和输出结果:

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

#define MAX_LINE_SIZE 1024
#define NUM_TESTS 37
#define WEIGHT 1.0/NUM_TESTS

typedef struct {
    int id;
    float tests[NUM_TESTS];
    float avg;
} Student;

int read_students(Student students[]) {
    char line[MAX_LINE_SIZE];
    int i = 0;
    FILE* file = fopen("scores.txt", "r");
    if(file == NULL) {
        fprintf(stderr, "Error opening file.\n");
        exit(EXIT_FAILURE);
    }
    fgets(line, MAX_LINE_SIZE, file); // Read first line (number of students)
    while(fgets(line, MAX_LINE_SIZE, file) != NULL) {
        int j = 0;
        char* token = strtok(line, ",");
        students[i].id = atoi(token);
        token = strtok(NULL, ",");
        while(token != NULL) {
            students[i].tests[j++] = atof(token);
            token = strtok(NULL, ",");
        }
        i++;
    }
    fclose(file);
    return i;
}

void calculate_averages(Student students[], int num_students) {
    int i, j;
    for(i = 0; i < num_students; i++) {
        float total = 0;
        for(j = 0; j < NUM_TESTS; j++) {
            total += students[i].tests[j];
        }
        students[i].avg = total * WEIGHT;
    }
}

void sort_students(Student students[], int num_students) {
    int i, j;
    for(i = 0; i < num_students; i++) {
        for(j = 0; j < num_students-i-1; j++) {
            if(students[j].avg < students[j+1].avg) {
                Student temp = students[j];
                students[j] = students[j+1];
                students[j+1] = temp;
            }
        }
    }
}

void print_students(Student students[], int num_students) {
    int i, j;
    printf("学号,");
    for(j = 1; j <= NUM_TESTS; j++) {
        printf("第%d次测试,", j);
    }
    printf("平均分\n");
    for(i = 0; i < num_students; i++) {
        printf("%d,", students[i].id);
        for(j = 0; j < NUM_TESTS; j++) {
            printf("%.0f,", students[i].tests[j]);
        }
        printf("%.2f\n", students[i].avg);
    }
}

int main() {
    Student students[100];
    int num_students = read_students(students);
    calculate_averages(students, num_students);
    sort_students(students, num_students);
    print_students(students, num_students);
    return 0;
}

该程序使用结构体类型存储学生的学号、测试成绩和平均分。程序读取数据文件,计算每个学生的平均分,然后根据平均分排序,最后输出结果到屏幕。计算平均分和排序均使用循环遍历数组和结构体的方式实现,以保证代码的简洁性和可读性。

可以借鉴下

#include<stdio.h>
#define N 3 //定义有3个学生
//定义学生结构体
struct student
{
    int n;
    float  c, m, e, p,aver;
 
};
void paixu(struct student x[N])
{
    printf("-----------------------------------成绩单-------------------------------------\n");
    printf("名次           学号           英语           语文            数学            物理             平均分\n");
    int i, j, k, temp;
    for (i = 0; i < N - 1; i++)
    {
        k = i;
        for (j = i + 1; j < N; j++)
        {
            if (x[i].aver > x[j].aver)//如果 后面比前面小
                k = j;
            if (k != j)//如果前面比后面小
            {
                temp = x[j].aver;
                x[j].aver = x[i].aver;
                x[i].aver = temp;
 
                temp = x[j].n;
                x[j].n = x[i].n;
                x[i].n = temp;
 
                temp = x[j].c;
                x[j].c = x[i].c;
                x[i].c = temp;
 
                temp = x[j].m;
                x[j].m = x[i].m;
                x[i].m = temp;
 
                temp = x[j].e;
                x[j].e = x[i].e;
                x[i].e = temp;
 
                temp = x[j].p;
                x[j].p = x[i].p;
                x[i].p = temp;
                //将两个结构组交换
            }
        }
 
    }
    int a;
    for (a=0; a < N; a++)
    {
        printf("%d          %d          %f          %f          %f          %f          %f\n", a + 1, x[a].n, x[a].e, x[a].c, x[a].m, x[a].p, x[a].aver);
 
    }
 
 
}
//计算模块
float jisuan(float c, float m, float e, float p)
{
    
    float aver, sum;
    sum = c + m + e + p;
    aver = sum / 4;
    printf("总分是:%f,平均值是:%f\n", sum,aver);
    return aver;
}
//输入模块
void fun1()
{
 
    int a;
    struct student x[N];
    
    for (a = 0; a < N; a++)
    {
        printf("请输入学号:");
        scanf("%d", &x[a].n);
        printf("英语:");
        scanf("%f", &x[a].e);
        printf("语文:");
        scanf("%f", &x[a].c);
        printf("数学:");
        scanf("%f", &x[a].m);
        printf("物理:");
        scanf("%f", &x[a].p);
    
        x[a].aver= jisuan(x[a].c, x[a].m, x[a].e, x[a].p);
        
    }
    paixu(x);
return;
}
 
//排序模块,排 x[a].aver
 
 
 
int main()
{
 
    fun1();//完成输入后,由结构体数组储存学生的信息
    
 
    
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^