仅存储多个用户生成值中的第一个的动态分配数组

Posted

技术标签:

【中文标题】仅存储多个用户生成值中的第一个的动态分配数组【英文标题】:Dynamically-Allocated Array Only Storing First of Multiple User-Generated Values 【发布时间】:2015-01-22 22:20:47 【问题描述】:

这是我第一次在这里发帖。我正在为我的 CS II 课程建立一个实验室(它已经过期了,所以我现在不会得到任何分数,但我仍然很想了解我做错了什么,以便我可以改进。代码远未完成,但我遇到了一个让我无法继续进行的挂断。提前道歉,我对此很生疏,在生疏之前,我很新。另外,我是直到凌晨 4 点左右才试图让它在昨晚工作,所以我的代码现在可能看起来很粗糙。

好的,所以我的问题是:在单步执行代码时,第一个函数 getNoMonths 运行良好。它会提示用户他们希望处理数据的销售月数,并将该数字存储在no_Months 中,然后返回main。验证需要在 3 到 6 之间的值也可以正常工作。

当我们到达getSales 时,问题就出现了。该函数会提示用户之前定义的多个月份的销售值。似乎它工作得很好。然而,经过仔细检查,似乎只有第一个值实际上存储在sales 中,它应该是一个数组,其大小是根据用户在getNoMonths 期间定义的月数动态分配的。

我确信无论我做错了什么都非常简单,我能感觉到。我一直在翻阅文本,尽可能多地了解数组、动态内存分配和指针是如何工作的。我了解它们背​​后的想法,但正如您可能看到的那样,我真的在为实际实施而苦苦挣扎。

我知道我需要在这里做的是:

设置一个数组来保存每个月的销售数据 使该数组的大小与用户输入的月数相匹配

...我只是不确定该怎么做。我也知道我需要有一个指针才能让第二个项目符号发生,但同样,我并不清楚我到底需要做什么。

TL;DR 我需要一些帮助来获取这个sales 数组来保存用户输入的所有值,而不仅仅是第一个值。为此,我可能需要帮助设置一个指针来动态分配sales 数组的大小,最好解释一下这一切到底是如何帮助我的,而不仅仅是令人困惑和多余的,哈哈.

源码如下:

//Jesse Holland
//Lab1Out
//Processes Sales Data, Displays as a Bar Graph presentation

#include <iostream>
#include "graph1.h"

using namespace std;

//FUNCTION PROTOTYPES
int getNoMonths(int& no_months);    //prompts for number of months of sales data to be processed
void getSales(int* sales, int no_months);   //prompts for sales data, stores corresponding data in "sales"
int getMax(int* sales, int no_months, double & max);    //maximum value for "sales" array
int getMin(int* sales, int no_months, double & min);    //minimum value for "sales" array
double getAvg(int* sales, int no_months, double & avg); //computes avg of sales data stored in "sales" array
void displayResults(int* sales, int no_months, int max, int min, double avg);   //displays bar chart diagram

//MAIN FUNCTION START
int main()

    double max = 0;
    double min = 0;
    double avg = 0;
    int no_months = 0;

    //prompt for number of months
    getNoMonths(no_months);

    //variable declaration
    int * sales = new int[no_months];

    //prompt for sales data
    getSales(sales, no_months);

    //maximum value of "sales" array
    getMax(sales, no_months, max);

    //minimum value for "sales" array
    getMin(sales, no_months, min);

    //computes avg of sales data stored in "sales" array
    getAvg(sales, no_months, avg);

    //displays bar chart diagram in graphics window
    displayResults(sales, no_months, max, min, avg);

    return 0;


//FUNCTIONS IMPLEMENTATION START
int getNoMonths(int& no_months) // int* months) 

    do
    
        cout << "Please enter the number of months you'd like to process: <must be at least 3, but no more than 6>:";
        cin >> no_months;
        //int* months = new int[no_months];
    while ((no_months < 3) || (no_months > 6));

    return no_months;


void getSales(int* sales, int no_months)

    int count = 0;

    for (count = 0; count < no_months; count++)
    
        cout << "Please enter sales for month #" << (count + 1) << ": ";
            cin >> sales[count];
    


int getMax(int* sales, int no_months, double & max)

    //int max = 0;

    for(int count = 0; count < no_months, count++;)
    
        if (sales[count] > max)
            max = sales[count];
    

    return max;


int getMin(int* sales, int no_months, double & min)

    //int min = 0;
    int count = 0;

    for (count = 0; count < no_months; count++)
    
        if (sales[count] < min)
            min = sales[count];
    

    return min;


double getAvg(int* sales, int no_months, double & avg)

    int sum = 0;

    for(int count = 0; count < no_months; count++)
        sum += sales[count];

    return avg = (sum/no_months);


void displayResults(int* sales, int no_months, int max, int min, double avg)

    cout << "The maximum is " << max << ". \n";
    cout << "The minimum is " << min << ". \n";
    cout << "The average is " << avg << ". \n";

非常非常感谢您的任何帮助。我在这一切方面都非常非常绿色,虽然我非常努力地得到它,但这似乎是不可能的。我决心了解这一切是如何工作的,并且能够理解它,这样我就可以自己复制它,但现在我需要一点帮助才能到达那里。很难没有任何对这些东西一无所知的朋友和一个对和我坐下来帮助我解决问题不太感兴趣的教授。无论如何,我期待着收到你们的来信,并希望能学到一些东西。也许有一天我可以学到足够的知识来回报比我新的人。

更新:更新源代码;现在正在正确计算和输出平均值,但仍然无法得到最大值和最小值来做同样的事情。感谢您迄今为止的帮助,任何进一步的意见当然将不胜感激。

【问题讨论】:

有两种方法可以从函数中检索值。通过引用(或指针)参数返回或输出。一般来说,不要同时做这两个。选一个。 getMax 不应依赖于正确设置的 max 参数的值。 max 应该是一个设置为 0 的局部变量。您的 average 函数不会通过引用更新 avg 参数,但您依靠它来输出结果。如果您不将 sum 或 no_months 转换为浮点类型,则仅执行整数除法。 @NeilKirk 感谢您的意见。快速提问,通过“局部变量”,你的意思是我需要输入“int max = 0;”吗?在 getMax 函数内部,而不是在 main 函数内部? @NeilKirk 另外,正如您所提到的,如何通过引用更新 avg 参数?我需要将函数原型和定义中的“double avg”更改为“double & avg”吗?最后,您能否详细说明一下您所说的最后一点?再次感谢您的输入,并抱歉所有的菜鸟问题。 除了 C 风格的数组,对于 T x 形式的参数,函数内部对 x 的任何更改都不会影响传递给函数的变量。对于T &amp; x 形式的参数,对 x 的任何更改都会修改传递给函数的变量。所以double&amp; avg会更新传给函数的double变量。 对于 getMax 函数,删除 max 参数并将其设置为 0 的局部变量。将 getMax 调用更新为 int max = getMax(sales, no_months); 如果要保留它作为参考参数,请将 @987654334 @ 在函数的开头。要了解为什么这是必要的,请尝试在具有相同外部最大变量的不同数据集上连续调用两次。 【参考方案1】:

您的主要问题似乎是 int no_months = 0; 后跟 int * sales = new int [no_months];,它基本上分配了一个大小为 0 的数组。尝试在分配数组之前调用 getNoMonths 并修复返回类型。

【讨论】:

“修复返回类型”是什么意思?

以上是关于仅存储多个用户生成值中的第一个的动态分配数组的主要内容,如果未能解决你的问题,请参考以下文章

动态数组分配仅返回所有索引中的最后一个元素 C

C语言中的动态内存分配的用法举例

根据值中的第一个字符将数组分成多个数组

Qt中的2D游戏:初始化怪物并将动态分配的数组作为指针参数传递[关闭]

数组及其在内存中的分配

使用猫鼬模式将多个选择元素值中的值存储到MongoDB中的数组中