2012-04-14 97 views
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; 
} 
+0

你记得的#include''?我在格式化代码时没有看到它。 – Makoto 2012-04-14 01:00:25

+0

“总和垃圾值”?数组中的值怎么样?他们是垃圾吗?如果你在数组中有垃圾,那么当然,总和也是垃圾(古典GIGO原理)。 – AnT 2012-04-14 01:04:28

+6

另外,你似乎是**将11个值读入大小为5 **的数组(或者至少试图这样做)。为什么?该程序的行为将是不确定的。只有这一点可以把任何东西变成垃圾 – AnT 2012-04-14 01:05:03

回答

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); 

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

3

你实际上是在ARRZ[0]文件读取,因为内环的所有值。当你到达i=1时,你在文件末尾,而不是读取任何东西。

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

相关问题