
代號:
頁次:
-
四、請完成計算中位數與眾數兩個方法(I)~(V)空格程式,使程式正常運作,
以輸出 Mean=1, Mode=5。其中,中位數是將一組數值資料由小到大排列
後,取最中間的數值為中位數。若資料個數為奇數,則取最中間的數值
為中位數,例如 1, 2, 3, 3, 4, 6, 7, 7, 9 的中位數是 4;若資料個數為偶數,
則取最中間兩個數值的平均為中位數,例如 1, 2, 3, 3, 4, 6, 7, 7, 8, 9 的
中位數是(4+6)/2=5。眾數,則是指一組數字中出現次數最頻繁的數字。
例如,2、3、3、5、7、10 的眾數是 3。最後請說明此程式是否有不安全
的地方,以及其原因。(25 分)
#include <iostream>
#include <algorithm>
using namespace std;
class Compute {
public:
void setData(int *, int);
double getMedian();
double getMode();
private:
int *data, d_size;
// 取得 key 在map 的 中的索引
int getIndex(int d[2][20], int key, int c) {
for (int i=0; i<c; i++)
if (key==d[0][i]) return i;
return -1;
}
//取得最大頻率值的 key
int getMaxValue(int d[2][20], int c) {
int maxKey = d[0][0];
int maxValue = d[1][0];
for (int i=1; i<c; i++)
if (maxValue<d[1][i]) {
maxKey = d[0][i];
maxValue = d[1][i];
}
return maxKey;
}
};
//設定資料並完成排序
void Compute::setData(int *d, int s) {
data = d;
d_size = s;
sort(data, data+d_size);
// 求中位數,若數量為奇數,回傳中間值,否則
回傳中間平均值
double Compute::getMedian() {
if (d_size%2== (I) ) // (I)
return data[ (II) ]; // (II)
else
return (data[(d_size/2)-1]+ (III) )/2.0; //(III)
}
//求眾數,統計數列各值出現頻率,找最大
double Compute::getMode() {
//d_map[0]紀錄 Key, d_map[1]紀錄頻率值
int d_map[2][20]={0};
//d_map 數量
int map_count=0;
for (int i=0; i<d_size; i++) {
int index =
getIndex(d_map, data[i], map_count);
if (index== (IV) ) { // (IV)
d_map[0][map_count]=data[i];
d_map[1][map_count++]=1;
}
else
d_map[1][ ( V )]=d_map[1][index]+1; //(V)
}
return getMaxValue(d_map,map_count);
}
int main() {
int data[10] ={5, 3, -4, 3, -1, 5, -1, -3, 5, -2};
Compute p;
p.setData(data, 10);
cout<<"Mean="<<p.getMedian()<<", ";
cout<<"Mode="<<p.getMode()<<endl;
}