编写一个C ++函数,接受一维数组并计算元素的总和,并显示它

时间:2015-12-14 08:58:02

标签: c++ arrays

我想创建一个定义1d数组的函数,计算元素的总和,并显示该总和。我写了下面的代码,但是我并没有意识到使用指针和其他先进的编码技术。

#include <iostream>

using namespace std;


int main()
{
int size;
int A[];

cout << "Enter an array: \n";
cin << A[size];

int sum;

int sumofarrays(A[size]);

sum = sumofarrays(A[size]);
cout << "The sum of the array values is: \n" << sum << "\n";
}


int sumofarrays(int A[size])
{
int i;
int j = 0;
int sum;
int B;

        for (i=0; i<size; i++)
                {
                        B  = j + A[i];
                        j = B;
                }

sum = B;
return(sum);
}

尝试编译此代码时,出现以下错误:

  

SumOfArrays.cpp:19:18:错误:调用对象类型&#39; int&#39;不是一个   函数或函数指针sum = sumofarrays(size)

2 个答案:

答案 0 :(得分:4)

如果您仅使用{em>容器(例如std::vector<int> A)作为数据。那么你的总和会辍学为:

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

然后,每个专业程序员都会快速了解您正在尝试做什么。这有助于使您的代码可读和可维护。

开始使用C ++标准库。读一本像Stroustrup这样的好书。

答案 1 :(得分:1)

请选择芭丝谢芭的回答 - 这是正确的答案。也就是说,除了上面的评论之外,我还想提供一些提示:

1)您需要了解堆栈上的数组(例如&#34; int A [3]&#34;)和堆(例如malloc或new分配的指针)之间的区别。这里有一定程度的细微差别,所以我不打算全部介绍,但如果你想用C或C ++编程,你学到这一点非常重要 - 尽管最好练习是尽可能避免指针,只使用stl容器! ;)

2)我不会告诉你使用特定的缩进样式。但请选择一个并保持一致。你会通过那种随意的方法让其他程序员疯狂;)同样,这同样适用于大写。

3)变量名应该始终有意义(除了其他无意义的循环计数器之外,其中&#34; i&#34;似乎是标准的)。没有人会查看你的代码并立即知道&#34; j&#34;或&#34; B&#34;应该是指。

4)您实施的算法只需要一半的变量。没有必要使用所有这些临时工。只需将sum声明为&#34; int sum = 0;&#34;然后在循环内部执行&#34; sum + = A [i];&#34;

5)最佳做法是 - 与过去不同的地方 - 不可能 - 仅在您需要使用它们的地方声明变量,而不是事先。因此,例如,您不需要在循环之前声明B或j(如上所述,实际上并非真正需要),您可以在循环内声明它们,因为&#34; int B = j + A [i];&#34;和&#34; int j = B;&#34;。或者更好,&#34; const int&#34;,因为没有改变它们。但最好的是,如#4所述,根本不使用它们,只需使用sum - 您实际关心的唯一变量;)

这同样适用于你的for循环 - 你应该在循环中声明我(&#34; for(int i = ....&#34;)而不是在它之外,除非你有某种需要在完成后看到循环爆发的位置(在你的例子中不可能)。

6)虽然这里没有任何区别,但你应该养成使用&#34; ++ i&#34;在你的for循环而不是&#34; i ++&#34;。它实际上只对类很重要,而不是像整数这样的基类型,但前缀增量的算法通常比后缀增量快一点。

7)你确实意识到你在这里两次调用sumOfArrays,对吗?

int sum;

int sumofarrays(A[size]);

sum = sumofarrays(A[size]);

你真正的意思是:

const int sum = sumofarrays(A);

或者你可以跳过将它分配给一个变量,只是简单地在你的cout中调用它。目标是使用尽可能少的代码,而不会让混淆。因为过多的不需要的代码只会增加抛弃某人或包含未检测到的错误的几率。

只是不要把这个做得太远,做一个巨大的混蛋,或者试图做得太聪明&#34;聪明&#34;使用单线&#34;技巧&#34;当他们第一次看到它们时,没有人会理解! ;)

8)我个人建议 - 在这个阶段 - 避免&#34;使用&#34;像瘟疫一样的召唤。通过明确调用&#34; std :: ....&#34;来了解stl的部分内容非常重要。每一次。此外,如果你曾经写过其他人可能会使用的.h文件,你不想(通过习惯的话)用&#34;使用&#34;会对其他人产生影响的电话&#39;代码。

你是初学者,没关系 - 你会学习! :)