2

欢迎。我的问题是我给出了一个数字数组,我需要计算平均值(我做的那部分),但是我必须找到更接近平均值的数组元素(模块)。下面贴上代码(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

我将非常感谢任何帮助。

4

3 回答 3

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
}
于 2013-10-21T20:57:46.900 回答
2

好的,这不是您问题的答案,因为您已经得到了几个

尝试新事物怎么样?

使用std::accumulate,std::sortstd::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;
于 2013-10-21T21:24:03.157 回答
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 之前使用 *,它也给出了指针所指向的值。如果没有 *,则该值是内存位置的地址,在这种情况下是不确定的。询问您的教授/老师规范是否正确,因为它不是。

尝试并了解所涉及的样式和功能 - 它并不复杂,这样的写作可以大大简化您的评分员工作。

在实际工作中,该接口也是一个非常泄漏的接口——请考虑一些标准库算法和容器。

于 2013-10-21T21:30:16.210 回答