好复杂的一题 指针类型的 有朋友能帮帮我吗

  3.每个学生信息存储在一个结构体中,结构体包括学号、数学成绩、英语成绩、计算机成绩、平均成绩五部分。Ave函数负责计算一个学生的平均成绩。Find函数负责找到平均成绩最高的学生, Print函数负责按表格的形式输出一个学生的全部信息,内容全部左对齐,表头为“No. Math. Eng. Comp. Ave.”。编程实现上述函数,要求输出一个班中(不少于8人)平均成绩最高的学生的信息。


#include <stdio.h>
#define N 8 // 学生人数

struct Student {
    int num; // 学号
    int math; // 数学成绩
    int eng; // 英语成绩
    int comp; // 计算机成绩
    float ave; // 平均成绩
};

void Ave(struct Student *stu) {
    stu->ave = (stu->math + stu->eng + stu->comp) / 3.0;
}

void Find(struct Student *stu) {
    int i, max_index = 0;
    float max_ave = stu[0].ave;
    for (i = 1; i < N; i++) {
        if (stu[i].ave > max_ave) {
            max_index = i;
            max_ave = stu[i].ave;
        }
    }
    printf("平均成绩最高的学生信息如下:\n");
    Print(&stu[max_index]);
}

void Print(struct Student *stu) {
    printf("%-4d%-5d%-5d%-5d%.2f\n", stu->num, stu->math, stu->eng, stu->comp, stu->ave);
}

int main() {
    int i;
    struct Student stu[N] = {
        {1001, 80, 90, 85},
        {1002, 85, 88, 90},
        {1003, 90, 92, 88},
        {1004, 95, 89, 92},
        {1005, 92, 96, 90},
        {1006, 87, 90, 93},
        {1007, 89, 92, 94},
        {1008, 93, 91, 95}
    };
    for (i = 0; i < N; i++) {
        Ave(&stu[i]);
    }
    printf("No.  Math Eng  Comp Ave.\n");
    for (i = 0; i < N; i++) {
        Print(&stu[i]);
    }
    Find(stu);
    return 0;
}

参考 GPT

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

#define MAX_STUDENTS 20
#define MAX_NAME_LEN 20

struct student {
    char id[MAX_NAME_LEN];
    int math;
    int eng;
    int comp;
    float ave;
};

void Ave(struct student *s) {
    s->ave = (s->math + s->eng + s->comp) / 3.0;
}

struct student *Find(struct student *s, int n) {
    struct student *max = &s[0];
    for (int i = 1; i < n; i++) {
        if (s[i].ave > max->ave) {
            max = &s[i];
        }
    }
    return max;
}

void print_table(struct student *s, int n) {
    printf("%-3s %-4s %-4s %-4s %-4s\n", "No", "Math", "Eng", "Comp", "Ave");
    for (int i = 0; i < n; i++) {
        printf("%-3s %-4d %-4d %-4d %-4.1f\n", s[i].id, s[i].math, s[i].eng, s[i].comp, s[i].ave);
    }
}

int main() {
    struct student students[MAX_STUDENTS] = {
        {"1001", 80, 90, 85},
        {"1002", 75, 85, 90},
        {"1011", 80, 90, 85},
        {"1012", 75, 85, 90},
        {"1017", 75, 85, 90},
        {"1018", 90, 80, 95},
        {"1019", 85, 90, 80},
        {"1020", 95, 85, 90},
    };
    int n = sizeof(students) / sizeof(students[0]);
    for (int i = 0; i < n; i++) {
        Ave(&students[i]);
    }
    print_table(students, n);
    struct student *max = Find(students, n);
    printf("The student with the highest average score is: %s, %.1f\n", max->id, max->ave);
    return 0;
}

在这个示例代码中,我们定义了一个结构体 student,其中包括了学号、数学、英语、计算机成绩和平均成绩五个成员变量。我们还定义了三个函数,分别是 AveFindprint_table

Ave 函数用于计算一个学生的平均成绩,它接受一个指向 student 结构体的指针作为参数,计算平均成绩并将结果存储在结构体的 ave 成员变量中。

Find 函数用于找到平均成绩最高的学生,它接受一个指向 student 结构体数组的指针和数组的长度作为参数,遍历数组并找到平均成绩最高的学生,返回该学生的指针。

print_table 函数用于按表格的格式输出全部学生信息,它接受一个指向 student 结构体数组的指针和数组的长度作为参数,按照要求输出表格。

在主函数中,我们定义了一个包含 20 个学生信息的数组 students,并计算每个学生的平均成绩。然后我们调用 print_table 函数输出全部学生信息,并调用 Find 函数找到平均成绩最高的学生并输出其信息。

  • 这篇博客: 习题 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");
    }