我的任务:
程序应具有2个函数,一个用于计算数组中值的平均值(返回结果为double),另一个用于查找数组中的峰值(将结果作为无符号值返回)。数组(unsigned int)和数组中的值(unsigned int)应该通过函数作为参数传递。
有人可以解释一下如何修复我的代码吗?
#include <iostream>
using namespace std;
#define SIZE 10
double findAverage (unsigned int);
unsigned findPeak (unsigned int);
unsigned numbers [SIZE] = {47, 1, 0, 1324, 99, 1000, 65536, 19, 0, 24000 };
unsigned sum;
unsigned peak;
int main()
{
double average;
for (int i = 0 ; i < SIZE; i++)
{
sum += numbers[i];
}
average = findAverage(numbers[SIZE]);
cout << "The average value is : " << average << endl;
peak = findPeak(numbers[SIZE]);
cout << "The peak value is : " << peak << endl;
}
double findAverage (unsigned sum)
{
double average;
average = sum / SIZE;
return average;
}
unsigned findPeak (unsigned int *)
{
for (int i = 0 ; i < SIZE; i++)
{
if (numbers[i] > peak)
{
peak = numbers[i];
}
}
return peak;
}
答案 0 :(得分:3)
从作业说明:
数组(无符号整数)和数组中的值数(无符号 int)应该作为参数传递函数。
函数中有哪两个参数?
double findAverage (unsigned int);
unsigned findPeak (unsigned int);
可以通过以下方式定义函数
double findAverage( const unsigned int a[], unsigned int n )
{
double sum = 0.0;
for ( unsigned int i = 0; i < n; i++ ) sum += a[i];
return n == 0 ? sum : sum / n;
}
unsigned int findPeak( const unsigned int a[], unsigned int n )
{
unsigned int max = 0;
for ( unsigned int i = 1; i < n; i++ )
{
if ( a[max] < a[i] ) max = i;
}
return max;
}
我定义了函数findPeak
,它重新调整了最大元素的索引。您可以重写它将返回最大元素本身。
考虑到这些任务可以使用标题std::accumulate
和std::max_element
分别在标题<numeric>
和
<algorithm>
。
此外,无需在全局名称中定义您的变量。它们可以像main的局部变量一样定义。
答案 1 :(得分:0)
您将数字[SIZE]传递给findAverage而不是sum。
findPeak的定义中缺少参数的名称。
此外,数字[SIZE]不在数组中,数字[SIZE-1]是数组的最后一个元素,因为索引从0开始。
指定数组的大小并手动添加元素(在{}中)也不是一个好主意。你很容易犯错。
此外,您应该将所有代码放在函数中。所以在main中,你只需要调用它们。不要使用全局变量,这里根本不需要它们,并且可能在更大的项目中引起各种各样的问题。所以不要习惯坏习惯。 只需将变量放在main中,然后将它们作为参数传递给函数。 (你实际上是这样做的,但目前它是不必要的,因为例如sum是全局的。)
答案 2 :(得分:0)
您的功能应该是独立且可重复使用的:
他们不应该依赖SIZE
他们不应该直接使用数组:具有大小的数组应该是参数。传递为const
(无需修改数组)。
以下示例:
double findAverage (const unsigned myArray[], int arraySize)
{
unsigned sum = 0;
double average = 0.0;
for (int i = 0 ; i < arraySize; i++)
{
sum += myArray[i];
}
if (arraySize) average = sum / arraySize;
return average;
}
unsigned findPeak (const unsigned myArray[], int arraySize)
{
unsigned peak = 0;
for (int i = 0 ; i < arraySize; i++)
{
if (myArray[i] > peak)
{
peak = numbers[i];
}
}
return peak;
}
电话:
average = findAverage(numbers, SIZE);
peak = findPeak(numbers,SIZE);
答案 3 :(得分:-1)
这是一个正在运行的版本:
#include <iostream>
using namespace std;
double findAverage (unsigned int *, unsigned int);
unsigned int findPeak (unsigned int *, unsigned int);
int main()
{
const int size = 10;
unsigned int numbers [] = {47, 1, 0, 1324, 99, 1000, 65536, 19, 0, 24000 };
double average = findAverage(numbers, size);
cout << "The average value is : " << average << endl;
unsigned int peak = findPeak(numbers, size);
cout << "The peak value is : " << peak << endl;
}
double findAverage (unsigned int *numbers, unsigned int size)
{
unsigned int sum = 0;
for (int i = 0 ; i < size; i++)
{
sum += numbers[i];
}
double average = (double)sum / size;
return average;
}
unsigned int findPeak (unsigned int *numbers, unsigned int size)
{
unsigned int peak = 0;
for (int i = 0 ; i < size; i++)
{
if (numbers[i] > peak)
{
peak = numbers[i];
}
}
return peak;
}
说明:
你应该避免全局变量。
我认为总和计算在findAverage()
中更有意义。然后它必须通过数组。
findPeak
的声明错过了*
,它与定义不符。
要传递数组,您不得提供任何[...]
。只需通过编写数组名称将指针传递给第一个元素即可。
average = sum / SIZE;
首先通过执行整数除法来计算sum / SIZE
,因此结果将被截断。你必须施放一个操作数来强制进行双重分割。