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::accumulatestd::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;
于 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 に答える