[C++] Rysowanie histogramu
Ostatnio zmodyfikowano 2014-09-23 00:08
Vectrom Temat założony przez niniejszego użytkownika |
[C++] Rysowanie histogramu » 2014-09-22 22:19:34 Cześć. Pisałem program w Borland C++ Builderze 6, którego zadaniem jest rysowanie histogramu. Fragment kodu (wykonuje się po wciśnięciu przycisku): void __fastcall TForm1::Button2Click( TObject * Sender ) { double min, max, d, n; vector < int > p( 1 ); vector < int > przedzialyp( 1 ); vector < int > przedzialyk( 1 ); lista.sort(); min = lista.front(); max = lista.back(); lpomiarow = lista.size(); n = floor( sqrt( lpomiarow ) ); d =( max - min ) / n; int lklas = Edit1->Text.ToInt(); przedzialyp[ 0 ] = min; for( int i = 1; i < lklas; i++ ) { przedzialyp[ i ] = przedzialyp[ i - 1 ] + d; } for( int i = 0; i < lklas; i++ ) { przedzialyk[ i ] = przedzialyp[ i ] + d; } for( list < double >::iterator i = lista.begin(); i != lista.end(); ++i ) { for( int j = 0; j < lklas; j++ ) { if(( * i >= przedzialyp[ j ] ) &&( * i < przedzialyk[ j ] ) ) { p[ j ] ++; } else if(( * i == max ) ) p[ j ] ++; } } for( int i = 0; i < n; i++ ) { Chart1->Series[ 0 ]->Add( p[ i ], "", clRed ); } }
Wcześniej próbowałem też wersję w której liczba klas nie była pobierana od usera, ale była równa wartości zmiennej n. Niestety, przy niektórych wartościach jest dobry histogram, ale przy innych pojawia się dziwny. Co jest nie tak? |
|
Monika90 |
» 2014-09-22 22:42:58 vector < int > p( 1 ); vector < int > przedzialyp( 1 ); vector < int > przedzialyk( 1 );
te wektory mają rozmiar równy 1, raczej chodzi ci o coś takiego: const int lklas = Edit1->Text.ToInt(); vector < int > p( lklas ); vector < int > przedzialyp( lklas ); vector < int > przedzialyk( lklas );
w pętli na końcu powinno być p.size() zamiast n for( int i = 0; i < p.size(); i++ ) { Chart1->Series[ 0 ]->Add( p[ i ], "", clRed ); }
|
|
Vectrom Temat założony przez niniejszego użytkownika |
» 2014-09-23 00:08:25 Obecnie kod prezentuje się tak: void __fastcall TForm1::Button2Click( TObject * Sender ) { const int lklas = Edit1->Text.ToInt(); double min, max, d, n; vector < int > p( lklas ); vector < int > przedzialyp( lklas ); vector < int > przedzialyk( lklas ); lista.sort(); min = lista.front(); max = lista.back(); lpomiarow = lista.size(); n = floor( sqrt( lpomiarow ) ); d =( max - min ) / lklas; przedzialyp[ 0 ] = min; for( int i = 1; i < lklas; i++ ) { przedzialyp[ i ] = przedzialyp[ i - 1 ] + d; } for( int i = 0; i < lklas; i++ ) { przedzialyk[ i ] = przedzialyp[ i ] + d; } for( list < double >::iterator i = lista.begin(); i != lista.end(); ++i ) { for( int j = 0; j < lklas; j++ ) { if(( * i >= przedzialyp[ j ] ) &&( * i < przedzialyk[ j ] ) ) { p[ j ] ++; } else if(( * i == max ) ) p[ j ] ++; } } for( int i = 0; i < p.size(); i++ ) { Chart1->Series[ 0 ]->Add( p[ i ], "", clRed ); } }
Wpisałem 7 jakiś liczb i dwie klasy - program wygenerował histogram, gdzie w 1 klasie było 7 liczb, a w drugiej 1 (łącznie 8). Wpisałem pięć razy 1 i dwie klasy - program wygenerował histogram, gdzie były 2 klasy po 5 liczb. Co nie gra? |
|
« 1 » |