试图将数组传递给函数并找到总和

时间:2012-04-14 00:53:20

标签: c++ arrays

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

这是我的代码

#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;
}

2 个答案:

答案 0 :(得分:3)

由于内部循环,您实际上正在读取ARRZ[0]中文件中的所有值。当你到达i=1时,你就在文件的末尾,而不是阅读任何内容。

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

答案 1 :(得分: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);

整个工作减少到一步......