【问题标题】:Creating a histogram to display how many items are in each category/bin with stars创建直方图以显示每个类别/箱中有多少项目,并带有星号
【发布时间】:2020-02-18 22:54:59
【问题描述】:

使用以下测试值,我需要我的程序输出这个直方图。

值:30、40、45、102、35、42、65、89、55、48、56、46、42、54、56、51、47、50、51、50、50、47、52 , 53, 47, 44, 69, 35, 40, 45, 35, 42, 65, 55, 48, 100, 56, 46, 42, 54, 56, 51, 47, 50, 51, 50, 50, 47 , 52, 53, 47, 78, 80, 95

Histogram: 
 9| ***
 8| **
 7| *
 6| ***
 5| **********************
 4| *******************
 3| ****
 2|
 1|
 0|
SD: 15.2579

该程序还需要找到输入值的标准差以及平均值。说明要求程序中有四个不同的功能: 主要、均值、偏差和直方图。 只能使用 iomanip 和 iostream 以及诸如 的头文件,并且不允许使用全局变量。

以下是完整的作业说明:

仅使用 iostream 和 iomanip 函数进行 I/O 和格式化(无标准输入输出) - 但可以使用其他头文件,例如 您的程序将具有四个功能: 主要的 意思是 偏差 直方图

主要

定义一个变量来保持输入分数的数量并将其初始化为0

定义scores数组(scores数组不需要初始化)

最多允许(不是总分)100 分

从控制台一次读取一个整数列表,并将每个整数放入分数数组中

输入的分数都不会是

读取并存储在分数数组中的每个分数的增量计数

当用户输入 -1 时停止数据输入并开始计算(不要在数据中包含 -1)

调用直方图函数(传递任何需要的参数)

打印直方图(直方图函数填充并返回bins数组但必须在main中打印直方图

调用偏差函数,返回标准偏差 打印标准差(如果需要,步骤 j 和 k 可以合并为一个语句)

意思

传入任何需要的参数

返回一个双精度值,即分数的平均值或平均值

偏差

传入你需要的任何参数

返回一个双精度值,即分数的标准差

直方图(直方图函数填充并返回 bins 数组 - 它不打印直方图)

计算直方图(即填充但不打印 bins 数组)

从函数返回一个数组是一个特殊的问题。文本介绍了问题和三种可能的解决方案。

bins 数组中的每个元素实际上都是一个累加器,因此必须初始化为 0。

将直方图中的分数分组如下:

Bin 9: score ≥ 90
Bin 8: score ≥ 80 but < 90
Bin 7: score ≥ 70 but < 80
    .
    .
    .
Bin 1: score ≥ 10 but < 20
Bin 0: score < 10

请注意,输入中的某些分数包括额外分数(即 > 100);你的程序必须能达到 109 分。

这是我目前的代码

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

double mean(double array[], int count);
double SD(double array[], int count);
void histogram(double array[], int count, int* bin);

int main()
{
int count = 0;
double array[100];

for (int i = 0; i < 100; i++)
{
    array[i] = 100;
}

int bin[10]{};
for (int b = 0; b < 10; b++)
{
    bin[b] = 0;
}

while (true)
{
    double score;
    cout << "Please enter scores (-1 to end): ";
    cin >> score;
    if (score != -1)
        array[count++] = score;
    else
        break;
}

cout << "Mean = " << mean(array, count) << endl;
cout << "SD = " << SD(array, count) << endl;
cout << "Count = " << count << endl;
cout << bin;

}

double mean(double array[], int count)
{
double sum = 0;

for (int i = 0; i < count; i++)
    sum += array[i];

double mean = sum / count;
return mean;
}   

double SD(double array[], int count)
{
double SD = 0;
for (int i = 0; i < count; ++i)
    SD += pow(array[i] - mean(array, count), 2);
return sqrt(SD / count);
}

void histogram(double array[], int count, int* bin)
{
for (int i = 0; i < count; i++)
{
    int Bin = array[i] / 10;
    if (Bin > 9)
        Bin = 9;
    bin[Bin]++;
}

}

我认为我已经很好地设置了均值和标准差函数,但我可以对其他两个函数(直方图和主函数)使用一些指导。我现在的问题是,我应该如何将数组中的值分配给 bin 类别?谢谢!

【问题讨论】:

  • 如果你使用std::map,直方图的代码是2-3行(不夸张)。你的问题有点含糊。试着问一个更具体的问题。也许这可以帮助:meta.stackoverflow.com/questions/284236/…
  • 我会调查的。我也会编辑我的问题,谢谢!
  • 不运行看起来没问题。如果您在进行代码审查后,他们是一个专门用于此的网站:codereview.stackexchange.com
  • 我注意到的一件事是:the histogram function fills and returns the bins array - it **does NOT** print the histogram 您的代码确实会打印结果。应该可能会移动它。
  • 数组未初始化。 double array[100]; int bin[10];。如果没有初始化,这些值是不确定的,读取它们是无效的(因此增加 this 无效,因为增量需要读取)。 array 没什么大不了的,但 bin 这是个问题。

标签: c++ arrays loops histogram


【解决方案1】:

代码接近所需,但还没有。

初始化bin,一个简单的

int bin[10] {};

够了。请注意,发布的代码将数组的每个元素都初始化为 10,这可能是一个错字。

由于类型不匹配,您还必须更改 histogram 的原型和定义:

void histogram(double array[], int count, int* bin) {
//             ^^^^^^

我不会编写实际打印直方图的代码,但是,鉴于限制,您可能需要查看std::setwstd::setfill

【讨论】:

  • 我继续进行了您建议的那些编辑,现在它们对我来说更有意义了。我还检查了 std::setw 和 std::setfill,它们看起来正是我所需要的。我很好奇如何在我的代码中实现这些,看到 setw() 值将取决于用户输入的内容。
  • @Cbiscuit 我没注意到,但您只需仔细查看链接页面中的示例即可。
猜你喜欢
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 2014-03-21
  • 2021-10-27
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多