2010-05-08 9 views
6

Zostałem przydzielony do ustawienia tablicy z punktami. Mówi się, żebym uzyskał maksymalną wartość, średnią iw obrębie tej samej tablicy, jeśli dowolny punkt w tablicy jest dwa razy większy od średniej, powinienem być cout "odstający". Do tej pory otrzymałem średnie i maksymalne liczby w tablicy. ale nie mogę ustawić programu na wartość zewnętrzną. Zamiast tego daje mi wielokrotność średniej. tutaj jest program;Próba uzyskania liczby w tablicy, która jest dwukrotnie większa od średniej

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

Dziękujemy za opublikowanie swojej pracy! Widzę tutaj najczęściej zadawane pytania w stylu prac domowych z jedynie pytaniem i oczekiwaniem, że społeczność rozwiąże je dla nich. To pokazuje, że włożyłeś w to uwagę i chciałbyś pomóc w niektórych aspektach problemu. Dzięki! –

+1

Warto zauważyć, że linia 'av = sum/max' może zostać przeniesiona poza pętlę.W tej chwili najpierw obliczasz średnią z pierwszych 1 elementów, następnie średnią z pierwszych 2 elementów, następnie średnią z pierwszych 3 ... w ostatniej iteracji przez ciebie obliczasz średnią z pierwszych 10 elementów (tj. elementów), a następnie po zakończeniu pętli, wyprowadzasz to ostatnie obliczenie. – Domenic

Odpowiedz

0

Musisz użyć dwóch pętli for-loop. Powinieneś przetrawdzić ary i sprawdzić każdy element przed out, a następnie cout << ary[i].

Prawdopodobnie będzie to trochę bardziej oczywiste, jeśli zadeklarujesz zmienne w miejscu, w którym są używane, w możliwie najmniejszym zakresie.

Na przykład:

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

i

double outlier = avg * 2; 

Nawiasem mówiąc, to może być trochę zbyt swojej głowicy (teraz), ale STL zapewnia funkcje określania max(max_element) i sum(accumulate) tablicy. To może być ciekawa lektura.

+0

Zakładam, że to praca domowa. Niektórzy nauczyciele nie lubią widzieć kogoś, kto używa rzeczy, o których nie myśleli. Powinien także nauczyć się, jak algorytmy są napisane. To dość proste. –

0

Jeśli jest to dokładnie dwukrotność średniej, powinno być "==" zamiast większego niż dwukrotność średniej.
Na czym polega wyjście maxv? Spróbuj użyć bardziej znaczących nazw.
Nie powinieneś zamiast tego drukować ary[i]? Co więcej, dlaczego nie zapętlisz ponownie tablicy za pomocą pętli for? Czy nie powinieneś iterować po nim, aby znaleźć wszystkie zarysy, lub tylko ostatni element powinien zostać sprawdzony pod kątem konturu.

+2

Pod względem technicznym masz rację, ale myślę, że termin "odstający" oznacza, że ​​powinien on być "większy niż dwukrotność średniej". – Stephen

10

Twój kod zawiera subtelny i trudny do wykrycia błąd. Używasz ary [i] po końcowej pętli. W tym momencie wartość i jest równa max, więc twoja instrukcja if porównuje pamięć losową, ponieważ wychodzisz z końca tablicy.

Ponieważ jest to C++ i nie C, można uniknąć tej konkretnej błąd deklarując zmienne pętli w pętli for jak to

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

I to jest dobry nawyk: zawsze zadeklaruj swoje zmienne w możliwie dokładniejszym zakresie. –

4

o to C++ rozwiązanie do swojego zadania, ale pewnie wygrał nie wolno w to mieszać ;-)

#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

Kiedy patrzysz na to, C++ jest tak brzydkim językiem. – Stephen

+0

i dunno, zawijam/deklaruję używając std namespace, i myślę, że wygląda całkiem dobrze i bardzo podobnie do czytania angielskiego (ale jestem stronniczy, więc ...) –

0

Przygotowałem następujący program (głównie do mojej nauki). Stara się wykorzystać jak najwięcej biblioteki standardowej 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; 
} 

moje wyjście (skompilowany z g++ (GCC 4.7.2) z 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 
Powiązane problemy