2010-05-08 4 views
6

Mi è stato assegnato per impostare un array con punti. Mi è stato detto di ottenere il valore massimo, nella media, e all'interno di questo stesso array, se qualsiasi punto dell'array è il doppio della media, dovrei cout un "valore anomalo". Finora ho ottenuto i numeri medi e massimi nella matrice. ma non riesco a impostare il programma su cout come valore anomalo. Invece mi dà un multiplo della media. ecco il programma;Cercando di ottenere un numero all'interno di un array che è il doppio della media

int main() 
{ 
    const int max = 10; 
    int ary[max]={4, 32, 9, 7, 14, 12, 13, 17, 19, 18}; 
    int i,maxv; 
    double out,sum=0; 
    double av; 


    maxv= ary[0]; 

    for(i=0; i<max; i++) 
    { 
     if(maxv<ary[i]) 
      maxv= ary[i]; 

    } 
    cout<<"maximum value: "<<maxv<<endl; 

    for(i=0; i<max; i++) 
    { 

     sum = sum + ary[i]; 
     av = sum/max; 
    } 
    cout<<"average: "<<av<<endl; 

    out = av * 2; 

    if(ary[i]>out) 
    { 
     cout<<"outlier: "<<maxv<<endl; 
    } 
    else 
    { 
     cout<<"ok"<<endl; 
    } 


    return 0; 
} 
+8

Grazie per aver pubblicato il tuo lavoro! Vedo molte domande sullo stile dei compiti pubblicati qui con solo la domanda e l'aspettativa che la comunità lo risolva per loro. Questo dimostra che ci hai pensato e vorrebbe aiuto su alcuni aspetti del problema. Grazie! –

+1

Vale la pena notare che la riga 'av = sum/max' può essere spostata all'esterno del ciclo.In questo momento stai prima calcolando la media dei primi 1 elementi, poi la media dei primi 2 elementi, poi la media dei primi 3 ... sull'ultima iterazione calcolando la media dei primi 10 elementi (cioè tutti degli elementi), e quindi dopo che il ciclo è finito, si esegue l'ultimo calcolo. – Domenic

risposta

0

Avrete bisogno di usare due for-loops. Dovresti attraversare il ary e controllare ogni elemento con out, quindi con cout << ary[i].

Questo sarebbe probabilmente un po 'più ovvio se si dichiarassero le variabili dove sono utilizzate, nel più piccolo ambito possibile.

Ad esempio:

for (int i = 0; ...) { 
} 

e

double outlier = avg * 2; 

Tra l'altro, questo può essere un po 'troppo la vostra testa (in questo momento), ma STL fornisce funzioni per la determinazione della max(max_element) e sum(accumulate) di un array. Potrebbe essere una lettura interessante.

+0

Suppongo che questo sia compito. Ad alcuni insegnanti non piace vedere qualcuno che usa cose che non hanno pensato. Dovrebbe anche imparare come sono scritti gli algoritmi. È piuttosto semplice. –

0

Se è esattamente il doppio della media dovrebbe essere '==' invece che più grande del doppio della media.
Analogamente, perché stai producendo maxv? Prova ad usare nomi più significativi.
Non dovresti stampare ary[i] invece? Inoltre, perché non si esegue nuovamente il ciclo della matrice con un ciclo for? Non dovresti iterarlo dappertutto per trovare tutti i outliner o dovresti controllare solo l'ultimo elemento per un outliner.

+2

Tecnicamente sei corretto, ma penso che il termine "outlier" indichi che dovrebbe essere "più grande del doppio della media". – Stephen

10

Il tuo codice contiene un insetto sottile e difficile da individuare. Stai usando ary [i] dopo il ciclo finale for. A questo punto, il valore di i è uguale a max, quindi l'istruzione if confronta la memoria casuale perché stai andando fuori dalla fine dell'array.

Dal momento che questo è C++ e non C, si avrebbe potuto evitare questo particolare bug dichiarando le variabili di loop nel ciclo for come questo

for (int i = 0; i < max; ++i) { 
    .... 
} 
+0

Ed è una buona abitudine: dichiarare sempre le variabili nel campo di applicazione più stretto possibile. –

4

Ecco una soluzione C++ per il vostro compito, ma probabilmente ha vinto 't essere autorizzati a portata di mano che nel ;-)

#include <algorithm> 
#include <functional> 
#include <iostream> 
#include <iterator> 
#include <numeric> 

int main() 
{ 
    const int N = 10; 
    int ary[N] = {4, 32, 9, 7, 14, 12, 13, 17, 19, 18}; 

    int max = *std::max_element(ary, ary + N); 
    std::cout << "maximum: " << max << std::endl; 

    double average = std::accumulate(ary, ary + N, 0.0)/N; 
    std::cout << "average: " << average << std::endl; 

    std::cout << "outlier: "; 
    std::remove_copy_if(ary, ary + N, 
         std::ostream_iterator<int>(std::cout, " "), 
         std::bind2nd(std::less_equal<double>(), 2 * average)); 
    std::cout << std::endl; 
} 
+1

Quando lo guardi, C++ è un linguaggio così brutto. – Stephen

+0

non lo so, lo incorporo/dichiari usando lo spazio dei nomi std, e penso che sia abbastanza buono e molto simile alla lettura in inglese (ma sono di parte così ...) –

0

ho preparato il seguente programma (per lo più per il mio apprendimento). Tenta di utilizzare il più possibile la libreria standard C++.

#include<iostream> 
#include<iterator> 
#include<vector> 
#include<algorithm> 

int main() { 
    std::vector<float> nums; 
    // this will read the numbers from standard input; it will continue 
    // for as long as it can read floats (to stop you can enter a 
    // letter, or press Ctrl+D) 
    std::copy(std::istream_iterator<float>(std::cin), 
      std::istream_iterator<float>(), 
      std::back_insert_iterator<std::vector<float>>(nums)); 

    // calculate the mean 
    float mean = std::accumulate(nums.begin(), nums.end(), 0)/nums.size(); 

    std::cout<<"Mean of "<<nums.size()<<" numbers: "<<mean<<std::endl; 

    // create a lambda function which returns true if a number is BELOW 
    // twice the mean 
    auto fun = [&mean](float x) {return x < 2.0 * mean;}; 

    // partition the list of numbers: those for which the lambda is true 
    // (i.e., the ones BELOW twice the man) will come before the 
    // outliers; the stable sort ensures that within each partition the 
    // numbers come in the original order 
    auto mark = std::stable_partition(nums.begin(), nums.end(), fun); 

    // mark gives an iterator to the first element of the second 
    // partition; it it is before the end we report the outliers 
    if(mark!=nums.end()) { 

    std::cout<<"Found "<<nums.end()-mark<<" outliers:"<<std::endl; 

    for(auto it=mark; it!=nums.end(); ++it) { 
     std::cout<<"\t"<<*it<<std::endl; 
    } 

    } else { 
    std::cout<<"No outliers found."<<std::endl; 
    } 

    return 0; 
} 

La mia uscita (compilato con g++ (GCC 4.7.2) utilizzando il flag -std=c++11).

[Prompt] ./a.out 
1 2 3 4 5 20 f # the f is to end the stream of numbers; press enter 
Mean of 6 numbers: 5 
Found 1 outliers: 
    20 
Problemi correlati