C语言结构体学生成绩

有N个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入N个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)
输入格式
学生数量N占一行每个学生的学号、姓名、三科成绩占一行,空格分开。
输出格式
各门课的平均成绩 最高分的学生的数据(包括学号、姓名、3门课成绩)
样例输入
2
1 blue 90 80 70
b clan 80 70 60
样例输出
85 75 65
1 blue 90 80 70

#include <stdio.h>
#define MAX 1000001
struct Student{
    int id;
    char Name[20];
    int class1,class2,class3;
}student[MAX];
int main()
{
   int N,i;
   scanf("%d",&N);
   for(i=0;i<N;i++)
   {
       scanf("%d%s%d%d%d",&student[i].id,&student[i].Name,&student[i].class1,&student[i].class2,&student[i].class3);
   }
   double ave1,ave2,ave3;
   int sum1=0,sum2=0,sum3=0;
    for(i=0;i<N;i++)
    {
        sum1+=student[i].class1;
        sum2+=student[i].class2;
        sum3+=student[i].class3;
    }
    ave1=1.0*sum1/N;
    ave2=1.0*sum2/N;
    ave3=1.0*sum3/N;
    printf("%lf %lf %lf\n",ave1,ave2,ave3);
    int grade[N];
    for(i=0;i<N;i++)
    {
        grade[i]=student[i].class1+student[i].class2+student[i].class3;
        
    }
    int max=grade[0],num=0;
    for(i=1;i<N;i++)
    {
        if(max<grade[i])
        {
            max=grade[i];
            num=i;
        }
    }
    printf("%d %s %d %d %d",student[num].id,student[num].Name,student[num].class1,student[num].class2,student[num].class3);
    return 0;
}

为啥计算各科平均分貌似只统计了第一个学生的各科成绩

因为学号不一定是数字,而你用了%d和int

修改如下:

#include <stdio.h>
#define MAX 1000001
struct Student{
    char id[20];
    char Name[20];
    int class1,class2,class3;
}student[MAX];
int main()
{
   int N,i;
   scanf("%d",&N);
   for(i=0;i<N;i++)
   {
       scanf("%s%s%d%d%d",&student[i].id,&student[i].Name,&student[i].class1,&student[i].class2,&student[i].class3);
   }
   double ave1,ave2,ave3;
   int sum1=0,sum2=0,sum3=0;
    for(i=0;i<N;i++)
    {
        sum1+=student[i].class1;
        sum2+=student[i].class2;
        sum3+=student[i].class3;
    }
    ave1=1.0*sum1/N;
    ave2=1.0*sum2/N;
    ave3=1.0*sum3/N;
    printf("%.0lf %.0lf %.0lf\n",ave1,ave2,ave3);
    int grade[N];
    for(i=0;i<N;i++)
    {
        grade[i]=student[i].class1+student[i].class2+student[i].class3;
        
    }
    int max=grade[0],num=0;
    for(i=1;i<N;i++)
    {
        if(max<grade[i])
        {
            max=grade[i];
            num=i;
        }
    }
    printf("%s %s %d %d %d",student[num].id,student[num].Name,student[num].class1,student[num].class2,student[num].class3);
    return 0;
}

img

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7627925
  • 除此之外, 这篇博客: 习题 9.5 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。中的 习题 9.5 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 代码块:

    方法1:

    #include <stdio.h>
    struct student
    {
        int num;
        char name[10];
        float score[3];
        float aver;
    } stu[10];
    void input(struct student s[], int n);
    void average(struct student s[], int n);
    void high_score(struct student s[], int n);
    int main()
    {
        input(stu, 10);
        average(stu, 10);
        high_score(stu, 10);
        return 0;
    }
    void input(struct student s[], int n)
    {
        int i, j;
        for (i=0; i<n; i++){
            printf("Please enter No.%d student num name score: ", i+1);
            scanf("%d %s", &s[i].num, s[i].name);
            for (j=0; j<3; scanf("%f", &s[i].score[j++]));
        }
    }
    void average(struct student s[], int n)
    {
        int i, j;
        float sum;
        for (i=0, sum=0.0; i<n; i++)
            for (j=0; j<3; sum+=s[i].score[j++]);
        printf("Average=%.2f\n", sum/n);
    }
    void high_score(struct student s[], int n)
    {
        int i, j;
        float sum;
        struct student temp;
        for (i=0; i<n; i++){
            for (j=0, sum=0.0; j<3; sum+=s[i].score[j++]);
            s[i].aver=sum/3;
        }
        for (i=0; i<n; i++)
            for (j=i+1; j<n; s[i].aver<s[j].aver ? temp=s[i], s[i]=s[j], s[j]=temp, j++ : j++);
        printf("The highest student info: %d %-5s ", s[0].num, s[0].name);
        for (i=0; i<3; printf("%.2f ", s[0].score[i++]));
        printf("%.2f\n", s[0].aver);
    }

    方法2:

    #include <stdio.h>
    #include <stdlib.h>
    struct Student{
        int num; 
        char name[20];
        float score[3];
    };
    void input(Student *st);
    void print(Student *st);
    int main()
    {
        Student *stu=(Student*)malloc(3*sizeof(Student));
        input(stu);
        print(stu);
        system("pause");
        return 0;
    }
    void input(Student *st)
    {
        int i;
        Student *p;
        for (p=st, i=0; p<st+3; p++, i++){
            printf("Please enter No.%d student info: ", i+1);
            scanf("%d %s", &p->num, p->name);
            for (i=0; i<3; scanf("%f", &p->score[i++]));
        }
    }
    void print(Student *st)
    {
        int i, j;
        float aver, sum[3], total, max;
        Student *p;
        for (p=st, i=0, total=0; p<st+3; p++, i++){
            for (j=0, sum[i]=0; j<3; sum[i]+=p->score[j++]);
            total+=sum[i]/3;
        }
        aver=total/3;
        printf("Total Average: %.2f\n", aver);
        for (i=0, max=sum[i]; i<3; i++)
            if (sum[i]>max){
                max=sum[i];
                j=i;
            }
        printf("The highest score student info: %d %s ", (st+j)->num, (st+j)->name);
        for (i=0; i<3; printf("%.2f ", (st+j)->score[i++]));
        printf("\n");
    }
  • 以下回答由chatgpt基于相关博客总结生成:

    问题标题: C语言结构体学生成绩

    问题内容: 有N个学生,每个学生的数据包括学号、姓名、3门课的成绩。请写一个程序,从键盘输入N个学生的数据,要求计算并打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)。

    输入格式:

    学生数量N占一行
    每个学生的学号、姓名、三科成绩占一行,空格分开。
    

    输出格式:

    各门课的平均成绩
    最高分的学生的数据(包括学号、姓名、3门课成绩)
    

    样例输入:

    2
    1 blue 90 80 70
    b clan 80 70 60
    

    样例输出:

    85 75 65
    1 blue 90 80 70
    

    参考资料中提到了两种方法来解决这个问题,我们可以根据参考资料给出的代码实现两种方法,并进行一些改动以适应题目要求的输入格式。下面是两种方法的改进代码:

    方法1:

    #include <stdio.h>
    
    struct student
    {
        int num;
        char name[10];
        float score[3];
        float aver;
    };
    
    void input(struct student s[], int n);
    void average(struct student s[], int n);
    void high_score(struct student s[], int n);
    
    int main()
    {
        int N;
        scanf("%d", &N); // 输入学生数量N
    
        struct student stu[N]; // 定义N个学生的结构体数组
    
        input(stu, N);
        average(stu, N);
        high_score(stu, N);
    
        return 0;
    }
    
    void input(struct student s[], int n)
    {
        for (int i = 0; i < n; i++)
        {
            scanf("%d %s", &s[i].num, s[i].name); // 输入学号和姓名
            for (int j = 0; j < 3; j++)
            {
                scanf("%f", &s[i].score[j]); // 输入三门课成绩
            }
        }
    }
    
    void average(struct student s[], int n)
    {
        float sum[3] = {0}; // 定义三门课程的成绩总和数组
    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                sum[j] += s[i].score[j]; // 累加每个学生的成绩
            }
        }
    
        printf("%.2f %.2f %.2f\n", sum[0] / n, sum[1] / n, sum[2] / n); // 输出三门课程的平均成绩
    }
    
    void high_score(struct student s[], int n)
    {
        int max_index = 0;
        float max_score = s[0].score[0];
    
        for (int i = 0; i < n; i++)
        {
            float total_score = 0;
            for (int j = 0; j < 3; j++)
            {
                total_score += s[i].score[j]; // 计算每个学生的总成绩
            }
            if (total_score > max_score) // 找到最高分的学生
            {
                max_score = total_score;
                max_index = i;
            }
        }
    
        printf("%d %s %.2f %.2f %.2f\n", s[max_index].num, s[max_index].name, s[max_index].score[0], s[max_index].score[1], s[max_index].score[2]); // 输出最高分的学生的数据
    }
    

    方法2:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Student
    {
        int num;
        char name[20];
        float score[3];
    };
    
    void input(struct Student *st, int n);
    void print(struct Student *st, int n);
    
    int main()
    {
        int N;
        scanf("%d", &N); // 输入学生数量N
    
        struct Student *stu = (struct Student *)malloc(N * sizeof(struct Student)); // 动态分配N个学生的结构体数组
    
        input(stu, N);
        print(stu, N);
    
        free(stu); // 释放内存
    
        return 0;
    }
    
    void input(struct Student *st, int n)
    {
        for (int i = 0; i < n; i++)
        {
            scanf("%d %s", &st[i].num, st[i].name); // 输入学号和姓名
            for (int j = 0; j < 3; j++)
            {
                scanf("%f", &st[i].score[j]); // 输入三门课成绩
            }
        }
    }
    
    void print(struct Student *st, int n)
    {
        float sum[3] = {0}; // 定义三门课程的成绩总和数组
        float max_score = st[0].score[0];
        int max_index = 0;
    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                sum[j] += st[i].score[j]; // 累加每个学生的成绩
            }
    
            float total_score = 0;
            for (int j = 0; j < 3; j++)
            {
                total_score += st[i].score[j]; // 计算每个学生的总成绩
            }
            if (total_score > max_score) // 找到最高分的学生
            {
                max_score = total_score;
                max_index = i;
            }
        }
    
        printf("%.2f %.2f %.2f\n", sum[0] / n, sum[1] / n, sum[2] / n); // 输出三门课程的平均成绩
        printf("%d %s %.2f %.2f %.2f\n", st[max_index].num, st[max_index].name, st[max_index].score[0], st[max_index].score[1], st[max_index].score[2]); // 输出最高分的学生的数据
    }
    

    这两种方法都可以实现题目要求,可以根据个人喜好选择其中一种。方法1使用静态数组,需要事先确定学生数量N的上限;方法2使用动态分配内存,可以适应任意数量的学生。

    代码中已经将输入格式改进为题目要求的格式,并输出了相应的结果。请测试并查看输出。