学生数量N占一行每个学生的学号、姓名、三科成绩占一行,空格分开。
输出
各门课的平均成绩 最高分的学生的数据(包括学号、姓名、3门课成绩)
样例输入:
2
1 blue 90 80 70
b clan 80 70 60
样例输出:
85 75 65
1 blue 90 80 70
分析:最高分指的是总分:
#include <stdio.h>
#include <malloc.h>
struct student_info { //定义结构体,成员变量分别是姓名,学号以及成绩
char s_id[16]; //学号
char s_name[32]; //姓名
int s_grades[16]; //成绩
int s_total[16]; // 存储每个同学的成绩总分
//warning 这个地方没必要搞个数组存一个就可以了.
};
void input(struct student_info * input);
void dataHandle(struct student_info * p);
int main()
{
int n;
int i;
int k;
int best;
int sum1,sum2,sum3;
scanf("%d",&n);
struct student_info *list[100]; //结构体指针数组初始化,
for (i=0;i<n;i++){
list[i] = (struct student_info *)malloc(sizeof(struct student_info)*n);
//开辟一块块内存地址,并且把首地址给指针list
}
for (i=0;i < n;i++){
input(list[i]);
}
for (i=0;i < n;i++){
dataHandle(list[i]);
}
for ( int i=0;i<n;i++){
sum1 = sum1+list[i]->s_grades[0];
sum2 = sum2+list[i]->s_grades[0]; //逻辑错误,这里应该为s_grades[1];
sum3 = sum3+list[i]->s_grades[0]; //逻辑错误,这里应该为s_grades[2]
}
sum1=sum1/3; //逻辑错误,应该除以n
sum2=sum2/3; //逻辑错误,应该除以n
sum3=sum3/3; //逻辑错误,应该除以n
//找到最大值
k=list[0]->s_total[0];
for (i=0;i < n;i++){
if ( k< list[i]->s_total[0] ){
k= list[i]->s_total[0];
best =k; //记录下成绩最好的同学
//error: 应该把i给best;
}
}
printf("%s %s %d %d %d",list[k]->s_id,list[k]->s_name,list[k]->s_name[0],
list[k]->s_name[1],list[k]->s_name[2]);
//error,这里应该都用list[i]
for (i=0;i<n;i++)
free(list[i]);
return 0;
}
void input(struct student_info * input){
scanf("%s%s%d%d%d",input->s_id,input->s_name,&(input->s_grades[0]),
&(input->s_grades[1]),&(input->s_grades[2]));
// intput->s_id指针变量input指向成员s_id的地址
// input->s_id == (*input).s_id ,
//这个本质是一个地址常量,指向char数组的开头,所以input->s_id是 char *类型的。
}
void dataHandle(struct student_info *p){
p->s_total[0]=p->s_grades[0]+ p->s_grades[1]+p->s_grades[2];
//printf("%s %s %d %d %d\n",p[k]->s_id,p[k]->s_name,
//p[k]->s_grades[0],p[k]->s_grades[1],p[k]->s_grades[2]);
},
gcc可以编译通过,但是一运行就报错,原因是:
printf("%s %s %d %d %d",list[k]->s_id,list[k]->s_name,list[k]->s_name[0],
list[k]->s_name[1],list[k]->s_name[2]);
这句代码把字符以%d形式打印出来,报错;
改了之后,代码在编程网站上提交通过,代码如下:
#include <stdio.h>
#include <malloc.h>
struct student_info { //定义结构体,成员变量分别是姓名,学号以及成绩
char s_id[16]; //学号
char s_name[32]; //姓名
int s_grades[16]; //成绩
int s_total; // 存储每个同学的成绩总分
};
void input(struct student_info * input);
void dataHandle(struct student_info * p);
int main()
{
int n;
int i;
int k;
int best=0;
int sum1=0;
int sum2=0;
int sum3=0;
scanf("%d",&n);
struct student_info *list[100]; //结构体指针数组初始化,
for (i=0;i<n;i++){
list[i] = (struct student_info *)malloc(sizeof(struct student_info)*n);
//开辟一块块内存地址,并且把首地址给指针list
}
for (i=0;i < n;i++){
input(list[i]);
}
for (i=0;i < n;i++){
dataHandle(list[i]);
}
for ( int i=0;i<n;i++){
sum1 = sum1+list[i]->s_grades[0];
sum2 = sum2+list[i]->s_grades[1];
sum3 = sum3+list[i]->s_grades[2];
}
sum1=sum1/n;
sum2=sum2/n;
sum3=sum3/n;
//找到最大值
k=list[0]->s_total;
for (i=0;i < n;i++){
if ( k< list[i]->s_total ){
k= list[i]->s_total;
best =i; //记录下成绩最好的同学
}
}
printf("%d %d %d\n",sum1,sum2,sum3);
printf("%s %s %d %d %d\n",list[best]->s_id,list[best]->s_name,
list[best]->s_grades[0],list[best]->s_grades[1],list[best]->s_grades[2]);
for (i=0;i<n;i++)
free(list[i]);
return 0;
}
void input(struct student_info * input){
scanf("%s %s %d %d %d",input->s_id,input->s_name,&(input->s_grades[0]),
&(input->s_grades[1]),&(input->s_grades[2]));
// intput->s_id指针变量input指向成员s_id的地址
// input->s_id == (*input).s_id,这个本质是一个地址常量,指向char数组的开头,
//所以input->s_id是 char *类型的。
}
void dataHandle(struct student_info *p){
p->s_total=p->s_grades[0]+ p->s_grades[1]+p->s_grades[2];
}