#include <algorithm>
#include <ctime>
#include <iostream>
#include <string>
using namespace std;
class stats
{
int arr_size, median1, median2, occurrences;
string data;
int* arr;
void setValues()
{
srand(time(NULL));
for (int i = 0; i < arr_size; i++) { arr[i] = rand() % 99 + 1; }
sortArray();
}
void sortArray()
{
int min_index;
for (int i = 0; i < arr_size - 1; i++)
{
min_index = i;
for (int j = i + 1; j < arr_size; j++) { if (arr[j] < arr[i]) { min_index = j; } }
swap(this->arr[i], this->arr[min_index]);
}
}
void swap(int& x, int& y)
{
int temp;
temp = x;
x = y;
y = temp;
}
double getMean()
{
double total = 0;
for (int i = 0; i < arr_size; i++) { total += arr[i]; }
return total / arr_size;
}
int getMedian()
{
if (arr_size % 2 == 0) { median1 = arr[(arr_size / 2) - 1]; this->median2 = arr[arr_size / 2]; }
else { median1 = arr[arr_size / 2]; }
return median1;
}
int getMode()
{
int count = 1, max_count = 1, mode;
mode = arr[0];
for (int i = 0; i < arr_size; i++)
{
if (arr[i - 1] == arr[i]) { count += 1; mode = arr[i]; }
else if (arr[i - 1] != arr[i])
{
if (count > max_count) { max_count = count; mode = arr[i - 1]; }
count = 1;
}
}
this->occurrences = max_count;
return mode;
}
public:
stats(string str = "", int size = 1) : data{ str }, arr_size{ size } { arr = new int[size]; setValues(); }
~stats() { delete arr; arr = nullptr; }
void printValues()
{
cout << this->data << endl << endl;
cout << "Mean: " << getMean() << endl;
this->median1 = getMedian();
if (arr_size % 2 == 0) { cout << "Median 1: " << this->median1 << endl << "Median 2: " << this->median2 << endl; }
else { cout << "Median: " << this->median1 << endl; }
int mode = getMode();
cout << "Mode: " << mode << " with " << this->occurrences << " occurrences." << endl;
// Testing purposes
cout << endl;
for (int i = 0; i < arr_size; i++) { cout << "arr[" << i << "]: " << arr[i] << endl; }
}
};
所以这是我的代码,基本上我所要做的就是得到均值,中位数和模式,以及它的出现次数。它根本不容易构建,但如果你运行它,median2
和occurrneces
就不会收到这些值。这是为什么?
答案 0 :(得分:2)
median2
只有在数组大小均匀时才会得到一个值(为清晰起见重新布局):
if (arr_size % 2 == 0) {
median1 = arr[(arr_size / 2) - 1];
this->median2 = arr[arr_size / 2];
}
else {
median1 = arr[arr_size / 2];
}
return median1;
另外你应该阅读统计数据;为了获得分布的任何中位数,样本需要排序,您似乎并不这样做。
这也是occurrences
未获得正确值的原因(它确实获得了一个值,而不是您期望的值)。
答案 1 :(得分:1)
这是因为未指定参数评估的顺序,但您的代码依赖于它们从左到右进行评估。
// getMode() and this->occurrences may be evaluated in any order...
cout << "Mode: " << getMode() << " with " << this->occurrences << " occurrences." << endl;
您可以将函数的结果存储在变量中:
int median1 = getMedian();
if (arr_size % 2 == 0) { cout << "Median 1: " << median1 << endl << "Median 2: " << this->median2 << endl; }
else { cout << "Median: " << median1 << endl; }
int mode = getMode();
cout << "Mode: " << mode << " with " << this->occurrences << " occurrences." << endl;
但更好的解决方案是重构代码,使其不依赖于副作用的排序。