检查哪个模块最接近

时间:2013-10-21 20:42:50

标签: c++ arrays loops

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

我将非常感谢任何帮助。

3 个答案:

答案 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::accumulatestd::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;

答案 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之前的*,它给出了指针指向的值。如果没有*,则值是内存位置的地址,在这种情况下是不确定的。向你的教授/老师询问规范是否正确,因为它不是。

尝试并理解所涉及的风格和功能 - 它并不复杂,像这样的写作可以帮助你的学生轻松完成工作。

此外,在实际工作中,该界面非常漏洞 - 请考虑使用一些标准库算法和容器。