2013-10-21 66 views
2

歡迎。我的問題是我給了一個數組,我需要計算平均值(我做的那部分),但是我必須找到數組元素(模塊),這更接近平均值。下面粘貼代碼(的主要形式()強加)檢查哪個模塊最接近

#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

不要這樣縮進,它會給出(錯誤的)印象,在'for'之後'aver'中的所有內容都是循環的一部分。儘管空白對於C++編譯器來說沒有意義,但它對人類來說是**。 – syam

+0

對我來說看起來像基本的算術。如你所建議的那樣,平均值最接近4;爲什麼?因爲(4 - yourAverage)<(yourAverage - 3)。 – ChiefTwoPencils

+0

「*我不知道如何檢查哪個元素最接近另一個元素,並將其替換爲p」給它一點思考。如果你想成爲一名程序員,你將不得不把這些事情弄清楚。 –

回答

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之前需要將*,它給出了指針指向太值。如果沒有*,那麼這個值就是內存位置的地址,在這種情況下它是不確定的。詢問你的教授/老師是否說明書是正確的,因爲它不是。

嘗試並理解所涉及的風格和功能 - 它並不複雜,這樣寫作可以使您的分級工作更輕鬆。

此外,該接口是一個非常泄漏的,在實際工作中 - 考慮一些標準庫算法和容器。

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 
} 
+0

非常感謝您的幫助,但我不能改變main()和double * aver(double * arr,size_t size,double&average)結構中的任何東西{我只能用這部分工作} –

+0

@Daniel Zawadzki so move this代碼到你的函數中,你擁有了所有需要計算的東西,只需在你的函數中創建這個映射,執行這個循環,然後返回disturbances.begin() - > second; – 4pie0

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;