4043:GPA排名系统

4043:GPA排名系统

时间限制: 
1000ms
  内存限制: 
65536kB
描述

目前,高等院校往往采用GPA来评价学生的学术表现。传统的排名方式是求对每一个学生的平均成绩,以平均成绩作为依据进行排名。
但这样的排名方法已经引起了教育界以及社会各界人士的争议,因为它存在着许多弊端。对于不同的课程,选课学生的平均成绩会不同程度地受到课程的难易程度和老师的严厉程度的制约。因而这样的排名系统无形中就鼓励了学生选择一些比较容易的课程,因为这样可以事半功倍地获得较高的平均分。
为了克服这些弊端,需要对排名系统做一定的改进。
一种改进的方案是对选第i门课的每一个学生的成绩加上一个特定的修正值di,例如编号为j的学生该课的成绩Gij修改为G'ij=Gij+di。最终使得经过调整后,该课调整后的平均分等于未调整前选该课的所有学生所有课的平均分。你的任务是根据某一个班级学生某学期的成绩,计算每门课的修正值di。
输入学生人数m(1 <= m <= 20)、课程数目n(1 <= n <= 10)、课程名称以及各个学生各门课的成绩。对于第i门课程,输出修正值di。

输入
1. 第一行输入两个整数,用空格分隔,分别为学生人数m和课程数目n。
2. 第二行输入n门课程名称,用空格分隔。每门课程的名称均不超过15个字符,均为小写。
3. 第三行开始输入m * n的矩阵。表示各个学生各门课成绩x(0 < x <= 100),以空格分隔。若学生未选此课,则该位输出0.
输出
输出为n行,每行格式为“math 5”。首先输出课程名称,空格后输出修正值di。di为整数(计算过程中小数部分均舍去,不考虑),若di为正输出‘’,否则输出‘-’
样例输入
8 5 
math physics algebra english chemistry 
98 78 0 76 86 
0 79 99 89 68 
0 0 79 96 78 
58 97 79 90 47 
90 0 84 99 77 
94 54 76 85 0 
69 60 0 85 95 
79 85 86 96 68
样例输出
math -1 
physics 4 
algebra -2 
english -8 
chemistry 7

 
(以前做过的,运行结果正确,提交一直出错,现在终于发现问题所在了。
在动态申请二维数组时如 int**a= (int**)malloc(sizeof(int*)*n) )中sizeof(int*)都简写成sizeof(int )了,在此提醒各位网友编程时一定要规范,避免不必要的错误,另外建议编程练习尽量用类似OpenJudge的这种系统,可以发现很多表面正确的错误,它有强大的测试数据,比较老师检查等强多了,可以锻炼思维的严谨性。)
源码(OpenJudge通过)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct Course
{
int di;
char name[15];
};

int main()
{
int m,n,i,j,k;
while(scanf("%d%d",&m,&n)!=EOF)
{
struct Course *course=(struct Course*)malloc(sizeof(struct Course)*n);
for(i=0;i<n;i++)
scanf("%s",course[i].name);

int **grade1=(int **)malloc(sizeof(int*)*m);
for(i=0;i<m;i++)
{
grade1[i]=(int *)malloc(sizeof(int)*n);
for(j=0;j<n;j++)
scanf("%d",&grade1[i][j]);
}

int sum,count,avg,ns;
for(i=0;i<n;i++) //n门课程
{
sum=0;
count=0; //选这门课程的所有学生的所有课程数
avg=0;
ns=0; //选这门课程的学生数
for(j=0;j<m;j++) //m个学生
{
if(grade1[j][i]!=0)
{
avg += grade1[j][i];
ns++;
for(k=0;k<n;k++) // n 门课程成绩
{
if(grade1[j][k]!=0)
{
sum+=grade1[j][k];
count++;
}
}
}
}
course[i].di= (int)( sum/ count -   avg/ ns );
printf("%s %d\n",course[i].name,course[i].di);
}
}
return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值