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
,其中包括了学号、数学、英语、计算机成绩和平均成绩五个成员变量。我们还定义了三个函数,分别是 Ave
、Find
和 print_table
。
Ave
函数用于计算一个学生的平均成绩,它接受一个指向 student
结构体的指针作为参数,计算平均成绩并将结果存储在结构体的 ave
成员变量中。
Find
函数用于找到平均成绩最高的学生,它接受一个指向 student
结构体数组的指针和数组的长度作为参数,遍历数组并找到平均成绩最高的学生,返回该学生的指针。
print_table
函数用于按表格的格式输出全部学生信息,它接受一个指向 student
结构体数组的指针和数组的长度作为参数,按照要求输出表格。
在主函数中,我们定义了一个包含 20 个学生信息的数组 students
,并计算每个学生的平均成绩。然后我们调用 print_table
函数输出全部学生信息,并调用 Find
函数找到平均成绩最高的学生并输出其信息。
代码块:
方法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");
}