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;
}


### 回答1: 题目描述: 定义一个结构体,包含学生的姓名和成绩,输入多个学生的信息,按照成绩从高到低排序输出。 输入格式: 第一行输入一个整数n,表示学生的数量。 接下来n行,每行输入一个字符串和一个整数,表示学生的姓名和成绩。 输出格式: 按照成绩从高到低排序输出每个学生的姓名和成绩,每个学生的姓名和成绩之间用一个空格隔开。 如果有多个学生成绩相同,则按照姓名的字典序从小到大排序。 样例输入: 5 Tom 80 Jerry 90 Bob 80 Alice 85 John 90 样例输出: Jerry 90 John 90 Alice 85 Bob 80 Tom 80 解题思路: 本题需要用到结构体和排序,首先定义一个结构体,包含学生的姓名和成绩,然后输入多个学生的信息,将其存储在结构体数组中,最后按照成绩从高到低排序输出。 排序时需要自定义比较函数,先按照成绩从高到低排序,如果成绩相同,则按照姓名的字典序从小到大排序。 代码实现: ### 回答2: 这道题目要求我们按照学生的成绩从高到低排序,我们可以使用结构体来存储每个学生的信息,包括姓名、学号和成绩。然后我们使用冒泡排序算法来排序,要求按照成绩从高到低排列。 首先,我们需要定义一个结构体来存储学生的信息。假设我们需要存储的三个属性为name, id, score,那么我们可以这样定义结构体: ``` struct Student { char name[20]; char id[20]; int score; }; ``` 然后我们就可以定义一个数组用来存储多个学生的信息: ``` Student students[100]; ``` 接下来,我们需要读入每个学生的信息,存储到这个数组中。假设我们需要读入n个学生的信息,那么我们可以使用循环来读入每个学生的信息: ``` for (int i = 0; i < n; i++) { scanf("%s %s %d", students[i].name, students[i].id, &students[i].score); } ``` 接下来,我们使用冒泡排序算法来排序。对于每一次冒泡,我们将会通过比较相邻的两个元素,如果顺序不对就交换它们的位置。我们需要多次执行这个操作,直到所有元素都按照从大到小的顺序排序完毕。 ``` for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (students[j].score < students[j + 1].score) { Student temp = students[j]; students[j] = students[j + 1]; students[j + 1] = temp; } } } ``` 在最后,我们需要输出排序后的结果。假设我们想要输出每个学生的信息,那么我们可以使用循环来输出: ``` for (int i = 0; i < n; i++) { printf("%s %s %d\n", students[i].name, students[i].id, students[i].score); } ``` 这样就完成了问题d:结构体按成绩排序的实现。 ### 回答3: 这道题的主要任务是将一个包含学生信息的结构体按照成绩从高到低进行排序。我们可以使用冒泡排序或快速排序等算法来实现。 首先我们需要定义一个结构体,包含学生姓名、学号和成绩。 ```c++ struct Student{ string name; string num; int score; }; ``` 接下来,我们定义一个函数,该函数接收一个指向结构体数组的指针,还需要一个整数类型的形参来表示数组的长度,函数的返回值为 void。该函数会根据成绩从高到低排序结构体数组。 ```c++ void sortStudents(Student* arr, int len){ for(int i = 0; i < len - 1; i++){ for(int j = i+1; j < len; j++){ if(arr[i].score < arr[j].score){ Student temp; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } ``` 接下来,我们先在主函数中定义一个结构体数组并填充数据。 ```c++ int main(){ Student s[5] = { {"Tom", "001", 85}, {"Lily", "002", 90}, {"Bob", "003", 76}, {"Lucy", "004", 92}, {"John", "005", 88} }; // 调用函数进行排序 sortStudents(s, 5); // 输出排序结果 for(int i = 0; i < 5; i++){ cout << s[i].name << " " << s[i].num << " " << s[i].score << endl; } return 0; } ``` 运行程序后,我们可以看到按照成绩从高到低排序的结果输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值