我已经在这段代码上工作了一段时间,几乎可以使用它,但是我遇到了一个问题。我正在整理数据时丢失了数据。输入的数字越多,显示的整数就越多。 link to the image of my output

同样,一旦代码运行,我将收到一条带以下消息的弹出窗口(我注意到在添加求和函数以及此后的每个函数之后,没有按F12键,我会收到此错误):

“ Windows在project3.exe中触发了一个断点。

这可能是由于堆损坏所致,这表明project3.exe或其已加载的任何DLL中存在错误。

这也可能是由于用户在按下
project3.exe具有焦点。

输出窗口可能包含更多诊断信息。


这是我的代码:
在最后一个输入数字后要求用户输入数字,他们必须按零,它会显示数据,显示一些统计数据并对数据进行排序。
我没有检查用户错误

(*如果我不使用system("pause"),则终端窗口关闭,这就是为什么它存在的原因,我知道我应该使用'delete []arr,但是在我置零后它将给我断点消息,这就是为什么将其注释掉的原因)

#include <iostream>
#include <iomanip>
using namespace std;
void getdata(double *arr, double &data, int &floatpt);
void display (double *arr, int floatpt);
void computesum (double *arr, int floatpt, double sum);
void computearthmeticmean (double *arr, int floatpt, double aMean);
void computeharmonicmean (double *arr, int floatpt, double hMean);
void median(double *arr, int floatpt);
void sort (double *arr, int floatpt);
int main ()
{
    double data, sum=0, aMean=0, hMean=0;
    int count=0, floatpt;
    double *arr =new double[count];

    getdata (arr, data, floatpt);
    cout<<"Thank you.  The data you entered are "<<endl;
    display(arr, floatpt);
    cout<<"The following statistics were computed "<<endl;
    computesum(arr,floatpt, sum);
    computearthmeticmean(arr, floatpt, aMean);
    median(arr, floatpt);
    computeharmonicmean (arr, floatpt, hMean);
    sort(arr, floatpt);
    cout<<"The original data set is "<<endl;
    display(arr, floatpt);
    cout<<"Thank you for using this program.  Enjoy your statistics "<<endl;

    //delete []arr;


   system ("pause");
   return 0;
}
void getdata(double *arr, double &data, int &floatpt)
{
    int count=0;

    cout<<"Please enter floating point data.\n";
    cout<<"After the last number has been entered press 0 (zero) \n";
    do
    {
        cin>>arr[count];
        data = arr[count];

        count++;

    }while(data != 0);
    floatpt=(count-1);

 }
void display (double *arr, int floatpt)
{
    for(int i=0; i<floatpt; i++)
    {
        cout<<arr[i]<<endl;
    }

}
void computesum (double *arr, int floatpt, double sum)
{
    for (int j=0; j<floatpt; j++)
    {
        sum+=arr[j];
    }
    cout<<"Sum: "<<sum<<endl;

}
void computearthmeticmean (double *arr, int floatpt, double aMean)
{
    for (int a=0; a<floatpt; a++)
    {
        aMean+=arr[a];
    }
    aMean=aMean/floatpt;
    cout<<"Arithmetic Mean: "<<aMean<<endl;

}
void computeharmonicmean (double *arr, int floatpt, double hMean)
{
    for (int h=0; h<floatpt; h++)
    {
        hMean+=(1/arr[h]);
    }
    hMean=floatpt/hMean;
    cout<<"Harmonic Mean: "<<hMean<<endl;

}
void median(double *arr, int floatpt)
{
    int temp;
    double median;

    for (int s=0; s<floatpt; s++)
    {
        for (int r=0; r<(floatpt-1); ++r)
        {
            if (arr[r] > arr[r+1])
            {
                temp = arr[r];
                arr[r] = arr[r+1];
                arr[r+1] = temp;
            }
        }

        if (floatpt%2 == 0)
        {
            median = (arr[s/2] + arr[(s/2)-1])/2.0;
        }
        else
        {
            median = arr[s/2]/1.0;
        }
    }

    cout<<"Median: "<<median<<endl;

}
void sort (double *arr, int floatpt)
{
    cout<<"The sorted data set is: "<<endl;
    for (int sd=0; sd<floatpt; sd++)
    {
        cout<<arr[sd]<<endl;
    }
}

最佳答案

int count=0, floatpt;
double *arr =new double[count];


count为0,因此您创建的数组没有分配。因此,在getdata中,您读入了超出范围的内存位置:

您打算稍后重新分配吗?

也许如果您尝试使用std::vector<double>,那么事情将会解决。它会自动调整自身大小,并且很容易进行边界检查。

像这样的东西(未经测试):

#include <vector>
// ...
std::vector<double> data;
getdata(arr);
// ...

void getdata(std::vector<double>& arr)
{
    double nextValue;

    cout<<"Please enter floating point data.\n";
    cout<<"After the last number has been entered press 0 (zero) \n";
    cin>>nextValue;
    while(nextValue != 0)
    {
       arr.push_back(nextValue);
       cin >> nextValue;
    }
 }

10-02 06:02
查看更多