Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Rysowanie histogramu

Ostatnio zmodyfikowano 2014-09-23 00:08
Autor Wiadomość
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):
C/C++
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?
P-117372
Monika90
» 2014-09-22 22:42:58
C/C++
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:
C/C++
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
C/C++
for( int i = 0; i < p.size(); i++ )
{
    Chart1->Series[ 0 ]->Add( p[ i ], "", clRed );
}
P-117374
Vectrom
Temat założony przez niniejszego użytkownika
» 2014-09-23 00:08:25
Obecnie kod prezentuje się tak:
C/C++
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?
P-117375
« 1 »
  Strona 1 z 1