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