【上机考试 第三题 模板类】

文章描述了一个名为Grader的模板类,用于处理不同类型的分数数据,包括int、double和char类型。类包含构造函数、排序输出和计算平均分等功能。当分数个数小于3,平均分直接计算;否则,去掉最高和最低分后计算。示例展示了如何使用该模板类处理int、double和char类型的分数数据,并输出排序后的分数列表和平均分。
摘要由CSDN通过智能技术生成

题目描述

请设计一个模板类(Grader)实现统计打分功能,针对输入的各种分数数据,实现计算平均分的打分和所有分数按序输出功能,模板类形式如下:

class Grader{
    T *ScoreArr;
    int len;
public:
    Grader(T a[], int count);	//构造函数
    void sortAndShow();		//排序输出函数
T avgScore();			//计算平均分函数
.......
}
Main函数内流程大致如下(以int类型为例):
main(){
int score[MaxSize], count;		//分数存放于数组,分数个数记录为count
......//输入分数数据
Grader<int> g1( score, count);	// 构造
g1.sortAndShow();			//排序输出分数
cout<< g1.avgScore<<endl;	//输出平均分
}

实现的核心函数包括构造函数,排序输出函数(所有分数从小到大排序输出),和计算平均得分函数,计算平均得分有如下规则:

当分数的个数低于3个时,直接计算平均值作为最终平均分;

当分数个数大于等于3个时,去掉一个最高分,并去掉一个最低分,剩下的分数计算平均值作为最终平均分。

补充说明:

1、类内可以自行增加其他成员函数,但核心功能需要用上述三个成员函数进行。

2、测试数据中的分数类型,包括int、double和char类型(其中char类型的分数为’A’,’B’,’C’这样的大写评分,最终输出的平均分也应为char类型)。

3、测试数据的分数个数最大不超过20,即上述代码中MaxSize=20。

4、特殊情况下,可用typeid(T).name()方法获取类型名称,如通过typeid(T).name()==typeid(int).name()判断是否为int型。 注:必须用类模板实现,否则计0分。

输入

共六行,每两行为一种类型的测试数据,第一行为测试数据分数的个数,第二行为测试数据的分数列表。三种类型的测试数据顺序依次为int类型、double类型和char类型。

输出

针对输入的测试数据,按类型顺序,分别输出其排序后的分数列表和最终平均分。

样例输入

2
90 95
5
98.1 97.7 99.3 92.8 90.44
4
B A C B

样例输出

90 95
92
90.44 92.8 97.7 98.1 99.3
96.2
A B B C
B
#include <iostream>
#include <algorithm>
using namespace std;

template <typename T>
class Grader {
private:
    T* ScoreArr;  // 分数数组
    int len;      // 分数数组长度
public:
    Grader(T a[], int count);           // 构造函数
    void sortAndShow();                // 排序输出函数
    T avgScore();                       // 计算平均分函数
};

// 构造函数
template <typename T>
Grader<T>::Grader(T a[], int count) {
    len = count;
    ScoreArr = new T[len];
    for (int i = 0; i < len; i++) {
        ScoreArr[i] = a[i];
    }
}

// 排序输出函数
template <typename T>
void Grader<T>::sortAndShow() {
    sort(ScoreArr, ScoreArr + len);      // STl库的sort算法
    for (int i = 0; i < len; i++) {
        cout << ScoreArr[i] << ' ';
    }
    cout << endl;
}

// 计算平均分函数
template <typename T>
T Grader<T>::avgScore() {
    T sum = 0;
    for (int i = 0; i < len; i++) {
        sum += ScoreArr[i];
    }
    if (len < 3) {
        return sum / len;
    }
    else {
        sort(ScoreArr, ScoreArr + len);      // STl库的sort算法
        T sum2 = sum - ScoreArr[0] - ScoreArr[len - 1];
        return sum2 / (len - 2);
    }
}

int main() {
    int n1, n2, a1[20];
    double a2[20], avg1, avg2;
    char a3[20];
    cin >> n1;
    for (int i = 0; i < n1; i++) {
        cin >> a1[i];
    }
    Grader<int> g1(a1, n1);             // 构造int类型Grader实例
    g1.sortAndShow();                   // 排序输出分数
    avg1 = g1.avgScore();               // 求取int类型分数的平均值
    cout << avg1 << endl;               // 输出平均分

    cin >> n2;
    for (int i = 0; i < n2; i++) {
        cin >> a2[i];
    }
    Grader<double> g2(a2, n2);          // 构造double类型Grader实例
    g2.sortAndShow();                   // 排序输出分数
    avg2 = g2.avgScore();               // 求取double类型分数的平均值
    cout << avg2 << endl;               // 输出平均分

    cin >> n2;
    for (int i = 0; i < n2; i++) {
        cin >> a3[i];
    }
    Grader<char> g3(a3, n2);            // 构造char类型Grader实例
    g3.sortAndShow();                   // 排序输出分数
    int avg3 = 0;                       // 初始化字符的平均值为0
    for (int i = 0; i < n2; i++) {      // 将字符映射为数字后求和
        avg3 += (int)a3[i];
    }
    avg3 /= n2;                         // 计算字符的平均值
    cout << char(avg3) << endl;               // 输出平均分

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纳皮尔的骨头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值