C ++将数组值插入另一个数组,但将相似的值组合到相同的元素中

时间:2018-02-21 06:07:16

标签: c++ arrays counter

到目前为止,我已经完成了大部分功能。我现在陷入了最后一步。我需要从我的主要部分到我的“histo”函数接收一个数组。我需要在一定范围内取重复值,并将它们分别放在同一个数组元素中并计算它们。完成后,我打印出一个带星号的直方图。范围是------ bin 0.如果得分< 10 .---- bin 1.如果得分> = 10但是< 20 ......等。然后输出; 9 | ** 8 | * 7 | ***等等,直到0.星号需要类似于指定范围内的数字量并存储在数组元素中。我被困在这一部分,我们不能使用向量,或除了之外的任何#includes,并使用命名空间std;任何建议都很棒。我主要是为了确保我的数学是正确的。

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

/*int histo(int x);*/
double dev(int count, int* scores, double mn);
double mean(int count, int* stats);

int main()
{
    int scores[101];
    int count = 0;
    int bin[10];
    double mn;

    cout << "Enter a score (-1 to stop): ";

    do
    {
        cin >> scores[count++];
    } while (scores[count - 1] != -1);
    count--;
    mn = mean(count, scores);
    cout << "mean: " << mean(count, scores) << endl;
    cout << "dev: " << dev(count, scores, mn) << endl;
    system("pause");
    return 0;
}

int histo(int* scores)
{
    int bins[10]{};
    int counter = 0;

    for (int i = 0; i < *scores; i++)
    {
        if (*scores < 10)
        {
            bins[counter++];
        }
        else if (*scores >= 10 && *scores < 20)
        {
            bins[counter++];
        }
        else if (*scores >= 20 && *scores < 30)
        {
            bins[counter++];
        }
        else if (*scores >= 30 && *scores < 40)
        {
            bins[counter++];
        }
        else if (*scores >= 40 && *scores < 50)
        {
            bins[counter++];
        }
        else if (*scores >= 50 && *scores < 60)
        {
            bins[counter++];
        }
        else if (*scores >= 60 && *scores < 70)
        {
            bins[counter++];
        }
        else if (*scores >= 80 && *scores < 90)
        {
            bins[counter++];
        }
        else if (*scores >= 90)
        {
            bins[counter++];
        }
        for (int j = 0; j < )
    }
}

double dev(int count, int* scores, double mn)
{
    double x = 0;
    double y = 0;
    double d = 0;

    for (int i = 0; i < count; i++)
    {
        x = pow(scores[i] - mn, 2);
        y += x;
    }
    d = sqrt(y / count);
    return d;
}
double mean(int count, int* scores)
{
    double total = 0;

    for (int i = 0; i < count; i++)
    {
        total += scores[i];
    }

    return total / count;
}

我知道我用if语句过去了。这就是我不确定该做什么的地方。

2 个答案:

答案 0 :(得分:0)

我相信你的组织功能要比它需要的复杂得多。

void histo(int* scores)
{
    int bins[10] = {0};

    for (int i = 0; scores[i] != -1 ; i++)
    {
        int index = scores[i]/10;
        bins[index]++;
    }

    for(int i = 0; i < 10; i++){
        cout << i + 1;
        for(int j = 0; j < bins[i]; j++){
            cout << "*";
        }
        cout << endl;
    }
}

答案 1 :(得分:0)

 for (int i = 0; i < *scores; i++)

好的,所以得分是指向数组的指针。通过取消引用它,您将获得该数组的第一个元素的值,但不是它的计数/大小。

 if (*scores < 10)
 {
    bins[counter++];
 }
 else if (*scores >= 10 && *scores < 20)
 {
    bins[counter++];
 }

bins [counter ++]将很快通过此设置超出界限,因为你的得分数组是&gt; 10(不考虑未定义的行为)。 else语句也暗示*得分> = =前一个语句。

因此,对此的解决方案将是这样的,假设您希望每次都增加索引n上的bin:

int histo(int *scores, int scoreCount)
{
    int bins[9]{};

    for (int i = 0; i < scoreCount; i++)
    {
        if (scores[i] < 10)
        {
            bins[0]++;
        }
        else if (scores[i] < 20)
        {
            bins[1]++;
        }
        else if (scores[i] < 30)
        {
            bins[2]++;
        }
        else if (scores[i] < 40)
        {
            bins[3]++;
        }
        else if (scores[i] < 50)
        {
            bins[4]++;
        }
        else if (scores[i] < 60)
        {
            bins[5]++;
        }
        else if (scores[i] < 70)
        {
            bins[6]++;
        }
        else if (scores[i] < 90)
        {
            bins[7]++;
        }
        else
        {
            bins[8]++;
        }
    }

    // Do stuff with your bins
}