gpt4 book ai didi

c++ - c++:使用数组,指针和循环来制作直方图。我就在那儿,我可能想得太辛苦了

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:43:17 25 4
gpt4 key购买 nike

这是我到目前为止的内容:

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

int* histogram (int arr[], int size);
double deviation (int arr[], int size);
double mean (int arr[], int size);

int main () {
int scores[100];
int count = 0;
int temp;
double sd;

cout << "***===***===Lab 5 - Stats===***===***\n";
cout << "Welcome to the Historgam Generator and Stardard Deviation Caluclator!" << endl;
cout << "Enter some scores, 0 to 109, limit 100, enter -1 to quit." << endl;

while (count < 109) {//puts limit on array
cout << "Enter value " << count + 1 << ": ";
cin >> temp; //initialize data
if (temp == -1) {
break;//end program
}
else if (temp < 0) {
cout << "An invalid score has been entered." << endl;
break;//end program
}
else {
scores[count] = temp;
count++;//valid number, continue counting when entered corretly
}
}

//help from here
//histogram (scores, count);
int* bin = histogram (scores, count);

for (int i = 0; i < count; i++) {
int displayNo = 0;
//bin[scores[count]]++;
//count is the number of numbers entered.
//scores[] is the array of scores entered by user
//bin[9] is the address of the element in the array

cout << displayNo << "| ";
for (int k = 0; k < scores[i]; k++) {
cout << '*';
}
cout << endl;
}

//to here

sd = deviation (scores, count);
cout << "SD: " << sd << endl;

//hold window open
system ("pause");
return 0;
}

int* histogram (int scores[], int size) {
int* bin = new int[10];
for (int i = 0; i < size; i++) {
if (scores[i] >= 90) {
bin[9]++;
}
else if (scores[i] >= 80 && scores[i] < 90) {
bin[8]++;
}
else if (scores[i] >= 70 && scores[i] < 80) {
bin[7]++;
}
else if (scores[i] >= 60 && scores[i] < 70) {
bin[6]++;
}
else if (scores[i] >= 50 && scores[i] < 60) {
bin[5]++;
}
else if (scores[i] >= 40 && scores[i] < 50) {
bin[4]++;
}
else if (scores[i] >= 30 && scores[i] < 40) {
bin[3]++;
}
else if (scores[i] >= 20 && scores[i] < 30) {
bin[2]++;
}
else if (scores[i] >= 10 && scores[i] < 20) {
bin[1]++;
}
else if (scores[i] >= 0 && scores[i] < 10) {
bin[0]++;
}
}
return bin;
}

//calculates standard deviation
double deviation (int scores[], int size) {
double avg = 0;
double sd = 0;
avg = mean (scores, size);
for (int i = 0; i < size; i++) {
sd += pow ((scores[i] - avg), 2);
}

sd = sqrt (sd / size);
return sd;
}

//calculates the mean/average
double mean (int scores[], int size) {
double sum = 0;
double mean = 0;
for (int i = 0; i < size; i++){
sum += scores[i];
}
mean = sum / size;
return mean;
}

我要做的就是在程序中获取直方图,如下所示:

9 | ***

8 | **

7 | *

6 | ***

5 | **********************

4 | *******************

3 | ****

2 |

1 |

0 |

标清:15.2579

那是如果我输入了这个测试用例中的数字:

案例2: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

我的SD部分已经停下来,但是我没有获得与for循环一起使用的逻辑以使其看起来像这样。上面的零件我可以得到一些帮助吗?

****更新****
这是我的老师给我的指示:

类(class)要求

命名您的程序文件stats.cpp
不要使用任何全局变量
仅将iostream和iomanip函数用于I / O和格式化(不使用stdio)
一次从控制台读取一个整数列表
将每个整数放入数组
最多允许100分(不是总分)(请参阅数组和循环(链接到外部站点。)链接到外部站点。-页面底部的示例)
输入的分数均不会小于0
计算输入的整数个数
当用户输入-1时停止数据输入并开始计算(数据中不要包含-1)
回想一下,我使用测试床来为您的实验室评分,这意味着它将是一个简单的程序,可以为您的程序提供输入-如果您的程序偏离上述要求,测试床将失败。
按以下方式在直方图中对分数进行分组:
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

请注意,这些分数包括一些获得了额外信用的分数;您的程序必须能在最高109的分数下工作。我使用了一个名为bin的整数数组,并将该数组填充到直方图函数中:int bins [10]; bins数组中的每个元素都是一个计数器,用于计数特定范围内的分数。打印直方图类似于打印X的金字塔或绘制松树:使用两个for循环,一个嵌套在另一个循环内。外循环遍历bins数组,内循环在给定的行上打印每个'*'。

每当您将变量用作累加器或计数器时(即,使用如下所示的方法:sum + = ...或count ++),都必须将其初始化为0。自动变量和动态变量都不会自动初始化,因此程序员必须记住将其作为程序的一部分进行。数组只是使用一个名称访问的变量的列表,这意味着当将数组用作一组累加器或计数器时,必须将数组的每个元素初始化为0。请参见图2(指向外部站点的链接) 。)链接到外部站点。

您的程序将具有四个功能(统计功能必须紧随main之后):

在程序顶部为三个统计函数添加函数原型(prototype)
主要
在这里定义你的数组
在此处读取数据
通话直方图
打印直方图(有关所需输出的示例,请参见下面的“测试用例”)
通话偏差
打印标准偏差(如果需要,可以合并步骤v和vi)
直方图(传递所需的任何参数)
计算直方图
以函数返回值(使用“return”关键字)或通过参数列表返回直方图数组。选择“数组和函数”(链接到外部站点)中的三种技术之一。链接到外部站点。
偏差(传递所需的任何参数,返回 double )
通话平均值(即所有分数的平均值)
计算标准差
返回标准偏差
均值(传递所需的任何参数,返回 double )-请参见average.cpp(链接到外部站点。)链接到外部站点。
额外信用
如果您尽早完成分配,则可以尝试以下两个或两个以上的额外信用分配来挑战自己:

(5分)仅使用一个循环即可打印直方图。有关提示,请参阅我为实验3发布的解决方案之一。
(5分)仅使用计算即可完成要求5(制作直方图)
您只能使用一(1)个循环
您的单个循环可能只包含一个语句(不使用逗号运算符作弊)
您不得使用if,switch或条件语句
您不得使用函数调用
您不得将任何逻辑移至打印功能
您可以使用多个循环来打印直方图(除非您要进行额外的功劳1),但不能填充数组
另外,要获得5点额外的积分,请完成上述的要求5,但您可以使用条件声明。

最佳答案

不知道该怎么做,是吗?

void histogram(int scores[], int size, int *bin)
{
for (int i = 0; i < size; i++)
{
int binId = scores[i] / 10;
if (binId > 9) binId = 9;
bin[binId]++;
}
}

// called from main:
int bin[10]; // declared here as global var, so it is well destroyed
histogram(scores, size, bin); // pass bin pointer, avoid returning pointer with assigned memory from within a fonction, this will trap you.

如果垃圾箱始终具有相同的“排序标准”,则x / 10将实际上使该值下降,因此您无需进行所有比较。

为了显示这样的东西?
for (int i = 0; i < 10; i++) 
{
cout << i << "| ";
for (int k = 0; k < bin[i]; k++)
{
cout << '*';
}
cout << endl;
}

如果您迷失了循环,将循环带入循环实际上可能会比较棘手。一些代码具有3-4个级别的循环,成为一场噩梦。重构为子功能将使您的代码更具可读性,更易于调试。
for (int i = 0; i < count; i++) 
{
cout << i << "| ";
print_stars(bin[i])
cout << endl;
}

void print_stars(int amount)
{
for (int k = 0; k < amount; k++)
{
cout << '*';
}
}

关于c++ - c++:使用数组,指针和循环来制作直方图。我就在那儿,我可能想得太辛苦了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44838472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com