对象成员没有在C ++中接收值

时间:2016-04-11 14:28:34

标签: c++ member

#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; }
    }
};

所以这是我的代码,基本上我所要做的就是得到均值,中位数和模式,以及它的出现次数。它根本不容易构建,但如果你运行它,median2occurrneces就不会收到这些值。这是为什么?

2 个答案:

答案 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;

但更好的解决方案是重构代码,使其不依赖于副作用的排序。