0

我是编程新手,我试图将一个数组传递给一个函数并将所有元素加在一起并返回总和。问题是我得到了一个垃圾值。我研究了如何将数组传递给函数,但我不知道是否应该使用指针来传递数组。反正我不擅长指针。

这是我的代码

#include <cmath>
#include <cstdlib>

using namespace std;
float mean(int);
int sum(int ARRZO[5]);

int total;

int main()
{

    int ARRZ[5];
    char *inname = "example.txt";
    ifstream infile(inname);

    if (!infile) {
        cout << "There was a problem opening file " << inname << " for reading." << endl;
        return 0;
    }
    cout << "Opened " << inname << " for reading." << endl;
    for(int i=0; i<11; i++)
    {
        while (infile >> ARRZ[i]) 
        {
            cout << "Value from file is " << ARRZ[i] << endl;
        }
    }

    total=sum(ARRZ);
    cout<<"the sum of the elements in the array is"<<total<<endl;

    system("PAUSE");

    return 0;
}


int sum(int ARRZO[])
{
    int sumz=0;
    for (int i=0; i<5; i++)
    {
        sumz+=ARRZO[i];
        cout<<ARRZO[i];
    }
    cout<<sumz<<endl;
    return sumz;
}
4

2 回答 2

3

ARRZ[0]由于内部循环,您实际上正在从文件中读取所有值。当您到达 时i=1,您已经到了文件的末尾,并且没有读取任何内容。

i删除一个循环,并在您成功读取一个值时递增。

于 2012-04-14T01:06:04.730 回答
1

我不确定你认为这对嵌套循环应该做什么:

for(int i=0; i<11; i++)
{
    while (infile >> ARRZ[i]) 
    {
        cout << "Value from file is " << ARRZ[i] << endl;
    }
}

但是(正如@aliexisdm 指出的那样)内部循环读取文件的全部内容。他没有(至少直接)指出的是,您正在将这些值中的每一个都读入数组的第一个元素中。然后你回到外循环,递增i,并尝试再次读取文件——但由于流failbit已经设置,你所有后续的读取尝试都会失败。

之后,您将数组中的 5 个项目相加,但由于您没有向其中的 4 个项目读取任何内容(并且从未初始化其内容),您最终会得到从文件中读取的最后一个项目 + 4 个垃圾值,给出结果仍然是更多的垃圾(好吧,通常无论如何-您确实有未定义的行为,因此程序可能会崩溃并烧毁,但是对于大多数当前计算机,您只会得到一些无意义的数字)。

但是,我建议对程序进行一些更改,而不仅仅是删除一个循环并在剩下的循环中增加。相反,我会删除所有(显式)循环,并尝试真正使用标准库提供的内容。

您可以一举从文件中读取数字:

std::ifstream infile(inname);

std::vector<int> ARRZ ((std::istream_iterator<int>(infile)),
                        std::istream_iterator<int>());

然后你可以将它们全部加起来std::accumulate

int sum = std::accumulate(ARRZ.begin(), ARRZ.end(), 0);

最后,您可以打印出结果:

cout << "The sum of the elements in the array is: " << sum << "\n";

但是,由于您只是从文件中读取值并将它们相加,因此您根本不需要存储它们。您可以将它们加在一起并打印出结果:

cout << "The sum of the elements in the file is: " 
     << std::accumulate(std::istream_iterator<int>(infile),
                        std::istream_iterator<int>(), 0);

整个工作简化为一步...

于 2012-04-14T05:22:22.483 回答