到目前为止,我已经完成了大部分功能。我现在陷入了最后一步。我需要从我的主要部分到我的“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语句过去了。这就是我不确定该做什么的地方。
答案 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
}