输入第一个浮点数后出现奇数结果

Odd results after first float entered

本文关键字:结果 第一个 浮点数 输入      更新时间:2023-10-16

我创建了一个程序来接收浮点值,直到输入非数字。然后程序将输出输入的数字,如{n0,n1,…,},以及对输入的数字求和并计算平均值。

我的问题是,在输出0之后,打印出的所有其他数字都与输入的数字不匹配。

程序如下:

#include <iostream>
using namespace std;
class ManagedArray
{
    float *elements;
    int numberOfElements;
public:
    ManagedArray(float *ele, int NOE) 
        : elements(ele), numberOfElements(NOE)
    {}
    ManagedArray() 
    { 
        elements = NULL, numberOfElements = 0;  //default constructor
    }
    int Size();
    float get(int index);
    void add(float value);
    ~ManagedArray(); // Destructor
    ManagedArray(ManagedArray & ma); // copy constructor
    void print(ManagedArray ma);
};
float ManagedArray::get(int index) { return elements[index]; }
int ManagedArray::Size() { return numberOfElements; };
void ManagedArray::add(float value) 
{
    float * biggerArray = new float[numberOfElements + 1];
    if (elements != NULL)
    {
        // copy the old elements into the biggerArray
        for (int i = 0; i < numberOfElements; i++)
        {
            biggerArray[i] = elements[i];
        }
        // the old array is not needed anymore, we have a better copy
        delete[] elements;
    }
    // point at the new array
    elements = biggerArray;
    numberOfElements = numberOfElements + 1;
    // put the new number into the last element of the array
    elements[numberOfElements - 1] = value;
}
ManagedArray::~ManagedArray() { delete[] elements; }
ManagedArray::ManagedArray(ManagedArray & ma)
{
    elements = new float[10]; // put here to get the number of input here
for (int i = 0; i <10; i++) // put here to get the number of input here
{
    elements[i] = ma.elements[i];
}
numberOfElements = ma.numberOfElements;
}
void ManagedArray::print(ManagedArray ma)
{
    bool hasNumbers = ma.Size() > 0;
    if (hasNumbers) {
        // print the stored numbers
        cout << "Entered numbers: " << endl;
        cout << "{";
        for (int i = 0; i < ma.Size(); ++i)
        {
            if (i > 0)
            {
                cout << ", ";
            }
            cout << ma.get(i);
        }
        cout << "}" << endl;
        float sum = 0;
        for (int i = 0; i < ma.Size(); ++i)
        {
            sum += ma.get(i);
        }
        cout << "total: " << sum << endl;
        cout << "average: " << (sum / ma.Size()) << endl;
    }
    else {
        cout << "no numbers entered." << endl;
    }
}

int main()
{
    ManagedArray mArray; // default constructor call for ManagedArray
    float userInput;
    bool addingNumbersToTheList;
    cout << "Keep entering numbers. Enter a non-number to stop." << endl;
    do
    {
        cin >> userInput;
        addingNumbersToTheList = !std::cin.fail();
        if (addingNumbersToTheList) {
            mArray.add(userInput);  
        }
    } while (addingNumbersToTheList);
    ManagedArray copy(mArray);
    // fix cin after intentionally breaking it above.
    if (std::cin.fail())
    {
        std::cin.clear();
        while (std::cin.get() != 'n');
    }
    copy.print(copy); 
    copy.print(copy);
    cin.get();
    return 0;
}

例如我输入1,2,3,a程序将输出{1,-4.22017e+ 37,2.89451e +31}

有人能指出我用这种方法做错了什么吗?

编辑:我已经修复了复制构造函数。谁能告诉我怎么换输入总数为10的数字?:
elements = new float[10];

for (int i = 0; i <10; i++)

我需要用for循环和数组遍历数组中所有可能的数字。

elements = new float[ma.Size()];
for (int i = 0; i < ma.Size(); i++)
{
    elements[i] = ma.elements[i];
}
numberOfElements = ma.numberOfElements;