Programowanie obiektowe
Transkrypt
Programowanie obiektowe
Programowanie obiektowe Zadanie 6 Piotr Bªaszy«ski 12 listopada 2016 Przygotowa¢ klas¦ do obsªugi macierzy liczb rzeczywistych. Klasa ma mie¢ metody pozwalaj¡ce na: • utworzenie macierzy o dowolnych rozmiarach, pami¦c przydzielana dyna- micznie, warto±ci w komórkach domy±lnie 0, rozmiar macierzy podawany jako parametry konstruktora, • zmian¦ warto±ci dowolnej komórki (podajemy poªo»enie komórki i now¡ war- to±¢), • zwrócenie reprezentacji w postaci stringa dla: podanej komórki, podanego wiersza, podanej kolumny, caªej macierzy (korzystaj¡c z metody zwracaj¡cej wiersze). • dodanie jednej liczby do wszystkich elementów macierzy, • zamian¦ na macierz transponowan¡ (NIE TYLKO dla macierzy kwadrato- wych), Klasa ma mie¢ tak»e funkcje do zapisu i odczytu (konstruktor) danych do i z pliku tekstowego o podanej nazwie. Przykªadowy kod demonstracyjny: • z przygotowanego pliku wczyta¢ macierz o rozmiarach 4x3, • zmodykowa¢ w niej kilka warto±ci, 1 • zapisa¢ do innego pliku (mo»na wykorzysta¢ czas jako cz¦±¢ nazwy pliku, jak w zad. 3), • utworzy¢ now¡ macierz na podstawie zapisanego przed chwil¡ pliku, • transponowa¢ macierz, • zapisa¢ do kolejnego pliku, • utworzy¢ kolejn¡ now¡ macierz na podstawie zapisanego przed chwil¡ pliku, • doda¢ jak¡± liczb¦ do wszystkich elementów macierzy, • zapisa¢ do kolejnego pliku. 2 Dla przypomnienia przykªadowe u»ycie klas obsªuguj¡cych pliki: # include # include # include # include # include < ctime > < iostream > < istream > < fstream > < string > using namespace std ; void file_read () { ifstream inputFile ( " foobar . txt ") ; if (! inputFile . is_open () ) throw std :: exception ( " Can 't read foobar . txt " ) ; string lineAsString ; while (! inputFile . eof () ) { inputFile >> lineAsString ; cout << lineAsString << endl ; } } void file_write () { ofstream outputFile ( " fooboo . txt " ) ; if (! outputFile . is_open () ) throw std :: exception ( " Can 't write fooboo . txt " ) ; outputFile <<" Line 1" << endl ; string lineAsString = " LineAsString "; outputFile << lineAsString << endl ; char * lineAsCharPointer = " LineAsChar * " ; outputFile << lineAsCharPointer << endl ; } 3 Przykªadowa alokacja pami¦ci na dane macierzy, wyj¡tkowo (i po raz ostatni) u»y¢ double ** (je»eli kto± u»ywaª klasy vector): class Matrix { . . double ** data ; . . }; void Matrix :: allocate_data () { data = new double *[ width ]; for ( int i = 0 ; i < width ; i ++) { data [ i ] = new double [ height ]; } } void Matrix :: free_data () { for ( int i = 0 ; i < width ; i ++) { delete [] data [ i ]; } delete [] data ; } Dla szybkich i ªagodnych: Przygotowa¢ wersj¦ klasy korzystaj¡c¡ z klasy vector. Porówna¢ czas wykonywania operacji transponowania dla obu rodzajów macierzy. Do porównania potrzebne b¦dzie wykonanie transponowania wielokrotnie dla odpowiednio du»ej macierzy. 4