2013-10-25 119 views
-1

我試圖創建一個函數,一旦調用它,將從數據文件讀取值並給出四個輸出:最大正值,最小正值,最大負值和最小值負值。如果沒有正值,它應該輸出「沒有正值」,負值也是一樣。 我遇到的主要問題是讓它返回正確的最小負值。找到最大值和最小值的C++函數

這是我到目前爲止。

void maxMinimum (double x[], int n) 
{ 
    int i; 
    double posMaximum; 
    double posMinimum; 
    double negMaximum; 
    double negMinimum; 
    double max; 
    double min; 

    posMaximum = x[0]; 
    for (i=0; i <= n-1; i++) 
    { 
     if(x[i] > posMaximum) 
     posMaximum = x[i]; 
    } 
    cout << "  Maximum positive value  = " << fixed << setprecision(2) << setw(8) << right << posMaximum << endl; 

    posMinimum = x[0]; 
    for (i=0; i <= n-1; i++) 
    { 
     if(x[i] < posMinimum) if(x[i] > 0.0) 
     posMinimum = x[i]; 
    } 
    cout << "  Minimum positive value  = " << fixed << setprecision(2) << setw(8) << right << posMinimum << endl; 

    negMaximum = x[0]; 
    for (i=0; i <= n-1; i++) 
    { 
     if(x[i] < negMaximum) if(x[i] < 0.0) 
     negMaximum = x[i]; 
    } 
    cout << "  Maximum negative value  = " << fixed << setprecision(2) << setw(8) << right << negMaximum << endl; 

    negMinimum = x[0]; 
    for (i=0; i <= n-1; i++) 
    { 
     if (x[i] < 0.0 && x[i] < negMaximum) 
     negMinimum = x[i]; 
    } 

    cout << "  Minimum negative value = " << fixed << setprecision(2) << setw(8) << right << negMinimum << endl << endl; 

    max = x[0]; 
    for (i=0; i <= n-1; i++) 
    { 
     if(x[i] > max) 
     max = x[i]; 
    } 

    min = x[0]; 
    for (i=0; i <= n-1; i++) 
    { 
     if(x[i] < min) 
     min = x[i]; 
    } 

    if(max < 0.0) 
     cout << "  No positive values" << endl; 
    if(min >= 0.0) 
     cout << "  No negative values" << endl << endl; 

} 

當執行該函數將返回正值爲最小負值。由於if (x[i] < 0.0 && x[i] < negMaximum),這對我來說沒有意義。有人能告訴我我錯過了什麼嗎?

注意:最小負值是指最接近於零的值。最大負值離零最遠。

在此先感謝!

+0

最小和最大負值似乎是做同樣的事情(找到最負值)。還要添加更多的parens:((x [i] <0.0)&&(x [i] Dweeberly

回答

1

negMinimum將大於negMaximum,如-5> -30。您還必須創建一個臨時變量,否則negMinimum將僅等於最後一個大於negMaximum的負值。 例如您的數據是{0,-80,5,-2,6,-8} negMinimum將等於-8,因爲-8 < 0和-8> -80。 所以你需要將x [i] < negMaximum更改爲x [i]> negMaximum,並引入一個變量作爲每個循環的新檢查條件。

negMinimum = x[0]; 
double temp = negMaximum 
    for (i=0; i <= n-1; i++) 
{ 
    if ((x[i] < 0.0) && (x[i] > temp)) 
    { 
    negMinimum = x[i]; 
    temp = negMinimum; 
    } 
+0

這非常有道理!快速,簡單的修復。謝謝。 – TheWiz

0

嘗試簡化您的設計。即嘗試寫出這樣的四種方法

double minPositive; 
void nextValueForMinPositive(double next); 

void maxMinimum(double x[], int n) { 
    if (n <= 0) return; 

    minPositive = x[0]; //std::numeric_limits<double>::max(); 

    std::for_each(x, x + n, nextValueForMinPositive); 
} 

void nextValueForMinPositive(double next) { 
    if (next > 0.0 && next < minPositive) 
     minPositive = next; 
} 
+0

啊,我明白你在說什麼了。以這種方式寫對方的優點是什麼? Geniunely想知道。 – TheWiz

+0

分而治之。儘可能簡化您的問題。不要一下子爭取。首先解決一個問題,然後傳遞給下一個(找到最小正數,如果它傳遞給實現最大正數)並嘗試在函數,類之間分配責任。您的函數試圖在一個函數中查找四個值。最後:如果你喜歡,請上傳。 – phoad