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. #include <math.h> #include <iostream> #include <conio.h> #include <cstdlib> #include <ctime> #include <windows.h>
using namespace std;
class Tablica { public: Tablica( int r_wier, int r_kol ) { wier = r_wier; kol = r_kol; } ~Tablica(); void StworzTab(); void WpiszLosowo(); void WpiszRecznie(); void Wyswietl(); void Menu(); int WprowadzKol( int r_kol ); int WprowadzWier(); void ZnajdzMax(); void ZnajdzMin(); void LiczSumy(); void LiczSrednie(); void LiczOdchylenia(); private: int wier; int kol; int wpiszDoTab; int * tabSum; float * tabSred; int ** tab; int * tabMax; int * tabMin; float * tabOdch; };
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' ); } 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 ]; for( int i = 0; i < wier; i++ ) { tab[ i ] = new int[ kol ]; } }
void Tablica::WpiszLosowo() { srand( time( NULL ) ); for( int i = 0; i < wier; i++ ) { for( int j = 0; j < kol; j++ ) { tab[ i ][ j ] =( rand() % 99 ) + 0; } } }
void Tablica::WpiszRecznie() { 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++ ) { tabSum[ i ] = 0; } for( int i = 0; i < wier; i++ ) { for( int j = 0; j < kol; j++ ) { tabSum[ 0 ] = tabSum[ 0 ] + tab[ i ][ j ]; } } for( int i = 0; i < wier; i++ ) { for( int j = 0; j < kol; j++ ) { tabSum[ licz ] = tabSum[ licz ] + tab[ i ][ j ]; } licz++; } for( int i = 0; i < kol; i++ ) { for( int j = 0; j < wier; j++ ) { tabSum[ licz ] = tabSum[ licz ] + tab[ j ][ i ]; } licz++; } }
void Tablica::LiczSrednie() { for( int i = 0; i < kol + wier + 2; i++ ) { tabSred[ i ] = 0; } tabSred[ 0 ] = float( tabSum[ 0 ] ) / float(( kol * wier ) ); for( int i = 1; i < wier + 1; i++ ) { tabSred[ i ] = float( tabSum[ i ] ) /( float ) kol; } for( int i = wier + 1; i < 1 + kol + wier; i++ ) { 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++ ) { tabMax[ i ] = 0; } for( int i = 0; i < wier; i++ ) { 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++ ) { 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++ ) { 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++ ) { tabMin[ i ] = 99; } for( int i = 0; i < wier; i++ ) { 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++ ) { 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++ ) { 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++ ) { tabOdch[ i ] = 0; } for( int i = 0; i < wier; i++ ) { 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 ) ); for( int i = 0; i < wier; i++ ) { 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 ); licz++; } for( int i = 0; i < kol; i++ ) { 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 ); licz++; } }
void Tablica::Wyswietl() { int licz = 0; cout << char( 201 ); for( int i = 0; i <( kol * 6 + 6 ); i++ ) { if( licz == 6 ) { cout << char( 203 ); licz = 0; } cout << char( 205 ); licz = licz + 1; } cout << char( 203 ); 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 << " "; 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++ ) { if( i == 0 ) cout << char( 204 );; if( licz == 6 ) { cout << char( 206 ); licz = 0; } cout << char( 205 ); licz++; } cout << char( 206 ); licz = 0; for( int i = 0; i < 27; i++ ) { 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 << " "; SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 ); for( int j = 0; j < kol; j++ ) { cout << char( 186 ); cout.width( 2 ); cout << " " << tab[ i ][ j ] << " "; if( tab[ i ][ j ] < 10 ) cout << " "; cout.width( 1 ); } cout << char( 186 ); SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 ); cout.width( 4 ); cout << tabSum[ i + 1 ] << " "; SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 ); cout << char( 186 ); SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 ); cout.width( 5 ); cout << tabSred[ i + 1 ] << " "; SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 ); cout << char( 186 ); SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 ); cout.width( 4 ); cout << tabMin[ i + 1 ] << " "; SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 ); cout << char( 186 ); SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 ); cout.width( 4 ); cout << tabMax[ i + 1 ] << " "; SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 ); cout << char( 186 ); SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 ); cout.width( 5 ); cout << tabOdch[ i + 1 ] << " "; SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 ); cout << char( 186 ); cout.width( 1 ); cout << endl; licz = 0; for( int z = 0; z <( kol * 6 + 6 ); z++ ) { if( z == 0 ) cout << char( 204 );; if( licz == 6 ) { cout << char( 206 ); licz = 0; } cout << char( 205 ); licz++; } cout << char( 206 ); licz = 0; if( i < wier - 1 ) { for( int i = 0; i < 27; i++ ) { 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++ ) { 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++ ) { SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 ); cout.width( 5 ); cout << tabSum[ wier + i ] << " "; 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 ); cout << endl; licz = 0; cout << char( 204 ); for( int j = 0; j < kol * 6 + 11; j++ ) { if( licz == 6 ) { cout << char( 206 ); licz = 0; } cout << char( 205 ); licz++; } 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++ ) { SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 ); cout.width( 5 ); cout << tabSred[ wier + i ] << " "; 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 ) { cout << char( 206 ); licz = 0; } cout << char( 205 ); licz++; } 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++ ) { SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 ); cout.width( 5 ); cout << tabMin[ wier + i ] << " "; 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 ) { cout << char( 206 ); licz = 0; } cout << char( 205 ); licz++; } 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++ ) { SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 ); cout.width( 5 ); cout << tabMax[ wier + i ] << " "; SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 ); cout << char( 186 ); } 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 ) { cout << char( 206 ); licz = 0; } cout << char( 205 ); licz++; } 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++ ) { SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 11 ); cout.width( 5 ); cout << tabOdch[ wier + i ] << " "; SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 7 ); cout << char( 186 ); } 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 ) { cout << char( 202 ); licz = 0; } cout << char( 205 ); licz++; } 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++ ) { 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++ ) { 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() { char wybor, wyborP; int r_kol, r_wier; bool spr1 = false, spr = false; do { cout.precision( 3 ); cout << endl; cout << " Obliczenia statystyczne dla tablicy dwuwymiarowej \n\n"; cout << " Najpierw zadeklaruj rozmiar tablicy: " << endl; do { cout << " Liczba kolumn [MAX 5]: "; if( cin.fail() ) { cin.clear(); while( cin.get() != '\n' ); } cin >> r_kol; spr = false; if( cin.fail() ) { 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 { 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 ); cout << endl; Statystyczna.StworzTab(); cout << "Wypelnij Losowo [L] lub Recznie [R] " << endl; 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 ); Statystyczna.LiczSumy(); Statystyczna.LiczSrednie(); Statystyczna.ZnajdzMax(); Statystyczna.ZnajdzMin(); Statystyczna.LiczOdchylenia(); cout << endl; Statystyczna.Wyswietl(); cout << endl << endl; Statystyczna.Menu(); 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 ); }
|