有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;
}
代码块:
方法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");
}
问题标题: 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使用动态分配内存,可以适应任意数量的学生。
代码中已经将输入格式改进为题目要求的格式,并输出了相应的结果。请测试并查看输出。