Problem J: 学生成绩统计表

Problem J: 学生成绩统计表

Time Limit: 1 Sec   Memory Limit: 16 MB
Submit: 902   Solved: 416
[ Submit][ Status][ Web Board]

Description

在学校里经常见到的成绩表,表的每行是一个学生的成绩,每列是各个科目的成绩。如下表所示。

你的任务是:输入这样的成绩表,统计出每个学生的总成绩和各个科目的平均成绩。如下表所示。

Input

第一行为两个整数m,n,0<m<=50、0<n<=10,表示有m个学生和n个成绩。

后面有m+1行n+1列的一个表,表的第1行和第1列都是不含空白符的字符串,表的各列用若干空格分隔,表的各行用一个回车分隔。第1行的2~n+1列是各个科目的名字。第2~m+1行1列为学生姓名。第2行2列开始到第m+1行、n+1列为各学生的各科目成绩(浮点数)。

Output

输出为一张表,表的大小为m+2行、n+2列,其中前m+1行n+1列的数据与输入相同。

表的最右侧一列为学生各科目成绩的总和,该列第1行的标题是“sum”。

表的最下面一行为各科目的所有学生平均成绩,该行的第1列标题是“average”。

表的第1列输出为8个字符左对齐,后面每列为5个字符右对齐,两列之间有2个空格。表的所有数据项(除第1行和第1列外)都输出为保留1位小数。表的每行用一个回车分隔,表的最右边一列的数据项后没有空格。

请注意:表的最右下角那项没有定义,不输出!最后1行的输出至最右一个科目的平均分结束,该行最后有回车。

Sample Input

10 6name SCI TECH COM CS106 SE309 CS101Tom 88 77 66 55 44 33Jerry 50 100 60 100 50 100Zhang3 90 95.5 60 75 82 18Li4 38 45 62 29 74 85Wang5 88 75 63 36 99 33.3Zhao6 99 99 99.5 97.5 42 100Liu7 80 80 80.5 81.5 82.5 83Wang8 7 6 5 4 3 2Song9 10 20 30 40 50 60Ma10 74 79.5 73 71 70 77

Sample Output

name SCI TECH COM CS106 SE309 CS101 sumTom 88.0 77.0 66.0 55.0 44.0 33.0 363.0Jerry 50.0 100.0 60.0 100.0 50.0 100.0 460.0Zhang3 90.0 95.5 60.0 75.0 82.0 18.0 420.5Li4 38.0 45.0 62.0 29.0 74.0 85.0 333.0Wang5 88.0 75.0 63.0 36.0 99.0 33.3 394.3Zhao6 99.0 99.0 99.5 97.5 42.0 100.0 537.0Liu7 80.0 80.0 80.5 81.5 82.5 83.0 487.5Wang8 7.0 6.0 5.0 4.0 3.0 2.0 27.0Song9 10.0 20.0 30.0 40.0 50.0 60.0 210.0Ma10 74.0 79.5 73.0 71.0 70.0 77.0 444.5average 62.4 67.7 59.9 58.9 59.6 59.1

[这道题目的坑爹之处很多,首先输入可能是不规则的,即两列之间的空格不一定是几个,所以不能直接输入输出,第二个是第一行的输出,尤其是name的输出需要注意,其他的部分要做好细节处理,比如每行的name,用二维数组时候要注意是double类型,同时注意输出格式第一列和其他列是不一样的。好了,上代码:]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int rr,cc;
    char top[1000],temp[100];
    int i,k;
    char name[20];
    double a[100][100],sum = 0;
    scanf("%d%d",&rr,&cc);
    getchar();
    //printf("r = %d,c = %d\n",rr,cc);

    for(i = 0; i <= cc; i++)
    {
        memset(temp,0,sizeof(temp));
        scanf("%s",temp);
        if(i != 0)
            printf("%5s  ",temp);
        else
            printf("name      ");

    }
    printf("  sum\n");
    //printf("r = %d,c = %d\n",rr,cc);
    for(k = 0; k < rr; k++)
    {
        //------------------------------- save name
        memset(name,0,sizeof(name));
        scanf("%s",name);
        //------------------------------- save && plus the grade
        sum = 0;
        for(i = 0; i < cc; i++)
        {
            scanf("%lf",&a[k][i]);
            sum += a[k][i];
        }
        //------------------------------- out name
        printf("%-8s  ",name);//-8 !

        //------------------------------- out the grade
        for(i = 0; i < cc; i++)
            printf("%5.1lf  ",a[k][i]);// +5!
        printf("%5.1lf\n",sum);
    }
    printf("average   ");
    for(i = 0; i < cc-1; i++)
    {
        sum = 0;
        for(k = 0; k < rr; k++)
            sum += a[k][i];
        printf("%5.1lf  ",(double)sum/rr);
    }
    sum = 0;
    for(k = 0; k < rr; k++)
        sum += a[k][cc-1];
    printf("%5.1lf\n",(double)sum/rr);

    return 0;
}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值