欢迎。我的问题是我给出了一组数字,我需要计算平均值(我做的那部分),但后来我必须找到更接近平均值的数组元素(模块)。下面粘贴代码(强加的main()形式)
#include <iostream>
using namespace std;
double* aver(double* arr, size_t size, double& average){
double count;
for(int p = 0; p < size; p++)
count += arr[p];
count /= size;
double * pointer;
pointer = &count;
average = *pointer;
}
int main() {
double arr[] = {1,2,3,4,5,7};
size_t size = sizeof(arr)/sizeof(arr[0]);
double average = 0;
double* p = aver(arr,size,average);
cout << p << " " << average << endl;
}
程序应该给出结果
4 3.66667
我不知道如何检查哪个元素最接近另一个元素,并将其替换为* p
我将非常感谢任何帮助。
答案 0 :(得分:2)
此算法基于std::map
保持其元素排序(使用operator<
)的事实:
#include <map>
#include <iostream>
#include <math.h>
using namespace std;
double closest_to_avg(double* arr, size_t size, double avg) {
std::map<double,double> disturbances;
for(int p = 0; p < size; p++) {
disturbances[fabs(avg-arr[p])]=arr[p]; //if two elements are equally
} //distant from avg we take
return disturbances.begin()->second; //a new one
}
答案 1 :(得分:2)
好的,这不是你问题的答案,因为你已经有了几个
尝试新事物怎么样?
使用std::accumulate
,std::sort
和std::partition
来实现同样的目标。
#include<algorithm>
//...
struct comp
{
double avg;
comp(double x):avg(x){}
bool operator()(const double &x) const
{
return x < avg;
}
};
std::sort(arr,arr+size);
average =std::accumulate(arr, arr+size, 0.0) / size;
double *p= std::partition(arr, arr+size, comp(average));
std::cout<<"Average :"<<average <<" Closest : "<<*p<<std::endl;
答案 2 :(得分:1)
因为每个人都在做孩子的家庭作业......
#include <iostream>
using namespace std;
double min(double first, double second){
return first < second ? first : second;
}
double abs(double first){
return 0 < first ? first : -first;
}
double* aver(double* arr, size_t size, double& average){
double count;
for(int p = 0; p < size; p++)
count += arr[p];
average = count/size;
int closest_index = 0;
for(int p = 0; p < size; p++)
if( abs(arr[p] - average) <
abs(arr[closest_index] - average) )
closest_index = p;
return &arr[closest_index];
}
int main() {
double arr[] = {1,2,3,4,5,7};
size_t size = sizeof(arr)/sizeof(arr[0]);
double average = 0;
double* p = aver(arr,size,average);
cout << *p << " " << average << endl;
//Above ^^ gives the expected behavior,
//Without it you'll get nothing but random memory
}
我坚持你需要在p之前的*,它给出了指针指向的值。如果没有*,则值是内存位置的地址,在这种情况下是不确定的。向你的教授/老师询问规范是否正确,因为它不是。
尝试并理解所涉及的风格和功能 - 它并不复杂,像这样的写作可以帮助你的学生轻松完成工作。
此外,在实际工作中,该界面非常漏洞 - 请考虑使用一些标准库算法和容器。