题目描述
有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. 引入头文件
代码开始时,引入了stdio.h
头文件,这是C语言标准输入输出库,用于处理输入输出函数,如scanf
和printf
。
#include <stdio.h>
2. 定义学生结构体
定义了一个名为student
的结构体类型,用来存储学生的详细信息。结构体包含5个字段:student_id
(学号),name
(姓名),mark1
,mark2
和mark3
(三门课的成绩)。
struct student
{
char student_id[30];
char name[20];
int mark1;
int mark2;
int mark3;
};
3. 输入学生信息的函数
定义了一个名为input
的函数,该函数接收一个指向student
类型的指针arr
和一个整数i
作为参数。这个函数的作用是使用scanf
函数从标准输入读取指定索引i
的学生信息,并存储到通过指针arr
指定的结构体实例中。
void input(struct student *arr, int i)
{
scanf("%s", arr[i].student_id);
scanf("%s", arr[i].name);
scanf("%d", &arr[i].mark1);
scanf("%d", &arr[i].mark2);
scanf("%d", &arr[i].mark3);
}
4. 统计和打印函数
定义了一个名为count_print
的函数,该函数接收一个指向student
类型的指针arr
和一个整数n
作为参数。这个函数的作用是计算所有学生的三门课程的平均分,并找出总分最高的学生,然后打印出所有学生的平均分以及最高分学生的信息。
在count_print
函数中,定义了几个整型变量用于存储总分和最高分学生的信息。通过一个for
循环遍历所有学生的成绩,累加每门课程的总分,并找出总分最高的学生。在循环结束后,计算每门课程的平均分,并打印出来。最后,打印出总分最高的学生的具体信息。
void count_print(struct student* arr, int n)
{
int mark_1 = 0, mark_2 = 0, mark_3 = 0;
int max = 0;
int max_;
for (int i = 0; i < n; i++)
{
mark_1 += arr[i].mark1;
mark_2 += arr[i].mark2;
mark_3 += arr[i].mark3;
if (arr[i].mark1 + arr[i].mark2 + arr[i].mark3 > max)
{
max = arr[i].mark1 + arr[i].mark2 + arr[i].mark3;
max_ = i;
}
}
mark_1 /= n;
mark_2 /= n;
mark_3 /= n;
printf("%d %d %d\n", mark_1, mark_2, mark_3);
printf("%s %s %d %d %d", arr[max_].student_id, arr[max_].name, arr[max_].mark1, arr[max_].mark2, arr[max_].mark3);
}
5. 主函数
main
函数是程序的入口点。首先,定义了一个整型变量n
来存储学生数量,并声明了一个student
类型的数组arr
,用来存储所有学生的信息,数组的大小定义为100,意味着最多可以存储100个学生的信息。
使用scanf
函数读取用户输入的学生数量n
。然后,通过一个for
循环,从0到n-1
,对每个学生调用input
函数,将用户输入的学生信息存入数组arr
中。
调用count_print
函数,传入学生数组arr
和学生数量n
,进行成绩统计和最高分学生信息的打印。
int n;
struct student arr[100];
scanf("%d", &n);
for (int i = 0; i < n; i++)
input(arr,i);
count_print(arr, n);
6. 程序结束
main
函数返回0,表示程序正常结束。
return 0;
源代码
#include <stdio.h>
struct student
{
char student_id[30];
char name[20];
int mark1;
int mark2;
int mark3;
};
void input(struct student *arr, int i)
{
scanf("%s", arr[i].student_id);
scanf("%s", arr[i].name);
scanf("%d", &arr[i].mark1);
scanf("%d", &arr[i].mark2);
scanf("%d", &arr[i].mark3);
}
void count_print(struct student* arr, int n)
{
int mark_1 = 0, mark_2 = 0, mark_3 = 0;
int max = 0;
int max_;
for (int i = 0; i < n; i++)
{
mark_1 += arr[i].mark1;
mark_2 += arr[i].mark2;
mark_3 += arr[i].mark3;
if (arr[i].mark1 + arr[i].mark2 + arr[i].mark3 > max)
{
max = arr[i].mark1 + arr[i].mark2 + arr[i].mark3;
max_ = i;
}
}
mark_1 /= n;
mark_2 /= n;
mark_3 /= n;
printf("%d %d %d\n", mark_1, mark_2, mark_3);
printf("%s %s %d %d %d", arr[max_].student_id, arr[max_].name, arr[max_].mark1, arr[max_].mark2, arr[max_].mark3);
}
int main(void)
{
int n;
struct student arr[100];
scanf("%d", &n);
for (int i = 0; i < n; i++)
input(arr,i);
count_print(arr, n);
return 0;
}