第3章 编程问题 3.2节 1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/young2415/article/details/72059735

题目描述:
数值分数有时是按照所谓的“学积分曲线”的评分模式来转换成字母表示的学分绩的。在这种模式下,将根据下表将一个字母成绩赋给一个数值分数。

x=数值分数 字母成绩 x=数值分数 字母成绩
x < m- 32 σ E m+ 12 σ x < m+ 12 σ B
m- 32 σ x < m- 12 σ D m+ 32 σ x A
m- 12 σ x < m+ 12 σ C

这里m是平均值,σ是标准方差:对于n个数 x1,x2,,xn 来说,他们的定义如下(这里 ni=1 表示i从1变化到n的累加和):

m= 1n ni=1 xi

σ= 1nni=1(xm)2

编写一个程序,读取表示数值分数的一个实数列表,调用函数计算它们的平均值和标准方差,接着调用一个函数得出并显示和每个数值分数相对应的字母成绩。

C++实现:

#include <iostream>
using namespace std;

double averageOf(const double *array, int length);
double standardDeviation(const double *array, int length);
double standardDeviation(const double *array, int length, double average);
void scoreTransfer(const double *score_array, int length);

void main() {
    const int CAPACITY = 4;
    double score_array[CAPACITY] = { 45.6, 67.8, 90.5, 87.2 };
    scoreTransfer(score_array, 4);
    system("pause");
}
/*-------------------------------------
接收一个表示数值分数的double型数组,显示和
每个数值相对应的字母成绩。

参数:
const double *score_array:一个表示数值分数的double型数组
int length:表示要处理前length个分数,当length等于数组的长度(即数组中元素的个数)时,全部处理
-------------------------------------*/
void scoreTransfer(const double *score_array, int length) {//在参数前面加const防止对数组中的元素进行修改
    if (score_array == NULL || length == 0) {
        return;
    }
    int index = 0;
    double m = averageOf(score_array, length);//平均值
    double std_Dev = standardDeviation(score_array, length, m);//标准方差

    while (index < length) {
        char score_text = 0;//字母形式的成绩
        double score_num = score_array[index];//数字形式的成绩
        if (score_num < m - 3 * std_Dev / 2) {
            score_text = 'E';//书上写的是F,但是个人觉得应该是E吧,毕竟前面是ABCD,总不能一下子从D跳到F吧
        }
        else if (score_num < m - std_Dev / 2) {
            score_text = 'D';
        }
        else if (score_num < m + std_Dev / 2) {
            score_text = 'C';
        }
        else if (score_num < m + 3 * std_Dev / 2) {
            score_text = 'B';
        }
        else if (score_num >= m + 3 * std_Dev / 2) {
            score_text = 'A';
        }
        cout << score_num << "\t" << score_text << endl;
        index++;
    }
}

/*---------------------------------------
求一个元素为double型值的数组中前length个元素
的平均值,当length等于数组中元素的个数时,这
个函数求的是数组中所有元素的平均值。

参数:
double *array:数组的首地址(或数组名)
int length:要求平均值的元素的个数

返回值:
数组中前length个元素的平均值
---------------------------------------*/
double averageOf(const double *array, int length) {
    if (array == NULL || length == 0) {
        return 0;
    }
    double ave = 0;
    int k = length;
    while (k > 0) {
        ave += array[k-1];
        k--;
    }
    ave /= length;
    return ave;
}

/*---------------------------------------
求一个元素为double型值的数组中前length个元素
的标准方差,当length等于数组中元素的个数时,这
个函数求的是数组中所有元素的标准方差。

参数:
double *array:数组的首地址(或数组名)
int length:要求标准方差的元素的个数

返回值:
数组中前length个元素的标准方差
---------------------------------------*/
double standardDeviation(const double *array, int length) {
    if (array == NULL || length == 0) {
        return 0;
    }
    double std_Dev;
    double ave;
    double sum = 0;
    int k = 0;

    /*先求平均值,调用averageOf函数*/
    ave = averageOf(array, length);

    /*算出每一项和平均值的差的平方的累加和*/
    while (k<length) {
        double a = (array[k] - ave) * (array[k] - ave);
        sum += a;
        k++;
    }

    /*把累加和除以length,然后开平方根*/
    std_Dev = sqrt(sum / length);
    return std_Dev;
}

/*---------------------------------------
求一个元素为double型值的数组中前length个元素
的标准方差,当length等于数组中元素的个数时,这
个函数求的是数组中所有元素的标准方差。

参数:
double *array:数组的首地址(或数组名)
int length:要求标准方差的元素的个数
double average:给定样本的平均值

返回值:
数组中前length个元素的标准方差
---------------------------------------*/
double standardDeviation(const double *array, int length, double average) {
    if (array == NULL || length == 0 || average==0.0) {
        return 0;
    }
    double std_Dev; //标准差
    double sum = 0;
    int k = 0;

    /*算出每一项和平均值的差的平方的累加和*/
    while (k < length) {
        double a = (array[k] - average) * (array[k] - average);
        sum += a;
        k++;
    }

    /*把累加和除以length,然后开平方根*/
    std_Dev = sqrt(sum / length);
    return std_Dev;
}

猜你喜欢

转载自blog.csdn.net/young2415/article/details/72059735