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

[C++] Destruktor zawiesza program. Jaka jest przyczyna?

Ostatnio zmodyfikowano 2015-01-17 23:37
Autor Wiadomość
kojot123
Temat założony przez niniejszego użytkownika
[C++] Destruktor zawiesza program. Jaka jest przyczyna?
» 2015-01-17 23:24:53
Witam wszystkich, mam pytanie dotyczące destruktora, cały program dzialał poprawnie do czasu dodania do niego destruktora, od tego momentu kawalek wykonuje się dobrze i w pewnym momencie zawiesza się, widziałem podobne tematy ale nie wiem czy moj problem dotyczy tego samego. 



C/C++
// BIBLIOTEKI
#include <math.h> // do pierwiastka
#include <iostream>   // wejscie/ wyjscie    
#include <conio.h>  //getch
#include <cstdlib> // do generatora liczb liosowych
#include <ctime> // do generatora liczb losowych
#include <windows.h> // kolorowanie

using namespace std;

class Tablica // deklaracja klasy Tablica
{
public: //sekcjia publiczna
   
    //metody
    Tablica( int r_wier, int r_kol ) // konstruktor
    {
        wier = r_wier;
        kol = r_kol;
    }
   
    ~Tablica();
   
   
    void StworzTab(); //tworzy tablice i domyslnie przypisuje wartosci  losowe
   
    // metody obslugi
    void WpiszLosowo();
    void WpiszRecznie(); // metoda pozwalajaca wpisac wartosci recznie do tablicy
    // void ZmienKomorke();
    void Wyswietl();
    void Menu();
    int WprowadzKol( int r_kol );
    int WprowadzWier();
   
   
    //metody obliczen
    void ZnajdzMax();
    void ZnajdzMin();
    void LiczSumy();
    void LiczSrednie();
    void LiczOdchylenia();
   
   
   
private:
    // sekcja prywatna
    int wier; //wiersze w obiekcie
    int kol; //kolumny w obiekcie
    int wpiszDoTab; //bufor ktory wpisuje do tablicy
    int * tabSum; //tablica wszystich sum
    float * tabSred;
   
    int ** tab; // tablica dwuwymiarowa liczb
    int * tabMax; // tablica najwiekszych wartosci
    int * tabMin; // tablica najmniejszych wartosci
    float * tabOdch; // tablica Odchylen
};


Tablica::~Tablica()
{
   
   
    for( int i = 0; i < wier; i++ )
         delete[] tab[ i ];
   
    delete[] tab;
   
    delete[] tabSum;
    delete[] tabSred;
    delete[] tabMin;
    delete[] tabMax;
    delete[] tabOdch;
   
}

int Tablica::WprowadzKol( int r_kol )
{
    do
    {
        if( cin.fail() )
        {
            cin.clear();
            while( cin.get() != '\n' );
           
        }
        //  cout << tekstZachety;
        cin >> r_kol;
        if( cin.fail() )
             cout << "To nie jest liczba.\n";
       
    } while( cin.fail() );
   
    return r_kol;
}

int Tablica::WprowadzWier()
{
   
   
   
}

void Tablica::StworzTab()
{
   
    tab = new int *[ wier ]; // tablica wskaznikow na tablice kolumn
   
    for( int i = 0; i < wier; i++ )
    {
        tab[ i ] = new int[ kol ];
    }
}

void Tablica::WpiszLosowo()
{
    srand( time( NULL ) ); // do generatora liczb losowych
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
           
            tab[ i ][ j ] =( rand() % 99 ) + 0; // losowanie liczb od 0 dp 99
           
        }
       
    }
   
   
}

void Tablica::WpiszRecznie() // nadpisz do tablicy
{
   
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
            cout << "Wpisz element do kolumny:[" << i << "] wiersza:[" << j << "]";
            cin >> wpiszDoTab;
            tab[ i ][ j ] = wpiszDoTab;
           
        }
       
    }
   
    for( int i = 0; i < wier; i++ )
    {
        for( int j = 0; j < kol; j++ )
        {
            cout << "Element" << i << " " << j << ": " << tab[ i ][ j ] << endl;
           
        }
       
    }
}


void Tablica::LiczSumy()
{
    tabSum = new int[ kol + wier + 1 ];
    int licz = 1;
   
    for( int i = 0; i < kol + wier + 1; i++ ) // zerowanie tablicy tabSum
    {
        tabSum[ i ] = 0;
    }
   
   
   
    for( int i = 0; i < wier; i++ ) //petla liczaca sume tablicy
    {
        for( int j = 0; j < kol; j++ ) //petla liczy wszystkie sumy
        {
            tabSum[ 0 ] = tabSum[ 0 ] + tab[ i ][ j ]; // zapisuje do pierwszego elementu tablicy
        }
    }
   
    for( int i = 0; i < wier; i++ ) //petla liczaca sume poszczegolnych wierszy
    {
        for( int j = 0; j < kol; j++ )
        {
            tabSum[ licz ] = tabSum[ licz ] + tab[ i ][ j ];
        }
        licz++;
    }
   
    for( int i = 0; i < kol; i++ ) //petla liczaca sume poszczegolnych kolumn
    {
        for( int j = 0; j < wier; j++ )
        {
            tabSum[ licz ] = tabSum[ licz ] + tab[ j ][ i ];
        }
        licz++;
    }
   
   
}

void Tablica::LiczSrednie()
{
    //float *  tabSred = new float[kol+wier+2];
   
    for( int i = 0; i < kol + wier + 2; i++ ) // zerowanie tablicy tabSred
    {
        tabSred[ i ] = 0;
    }
   
    tabSred[ 0 ] = float( tabSum[ 0 ] ) / float(( kol * wier ) ); // liczy srednia calej tablicy
   
    for( int i = 1; i < wier + 1; i++ ) // liczy srednia wierszy
    {
        tabSred[ i ] = float( tabSum[ i ] ) /( float ) kol;
    }
   
    for( int i = wier + 1; i < 1 + kol + wier; i++ ) //  liczy srednia kolumn
    {
        tabSred[ i ] = float( tabSum[ i ] ) /( float ) wier;
    }
   
   
   
}

void Tablica::ZnajdzMax()
{
   
   
    tabMax = new int[ kol + wier + 1 ];
    int licz1 = 1;
   
    for( int i = 0; i < kol + wier + 1; i++ ) // zerowanie tablicy tabMax
    {
        tabMax[ i ] = 0;
    }
   
    for( int i = 0; i < wier; i++ ) //petla szukajaca najwiekszej liczby w tablicy
    {
        for( int j = 0; j < kol; j++ )
        {
            if( tab[ i ][ j ] > tabMax[ 0 ] )
                 tabMax[ 0 ] = tab[ i ][ j ];
           
        }
    }
   
    for( int i = 0; i < wier; i++ ) //petla szukajaca najwieksza w danych wierszach
    {
        for( int j = 0; j < kol; j++ )
        {
            if( tab[ i ][ j ] > tabMax[ licz1 ] )
                 tabMax[ licz1 ] = tab[ i ][ j ];
           
        }
        licz1++;
    }
   
    for( int i = 0; i < kol; i++ ) //petla liczaca najwieksza po poszczegolnych kolumnach
    {
        for( int j = 0; j < wier; j++ )
        {
            if( tab[ j ][ i ] > tabMax[ licz1 ] )
                 tabMax[ licz1 ] = tab[ j ][ i ];
           
        }
        licz1++;
    }
   
   
   
}

void Tablica::ZnajdzMin()
{
   
    tabMin = new int[ kol + wier + 1 ];
    int licz = 1;
   
    for( int i = 0; i < kol + wier + 1; i++ ) // zerowanie tablicy tabMax
    {
        tabMin[ i ] = 99;
    }
   
    for( int i = 0; i < wier; i++ ) //petla szukajaca najwiekszej liczby w tablicy
    {
        for( int j = 0; j < kol; j++ )
        {
            if( tab[ i ][ j ] < tabMin[ 0 ] )
                 tabMin[ 0 ] = tab[ i ][ j ];
           
        }
    }
   
    for( int i = 0; i < wier; i++ ) //petla szukajaca najwieksza w danych wierszach
    {
        for( int j = 0; j < kol; j++ )
        {
            if( tab[ i ][ j ] < tabMin[ licz ] )
                 tabMin[ licz ] = tab[ i ][ j ];
           
        }
        licz++;
    }
   
    for( int i = 0; i < kol; i++ ) //petla liczaca najwieksza po poszczegolnych kolumnach
    {
        for( int j = 0; j < wier; j++ )
        {
            if( tab[ j ][ i ] < tabMin[ licz ] )
                 tabMin[ licz ] = tab[ j ][ i ];
           
        }
        licz++;
    }
   
   
   
}

void Tablica::LiczOdchylenia()
{
    tabOdch = new float[ kol + wier + 1 ];
    int licz = 1;
   
    for( int i = 0; i < kol + wier + 1; i++ ) // zerowanie tablicy tabMax
    {
        tabOdch[ i ] = 0;
    }
   
    for( int i = 0; i < wier; i++ ) // Obliczanie odchylenia dla calej tablicy
    {
        for( int j = 0; j < kol; j++ )
        {
            tabOdch[ 0 ] = tabOdch[ 0 ] +(( float( tab[ i ][ j ] ) - tabSred[ 0 ] ) *( float( tab[ i ][ j ] ) - tabSred[ 0 ] ) );
        }
    }
    tabOdch[ 0 ] = sqrt( tabOdch[ 0 ] /( wier * kol ) ); //powstanie odchylenia
   
    for( int i = 0; i < wier; i++ ) // obliczanie odchylenia wierszy
    {
        for( int j = 0; j < kol; j++ )
        {
            tabOdch[ licz ] = tabOdch[ licz ] +(( float( tab[ i ][ j ] ) - tabSred[ licz ] ) *( float( tab[ i ][ j ] ) - tabSred[ licz ] ) );
           
        }
        tabOdch[ licz ] = sqrt( tabOdch[ licz ] / wier ); //powstanie dla kolumny
        licz++;
    }
   
    for( int i = 0; i < kol; i++ ) // obliczanie odchylenia kolumn
    {
        for( int j = 0; j < wier; j++ )
        {
            tabOdch[ licz ] = tabOdch[ licz ] +(( float( tab[ j ][ i ] ) - tabSred[ licz ] ) *( float( tab[ j ][ i ] ) - tabSred[ licz ] ) );
           
        }
        tabOdch[ licz ] = sqrt( tabOdch[ licz ] / wier ); //powstanie odchylenia dla kolumny
        licz++;
    }
   
   
}


void Tablica::Wyswietl()
{
   
   
   
    int licz = 0;
    cout << char( 201 );
    for( int i = 0; i <( kol * 6 + 6 ); i++ ) // gorna linia
    {
       
        //rog
       
        if( licz == 6 ) //wstaw co 4 trojnik
        {
            cout << char( 203 ); // trojnik
            licz = 0;
        }
       
       
        cout << char( 205 ); //pozioma
       
        licz = licz + 1; //licznik do trojnika
    }
    cout << char( 203 ); //prawy gorny rog
   
    licz = 0;
    for( int y = 0; y < 27; y++ )
    {
       
        cout << char( 205 );
       
        if( licz == 4 )
        {
            cout << char( 203 );
        }
       
        if( licz == 10 )
        {
            cout << char( 203 );
        }
       
        if( licz == 15 )
        {
            cout << char( 203 );
        }
       
        if( licz == 20 )
        {
            cout << char( 203 );
        }
       
        licz++;
    }
    cout << char( 187 );
   
    cout << endl;
    for( int t = 0; t < kol + 1; t++ )
    {
        cout << char( 186 );
        if( t == 0 )
        {
           
            if( wier < 10 )
                 cout << "  " << kol << "x" << wier << " ";
            else
                 cout << " " << kol << "x" << wier << " ";
           
        }
        else
        {
            cout.width( 4 );
            SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
            cout << t << "  "; //numerowanie kolumn
            SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
        }
       
    }
    cout << char( 186 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
    cout << " SUM ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
    cout << " AVG  ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
    cout << " MIN ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
    cout << " MAX ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
    cout << "  DEV ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
   
    cout << endl;
    licz = 0;
    for( int i = 0; i <( kol * 6 + 6 ); i++ ) // linia dzielaca
    {
       
        if( i == 0 )
        cout << char( 204 );; //rog
       
       
       
        if( licz == 6 ) //wstaw co czwornik
        {
            cout << char( 206 ); // czwornik
            licz = 0;
        }
       
       
        cout << char( 205 ); //pozioma
       
        licz++; //licznik do trojnika
    }
    cout << char( 206 ); //czwornik
   
    licz = 0;
    for( int i = 0; i < 27; i++ ) // linia dzielaca - sekcja wynikowa
    {
        cout << char( 205 );
       
        if( licz == 4 )
        {
            cout << char( 206 );
        }
       
        if( licz == 10 )
        {
            cout << char( 206 );
        }
       
        if( licz == 15 )
        {
            cout << char( 206 );
        }
       
        if( licz == 20 )
        {
            cout << char( 206 );
        }
       
        licz++;
    }
    cout << char( 185 );
   
    cout << endl;
   
    for( int i = 0; i < wier; i++ )
    {
        cout << char( 186 );
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
        cout.width( 4 );
        cout << i + 1 << "  "; // numerowanie wierszy
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
       
        for( int j = 0; j < kol; j++ )
        {
           
            cout << char( 186 );
            cout.width( 2 ); //pionowa rama
            cout << " " << tab[ i ][ j ] << "  "; // tutaj jest wstawiana liczba do tabeli
            if( tab[ i ][ j ] < 10 ) // jesli liczba mniejsza od 10 dodaj spacje
                 cout << " ";
           
            cout.width( 1 );
        }
        cout << char( 186 );
       
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 );
        cout.width( 4 );
        cout << tabSum[ i + 1 ] << " "; // wstawia sume wiersza
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
        cout << char( 186 );
       
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 );
        cout.width( 5 );
        cout << tabSred[ i + 1 ] << " "; // wstawia srenia wiersza
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
        cout << char( 186 );
       
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 );
        cout.width( 4 );
        cout << tabMin[ i + 1 ] << " "; // wstawia minimalna wartosc wiersza
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
        cout << char( 186 );
       
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 );
        cout.width( 4 );
        cout << tabMax[ i + 1 ] << " "; // wstawia maksymalna wartosc wiersza
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
        cout << char( 186 ); // pionowa kreska
       
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 );
        cout.width( 5 );
        cout << tabOdch[ i + 1 ] << " "; // wstawia odchylenie stadardowe wiersza
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
        cout << char( 186 );
       
        cout.width( 1 );
       
        cout << endl; // koniec lini, rozpoczynam
       
        licz = 0;
        for( int z = 0; z <( kol * 6 + 6 ); z++ ) // linia dzielaca
        {
           
            if( z == 0 )
            cout << char( 204 );; //rog
           
           
           
            if( licz == 6 ) //wstaw co czwornik
            {
                cout << char( 206 ); // czwornik
                licz = 0;
            }
           
           
            cout << char( 205 ); //pozioma
           
            licz++; //licznik do trojnika
        }
       
        cout << char( 206 ); //czwornik
       
        licz = 0;
        if( i < wier - 1 )
        {
            for( int i = 0; i < 27; i++ ) // linia dzielaca - sekcja wynikowa
            {
                cout << char( 205 );
               
                if( licz == 4 )
                {
                    cout << char( 206 );
                }
               
                if( licz == 10 )
                {
                    cout << char( 206 );
                }
               
                if( licz == 15 )
                {
                    cout << char( 206 );
                }
               
                if( licz == 20 )
                {
                    cout << char( 206 );
                }
               
                licz++;
            }
            cout << char( 185 );
        }
       
       
        else
        {
            for( int i = 0; i < 27; i++ ) // linia dzielaca - sekcja wynikowa
            {
                cout << char( 205 );
               
                if( licz == 4 )
                {
                    cout << char( 206 );
                }
               
                if( licz == 10 )
                {
                    cout << char( 202 );
                }
               
                if( licz == 15 )
                {
                    cout << char( 202 );
                }
               
                if( licz == 20 )
                {
                    cout << char( 202 );
                }
               
                licz++;
            }
            cout << char( 188 );
        }
       
       
        cout << endl;
       
    }
    cout << char( 186 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
    cout << "  SUM ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
    for( int i = 1; i < kol + 1; i++ ) // wyswietlenie obliczen statystycznych dla kolumn
    {
       
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 );
        cout.width( 5 );
        cout << tabSum[ wier + i ] << " "; // wstawia sume wiersza
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
        cout << char( 186 );
    }
   
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 15 );
    if( tabSum[ 0 ] < 10 )
         cout << "   " << tabSum[ 0 ] << " ";
    else if( tabSum[ 0 ] < 100 )
         cout << "  " << tabSum[ 0 ] << " ";
    else if( tabSum[ 0 ] < 1000 )
         cout << " " << tabSum[ 0 ] << " ";
    else
         cout << " " << tabSum[ 0 ];
   
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 ); //wstawianie sumy dla calej tablicy
   
    cout << endl;
    licz = 0;
    cout << char( 204 );
   
   
    for( int j = 0; j < kol * 6 + 11; j++ )
    {
       
        if( licz == 6 ) //wstaw co czwornik
        {
            cout << char( 206 ); // czwornik
            licz = 0;
        }
       
        cout << char( 205 ); //pozioma
        licz++; //licznik do trojnika
       
       
    }
    cout << char( 206 );
    for( int e = 0; e < 6; e++ )
    {
        cout << char( 205 );
    }
    cout << char( 187 );
   
   
    cout << endl;
    cout << char( 186 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
    cout << "  AVG ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
   
    for( int i = 1; i < kol + 1; i++ ) // wyswietlenie obliczen statystycznych dla kolumn
    {
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 );
        cout.width( 5 );
        cout << tabSred[ wier + i ] << " "; // wstawia srenia wiersza
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
        cout << char( 186 );
    }
   
    cout << "     ";
    cout << char( 186 );
    cout.width( 5 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 15 );
    cout << tabSred[ 0 ] << " ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
   
   
   
    cout << endl;
    licz = 0;
    cout << char( 204 );
   
    for( int j = 0; j < kol * 6 + 6; j++ )
    {
       
        if( licz == 6 ) //wstaw co czwornik
        {
            cout << char( 206 ); // czwornik
            licz = 0;
        }
       
        cout << char( 205 ); //pozioma
        licz++; //licznik do trojnika
    }
    cout << char( 185 );
   
    cout << "     ";
    cout << char( 200 );
    for( int e = 0; e < 12; e++ )
    {
        if( e == 6 )
             cout << char( 206 );
        else
             cout << char( 205 );
       
    }
    cout << char( 187 );
   
   
   
    cout << endl;
    cout << char( 186 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
    cout << "  MIN ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
   
    for( int i = 1; i < kol + 1; i++ ) // wyswietlenie obliczen statystycznych dla kolumn
    {
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 );
        cout.width( 5 );
        cout << tabMin[ wier + i ] << " "; // wstawia minimalna wartosc wiersza
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
        cout << char( 186 );
    }
    cout << "            ";
    cout << char( 186 );
    cout.width( 4 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 15 );
    cout << tabMin[ 0 ] << " ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
   
    cout << endl;
    licz = 0;
    cout << char( 204 );
   
    for( int j = 0; j < kol * 6 + 6; j++ )
    {
       
        if( licz == 6 ) //wstaw co czwornik
        {
            cout << char( 206 ); // czwornik
            licz = 0;
        }
       
        cout << char( 205 ); //pozioma
        licz++; //licznik do trojnika
    }
    cout << char( 185 );
   
    cout << "            ";
    cout << char( 200 );
    for( int e = 0; e < 11; e++ )
    {
        if( e == 5 )
             cout << char( 206 );
        else
             cout << char( 205 );
       
    }
   
    cout << char( 187 );
    cout << endl;
    cout << char( 186 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
    cout << "  MAX ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
   
    for( int i = 1; i < kol + 1; i++ ) // wyswietlenie obliczen statystycznych dla kolumn
    {
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 );
        cout.width( 5 );
        cout << tabMax[ wier + i ] << " "; // wstawia maksymalna wartosc wiersza
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
        cout << char( 186 ); // pionowa kreska
    }
    cout << "                  ";
    cout << char( 186 );
    cout.width( 4 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 15 );
    cout << tabMax[ 0 ] << " ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
   
    cout << endl;
    licz = 0;
    cout << char( 204 );
   
    for( int j = 0; j < kol * 6 + 6; j++ )
    {
       
        if( licz == 6 ) //wstaw co czwornik
        {
            cout << char( 206 ); // czwornik
            licz = 0;
        }
       
        cout << char( 205 ); //pozioma
        licz++; //licznik do trojnika
    }
    cout << char( 185 );
   
    cout << "                  ";
    cout << char( 200 );
    for( int e = 0; e < 12; e++ )
    {
        if( e == 5 )
             cout << char( 206 );
        else
             cout << char( 205 );
       
    }
    cout << char( 187 );
    cout << endl;
    cout << char( 186 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 8 );
    cout << "  DEV ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
   
    for( int i = 1; i < kol + 1; i++ ) // wyswietlenie obliczen statystycznych dla kolumn
    {
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 );
        cout.width( 5 );
        cout << tabOdch[ wier + i ] << " "; // wstawia maksymalna wartosc wiersza
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
        cout << char( 186 ); // pionowa kreska
    }
   
    cout << "                        ";
    cout << char( 186 );
    cout.width( 5 );
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 15 );
    cout << tabOdch[ 0 ] << " ";
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 );
    cout << char( 186 );
    cout << endl;
   
   
    cout << char( 200 );
    licz = 0;
    for( int j = 0; j < kol * 6 + 6; j++ )
    {
       
        if( licz == 6 ) //wstaw co czwornik
        {
            cout << char( 202 ); // czwornik
            licz = 0;
        }
       
        cout << char( 205 ); //pozioma
       
        licz++; //licznik do trojnika
    }
    cout << char( 188 );
   
    cout << "                        ";
    cout << char( 200 );
    for( int e = 0; e < 6; e++ )
    {
       
        cout << char( 205 );
    }
    cout << char( 188 );
}


void Tablica::Menu()
{
    cout << char( 201 );
    for( int x = 0; x < 70; x++ ) // linia gorna
    {
        if( x == 20 )
             cout << char( 203 );
       
        else if( x == 23 )
             cout << char( 203 );
        else if( x == 59 )
             cout << char( 203 );
       
        else if( x == 66 )
             cout << char( 203 );
       
        cout << char( 205 );
    }
    cout << char( 187 );
    cout << endl;
    cout << char( 186 );
   
    cout << "   URUCHOM PONOWNIE ";
    cout << char( 186 );
    cout << " U ";
   
   
   
   
    cout << char( 186 );
    cout << "                                    ";
    cout << char( 186 );
    cout << " WYJDZ ";
    cout << char( 186 );
    cout << " W ";
   
   
   
    cout << " ";
    cout << char( 186 );
   
   
    cout << endl;
   
    cout << char( 200 );
   
    for( int x = 0; x < 74; x++ ) // linia gorna
    {
        if( x == 20 )
             cout << char( 202 );
       
        else if( x == 24 )
             cout << char( 202 );
       
       
        else if( x == 61 )
             cout << char( 202 );
       
        else if( x == 69 )
             cout << char( 202 );
        else
             cout << char( 205 );
       
    }
    cout << char( 188 );
    cout << endl;
}




int main()
{
    //zmienne
    char wybor, wyborP;
    int r_kol, r_wier;
    bool spr1 = false, spr = false;
   
    do
    {
        cout.precision( 3 ); // ustawianie precyzji liczb
       
       
       
       
        cout << endl;
        cout << " Obliczenia statystyczne dla tablicy dwuwymiarowej \n\n";
        cout << " Najpierw zadeklaruj rozmiar tablicy: " << endl;
       
        do
        {
            cout << " Liczba kolumn [MAX 5]:  "; // sprawdzanie o kolumn
            if( cin.fail() )
            {
                cin.clear();
                while( cin.get() != '\n' ); // czyszczenie cin'a
               
            }
           
            cin >> r_kol;
            spr = false; //ustawienie na false zalozenie ze wszystko jest ok
           
            if( cin.fail() ) // sprawdzanie czy nie jest wprowadzona litera
            {
                cout << "To nie jest liczba.\n";
                spr = true;
            }
           
            if( r_kol < 1 || r_kol > 5 )
            {
                cout << "Zly rozmiar kolumn, podaj jeszcze raz:" << endl;
                spr = true;
            }
           
            cin.ignore( 1000, '\n' );
        } while( spr );
       
        spr = false;
       
       
        do // sprawzanie dla wierszy
        {
            cout << " Liczba wierszy [MAX 20]:  ";
            if( cin.fail() )
            {
                cin.clear();
                while( cin.get() != '\n' );
               
            }
           
           
            cin >> r_wier;
            spr = false;
            if( cin.fail() )
            {
               
                cout << "To nie jest liczba.\n";
                spr = true;
            }
           
            if( r_wier < 1 || r_wier > 20 )
            {
                cout << "Zly rozmiar kolumn, podaj jeszcze raz:" << endl;
                spr = true;
            }
           
            cin.ignore( 1000, '\n' );
        } while( spr );
       
       
       
        cout << endl;
       
        Tablica Statystyczna( r_wier, r_kol ); // konstruktor z prarametrami rozmiaru tablicy
       
        cout << endl;
       
        Statystyczna.StworzTab(); // tworzy dynamiczna tablice na stercie
       
        cout << "Wypelnij Losowo [L] lub Recznie [R] " << endl; // wybor sposobu zapelnienia tablicy
       
        spr = false;
        do
        {
            cin >> wybor;
            wybor = toupper( wybor );
           
            if( wybor == 'L' )
            {
                Statystyczna.WpiszLosowo();
                spr = false;
            }
           
            else if( wybor == 'R' )
            {
                cout << " Wybrales metode wpisywania recznego: " << endl;
                Statystyczna.WpiszRecznie();
                spr = false;
            }
            else
            {
                cout << " Zly wybor, sprobuj jeszcze raz w pisz litere R lub L" << endl;
                spr = true;
                cin.ignore( 1000, '\n' );
            }
        }
        while( spr );
       
       
        //metody wykonujace obliczenie statystyczne
        Statystyczna.LiczSumy();
        Statystyczna.LiczSrednie();
        Statystyczna.ZnajdzMax();
        Statystyczna.ZnajdzMin();
        Statystyczna.LiczOdchylenia();
       
        // metody wyswietlania
        cout << endl;
        Statystyczna.Wyswietl();
        cout << endl << endl;
        Statystyczna.Menu();
       
       
        //Statystyczna.~Tablica();
        do {
           
            cin >> wyborP;
            wyborP = toupper( wyborP );
           
            if( wyborP == 'W' )
                 return 0;
           
           
           
            else if( wyborP == 'U' )
            {
                spr = true;
                spr1 = false;
            }
            else
            {
               
                cout << endl << "Zly wybor, sprobuj jeszcze raz (U) lub (W)";
                spr1 = true;
               
            }
           
           
            cin.ignore( 1000, '\n' );
        } while( spr1 );
       
        Statystyczna.~Tablica();
        system( "cls" );
    } while( spr );
   
}
P-125130
DejaVu
» 2015-01-17 23:33:58
Destruktor zwalnia wskaźniki, które mogą być niezaalokowane (i zapewne są niezaalokowane). Czytaj: zwalniasz w destruktorze losowy adres pamięci, więc aplikacja się wywala.
P-125133
darko202
» 2015-01-17 23:37:57
poczytaj sobie o użyciu słowa delete  zwalniającego pamięć.
używasz tylko wtedy gdy zarezerwujesz pamięć przy pomocy  new
np. http://cpp0x.pl/kursy/Kurs-C++​/Dynamiczne-zarzadzanie-pamieci​a-new-i-delete​/307

new/delete
mallock/free  //podobnie

w Twoim przypadku użyłeś new do elementów tablicy i tylko to musisz zwolnić
P-125134
« 1 »
  Strona 1 z 1