[OJ] 成绩单问题

学生数量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];

 }

OVER!

原创文章 42 获赞 15 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Codeliang666/article/details/104025371