【发布时间】: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