第3章 编程问题 3.2节 1

来源:互联网 发布:linux退出 编辑:程序博客网 时间:2024/05/19 00:37

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

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=1nni=1xi

σ=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;}
2 0
原创粉丝点击