题目描述:
数值分数有时是按照所谓的“学积分曲线”的评分模式来转换成字母表示的学分绩的。在这种模式下,将根据下表将一个字母成绩赋给一个数值分数。
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
σ= 1n∑ni=1(x−m)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;
}