结构体好题--成绩单(习题9.5)

题目描述

有 N 个学生,每个学生的数据包括学号、姓名、三门课的成绩。
从键盘输入 N 个学生的数据,要求打印出 3 门课的总平均成绩,以及总分最高的学生的数据(包括学号、姓名、3 门课成绩)。

输入格式

第一行包含一个整数 N,其后 N 行,每行包含两个字符串及三个整数,分别表示每个学生的学号、姓名、
3 科成绩。以空格分开。1<=N<=100
学号、姓名的长度不超过 10,三科成绩数据范围在 [0,100] 内
数据保证总分最高的同学只有一位

输出格式

第一行输出三个整数,表示各门课的平均成绩。数据保证平均成绩一定为整数。
第二行输出总分最高的学生的数据(包括学号、姓名、3 门课成绩,以空格隔开)。

结构体好题--成绩单(习题9.5)_第1张图片

题解:

1.引入头文件和定义常量:

在代码开头,我们引入了stdio.h头文件以使用输入/输出函数,引入了string.h头文件以使用字符串相关的函数。同时,我们定义了两个常量MAX_LENGTH和MAX_STUDENTS,分别表示学生信息中字符串的最大长度和最大学生人数。

#include 
#include 

#define MAX_LENGTH 10
#define MAX_STUDENTS 100

2.定义学生结构体:

我们使用结构体Student来表示每个学生的信息。结构体包含了学生的学号、姓名、三门课程的成绩和总分。

typedef struct
 {
    char id[MAX_LENGTH];
    char name[MAX_LENGTH];
    int scores[3];
    int total_score;
} Student;

3.主函数

在主函数中,我们首先声明并读取学生的总人数N。 然后,我们定义一个数组students来存储学生的信息,数组大小为MAX_STUDENTS。
我们还定义一个数组total_scores来存储各门课程的总分,初始值为0。
变量max_total_score用于保存总分最高的学生的分数,初始值为0。
max_student_data用于保存总分最高的学生的数据,数组大小根据最大字符串长度计算得出。

int main()
 {
    int N;
    scanf("%d", &N);  // 输入学生人数
    
    Student students[MAX_STUDENTS];  // 存储学生信息的数组
    int total_scores[3] = {0};  // 各门课程的总分
    int max_total_score = 0;
    char max_student_data[MAX_LENGTH * 4 + 3];  // 保存总分最高的学生的数据

4.循环读取学生信息并计算总分和各门课程的总分:

for (int i = 0; i < N; i++)
 {
    scanf("%s %s %d %d %d", students[i].id, students[i].name,
          &students[i].scores[0], &students[i].scores[1], &students[i].scores[2]);

    // 计算总分
    students[i].total_score = students[i].scores[0] + students[i].scores[1] + students[i].scores[2];

    // 更新各门课程的总分
    for (int j = 0; j < 3; j++)
     {
        total_scores[j] += students[i].scores[j];
    }

    // 判断是否为总分最高的学生
    if (students[i].total_score > max_total_score)
     {
        max_total_score = students[i].total_score;
        sprintf(max_student_data, "%s %s %d %d %d", students[i].id, students[i].name,
                students[i].scores[0], students[i].scores[1], students[i].scores[2]);
    }
}

在循环中,我们使用scanf函数按照指定格式读取学生的学号、姓名和三门课程的成绩,分别保存到对应的学生结构体中。然后,我们计算每个学生的总分,并通过循环更新各门课程的总分。同时,我们判断每个学生的总分是否超过max_total_score,如果是则更新max_total_score和max_student_data。

5.计算各门课程的平均成绩:

通过循环遍历total_scores数组,我们计算每门课程的平均成绩,并将结果保存到average_scores数组中。

int average_scores[3];
for (int i = 0; i < 3; i++) {
    average_scores[i] = total_scores[i] / N;
}

6.输出结果

printf("%d %d %d\n", average_scores[0], average_scores[1], average_scores[2]);
printf("%s\n", max_student_data);

总体效果如下

#include 
#include 

#define MAX_LENGTH 10
#define MAX_STUDENTS 100

// 定义学生结构体
typedef struct 
{
    char id[MAX_LENGTH];
    char name[MAX_LENGTH];
    int scores[3];
    int total_score;
} Student;

int main()
 {
    int N;
    scanf("%d", &N);  // 输入学生人数
    
    Student students[MAX_STUDENTS];  // 存储学生信息的数组
    int total_scores[3] = {0};  // 各门课程的总分
    int max_total_score = 0;
    char max_student_data[MAX_LENGTH * 4 + 3];  // 保存总分最高的学生的数据

    // 循环读取每个学生的信息并计算总分和各门课程的总分
    for (int i = 0; i < N; i++) {
        scanf("%s %s %d %d %d", students[i].id, students[i].name,
              &students[i].scores[0], &students[i].scores[1], &students[i].scores[2]);
        
        // 计算总分
        students[i].total_score = students[i].scores[0] + students[i].scores[1] + students[i].scores[2];
        
        // 更新各门课程的总分
        for (int j = 0; j < 3; j++)
         {
            total_scores[j] += students[i].scores[j];
        }
        
        // 判断是否为总分最高的学生
        if (students[i].total_score > max_total_score) 
        {
            max_total_score = students[i].total_score;
            sprintf(max_student_data, "%s %s %d %d %d", students[i].id, students[i].name,
                    students[i].scores[0], students[i].scores[1], students[i].scores[2]);
        }
    }
    
    // 计算各门课程的平均成绩
    int average_scores[3];
    for (int i = 0; i < 3; i++)
     {
        average_scores[i] = total_scores[i] / N;
    }
    
    // 输出结果
    printf("%d %d %d\n", average_scores[0], average_scores[1], average_scores[2]);
    printf("%s\n", max_student_data);
    return 0;
}

你可能感兴趣的:(C语言刷题,算法,c语言)